【问题标题】:Bash not found in Jenkins declarative pipeline在 Jenkins 声明性管道中找不到 Bash
【发布时间】:2019-05-20 01:36:27
【问题描述】:

我遇到了 Jenkins 无法识别 bash 的问题。

我使用 golang 映像运行 stage 和 docker agent。尝试运行 sh 文件时,我收到此错误:

+ ./build/docker/docker.sh /home/jenkins/workspace/003-CGI-App-setup-ACS-build-4ZEA3UO3JRWIGZRIGIBD7BRQJV7JJ4LAKTS4XDXT6N3GDVU7Z4WA@tmp/durable-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?

谢谢。

【问题讨论】:

    标签: bash docker jenkins containers jenkins-declarative-pipeline


    【解决方案1】:

    许多轻量级 Docker 映像,尤其是那些构建在 Alpine Linux 之上的映像,不包含 GNU Bash。

    这里最好的解决方案是重写您的脚本,使其不再需要 bash。将其 shebang 行更改为 #!/bin/sh,并将其语法限制为 POSIX shell specification 中允许的内容。对于大多数简单的“做 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 问题而不是 Docker 问题。这里真正的问题是他试图访问他的 Jenkins 工作区中的 ./build/docker/docker.sh,但由于某种原因它不在 Docker 映像中,所以它不存在。
    • 如果它被检入到源代码存储库中,那么checkout scm 步骤应该使它可用吗?但是,是的,这是很重要的一点。
    • 是的,如果它被检入 SCM,它应该被放入工作区。然而,checkout([$class: 'GitSCM'...]) 或类似的具体信息似乎在Jenkinsfile 中不存在(只是伪代码)。这个问题似乎没有具体细节。另一方面,如果sh 不存在,那么chmod 将失败,所以现在我更倾向于同意你的回答。
    • 谢谢你们的回答。我可以通过存储构建文件并在单独的阶段运行脚本来解决这个问题。我发现docker镜像不允许使用bash。
    猜你喜欢
    • 2021-12-07
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    相关资源
    最近更新 更多