2016-09-13 8 views
1

私たちのプロジェクトでは、後続のビルドプロセスやビルドされたアプリケーションを実行するための環境変数を設定するソースとなるシェルスクリプトがあります。

これは、既に設定された変数をチェックし、調整を行うブロックを含んでいます。ライブラリーへのパスが$LD_LIBRARY_PATHに既にあるとされていない場合、それを追加した場合

# part of setup.sh 
for LIBRARY in "${LIBRARIES_WE_NEED[@]}" 
do 
    echo $LD_LIBRARY_PATH | \grep $LIBRARY > /dev/null 
    if [ $? -ne 0 ] 
    then 
    echo Adding $LIBRARY 
    LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$LIBRARY 
    else 
    echo Not adding $LIBRARY 
    fi 
done 

すなわち、それがチェックします。 (公平には、(like here)とは違って書かれているかもしれませんが、プログラムを呼び出すことなくスクリプトを実行して$?をチェックしてから、別のことをやるなど)

.gitlab-ci.ymlはその後

before_script: 
    - yum install -y <various packages> 
    - source setup.sh 

が含まれていますが、if文が$LD_LIBRARY_PATHへのパスを追加することを決定したときにランナーがすなわち瞬間$?が非ゼロである前にスクリプトを停止することを決定します。 gitlabランナーがスクリプトの各行の後に$?をチェックするのはいいですが、ここでは.gitlab-ci.ymlの行がアトミックであると考えられるとすばらしいでしょう。

.gitlab-ci.ymlのソースにある$?の中間チェックを避ける方法はありますか?

答えて

4

command_that_might_fail || trueを使用して、このコマンドの終了ステータスをマスクします。

はまた、あなたが出力を防ぐためにgrep -qを使用できることに注意してください。

echo "$LD_LIBRARY_PATH" | grep -q "$LIBRARY" || true 

しかし、これはまた、あなたが望んでいないかもしれない$?をマスクします。コマンド終了が修正かどうかを確認したい場合は、使用する可能性があります:

if echo "$LD_LIBRARY_PATH" | grep -q "$LIBRARY"; then 
    echo "Adding $LIBRARY" 
else 
    ... 
fi 

私は疑うことgitlab-ciセット-eいることができますset +eと無効:

set +e # Disable exit on error 
for library in "${LIBRARIES_WE_NEED[@]}"; do 
    ... 
done 
set -e # Enable exit on error 

今後の読書:Why double quotes matterPitfalls with set -e