2017-03-01 1067 views
2

我想在我的Jenkinsfile中爲多分支管道項目使用if語句。爲了這個問題,假設我在當前目錄中有一個名爲'scan.txt'的文本文件。該文本文件與bash命令生成如何在Jenkinsfile中使用jenkins環境變量if語句

echo "False" > scan.txt 

所以,唯一的內容是

我在Jenkinsfile設置的任意環境變量scan.txt的像這樣內容的字符串「假」:

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

如果我做

echo "${env.TEXT}" 

腳本塊則jenk外正如預期的那樣,控制檯顯示False。

但是,我所有的檢查它是否等於「False」的嘗試都失敗了。我在腳本塊之後立即嘗試了以下內容:

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

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


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

並且它們都不起作用。所有這些條件都是boolean false。讀文件管道步驟的文檔聲明它返回一個文件內容的字符串 https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#code-readfile-code-read-file-from-workspace 所以我不確定這裏發生了什麼。有沒有人有任何見解?

感謝

回答

10

問題是,當你做echo "False" > scan.txt回聲會在文件末尾留下換行符,如果你在管道腳本中回顯env.TEXT,你可以選擇這個。

所以你需要做的是在檢查它是否等於False之前使用String.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()處理字符串時未進行任何修剪。

-2

因此,原來如果我使用條件

env.TEXT.contains("False") 

然後它的作品!它必須是readFile在其字符串中包含的不僅僅是「False」。

+2

這是一個黑客,真正的解決方案已由Jon S. – Pom12