有没有办法在 Jenkins stage lock 选项中使用运行时环境变量?

问题描述 投票:0回答:1

我在 Jenkins 声明性管道的阶段上设置锁定时遇到问题。 我想在锁中使用我仅在运行时知道的环境变量(由前一阶段设置)。 如果我只是在锁名称中使用 ${env.myvar} ,它会显示“null”。

这是我到目前为止所做的(我尝试尽可能简化管道,因为它很大,但我保留了有意义的部分):

import hudson.console.*

pipeline {
    agent none
    stages {
        stage('Init') {
            stages{
                stage('init_1') {
                    steps {
                        script {
                          env.MYVAR = "value"
                        }
                    }
                }
                stage('init_2') {
                    steps {
                        print("${env.MYVAR}")
                    }
                   // other init stuff
                }
            }
        }

        stage('run') {
            agent any

            options {
                lock resource: "${env.MYVAR}"
            }

            stages {
                stage('actually do stuff') {
                    steps {
                        print("${env.MYVAR}")
                    }
                }
            }
        }
    }
}

该脚本的输出是:

10:30:47  [Pipeline] Start of Pipeline
10:30:47  [Pipeline] stage
10:30:47  [Pipeline] { (Init)
10:30:47  [Pipeline] stage
10:30:47  [Pipeline] { (init_1)
10:30:47  [Pipeline] script
10:30:47  [Pipeline] {
10:30:47  [Pipeline] }
10:30:47  [Pipeline] // script
10:30:47  [Pipeline] }
10:30:47  [Pipeline] // stage
10:30:47  [Pipeline] stage
10:30:47  [Pipeline] { (init_2)
10:30:47  [Pipeline] echo
10:30:47  value
10:30:47  [Pipeline] }
10:30:47  [Pipeline] // stage
10:30:47  [Pipeline] }
10:30:47  [Pipeline] // stage
10:30:47  [Pipeline] stage
10:30:47  [Pipeline] { (run)
10:30:47  [Pipeline] lock
10:30:47  Trying to acquire lock on [null]
10:30:47  Resource [null] did not exist. Created.
10:30:47  Lock acquired on [null]
10:30:47  [Pipeline] {
10:30:48  [Pipeline] node
10:30:48  Running on Jenkins in /var/jenkins_home/workspace/Pipeline for tests
10:30:48  [Pipeline] {
10:30:48  [Pipeline] stage
10:30:48  [Pipeline] { (actually do stuff)
10:30:48  [Pipeline] echo
10:30:48  value
10:30:48  [Pipeline] }
10:30:48  [Pipeline] // stage
10:30:48  [Pipeline] }
10:30:48  [Pipeline] // node
10:30:48  [Pipeline] }
10:30:48  Lock released on resource [null]
10:30:48  [Pipeline] // lock
10:30:48  [Pipeline] }
10:30:48  [Pipeline] // stage
10:30:48  [Pipeline] End of Pipeline
10:30:48  Finished: SUCCESS
jenkins-pipeline jenkins-groovy
1个回答
0
投票

尝试使用 Groovy 变量来代替:

// Jenkinsfile

def myvar

pipeline {
    agent none
    stages {
        stage('Init') {
            stages{
                stage('init_1') {
                    steps {
                        script {
                            myvar = "value"
                        }
                    }
                }
                stage('init_2') {
                    steps {
                        print("${myvar}")
                    }
                   // other init stuff
                }
            }
        }

        stage('run') {
            agent any

            options {
                lock resource: "${myvar}"
            }

            stages {
                stage('actually do stuff') {
                    steps {
                        print("${myvar}")
                    }
                }
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.