在 Jenkins 声明式管道中找不到 Bash

ZaC*_*aCH 3 bash containers jenkins docker jenkins-declarative-pipeline

我有 Jenkins 无法识别 bash 的问题。

我使用 golang 图像stageagentdocker一起运行。尝试运行 sh 文件时,我收到此错误:

+ ./build/docker/docker.sh /home/jenkins/workspace/003-CGI-App-setup-ACS-build-4ZEA3UO3JRWIGZRIGIBD7BRQJV7JJ4LAKTS4XDXT6N3GDVU7Z4WA@tmp/durable-46264c73/docker.sh:line/build/script. 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'
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的 docker.sh 文件也以 开头#!/bin/bash

有谁知道它是否与docker镜像有关?如果是,我是否正确添加了 bash?

谢谢。

Dav*_*aze 5

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

这里最好的解决方案是重写你的脚本,而不是特别需要 bash。将其 shebang 行更改为#!/bin/sh,并将其语法限制为POSIX shell 规范中允许的内容。这对于大多数简单的“先做 A、B、C,然后是 D”风格的脚本来说已经足够了;如果您发现自己需要 bash 特定的功能(如数组),请考虑使用更强大的脚本语言(如 Python)。

具体在单行

sh 'export PATH=/bin/bash:$PATH'
Run Code Online (Sandbox Code Playgroud)
  • 每个sh命令都在自己的执行环境中运行,环境干净,因此前面sh语句中的环境变量设置不会影响后面的语句;此声明是禁止操作的。
  • 的元素$PATH是目录,而不是单个文件。
  • /bin几乎是必需的,$PATH并且它在所有标准执行环境中。(如果/bin/bash存在,则显式bash -c '...'命令和#!/bin/bashshebang 行会找到它。)

(造成此类问题的另一个常见原因是混合 Windows/Linux 环境,其中实际的 shebang 行以 DOS 样式的 CR/LF 两字符换行符结尾,并且环境无法运行/bin/bash\r。)