Jenkins Pipeline重复环境变量导出代码的复用优化方案咨询
解决Jenkins Pipeline环境变量代码冗余问题
在Jenkins Pipeline中,通过if条件调用不同bash脚本时,每个sh块重复导出相同环境变量会导致代码冗余。以下是针对该问题的分析及正确实现方案:
初始可运行代码
pipeline { agent any stages { stage('Stage 1') { steps { script { withCredentials([ gitUsernamePassword(credentialsId: 'jenkins-credentials', gitToolName: 'Default', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD') ]) { sh '''#!/bin/bash export GIT_USERNAME=${GIT_USERNAME}; export GIT_PASSWORD=${GIT_PASSWORD}; export PROYECT_DIRECTORY=${PROYECT_DIRECTORY}; export CHECKOUT_POINT=${CHECKOUT_POINT}; export GIT_HTTPS_REPO_DEPLOY=${GIT_HTTPS_REPO_DEPLOY}; export MARIADB_HOSTNAME=${MARIADB_HOSTNAME}; ./scripts/awesome_script.sh ''' } } } } } }
添加条件判断后的冗余代码
script { withCredentials([ gitUsernamePassword(credentialsId: 'jenkins-credentials', gitToolName: 'Default', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD') ]) { sh '''#!/bin/bash export GIT_USERNAME=${GIT_USERNAME}; export GIT_PASSWORD=${GIT_PASSWORD}; export PROYECT_DIRECTORY=${PROYECT_DIRECTORY}; export CHECKOUT_POINT=${CHECKOUT_POINT}; export GIT_HTTPS_REPO_DEPLOY=${GIT_HTTPS_REPO_DEPLOY}; export MARIADB_HOSTNAME=${MARIADB_HOSTNAME}; ./scripts/awesome_script.sh ''' if(env.APP_ENV == 'testing'){ sh '''#!/bin/bash export GIT_USERNAME=${GIT_USERNAME}; export GIT_PASSWORD=${GIT_PASSWORD}; export PROYECT_DIRECTORY=${PROYECT_DIRECTORY}; export CHECKOUT_POINT=${CHECKOUT_POINT}; export GIT_HTTPS_REPO_DEPLOY=${GIT_HTTPS_REPO_DEPLOY}; export MARIADB_HOSTNAME=${MARIADB_HOSTNAME}; ./scripts/awesome_script_2.sh ''' } } }
存在语法问题的复用尝试
原写法使用三重单引号(Groovy纯字符串),无法插值STRING_BLOCK_WITHOUT_PROCESSING变量,导致bash执行时无法识别该变量:
script { env.STRING_BLOCK_WITHOUT_PROCESSING = ''' export GIT_USERNAME=${GIT_USERNAME}; export GIT_PASSWORD=${GIT_PASSWORD}; export PROYECT_DIRECTORY=${PROYECT_DIRECTORY}; export CHECKOUT_POINT=${CHECKOUT_POINT}; export GIT_HTTPS_REPO_DEPLOY=${GIT_HTTPS_REPO_DEPLOY}; export MARIADB_HOSTNAME=${MARIADB_HOSTNAME}; '''; withCredentials([ gitUsernamePassword(credentialsId: 'jenkins-credentials', gitToolName: 'Default', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD') ]) { sh '''#!/bin/bash ${STRING_BLOCK_WITHOUT_PROCESSING} ./scripts/awesome_script.sh ''' if(env.APP_ENV == 'testing'){ sh '''#!/bin/bash ${STRING_BLOCK_WITHOUT_PROCESSING} ./scripts/awesome_script_2.sh ''' } } }
正确实现方案
方案1:Groovy字符串变量+双引号插值
定义可复用的环境导出语句为Groovy变量,在sh块中使用双引号让Groovy完成变量插值:
script { // 定义复用的导出语句,trim()去除首尾空白避免无效空行 def envExports = ''' export GIT_USERNAME=${GIT_USERNAME}; export GIT_PASSWORD=${GIT_PASSWORD}; export PROYECT_DIRECTORY=${PROYECT_DIRECTORY}; export CHECKOUT_POINT=${CHECKOUT_POINT}; export GIT_HTTPS_REPO_DEPLOY=${GIT_HTTPS_REPO_DEPLOY}; export MARIADB_HOSTNAME=${MARIADB_HOSTNAME}; '''.trim() withCredentials([ gitUsernamePassword(credentialsId: 'jenkins-credentials', gitToolName: 'Default', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD') ]) { sh """#!/bin/bash ${envExports} ./scripts/awesome_script.sh """ if(env.APP_ENV == 'testing'){ sh """#!/bin/bash ${envExports} ./scripts/awesome_script_2.sh """ } } }
方案2:利用Jenkins自动环境变量传递
Jenkins会自动将Pipeline上下文的env变量注入到sh执行的shell环境中,无需手动export,直接在脚本中使用即可:
script { withCredentials([ gitUsernamePassword(credentialsId: 'jenkins-credentials', gitToolName: 'Default', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD') ]) { // 无需手动export,脚本内直接用$GIT_USERNAME等变量 sh '''#!/bin/bash ./scripts/awesome_script.sh ''' if(env.APP_ENV == 'testing'){ sh '''#!/bin/bash ./scripts/awesome_script_2.sh ''' } } }
方案3:封装为Groovy函数
将带环境变量的脚本执行逻辑封装成函数,进一步提升复用性:
script { // 定义通用执行函数,接收脚本路径参数 def runScriptWithEnv(scriptPath) { sh """#!/bin/bash export GIT_USERNAME=${GIT_USERNAME}; export GIT_PASSWORD=${GIT_PASSWORD}; export PROYECT_DIRECTORY=${PROYECT_DIRECTORY}; export CHECKOUT_POINT=${CHECKOUT_POINT}; export GIT_HTTPS_REPO_DEPLOY=${GIT_HTTPS_REPO_DEPLOY}; export MARIADB_HOSTNAME=${MARIADB_HOSTNAME}; ./scripts/${scriptPath} """ } withCredentials([ gitUsernamePassword(credentialsId: 'jenkins-credentials', gitToolName: 'Default', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD') ]) { runScriptWithEnv('awesome_script.sh') if(env.APP_ENV == 'testing'){ runScriptWithEnv('awesome_script_2.sh') } } }
内容的提问来源于stack exchange,提问作者navebinario
相关产品推荐
相关产品推荐

