How to pass dynamic values to an environment block during the pipeline execution in Jenkins?

人盡茶涼 提交于 2020-05-17 07:12:05

问题


This is related to one question I asked before: Using groovy to parse JSON object in shell scripts for Jenkin

basically I will need to pass a dynamic value as returned from sh scripts to an environment block, so that the following stage can re-use that value and pass the version as a label to JIRA plugin called Xray. But I aware that I cannot pass dynamic values to an environment block during the pipeline execution. So, I think I am going to need try a different route for that, not sure if anyone could give me some tips please?

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 response looks like that:

{"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"}

and there is an environment block where I would like to pass the value to one of the variable defined there@

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 = ''
}

If this path not working, what else could I use? Want to re-use the latest version taken from JSON response for the next stage in the pipeline to use. Next stage looks like this:

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)
            }
        }

Sorry I have to put xxxx to make this question general due to project confidentiality.


回答1:


To put it simple, you want to use the version you fetched from a JSON response and want to use it in all stages of your Jenkins pipeline.

Ensure you've jq utility installed in your jenkins agent.

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}"
            }
        }
    }     
}

You can use the variable ${XRAY_LATEST_VERSION} in any stages you want the and the value will be rendered across.



来源:https://stackoverflow.com/questions/61658578/how-to-pass-dynamic-values-to-an-environment-block-during-the-pipeline-execution

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!