如何用单条awk命令基于version.text替换build.xml的版本信息
搞定Jenkins Pipeline里替换build.xml版本号的单条命令方案
为啥你之前的命令不行?
你之前尝试的两条awk命令存在语法问题——没有正确把version.text的内容传递给awk的替换逻辑,而且分两次处理既麻烦又不够高效。咱们直接整个单条命令,一次性搞定versionCode和versionName的替换,还能直接在Jenkins Pipeline里跑。
先明确前提:假设你的version.text是两行格式,第一行是versionCode(比如1044),第二行是versionName(比如1.20.10);build.xml里的defaultConfig块内有versionCode 数字和versionName "字符串"这样的行。
直接能用的单条命令
这条awk命令可以一次性完成两个字段的替换,处理完直接覆盖原文件:
awk 'NR==FNR{if(NR==1)vc=$0;if(NR==2)vn=$0;next} /defaultConfig/{in_block=1} in_block&&/versionCode/{sub(/versionCode [0-9]+/, "versionCode " vc);in_block=0} in_block&&/versionName/{sub(/versionName "[^"]+"/, "versionName \"" vn "\"")} 1' /opt/scripts/version.text build.xml > tmp && mv tmp build.xml
拆解开讲下逻辑
- 读取version.text:
NR==FNR是awk的经典用法,先读第一个文件(version.text),把第一行存成变量vc(对应versionCode),第二行存成vn(对应versionName),然后next跳过后续处理,转去读build.xml。 - 定位defaultConfig块:当匹配到
defaultConfig行时,标记in_block=1,表示进入了要修改的代码块。 - 替换versionCode:在目标块内匹配到
versionCode行时,用sub把原来的数字替换成vc里存的新值,然后把in_block设为0(如果versionCode在defaultConfig里只出现一次的话,避免误改其他地方)。 - 替换versionName:同理,匹配到
versionName行时,替换引号里的内容,注意要转义引号\"保证格式正确。 - 输出所有行:最后的
1是awk的简写,意思是打印每一行,处理后的内容会输出到临时文件tmp,再替换原build.xml。
Jenkins Pipeline里怎么写?
直接把命令放到sh步骤里就行,记得加#!/bin/bash -xe方便调试查看执行过程:
pipeline { agent any stages { stage('Update Build Version') { steps { sh '''#!/bin/bash -xe awk 'NR==FNR{if(NR==1)vc=$0;if(NR==2)vn=$0;next} /defaultConfig/{in_block=1} in_block&&/versionCode/{sub(/versionCode [0-9]+/, "versionCode " vc);in_block=0} in_block&&/versionName/{sub(/versionName "[^"]+"/, "versionName \"" vn "\"")} 1' /opt/scripts/version.text build.xml > tmp && mv tmp build.xml ''' } } } }
如果你的version.text是键值对格式?
要是version.text里是versionCode=1044、versionName=1.20.10这种键值对,稍微改下awk读取部分就行:
awk 'NR==FNR{if($0~/versionCode=/)vc=substr($0,index($0,"=")+1);if($0~/versionName=/)vn=substr($0,index($0,"=")+1);next} /defaultConfig/{in_block=1} in_block&&/versionCode/{sub(/versionCode [0-9]+/, "versionCode " vc);in_block=0} in_block&&/versionName/{sub(/versionName "[^"]+"/, "versionName \"" vn "\"")} 1' /opt/scripts/version.text build.xml > tmp && mv tmp build.xml
小提醒
- 确保Jenkins节点能访问到
/opt/scripts/version.text和build.xml这两个文件,且有读写权限。 - 如果
defaultConfig块里versionCode和versionName的顺序反过来,把in_block=0移到versionName的替换逻辑里就行,或者直接去掉in_block=0(只要保证defaultConfig里只有这两个要替换的行)。
内容的提问来源于stack exchange,提问作者user565
相关产品推荐
相关产品推荐

