web-dev-qa-db-ja.com

Jenkinsfile ifステートメントでjenkins環境変数を使用する方法

Jenkinsfileでifステートメントを使用して、マルチブランチパイプラインプロジェクトを作成しようとしています。この質問のために、現在のディレクトリに「scan.txt」というテキストファイルがあるとします。テキストファイルはbashコマンドで生成されます

echo "False" > scan.txt

したがって、唯一のコンテンツは文字列「False」です

Jenkinsfileの任意の環境変数を次のようにscan.txtの内容に設定します。

script {
    env.TEXT = readFile 'scan.txt'
}

私が行った場合

echo "${env.TEXT}" 

スクリプトブロックの外では、jenkinsコンソールはそのステップに対して期待どおりにFalseを表示します。

ただし、「False」に等しいかどうかを確認する私の試みはすべて失敗しました。スクリプトブロックの直後に次のことを試しました。

if (env.TEXT.equals("False")) {
    //do something
}

if (env.TEXT.matches("False")) {
    //do something
}


if (env.TEXT == "False") {
    //do something
}

そしてそれらのどれも動作しません。これらの条件はすべてブール偽です。ファイル読み取りパイプラインステップのドキュメントには、ファイルコンテンツの文字列が返されると記載されています https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#code-readfile-code-read- file-from-workspace したがって、ここで何が行われているのかわかりません。誰か洞察力がありますか?

ありがとう

5
Dalton Sweeney

問題は、_echo "False" > scan.txt_エコーを実行すると、ファイルの最後に改行が残るため、パイプラインスクリプトで_env.TEXT_をエコーすると、これが発生する可能性があることです。

したがって、Falseと等しいかどうかを確認する前にString.trim()を使用する必要があります。trimは、先頭と末尾のすべての空白を削除します。さらに、文字列が含まれているかどうかをテストする最良の方法は、Boolean.parseBoolean()を使用することです。

これを試してみましょう:

_node {
    sh 'echo "False" > output.txt'
    def val = readFile 'output.txt'
    echo "${val}"
    echo "${val.trim()}"
    if (val.equals("False")) { // This will print No
        echo "Yes"
    } else {
        echo "No"
    }
    if (val.trim().equals("False")) { // This will print Yes
        echo "Yes"
    } else {
        echo "No"
    }
    if (!Boolean.parseBoolean(val)) { // This will print Yes
        echo "Yes"
    } else {
        echo "No"
    }
}
_

そして、出力では次のようになります。

_Started by user jon
[Pipeline] node
Running on master in /var/lib/jenkins/workspace/pl
[Pipeline] {
[Pipeline] sh
[pl] Running Shell script
+ echo False
[Pipeline] readFile
[Pipeline] echo
False

[Pipeline] echo
False
[Pipeline] echo
No
[Pipeline] echo
Yes
[Pipeline] echo
Yes
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
_

ご覧のとおり、最初のエコーステップを実行すると、余分な改行が発生します。また、Boolean.parseBoolean()はトリミングせずに文字列を処理することに注意してください。

15
Jon S

ここにいくつかのケースがあります、それが一部の人々のために時間を節約することを望みます:

node {

sh 'echo "False" > output.txt'
def val = readFile 'output.txt'
echo "${val}"
echo "${val.trim()}"
if ( "${val.trim()}" ==~ /False/ ) {
    echo "Match Yes trim"
} else {
    echo "Match No trim"
}

if ( "${val}" ==~ /(?ms)False/ ) {
    echo "Match Yes (?ms)"
} else {
    echo "Match No (?ms)"
}

if ( "${val}" ==~ /(?ms)False.*/ ) {
    echo "Match Yes (?ms).*"
} else {
    echo "Match No (?ms).*"
}

if ( "${val}" =~ /False/ ) {
    echo "Match Yes 1="
} else {
    echo "Match No 1="
}

}

出力:

[Pipeline] sh
+ echo False
[Pipeline] readFile
[Pipeline] echo
False

[Pipeline] echo
False
[Pipeline] echo
Match Yes trim
[Pipeline] echo
Match No (?ms)
[Pipeline] echo
Match Yes (?ms).*
[Pipeline] echo
Match Yes 1=

ここで(?ms)は複数行を意味し、sは正規表現の新しい行に一致するドットを意味します。

ご了承ください echo "False" >はファイルに改行を追加します。これはトリミングする必要があるか、echo -n 中古。

1