0

プロジェクトの release_notes を更新するために git log を使用しています。Mac ラップトップで以下のスクリプトを実行すると、すべてが期待どおりに機能します。centos で実行されているジェンキンスで実行すると、実行順序として次のように表示されます。

脚本

...
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

矛盾は見られません。サブシェルで実行されているコマンドがいくつかあり (VERSION と NAME を設定するとき)、変数が割り当てられる前にそれらのコマンドを実行する必要があるため、上記の /bin/bash -x 出力は私が期待するものです。

これらの各パイプライン内のコマンドの順序について話している場合、それらはすべて同時に実行され、正確な起動順序 が指定されていない可能性があることに注意してください。

于 2013-06-14T22:23:09.597 に答える
1

パイプライン内の個々のコマンドが開始される順序 (set -x表示されている順序) は重要ではありません。データは依然として左から右に流れます。ただし、grepパイプラインの代わりに への 1 回の呼び出しを使用して変数を設定できます。(ただし、これは 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]|ダウンロード)" | tr -d "- SNAPSHOT") NAME=$(mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.artifactId | egrep -v "(^[INFO]|ダウンロード)")

これにより、バージョン/名前を取得でき、Mac と Linux の両方で動作します。

于 2013-06-22T06:00:33.087 に答える