Jenkins声明式管道中未找到Bash

时间:2018-12-19 14:27:14

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

我对詹金斯(Jenkins)无法识别bash有疑问。

我使用golang映像与docker stage一起运行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?

谢谢。

1 个答案:

答案 0 :(得分:3)

许多重量较轻的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。)