Execute permission check fails on executable file
Asked by Mark Tsyrulnyk:

I've built custom docker image based on \`ubuntu:21.04\` for qt based android app development but encountered with weird bug when running \`androiddeployqt\` inside a pipelines.

java executable fails to test against execution permissions.

Here is log of pipeline execution:

```
Images used:
build : docker.io/siexp/docker-qt-android@sha256:d4752bfd6936dcfc8a9331c3a4b5099377a8f66a9ac23eb5dc527f569e1d06e1
+ JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre

+ ls -la /usr/bin/java
lrwxrwxrwx. 1 root root 22 Jun 16 13:14 /usr/bin/java -> /etc/alternatives/java

+ ls -la /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
-rwxr-xr-x. 1 root root 14632 Apr 21 10:25 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java

+ if [ ! -x "$JAVA_HOME/bin/java" ] ; then echo "not an exec $JAVA_HOME/bin/java" ; fi
not an exec /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
...

+ /opt/Qt/5.15.2/android/bin/androiddeployqt --input android_deployment_settings.json --output android-build --apk $BITBUCKET_CLONE_DIR/build/debug.apk --android-platform android-29 --gradle

...
ERROR: JAVA_HOME is set to an invalid directory: /usr/lib/jvm/java-8-openjdk-amd64/jre

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation.
```

Problem is that \`/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java\` is executable (I'm able to run it inside pipeline) however test for executable \`-x\` fails. I suppose it somehow related to selinux

P.S.

When I run pipeline commands inside docker locally everything works fine


Answers:
author: Mark C
body: Hi [@Mark Tsyrulnyk](/t5/user/viewprofilepage/user-id/3087400)  

Thank you for reaching out to the community.  

Would it be possible for you to try to add the "**export** " command while setting your environment variable?  
This is to make sure the variable is accessible to any process you run.  

**From:**

```
JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre
```

**To:**

```
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre
```

Let me know how it goes.  

Regards,  
Mark C

comments: author: Mark Tsyrulnyk
body: This was my first guess when I tried to figure out what is a problem, unfortunately this is not a cause.

As you can see from the logs binary exist and JAVA_HOME variable is set

```
+ ls -la /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
-rwxr-xr-x. 1 root root 14632 Apr 21 10:25 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java

+ if [ ! -x "$JAVA_HOME/bin/java" ] ; then echo "not an exec $JAVA_HOME/bin/java" ; fi
not an exec /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
```

the problem is exactly in \`-x\` check.

My workaround was to modify \`gradlew\` file and comment out JAVA_HOME checks in there


author: Mark C
body: Hi [@Mark Tsyrulnyk](/t5/user/viewprofilepage/user-id/3087400)  

I see.  
I actually tried your base image (siexp/docker-qt-android) and the following commands with the **-x** flag.  
However, I didn't receive the echo message "not an exec".

```
image: siexp/docker-qt-android@sha256:d4752bfd6936dcfc8a9331c3a4b5099377a8f66a9ac23eb5dc527f569e1d06e1pipelines:  default:    - step:        script:          - JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre          - ls -la /usr/bin/java          - ls -la /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java          - if [ ! -x "$JAVA_HOME/bin/java" ] ; then echo "not an exec $JAVA_HOME/bin/java" ; fi          - echo "Done"
```

Are you using Bitbucket Pipelines [Caches](https://support.atlassian.com/bitbucket-cloud/docs/cache-dependencies/) by any chance whereas you're caching the directories below?

* /usr/bin/java
* /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java

Regards,  
Mark C


Tags: bitbucket-cloud

bitbucket-pipelines

cloud

java

permission