我想以某种方式将在阶段A中读取的变量传递给阶段B。在某些示例中,我看到人们将其写入文件中,但是我认为这并不是一个很好的解决方案。我尝试将其写入环境变量,但是在此方面我并没有真正成功。如何正确设置?
为了使它正常工作,我尝试了很多事情,并读到我应该使用“””而不是“’‘来启动外壳程序并将这些变量转义\${foo}为例如。
\${foo}
以下是我拥有的管道:
#!/usr/bin/env groovy pipeline { agent { node { label 'php71' } } environment { packageName='my-package' packageVersion='' groupId='vznl' nexus_endpoint='http://nexus.devtools.io' nexus_username='jenkins' nexus_password='J3nkins' } stages{ // Package dependencies stage('Install dependencies') { steps { sh ''' echo Skip composer installation #composer install --prefer-dist --optimize-autoloader --no-interaction ''' } } // Unit tests stage('Unit Tests') { steps { sh ''' echo Running PHP code coverage tests... #composer test ''' } } // Create artifact stage('Package') { steps { echo 'Create package refs' sh """ mkdir -p ./build/zpk VERSIONTAG=\$(grep 'version' composer.json) REGEX='"version": "([0-9]+.[0-9]+.[0-9]+)"' if [[ \${VERSIONTAG} =~ \${REGEX} ]] then env.packageVersion=\${BASH_REMATCH[1]} /usr/bin/zs-client packZpk --folder=. --destination=./build/zpk --name=${env.packageName}-${env.packageVersion}.zpk --version=${env.packageVersion} else echo "No version found!" exit 1 fi """ } } // Publish ZPK package to Nexus stage('Publish packages') { steps { echo "Publish ZPK Package" sh "curl -u ${env.nexus_username}:${env.nexus_password} --upload-file ./build/zpk/${env.packageName}-${env.packageVersion}.zpk ${env.nexus_endpoint}/repository/zpk-packages/${groupId}/${env.packageName}-${env.packageVersion}.zpk" archive includes: './build/**/*.{zpk,rpm,deb}' } } } }
如您所见packageVersion,我从阶段 Package中 读取的内容也需要在阶段 Publish中 使用。
packageVersion
当然,总会欢迎针对管道的总体技巧。
代码中的问题是您正在sh步骤中分配环境变量的版本。此步骤将在其自己的隔离流程中执行,并继承父流程环境变量。
sh
但是,将数据传递回父级的唯一方法是通过STDOUT/STDERR或退出代码。当您需要一个字符串值时,最好从sh步骤中回显版本并将其分配给script上下文中的变量。
STDOUT/STDERR
script
如果您重复使用该节点,则脚本上下文将持久存在,并且变量将在后续阶段中可用。下面是一个工作示例。请注意,任何将其放在一个parallel块中的尝试都可能会失败,因为版本信息变量可以由多个进程写入。
parallel
#!/usr/bin/env groovy pipeline { environment { AGENT_INFO = '' } agent { docker { image 'alpine' reuseNode true } } stages { stage('Collect agent info'){ steps { echo "Current agent info: ${env.AGENT_INFO}" script { def agentInfo = sh script:'uname -a', returnStdout: true println "Agent info within script: ${agentInfo}" AGENT_INFO = agentInfo.replace("/n", "") env.AGENT_INFO = AGENT_INFO } } } stage("Print agent info"){ steps { script { echo "Collected agent info: ${AGENT_INFO}" echo "Environment agent info: ${env.AGENT_INFO}" } } } } }