如何在Jenkinsfile的脚本块中创建环境变量(声明性)

时间:2017-07-21 19:49:10

标签: maven jenkins groovy continuous-integration environment-variables

我正在为一个maven项目的CICD编写一个声明性的Jenkins管道。我设置了一个名为REL_VER的环境变量,它可以采用0.1-rc10.20-alpha10.15-beta2等形式。

  environment {
        REL_VER = '0.1-alpha1'
        DEV_VER = '0.1-SNAPSHOT'    
    } 

我需要拆分REL_VER并将名为osgi_ver的第一个元素传递给我在steps中运行的shell命令,以根据{的答案替换Java文件中的单词{3}}

   stages {
        stage('package') {
            steps {
                script {
                    def vars = Jenkins.instance.getGlobalNodeProperties()[0].getEnvVars()
                    def osgi_ver = vars['REL_VER'].tokenize('-')[0]
                }
                sh "echo ${osgi_ver}"

                withMaven(
                    maven: 'maven-3.3.9',
                    mavenSettingsConfig: 'dist-maven-settings',
                    mavenLocalRepo: '.m2repo') {   

                    sshagent (credentials: ['dist-serv']) { 
                        sh "sed -i '/setSystemExtraPackages/s/.*/\t\t.setSystemExtraPackages(new String[]{\"com.xxx;version=${osgi_ver}\"}));/' DsgPluginTest.java"

但是我收到错误org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use staticMethod jenkins.model.Jenkins getInstance

操作env var并将创建的var作为参数发送给声明性管道中的后续步骤的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

它不允许您拨打Jenkins.instance。但是,您不需要这样做来获取环境变量。 env.REL_VER可以这样工作:

pipeline {
  agent { label 'docker' }
  environment {
    REL_VER = '0.1-alpha1'
  }
  stages {
    stage('build') {
      steps {
        script {
          def osgi_ver = env.REL_VER.tokenize('-')[0]
          echo "osgi_ver in script block: ${osgi_ver}"
          withMaven(maven: 'maven-3.3.9', mavenSettingsConfig: 'dist-maven-settings', mavenLocalRepo: '.m2repo') {
            sshagent (credentials: ['dist-serv']) {
              sh "sed -i '/setSystemExtraPackages/s/.*/\t\t.setSystemExtraPackages(new String[]{\"com.xxx;version=${osgi_ver}\"}));/' DsgPluginTest.java"
            }
          }
        }
      }
    }
  }
}

请注意,如果您要在script块中定义局部变量,则对它的所有引用也必须位于同一script块中。