Jenkins
grep 在管道腳本腳本中的 shell 命令上
當我想創建幾個 shell 命令時,我的腳本管道返回第一個命令的答案而不執行管道。這是我的情況:我想在 HTML 頁面上獲取特定內容。所以我在頁面上捲曲,然後是 grep,最後是 awk。
def checkState(hostUri, check) { node('master') { def result = sh 'curl -Lsd "login=username&password=password&button=Login" -c cookie ${hostUri} && grep ${check} && awk -F \'"\' {\'print $2\'}' println result }
只有我的管道的控制台返回對應只執行curl命令而不執行grep和awk。
Running on Jenkins in /var/lib/jenkins/workspace/Clearcase@8 [Pipeline] { [Pipeline] sh <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ... </html> [Pipeline] } [Pipeline] // node
我嘗試了不同的方法,例如使用腳本管道中不存在
'''
的命令。new BuildProcess
在所示的 Jenkinsfile 中,變數賦值涉及一個 shell 步驟:
def result = sh 'curl -Lsd "login=username&password=password&button=Login" -c cookie ${hostUri} && grep ${check} && awk -F \'"\' {\'print $2\'}'
此時 Jenkins 將呼叫一個 shell,並將以下命令傳遞給它:
curl -Lsd "login=username&password=password&button=Login" -c cookie ${hostUri} && grep ${check} && awk -F '"' {'print $2'}
&&
運算符表示 AND 列表。在這種情況下,如果curl
命令成功,則grep
執行命令,如果成功,則執行awk
命令。這些命令的標準輸入/輸出/錯誤流沒有相互連接。由於這裡的目的是解析
curl
使用grep
andawk
語句的輸出,因此應該使用管道而不是&&
運算符:def result = sh 'curl -Lsd "login=username&password=password&button=Login" -c cookie ${hostUri} | grep ${check} | awk -F \'"\' {\'print $2\'}'
考慮引用
hostUri
&check
變數,以防您最終在這些欄位中使用特殊字元。最後一點:如果沒有文件名參數或某種輸入,命令
grep ${check}
&在技術上是不完整的。awk -F '"' {'print $2'}
如果您從 shell 終端按原樣執行它們,它們只會卡住。但是,由於 Jenkins 以非互動方式執行建構過程,我假設他們的標準輸入流是從/dev/null
. 在這種情況下,grep
命令將失敗並顯示非零錯誤程式碼。