在 Jenkins 管道上运行 bash 命令

在 groovy 脚本内部(针对 jenkins 管道) : 如何运行 bash命令而不是 sh命令?

我试过以下方法:

sh调用中调用“ #!/bin/bash”:

stage('Setting the variables values') {
steps {
sh '''
#!/bin/bash
echo "hello world"
'''
}
}

sh呼叫替换为 bash呼叫:

stage('Setting the variables values') {
steps {
bash '''
#!/bin/bash
echo "hello world"
'''
}
}

附加信息:

我的命令比 echo hello world更复杂。

197967 次浏览

根据 这份文件,你应该可以这样做:

node {
sh "#!/bin/bash \n" +
"echo \"Hello from \$SHELL\""
}

您提供的 Groovy 脚本正在将结果脚本中的第一行格式化为空行。Shebang 告诉脚本使用/bin/bash 而不是/bin/sh 运行,它需要放在文件的第一行,否则将被忽略。

因此,您应该像下面这样格式化 Groovy:

stage('Setting the variables values') {
steps {
sh '''#!/bin/bash
echo "hello world"
'''
}
}

它将使用/bin/bash 执行。

我相信以上的回答是完美的。然而,我很难在接近100的地方加上双引号作为 bash 行。所以,下面的方法帮助了我。(简而言之,shell 的每一行都不能有双引号)

而且,当我在步骤中包含“ bash”# !/bin/bash”时,我得到了以下错误 java.lang.NoSuchMethodError: No such DSL method '**bash**' found among steps

pipeline {
agent none


stages {


stage ('Hello') {
agent any


steps {
echo 'Hello, '


sh '''#!/bin/bash


echo "Hello from bash"
echo "Who I'm $SHELL"
'''
}
}
}
}

上述执行的结果是

enter image description here

对于多行 shell 脚本或那些运行多次的脚本,我会创建一个新的 bash 脚本文件(从 #!/bin/bash开始) ,然后在 Jenkinsfile 用 sh运行它:

sh 'chmod +x ./script.sh'
sh './script.sh'

如果您想为 Jenkins 上的 所有项目将默认 shell 更改为 bash,您可以通过 Web 门户在 Jenkins 配置中这样做:

管理 Jenkins > 配置系统(如果你想跳过这个点击,可以直接跳到 https://{YOUR_JENKINS_URL}/configure)

用值 /bin/bash填充标记为“ Shell 可执行文件”的字段,然后单击“保存”。

在我的例子中,我必须通过 jenkinsfile在 bash 中执行一个 Shell 脚本:

sh 'core_devops/automation/scripts/ecs_initialize.sh'

剧本的第一行

#!/bin/bash

问题在于,如果 Shebang 不从文件的开头开始,那么它就会被忽略。

作为破坏 Jenkinsfile读者格式的一种替代方法,我已经开始使用以下代码:

sh label: 'Run fancy bash script',
script: '''
#!/usr/bin/env  bash


echo "Hello ${SHELL}!"
'''.stripIndent().stripLeading()

注意,对于 工作来说,stripIndent()并不是必需的,但是 Jenkins 日志使用它更好。