Jenkinsfile声明性管道定义动态环境变量

DEL*_*DEL 45 jenkins jenkins-pipeline

我是jenkins管道的新手,我正在定义一个声明性语法管道,我不知道我是否可以解决我的问题,因为我找不到解决方案.

在这个例子中,我需要将一个变量传递给ansible插件(在旧版本中我使用ENV_VAR或者使用inject插件从文件中注入它,该变量来自脚本.

这是我完美的风景(但它不起作用,因为环境{}):

pipeline {
  agent { node { label 'jenkins-node'}}

  stages {
    stage('Deploy') {
      environment {
        ANSIBLE_CONFIG = '${WORKSPACE}/chimera-ci/ansible/ansible.cfg'
        VERSION = sh("python3.5 docker/get_version.py")
      }
      steps {
        ansiblePlaybook credentialsId: 'example-credential', extras: '-e version=${VERSION}', inventory: 'development', playbook: 'deploy.yml'
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我尝试了其他方法来测试env vars在其他帖子中的工作方式,例如:

pipeline {
  agent { node { label 'jenkins-node'}}

  stages {
    stage('PREPARE VARS') {
      steps {
        script {
          env['VERSION'] = sh(script: "python3.5 get_version.py")
        }
        echo env.VERSION
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但"echo env.VERSION"返回null.

还尝试了相同的例子: - VERSION = python3.5 get_version.py - VERSION = python3.5 get_version.py> props.file(并尝试注入它,但没有找到如何)

如果这是不可能的,我将在ansible角色中进行.

UPDATE

Ansible插件中还有另一个"问题",要在额外的变量中使用变量,它必须有双引号而不是单引号.

ansiblePlaybook credentialsId: 'example-credential', extras: "-e version=${VERSION}", inventory: 'development', playbook: 'deploy.yml'
Run Code Online (Sandbox Code Playgroud)

bur*_*ttk 95

您可以在管道块启动之前创建变量.您可以sh返回stdout以分配给这些变量.您没有相同的灵活性来分配给environment节中的环境变量.所以在python3.5 get_version.py这里替换echo 0.0.1脚本中的位置(并确保你的python脚本只是将版本返回到stdout):

def awesomeVersion = 'UNKNOWN'

pipeline {
  agent { label 'docker' }
  stages {
    stage('build') {
      steps {
        script {
          awesomeVersion = sh(returnStdout: true, script: 'echo 0.0.1')
        }
      }
    }
    stage('output_version') {
      steps {
        echo "awesomeVersion: ${awesomeVersion}"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

上述管道的输出是:

awesomeVersion: 0.0.1
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,我在管道块之前没有声明变量的情况下尝试了此操作,并且它也有效。我并不反对声明如图所示的变量,它明确表明它旨在用于多个阶段,只是想说它不是必需的。 (2认同)

Kev*_*ins 20

在Jenkins 2.76中,我能够将@burnettk的解决方案简化为:

pipeline {
  agent { label 'docker' }
  environment {
    awesomeVersion = sh(returnStdout: true, script: 'echo 0.0.1')
  }
  stages {
    stage('output_version') {
      steps {
        echo "awesomeVersion: ${awesomeVersion}"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 我试过这个,但如果我在output_verison阶段之前的另一个阶段设置了awesomeVersion,那就不会在变量中更新. (4认同)
  • 仍然 +1 b/c 知道您可以使用“sh”步骤设置环境变量是非常有用的。 (3认同)
  • 请注意,此解决方案不是Burnettk解决方案的简化。区别在于它设置环境变量。burnettk的解决方案使用Groovy变量。这就是为什么在另一个阶段进行更新无法按预期进行的原因。 (2认同)

小智 5

使用“管道实用程序步骤”插件,您可以从属性文件中定义可用于所有阶段的通用变量。例如,让props.txt为:

version=1.0
fix=alfa
Run Code Online (Sandbox Code Playgroud)

并将脚本和声明式 Jenkins 管道混合为:

def props
def VERSION
def FIX
def RELEASE

node {
   props = readProperties file:'props.txt'
   VERSION = props['version']
   FIX = props['fix']
   RELEASE = VERSION + "_" + FIX
}

pipeline {
   stages {
      stage('Build') {
         echo ${RELEASE}
      }
   }
}
Run Code Online (Sandbox Code Playgroud)