Jenkins Pipeline中如何在阶段中覆盖全局“environment {}”变量

180次阅读
没有评论

问题描述

在设置一个自动化的Jenkins Pipeline时,希望根据Git分支动态地覆盖全局设置的environment {}变量。具体来说,用户在Jenkinsfile中有一个Env Setup阶段,根据Git分支给environment类型的变量(development/staging)赋值。现在,用户想在Migration阶段中根据环境类型动态地连接到开发或者暂存MongoDB服务器,并执行迁移操作。用户尝试从全局变量dev_mongo_urlstg_mongo_url中自动注入$mongo_url的值,但陷入了困境,不知道如何实现。

解决方案

在Jenkins Pipeline中,你可以使用动态的方式来设置环境变量,以满足你的需求。这里有一个示例代码,可以帮助你根据不同的分支动态地设置mongo_url变量:

pipeline {
    agent any
    environment {
        // 根据不同的分支设置不同的mongo_url
        mongo_url = sh(script: """
            if [[ "\$BRANCH_NAME" == "bugfix/"* || "\$BRANCH_NAME" == "feature/"* || "\$BRANCH_NAME" == "development" || "\$BRANCH_NAME" == "hotfix/"* ]]; then
                echo "YOUR_DEV_MONGO_URL_HERE"
            elif [[ "\$BRANCH_NAME" == "staging" ]]; then
                echo "YOUR_STAGING_MONGO_URL_HERE"
            fi
        """, returnStdout: true).trim()
    }
    stages {
        stage('Env Setup') {
            steps {
                script {
                    if (env.BRANCH_NAME ==~ /bugfix\/.*/ || env.BRANCH_NAME ==~ /feature\/.*/ || env.BRANCH_NAME == 'development' || env.BRANCH_NAME ==~ /hotfix\/.*/) {
                        env.environment = 'development'
                        echo 'Build & deployment to development environment'
                    }
                    if (env.BRANCH_NAME == 'staging') {
                        env.environment = 'staging'
                        echo 'Build & deployment to staging environment'
                    }
                }
            }
        }
        stage('Migration') {
            when {
                anyOf {
                    branch 'development'
                    branch 'feature/*'
                    branch 'staging'
                }
            }
            steps {
                echo "Installing the project NodeJS dependencies..."
                sh 'npm ci'
                echo "Executing the MongoDB migration script & displaying the status..."
                dir('db-migrations') {
                    sh 'npm ci'
                    sh('npm run migrate --silent -- --mongodb-url=$mongo_url')
                    sh 'npm run migrate:status'
                }
            }
        }
    }
}

在上面的示例中,我们首先在environment部分使用Shell脚本来根据不同的分支设置mongo_url变量。这个脚本通过检查BRANCH_NAME环境变量的值来决定使用哪个MongoDB服务器的URL。然后,在Migration阶段中,我们使用了$mongo_url来执行迁移操作。

请注意,这里使用了正则表达式来匹配分支名称,以支持类似bugfix/*feature/*这样的通配符匹配。你可以根据实际情况进行调整。

总之,通过动态设置环境变量,你可以在Jenkins Pipeline中根据不同的分支动态地覆盖全局的environment {}变量,实现你的需求。

正文完