問題描述
Jenkins Pipeline,更像“膠水”,將很多腳本與工具粘合在一起,實現自動化任務,而它本身並沒有提供特定功能。
執行 Shell 命令或者腳本是個非常常見的任務。該筆記將記錄在 Jenkins Pipeline 中執行 Shell 的方法。
注意,除了 Shell 腳本,Jenkins 還能執行 bat、ps 等等,我們這里以 Shell 為例,更多內容建議參考官方文檔。
解決方法
Pipeline: Nodes and Processes
安裝 Pipeline: Nodes and Processes 插件
插件地址:https://plugins.jenkins.io/workflow-durable-task-step/
使用手冊:Pipeline Steps Reference/Pipeline: Nodes and Processes
倉庫地址:jenkinsci/workflow-durable-task-step-plugin
在我們的印象中,該插件無需單獨安裝。在安裝 Pipeline 之后會自動安裝該插件(依賴?必備組件?)
Labelled Pipeline Steps
還可以安裝 Labelled Pipeline Steps 插件,這是對 sh 與 bat 的替代,以支持在 BlueOcean 中顯示標簽。
插件地址:https://plugins.jenkins.io/labelled-steps/
使用手冊:Pipeline Steps Reference/Labelled Pipeline Steps Plugin
倉庫地址:https://github.com/jenkinsci/labelled-steps-plugin
簡單示例
執行命令:
sh 'ls -l'
返回命令狀態碼:
def statusCode = sh returnStatus: true, script: 'command-not-found'
返回命令輸出:
def statusCode = sh returnStdout: true, script: 'ls'
在控制台中,隱藏正在執行的命令
問題描述
在控制台中,當使用 sh 步驟時會打印正在執行的 Shell 命令,如下所示:
... [Pipeline] script [Pipeline] { [Pipeline] sh + ls -l -h total 16K drwxr-xr-x 2 jenkins jenkins 25 Mar 21 21:00 deploy drwxr-xr-x 4 jenkins jenkins 192 Mar 21 21:00 docs drwxr-xr-x 139 jenkins jenkins 8.0K Mar 21 21:00 notebook -rw-r--r-- 1 jenkins jenkins 47 Mar 21 21:00 README.md drwxr-xr-x 7 jenkins jenkins 211 Mar 21 21:00 scripts drwxr-xr-x 2 jenkins jenkins 23 Mar 21 21:00 template [Pipeline] } [Pipeline] // script}
我們希望能夠隱藏命令輸出,即隱藏 + ls -l -h 輸出行。
問題原因
在 Jenkins 執行 Shell 命令時,默認啟用 -x 與 -e 選項,而 -x 選項導致命令打印。
解決辦法
關閉 -x 選項,即僅使用 -e 選項(以下兩種寫法皆可):
sh """#!/bin/sh -e // do some stuff """ sh """\ #!/bin/sh -e // do some stuff """
還可以使用 set +x 也可以,但是會輸出 set +x 命令自身,不夠“干凈”:
sh """ set +x // do some stuff """
參考文獻
WikiNotes/執行 Shell 命令
Pipeline: Nodes and Processes/sh
How to disable command output in jenkins pipeline build logs
Using a Jenkinsfile