如何从 ci-pipeline 执行位于 runner 中的脚本?
How to execute a script located in the runner from the ci-pipeline?
我有一个gitlab-runner镜像如下:
Dockerfile
FROM alpine:3.6
RUN apk add --no-cache curl bash
COPY trigger-jenkins /usr/local/bin/trigger-jenkins
ENTRYPOINT ["/bin/bash"]
它的目的是触发 Jenkins 作业。 运行 这与:
docker run -ti jenkins-runner:latest trigger-jenkins job_name
工作得很好。但是当我尝试通过以下方式做同样的事情时:
.gitlab-ci.yml
Jenkins Trigger:
script:
- trigger-jenkins job_name
tags:
- Jenkins
管道像这样失败:
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
我搜索了错误代码,但找不到解释。
我错过了什么?
我继续研究并找到了官方 Maven docker 图片的存储库。
他们通过创建 mvn-entrypoint.sh
解决了类似的问题。所以我尝试了同样的方法:
entrypoint.sh
#!/bin/sh
export PATH=$PATH:/usr/local/bin/
exec "$@"
这成功了。
问题不是因为 exec。问题可能是这样的,你的入口点是 /bin/bash
而 Gitlab CI 试图执行 /bin/sh
这是一个可执行文件。导致类似下面的内容
/bin/bash /bin/sh command args
这就是我们所看到的投诉。无法执行二进制文件。你的 entrypoint
应该在下面
ENTRYPOINT ["/bin/bash", "-c"]
这将确保命令被 bash 执行,无论它是另一个 shell 还是 bash 它都会起作用。无需修改和创建entrypoint.sh
我有一个gitlab-runner镜像如下:
Dockerfile
FROM alpine:3.6
RUN apk add --no-cache curl bash
COPY trigger-jenkins /usr/local/bin/trigger-jenkins
ENTRYPOINT ["/bin/bash"]
它的目的是触发 Jenkins 作业。 运行 这与:
docker run -ti jenkins-runner:latest trigger-jenkins job_name
工作得很好。但是当我尝试通过以下方式做同样的事情时:
.gitlab-ci.yml
Jenkins Trigger:
script:
- trigger-jenkins job_name
tags:
- Jenkins
管道像这样失败:
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
我搜索了错误代码,但找不到解释。
我错过了什么?
我继续研究并找到了官方 Maven docker 图片的存储库。
他们通过创建 mvn-entrypoint.sh
解决了类似的问题。所以我尝试了同样的方法:
entrypoint.sh
#!/bin/sh
export PATH=$PATH:/usr/local/bin/
exec "$@"
这成功了。
问题不是因为 exec。问题可能是这样的,你的入口点是 /bin/bash
而 Gitlab CI 试图执行 /bin/sh
这是一个可执行文件。导致类似下面的内容
/bin/bash /bin/sh command args
这就是我们所看到的投诉。无法执行二进制文件。你的 entrypoint
应该在下面
ENTRYPOINT ["/bin/bash", "-c"]
这将确保命令被 bash 执行,无论它是另一个 shell 还是 bash 它都会起作用。无需修改和创建entrypoint.sh