TeamCity 10.x执行Python2脚本时参数被识别为列表对象的问题
我来帮你解决这个TeamCity 10.x传递Maven构建参数到Python 2脚本时的列表格式问题,这确实是TeamCity参数处理的一个小坑,下面是具体的原因和解决方案:
问题根源
TeamCity里从Maven步骤生成的构建参数(比如%maven.project.version%)默认会被标记为列表类型,当你在命令行运行器的参数里直接引用它时,TeamCity会把这个列表以[ '2.141']这种字符串形式传给Python脚本,而不是我们需要的纯版本号字符串。再加上你的脚本里用了nargs=1的argparse配置,这会让参数被解析成单元素列表,最终导致Nexus URL里出现奇怪的括号格式。
两种可行解决方案
方案1:调整Python脚本的参数解析逻辑
你可以从脚本层面入手,适配TeamCity的参数格式:
- 去掉
nargs=1配置:如果这个参数只需要接收单个值,完全可以删掉nargs=1,argparse默认会把输入解析成字符串,这样不管是本地还是TeamCity传参都能正常工作:parser.add_argument('-mv', '--mvn_vrsn', type=str, default='2.140.0-SNAPSHOT', help='TCity: maven.project.version') - 保留
nargs=1但提取列表元素:如果因为某些原因必须保留nargs=1,那在获取参数时直接取列表的第一个元素就行:args = parser.parse_args() mvn_version = args.mvn_vrsn[0] # 把列表转成单个字符串 - 处理带括号的异常输入:如果TeamCity已经把参数传成了
[ '2.141']这种格式,你可以用字符串处理提取出里面的版本号:import re # 先判断参数是列表还是字符串,统一处理 raw_input = args.mvn_vrsn[0] if isinstance(args.mvn_vrsn, list) else args.mvn_vrsn # 用正则提取引号里的内容 mvn_version = re.search(r"'(.*?)'", raw_input).group(1)
方案2:在TeamCity里直接转换参数为字符串
更简单的方式是在TeamCity的命令行参数里直接处理,利用TeamCity的参数语法提取列表的第一个元素,这样脚本完全不用改:
把原来的脚本参数:
./some-python-script.py --mvn_version %maven.project.version% --artifact_id %maven.project.artifactId%
改成:
./some-python-script.py --mvn_version %maven.project.version[0]% --artifact_id %maven.project.artifactId[0]%
这样TeamCity会直接传递纯版本号字符串,和你在本地命令行运行的效果完全一致。
验证效果
不管用哪种方案,修改后再运行构建,Nexus URL都会正常显示为:https://nexus_server/nexus/service/local/repositories/myproject/content/my/maven/group/some_artifact/2.141
内容的提问来源于stack exchange,提问作者OneMoreNerd
相关产品推荐
相关产品推荐

