使用Maven exec设置TeamCity作业内部版本号:exec

时间:2018-04-20 13:41:41

标签: windows maven teamcity

在TeamCity工作中,我试图从根pom.xml读取Maven项目版本,例如1.0.0-SNAPSHOT并将内部版本号更改为1.0.0-N,其中N的值为%build.counter%。目标是用构建标识符替换SNAPSHOT

到目前为止,我尝试将build-helper:parse-versionexec: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脚本?

1 个答案:

答案 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破解。

希望这有帮助。

Results in TeamCity