通過 CLI 管理 Jenkins Server
Jenkins 內建的命令列介面允許管理員通過命令列工具訪問並管理 Jenkins。這讓我們可以通過指令碼自動化的建立配置或執行任務,也就是把 Jenkins 中的配置程式碼化了。Jenkins 同時支援通過 SSH 和客戶端命令列工具 jenkins-cli.jar 進行訪問。本文主要介紹如何通過這兩種方式用命令列操作 Jenkins。說明:本文的演示環境為 ubuntu 16.04。
通過 SSH 執行命令
在 Jenkins Server 的預設安裝中,內建的 SSH service 是沒有啟用的:
我們可以通過下面的配置讓 Jenkins 啟用 SSH service,Jenkins ->Configure Global Security:
筆者選擇讓 Jenkins 的 SSH Server 監聽 8090 埠,如果你選擇的是 Random,那麼監聽的埠是隨機產生的,無論如何,我們都可以用下面的命令來獲得 Jenkins SSH Server 監聽的埠號:
$ curl -Lv http://192.168.21.145:8080/login 2>&1 | grep 'X-SSH-Endpoint'
說明:筆者的 Jenkins Server 部署在主機 192.168.21.145 上,監聽的埠號為 8080。使用者至少要有 Overall/Read 許可權才能訪問命令列介面,但是根據執行的命令的不同還需要更高的許可權。本文主要演示如何配置遠端執行命令,所以演示用的使用者具有全部許可權。
為使用者新增身份驗證的祕鑰
使用 SSH 的最佳方式是通過祕鑰進行身份驗證,這裡我們把遠端機器上使用者的公鑰新增到 Jenkins 使用者 jack 的 Public Keys 列表中(Jenkins -> jack):
現在就可以遠端呼叫 Jenkins Server 提供的命令了,先來問一下 "我是誰?":
$ ssh -l jack -p 8090 192.168.21.145 who-am-i
help 命令
我們可以通過 help 命令來檢視所有的可用命令:
$ ssh -l jack -p 8090 192.168.21.145 help
help 命令的輸出很長,上圖僅截取了一部分,我們還可以通過 help 命令檢視其它命令的詳細用法,筆者會在後面的文章中詳細介紹常用命令,這裡先一筆帶過。
build 命令
為了演示方便,我們先來簡單瞭解一下 build 命令,它用來觸發 job 和 pipeline 的執行。下面的是用它來觸發一個名稱為 test 的 job,這個 job 非常簡單,僅僅輸出字串 "hello":
$ ssh -l jack -p 8090 192.168.21.145 build test -f -v
還不賴,任務被成功的執行了!
到此為止,我們已經可以組織自動化指令碼遠端操作 Jenkins Server 了。下面我們一起看看 Jenkins 提供的另外一種方式:客戶端命令列工具。
客戶端命令列工具
雖然基於 SSH 的 CLI 非常便捷,並且能夠滿足大多數需求,但是在某些情況下,與 Jenkins 一起釋出的客戶端 CLI 工具可能更合適。例如,客戶端 CLI 工具的預設傳輸方式是 HTTP,這意味著不需要在防火牆中開啟額外的埠來就可以使用。
通常不需要進行特殊的系統配置來啟用基於 HTTP 的命令列連線。如果是在 HTTP(S) 反向代理後面執行 Jenkins,一定要確保請求和響應不會被快取。
下載客戶端命令列工具
Jenkins 自帶的命令列工具是一個 java 程式,可以通過下面的 url 下載到遠端主機上:
JENKINS_URL/jnlpJars/jenkins-cli.jar
比如:
$ wget http://192.168.21.145:8080/jnlpJars/jenkins-cli.jar
注意,這是個 java 程式,要執行它需要確保你的主機上安裝了 jre。
通過使用者名稱和密碼認證使用者身份
下面我們用客戶端工具來觸發 test job,先通過使用者名稱和密碼的方式進行認證:
$ java -jar jenkins-cli.jar -s http://192.168.21.145:8080 -auth jack:123456 build test -f -v
雖然命令成功執行了,但使用密碼畢竟太不安全。
使用 API Token
安全起見還是應該使用 API Token,先為使用者 jack 生成 API Token:
把上面命令中的密碼換成 API Token 就可以了:
$ java -jar jenkins-cli.jar -s http://192.168.21.145:8080 -auth jack:11d5ca0f9ee2dac8c47492b3e6b71c82cd build test -f -v
結果和上面是一樣的。還可以把使用者名稱和 API Token 儲存到檔案中,這樣能進一步提高安全性:
$ echo jack:11d5ca0f9ee2dac8c47492b3e6b71c82cd > .jenkins-token
然後可以使用 @ 符以下面的方式引用:
$ java -jar jenkins-cli.jar -s http://192.168.21.145:8080 -auth @/home/nick/.jenkins-token build test -f -v
執行的結果也是一樣的。注意要在 @ 後面不要用 ~ 號代替使用者的家目錄。
除此之外還可以通過環境變數來指定使用者名稱和 API Token:
$ export JENKINS_USER_ID=jack $ export JENKINS_API_TOKEN=11d5ca0f9ee2dac8c47492b3e6b71c82cd $ java -jar jenkins-cli.jar -s http://192.168.21.145:8080 build test -f -v
效果也是一樣的。
通過 SSH 進行連線
好吧,客戶端命令列工具也支援通過 SSH 進行連線。同時指定 -ssh 和 -user 選項就可以了:
$ java -jar jenkins-cli.jar -s http://192.168.21.145:8080 -ssh -user jack build test -f -v
總結
通過 Ansible 等工具自動化的建立 Jenkins Server(參考前文《通過 Ansible 建立 Jenkins Server》),然後再通過 Jenkins 提供的 CLI 自動化的操作 Jenkins 中的配置。這樣我們就打通了整個 Jenkins Server 的自動化過程(當然,筆者還會介紹如何自動化的建立執行 Jenkins Server 的宿主機)。好吧,這都只是些簡單的 demo,在生產環境中要做的事情可要多的多!
參考:
Jenkins CLI