我想以某种方式将在阶段A中读取的变量传递给阶段B。在某些示例中,我看到人们将其写入文件中,但是我认为这并不是一个很好的解决方案。我尝试将其写入环境变量,但是在此方面我并没有真正成功。如何正确设置?
为了使它正常工作,我尝试了很多事情,并读到我应该使用“””而不是“’‘来启动外壳程序并将这些变量转义\${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中 使用。
当然,总会欢迎针对管道的总体技巧。
代码中的问题是您正在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}"
}
}
}
}
}
问题内容: 运行带有包含多个节点的阶段的Jenkins管道(基于Groovy),我需要将列表从stageA上NodeA上的某个文件传递到StageB上的nodeB。 在stageA NodeA中,我运行 在stageB,我跑步 到目前为止,我已经在控制台中获得了输出。 现在如何将其输出传递到文件? 不能解决问题:-( 我敢肯定这没什么大不了的,但是我已经花了几个小时来搅动互联网,但无济于事。 问题
问题内容: 我有一个运行Jenkins的节点,该节点使用Maven构建代码。Jenkins作业是声明性管道脚本。Maven需要从需要证书才能访问的私有存储库中下载依赖项。凭证存储在Jenkins凭证管理器中。 我如何将这些凭据传递给Maven,以便Maven可以使用这些凭据从私有存储库正确下载依赖项。 问题答案: 通过将Jenkins凭证注入您的环境,然后将这些凭证传递给Maven,您可以使用Je
问题内容: 我有一个詹金斯工作,带有“主动选择参数”和“主动选择反应参数”。 我试图调用詹金斯的工作,并使用管道脚本传递参数值。但是,我收到以下错误: 参数’ActiveChoicesParam’不具有App_Build期望的类型。转换为有效选择参数。 参数’ActiveChoicesReactiveParam’不具有App_Build期望的类型。转换为活动选择反应参数。 它们(Dev和Serve
问题内容: 我的用例是构建一个Java作业,将tar.gz.zip部署到nexus,并将该工件URL传递到进一步的阶段。 我在执行其他验证的脚本中使用以下命令: 以下是我的阶段: 我不想使用“ archiveartifacts”,因为我已经存储了工件,所以我不想对其进行存档。我只需要URL。 到目前为止,我所能做的就是将部署的全部输出输出到一个文本文件中。 但是,新文件(deploy.txt)不适
有没有可能让詹金斯使用真正的浏览器而不是无头浏览器?我正在运行一些用TestNG编写的测试(使用Selenium webdriver)。当我运行testng时。在Eclipse中,浏览器启动并运行测试。但当我使用Jenkins并用maven运行测试时,它不会启动任何浏览器。
问题内容: 考虑一个詹金斯管道有两个阶段, A阶段 则 B阶段 。 在阶段B中,是否可以为某些特定文本解析阶段A的日志? 问题答案: 自7月28日以来已有更新! 正如mentionned 这个答案,作为2.4版本的_管道:节点和进程_ ,你可以使用: 至少,与输出到文件然后读取文件相比,它更加简单和干净。