Dir*_*kos 8 jenkins jenkins-pipeline
我想以某种方式将我在A阶段读到的变量传递给B阶段.我在一些例子中看到人们把它写到文件中,但我想这不是一个很好的解决方案.我尝试将它写入环境变量,但我并没有真正成功.如何正确设置?
为了使它工作,我尝试了很多东西,并且读到我应该使用""而不是'''来启动shell并将这些变量转义\${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}'
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的packageVersion
,我从舞台包中读到的包也需要在舞台发布中使用.
当然,对管道的总体提示也是受欢迎的.
tos*_*ske 16
代码中的一个问题是您在sh
步骤中分配环境变量的版本.此步骤将在其自己的独立进程中执行,继承父进程环境变量.
但是,将数据传递回父级的唯一方法是通过STDOUT/STDERR
或退出代码.如果需要字符串值,最好从sh
步骤中回显版本并将其分配给script
上下文中的变量.
如果重用该节点,脚本上下文将保持不变,并且变量将在后续阶段中可用.下面是一个工作示例.请注意,任何尝试将其置于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}"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)