Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to execute a script located in the runner from the ci-pipeline?

I have a gitlab-runner image as follows:

Dockerfile

FROM alpine:3.6

RUN apk add --no-cache curl bash

COPY trigger-jenkins /usr/local/bin/trigger-jenkins

ENTRYPOINT ["/bin/bash"]

Its purpose is to trigger a Jenkins job. Running this with:

docker run -ti jenkins-runner:latest trigger-jenkins job_name

works perfectly fine. But when I tried to do the same by:

.gitlab-ci.yml

Jenkins Trigger:
  script:
    - trigger-jenkins job_name
  tags:
    - Jenkins

The pipeline fails like this:

Running with gitlab-ci-multi-runner 9.3.0 (3df822b)
  on Jenkins Trigger (12475d61)
Using Docker executor with image jenkins-runner:latest ...
Using docker image sha256:44dedf0b3485e0e57107e2745739e1a252fb64c4161465e1b5ccc1119a1183bf for predefined container...
Using docker image jenkins-runner:latest ID=sha256:4760a8ef9139ee9c9a56c686de780fc49e176fe4294e1f0db4f431e117b6811c for build container...
Running on runner-12475d61-project-6-concurrent-0 via cc960a3794a0...
Cloning repository...
Cloning into '/builds/dev/Project'...
Checking out 874b2eac as test/jenkins...
Skipping Git submodules setup
/bin/sh: /bin/sh: cannot execute binary file
/bin/sh: /bin/sh: cannot execute binary file
ERROR: Job failed: exit code 126

I searched for the error code, but was not able to find an explanation.

What am I missing?

like image 455
tgr Avatar asked Aug 09 '17 10:08

tgr


People also ask

What Shell does Gitlab runner use?

PowerShell Desktop Edition is the default shell when a new runner is registered on Windows using GitLab Runner 12.0-13.12. In 14.0 and later, the default is PowerShell Core Edition. PowerShell doesn't support executing the build in context of another user.

Which user does Gitlab runner run as?

gitlab-ci. yml scripts are running as user gitlab-www now. If this one has same uid as host mounts, you are also able to deploy directly to host folders.


2 Answers

The issue was not because of exec. The issue was probably this, your entrypoint was /bin/bash and Gitlab CI was trying to execute /bin/sh which is an executable. Leads to something like below

/bin/bash /bin/sh command args

Which is what the complaint we see as. Cannot execute binary file. What your entrypoint should have been is below

ENTRYPOINT ["/bin/bash", "-c"]

Which would have made sure a command gets execute by bash and whether it is another shell or bash it would have worked. No need to modify and created entrypoint.sh

like image 163
Tarun Lalwani Avatar answered Oct 02 '22 08:10

Tarun Lalwani


I continued my research and found the repository of the official maven docker images.

They solved a similar problem by creating a mvn-entrypoint.sh. So I tried the same:

entrypoint.sh

#!/bin/sh

export PATH=$PATH:/usr/local/bin/

exec "$@"

This did the trick.

like image 28
tgr Avatar answered Oct 02 '22 06:10

tgr