0

我正在使用 git log 为我的项目更新 release_notes。当我在我的 mac 笔记本电脑上运行下面的脚本时,一切都按预期工作,当我在 centos 上运行的 jenkins 上运行时,我看到以下执行顺序:

脚本

...
FILE=RELEASE_NOTES
TMP_FILE=${FILE}.tmp
VERSION=$(cat pom.xml | grep "<version>" | head -n1 | sed -e "s/.*\>\(.*\)\<.*/\1/" | tr -d "\-SNAPSHOT")
NAME=$(cat pom.xml | grep "<artifactId>" | head -n1 | sed -e "s/.*\>\(.*\)\<.*/\1/")

echo "$NAME-${VERSION}" > ${TMP_FILE}
git log --pretty="%x09* [%h] %s." $(git describe --abbrev=0)..HEAD >> ${TMP_FILE}

echo "" >> ${TMP_FILE}

if [ -e $FILE ]; then
  cat ${FILE} >> ${TMP_FILE}
fi

mv ${TMP_FILE} $FILE
...

使用 #!/bin/bash -x 运行时 jenkins 的输出

+ FILE=RELEASE_NOTES
+ TMP_FILE=RELEASE_NOTES.tmp
++ tr -d '\-SNAPSHOT'
++ head -n1
++ cat pom.xml
++ sed -e 's/.*\>\(.*\)\<.*/\1/'
++ grep '<version>'
+ VERSION='</'
++ head -n1
++ sed -e 's/.*\>\(.*\)\<.*/\1/'
++ cat pom.xml
++ grep '<artifactId>'
+ NAME='</'
+ echo '</-</'
++ git describe --abbrev=0

我无法弄清楚为什么执行顺序会发生变化。有什么想法吗?

4

3 回答 3

3

我没有看到任何不一致之处。您在子 shell 中运行了几个命令(当它设置 VERSION 和 NAME 时),并且必须在分配变量之前执行这些命令,所以上面的 /bin/bash -x 输出是我希望看到的。

如果您正在讨论每个管道中的命令顺序,请记住它们都是同时运行的,并且 可能未指定确切的启动顺序。

于 2013-06-14T22:23:09.597 回答
1

管道中各个命令的启动顺序(这set -x是向您显示的)并不重要。数据仍然从左向右流动。但是,您可以使用单个调用grep而不是管道来设置变量。(这确实假设 GNU grep,但是)。

VERSION=$( grep -oP -m 1 '(?<=<version>).*(?=-SNAPSHOT)' pom.xml )
NAME=$( grep -oP -m 1 '(?<=<artifactId>).*(<=</artifactId)' pom.xml )
于 2013-06-15T14:15:33.833 回答
0

所以在 mac 上 grep 是 BSD,linux GNU,所以管道似乎是确保它在每个环境中工作的最佳选择。但是找到了另一个解决方案:maven。

VERSION=$(mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version | egrep -v "(^[INFO]|Download)" | tr -d "- SNAPSHOT") NAME=$(mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.artifactId | egrep -v "(^[INFO]|Download)")

这将让我获得版本/名称并在 mac 和 linux 上工作。

于 2013-06-22T06:00:33.087 回答