在詹金斯的管道执行期间如何将动态值传递给环境块?
How to pass dynamic values to an environment block during the pipeline execution in Jenkins?
这与我之前问过的一个问题有关:
基本上我需要将从 sh 脚本返回的动态值传递给环境块,以便下一阶段可以重新使用该值并将版本作为标签传递给名为 Xray 的 JIRA 插件。但我知道我无法在管道执行期间将动态值传递给环境块。所以,我想我需要为此尝试不同的路线,不确定是否有人可以给我一些提示?
def setLatestAppVersionLabel() {
def response = sh(script: "curl --silent ${APP_ARTIFACTORY_URL}/${XRAY_PLATFORM}/builds/latest.json", returnStdout: true).trim() as String
def jsonResponse = readJSON text: response
LATEST_VERSION = jsonResponse.id
echo "LATEST_VERSION -> ${LATEST_VERSION}"
}
JSON 响应看起来像这样:
{"id":"1.0.0-6",
"version":"1.0.0",
"build":6,
"tag":"android-v1.0.0-6",
"commitHash":"5a78c4665xxxxxxxxxxe1b62c682f84",
"dateCreated":"2020-03-02T08:11:29.912Z"}
并且有一个环境块,我想将值传递给其中定义的变量之一@
environment {
AWS_DEFAULT_REGION = 'uk-xxx'
XRAY_ENVIRONMENT = 'e2e'
VERSION_KEY = 'id'
XRAY_PLATFORM = 'Android'
APP_ARTIFACTORY_URL = 'https://artifactory.example.com/mobile'
LATEST_VERSION = ''
}
如果这条路不行,我还能用什么?想要重新使用取自 JSON 响应的最新版本以供管道中的下一阶段使用。
下一阶段如下所示:
stage('Import Result to Xray') {
when {
expression { return fileExists('xxx-executor/target/AndroidxxxxE2EResults/cucumber-reports/Cucumber.json')}
}
steps {
xrayResultsImport('xxx-executor/target/AndroidxxxxxE2EResults/cucumber-reports/Cucumber.json', 'xxx_ANDROID_E2E_xxxxxxx_Tests', XRAY_LABELS, ['E2E', 'Android', LATEST_VERSION], env.BUILD_URL)
}
}
抱歉,由于项目机密性,我不得不将 xxxx 设为通用问题。
简单来说,您想使用从 JSON 响应中获取的版本,并希望在 Jenkins 管道的所有阶段使用它。
确保您的 jenkins 代理中安装了 jq
实用程序。
pipeline {
agent any
environment {
XRAY_LATEST_VERSION = ''
}
stages {
stage(‘Get Version ') {
steps {
script {
XRAY_LATEST_VERSION = sh(script: 'curl -s ${APP_ARTIFACTORY_URL}/${XRAY_PLATFORM}/builds/latest.json | jq .version | sed \'s/"//g\'', returnStdout: true).trim()
}
}
}
stage('Print'){
steps{
echo "${XRAY_LATEST_VERSION}"
}
}
}
}
您可以在您想要的任何阶段使用变量 ${XRAY_LATEST_VERSION}
,值将在整个阶段呈现。
这与我之前问过的一个问题有关:
基本上我需要将从 sh 脚本返回的动态值传递给环境块,以便下一阶段可以重新使用该值并将版本作为标签传递给名为 Xray 的 JIRA 插件。但我知道我无法在管道执行期间将动态值传递给环境块。所以,我想我需要为此尝试不同的路线,不确定是否有人可以给我一些提示?
def setLatestAppVersionLabel() {
def response = sh(script: "curl --silent ${APP_ARTIFACTORY_URL}/${XRAY_PLATFORM}/builds/latest.json", returnStdout: true).trim() as String
def jsonResponse = readJSON text: response
LATEST_VERSION = jsonResponse.id
echo "LATEST_VERSION -> ${LATEST_VERSION}"
}
JSON 响应看起来像这样:
{"id":"1.0.0-6",
"version":"1.0.0",
"build":6,
"tag":"android-v1.0.0-6",
"commitHash":"5a78c4665xxxxxxxxxxe1b62c682f84",
"dateCreated":"2020-03-02T08:11:29.912Z"}
并且有一个环境块,我想将值传递给其中定义的变量之一@
environment {
AWS_DEFAULT_REGION = 'uk-xxx'
XRAY_ENVIRONMENT = 'e2e'
VERSION_KEY = 'id'
XRAY_PLATFORM = 'Android'
APP_ARTIFACTORY_URL = 'https://artifactory.example.com/mobile'
LATEST_VERSION = ''
}
如果这条路不行,我还能用什么?想要重新使用取自 JSON 响应的最新版本以供管道中的下一阶段使用。 下一阶段如下所示:
stage('Import Result to Xray') {
when {
expression { return fileExists('xxx-executor/target/AndroidxxxxE2EResults/cucumber-reports/Cucumber.json')}
}
steps {
xrayResultsImport('xxx-executor/target/AndroidxxxxxE2EResults/cucumber-reports/Cucumber.json', 'xxx_ANDROID_E2E_xxxxxxx_Tests', XRAY_LABELS, ['E2E', 'Android', LATEST_VERSION], env.BUILD_URL)
}
}
抱歉,由于项目机密性,我不得不将 xxxx 设为通用问题。
简单来说,您想使用从 JSON 响应中获取的版本,并希望在 Jenkins 管道的所有阶段使用它。
确保您的 jenkins 代理中安装了 jq
实用程序。
pipeline {
agent any
environment {
XRAY_LATEST_VERSION = ''
}
stages {
stage(‘Get Version ') {
steps {
script {
XRAY_LATEST_VERSION = sh(script: 'curl -s ${APP_ARTIFACTORY_URL}/${XRAY_PLATFORM}/builds/latest.json | jq .version | sed \'s/"//g\'', returnStdout: true).trim()
}
}
}
stage('Print'){
steps{
echo "${XRAY_LATEST_VERSION}"
}
}
}
}
您可以在您想要的任何阶段使用变量 ${XRAY_LATEST_VERSION}
,值将在整个阶段呈现。