通常是最常见的问题:
糟糕的替代
错误是使用 sh 代替 bash 。
sh
bash
特别是在使用Jenkins时,如果你正在使用 执行shell ,确保你的 命令 以。。开始 家当 ,例如 #!/bin/bash -xe 要么 #!/usr/bin/env bash 。
#!/bin/bash -xe
#!/usr/bin/env bash
我可以肯定地告诉你,这都是关于sh shell和bash shell的。我通过指定修复了这个问题 #!/bin/bash -xe 如下:
node { stage("Preparing"){ sh'''#!/bin/bash -xe colls=( col1 col2 col3 ) for eachCol in ${colls[@]} do echo $eachCol done ''' } }
这结果是一个语法问题。包装命令 ' 是因为 ${env.BUILD_NUMBER 被传递而不是它的价值。我把整个命令包裹起来 " s并逃脱了嵌套。现在工作正常。
'
${env.BUILD_NUMBER
"
sh "curl -v --user user:password --data-binary ${buildDir}package${env.BUILD_NUMBER}.tar -X PUT \"http://artifactory.mydomain.com/artifactory/release-packages/package${env.BUILD_NUMBER}.tar\""
实际上,你似乎误解了 env 变量。在你的 sh 阻止,你应该访问 ${BUILD_NUMBER} 直。
env
${BUILD_NUMBER}
的 原因/说明: 强> env 表示脚本内的环境。该环境直接用于/可用于任何执行的环境,例如, shell脚本。
还请注意不要写任何东西 env.* ,但使用 withEnv{} 而是阻止。
env.*
withEnv{}
我遇到了显示问题的问题 {env.MAJOR_VERSION} 在jar文件的神器中。显示我通过保持Jenkinsfile中的环境步骤来实现。
{env.MAJOR_VERSION}
pipeline { agent any environment { MAJOR_VERSION = 1 } stages { stage('build') { steps { sh 'ant -f build.xml -v' } } } post { always{ archiveArtifacts artifacts: 'dist/*.jar', fingerprint: true } } }
我解决了问题,然后在我的Jenkins构建输出中没有显示我的错误替换。所以环境步骤在Jenkinsfile中扮演更重要的角色。