在Jenkins声明性管道中未找到Bash
我对詹金斯不认识巴什有意见 我使用golang图像运行docker在Jenkins声明性管道中未找到Bash,bash,docker,jenkins,containers,jenkins-declarative-pipeline,Bash,Docker,Jenkins,Containers,Jenkins Declarative Pipeline,我对詹金斯不认识巴什有意见 我使用golang图像运行docker代理的阶段。尝试运行sh文件时,我收到以下错误: +/build/docker/docker.sh /home/jenkins/workspace/003 CGI应用程序设置ACS构建-4ZEA3UO3JRWIGZRIGIBD7BRQJV7JJ4LAKTS4XDXT6N3GDVU7Z4WA@tmp/耐用-46264c73/script.sh:第1行:./build/docker/docker.sh:未找到 这是我的舞台: stag
代理的阶段
。尝试运行sh文件时,我收到以下错误:
+/build/docker/docker.sh
/home/jenkins/workspace/003 CGI应用程序设置ACS构建-4ZEA3UO3JRWIGZRIGIBD7BRQJV7JJ4LAKTS4XDXT6N3GDVU7Z4WA@tmp/耐用-46264c73/script.sh:第1行:./build/docker/docker.sh:未找到
这是我的舞台:
stage('Build & publish') {
agent {
docker {
image 'golang:1.10-alpine3.7'
}
}
steps {
checkout scm
unstash 'war'
sh 'export PATH=/bin/bash:$PATH'
sh 'cp XXX/XXX/target/*.war build/docker/ROOT.war'
sh 'chmod 777 ./build/docker/docker.sh'
sh 'go build -o XXX'
sh './XXX build'
sh './build/docker/docker.sh'
}
}
我的docker.sh文件以开头/bin/bash
有人知道这是否与docker的形象有关吗?如果是,是否正确添加bash?
谢谢。许多重量较轻的Docker映像,尤其是那些构建在Alpine Linux之上的映像,不包含GNU Bash
这里最好的解决方案是重写脚本,使其不特别需要bash。将其shebang行更改为#/bin/sh
,并将其语法限制为中允许的语法。对于最简单的“先做A、B、C,然后做D”样式的脚本来说,这已经足够了;如果你发现自己达到了BASH特定的特性,比如数组,那么就考虑一个更强大的脚本语言,比如Python。
特别是在单行中
sh 'export PATH=/bin/bash:$PATH'
- 每个
sh
命令都在自己的执行环境中运行,环境干净,因此前面的sh
语句中的环境变量设置不会影响后面的语句;这句话是不可行的
$PATH
的元素是目录,而不是单个文件
/bin
几乎必须位于$PATH
上,并且它在所有标准执行环境中都存在。(如果存在/bin/bash
,则显式bash-c'…'
命令和#!/bin/bash
shebang行将找到它。)
(这类问题的另一个常见原因是Windows/Linux混合环境,实际的shebang行以DOS风格的CR/LF双字符换行符结尾,并且环境无法运行/bin/bash\r
)即使此答案中的所有信息都是正确的,但实际上这并不是问题的根本原因,因为它源于詹金斯问题而不是码头工人问题。这里真正的问题是,他试图访问Jenkins工作区中的/build/docker/docker.sh
,该工作区不存在,因为无论出于何种原因,它不在docker映像中。如果已将其签入源代码存储库,则签出scm
步骤应使其可用?但这是很重要的一点。是的,如果它被签入SCM,它应该被放入工作区。但是,签出([$class:'GitSCM'…])
或类似的特定信息似乎在文件中缺失(只是伪代码)。这个问题似乎没有具体的细节。另一方面,如果sh
不存在,那么chmod
就会失败,所以现在我更倾向于同意你们的答案。谢谢你们的回答。我可以通过隐藏构建的文件并在单独的阶段运行脚本来解决这个问题。我发现docker映像不允许使用bash。