如何在Jenkins Pipeline中替换子字符串处理GIT_BRANCH变量
Jenkins Pipeline中Bash字符串替换命令失效的解决方法
在Bash环境中,可通过以下命令将origin/docker格式的分支名提取出docker部分:
user@localhost MINGW64 ~ $ echo $GIT_BRANCH origin/docker $ GIT_BRANCH_NAME="${GIT_BRANCH/origin\/}" $ echo $GIT_BRANCH_NAME docker
但将相同命令直接放到Jenkins Pipeline脚本中时:
GIT_BRANCH_NAME="${GIT_BRANCH/origin\/}"
会触发Groovy编译错误,日志如下:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: WorkflowScript: 38: unexpected char: '\' @ line 38, column 53. ANCH_NAME="${GIT_BRANCH/origin\/}
原因是Jenkins Pipeline基于Groovy解析,反斜杠会被Groovy当作转义符处理,导致Bash的字符串替换语法无法正常识别。
正确解决方案
通过Groovy的字符串替换方法先处理分支名,再将结果存入环境变量,后续在Shell步骤中直接使用该变量即可。同时该方案还支持处理bugfix/、feature/等其他分支前缀:
script { env.GIT_BRANCH_NAME = "" String gitBranchName = env.GIT_BRANCH.replaceFirst('^origin/', '') env.GIT_BRANCH_NAME = gitBranchName.replaceFirst('^bugfix/', 'bugfix-') env.GIT_BRANCH_NAME = gitBranchName.replaceFirst('^feature/', 'feature-') env.GIT_BRANCH_NAME = gitBranchName.replaceFirst('^hotfix/', 'hotfix-') env.GIT_BRANCH_NAME = gitBranchName.replaceFirst('^release/', 'release-') }
之后在Shell步骤中使用GIT_BRANCH_NAME变量完成制品上传:
sh ''' mv ${GIT_COMMIT}.zip app_${GIT_BRANCH_NAME}_${GIT_COMMIT}.zip curl -u JFROG_USR:JFROG_PSW -T app_${GIT_BRANCH_NAME}_${GIT_COMMIT}.zip "some-jfrog-artifctory-url/${BUILD_NUMBER}/app_${GIT_BRANCH_NAME}_${GIT_COMMIT}.zip;git.branch.name=${GIT_BRANCH};git.commit.id=${GIT_COMMIT};jenkins.build.url=${BUILD_URL}" rm -rf app_${GIT_BRANCH_NAME}_${GIT_COMMIT}.zip '''
内容的提问来源于stack exchange,提问作者Ranjeet
相关产品推荐
相关产品推荐

