在TeamCity工作中,我试图从根pom.xml
读取Maven项目版本,例如1.0.0-SNAPSHOT
并将内部版本号更改为1.0.0-N
,其中N
的值为%build.counter%
。目标是用构建标识符替换SNAPSHOT
。
到目前为止,我尝试将build-helper:parse-version
和exec:exec
结合起来调用echo
在构建日志中编写##teamcity[buildNumber '1.0.0-1']
并更改内部版本号。
在我的工作站上,我可以执行以下Maven命令在命令行中打印##teamcity
指令:
mvn build-helper:parse-version exec:exec \
-Dexec.executable="echo" \
-Dexec.args="##teamcity[buildNumber '${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}-%build.counter%']"
但是当我在TeamCity构建中定义Maven Step时,TeamCity直接从构建日志中打印的Maven命令行调用中解析##teamcity
指令,导致跟随Maven调用:
mvn build-helper:parse-version exec:exec \
-Dexec.executable="echo" \
-Dexec.args=""
以及TeamCity完成后:
##teamcity[buildNumber '${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}-11']
是否有办法在Maven命令行调用中转义包含##teamcity
的参数,以便TeamCity在Maven调用期间忽略它,但将其传递给exec:exec
Maven目标,以便输出:
##teamcity[buildNumber '1.0.0-11']
如果有更简单的方法可以使用TeamCity构建步骤实现我的目标而无需修改项目的pom.xml
,请告诉我。我是否必须使用PowerShell或Batch脚本?
答案 0 :(得分:1)
有趣的用例。我尝试过这个并获得了积极的结果。 echo命令省略了最终输出中的单引号,所以我从未设法让TeamCity使用服务消息。
我没有调用Maven构建步骤,而是定义了启动脚本的命令行构建步骤。脚本任务是生成所需的输出:
##teamcity[buildNumber '1.0.0-61']
脚本本身很难看,但有点有用。也许你可以提出更优雅的解决方案:
#!/bin/bash
export ARGUMENTS="teamcity[buildNumber 'Q\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.
mvn build-helper:parse-version exec:exec -Dexec.executable="echo" -Dexec.args="$ARGUMENTS" | grep teamcity | sed "s/Q/\'/g" | awk '{print "##"$0}'
出于某种原因,如果我把##放在初始字符串中并且在命令序列的末尾没有使用awk,那么它没有工作,我最终得到的结果如&# 39; 1.0.0 - ???',因此在最后用awk破解。
希望这有帮助。