1. 程式人生 > >持續整合高階篇之Jenkins cli與Jenkins ssh

持續整合高階篇之Jenkins cli與Jenkins ssh

系列目錄

Jenkins Cli介紹

Jenkins Cli為Jenkins提供的一個cli工具,此工具功能非常強大,可以完成諸如重啟jenkins,建立/刪除job,檢視job控制檯輸出,新增/刪除節點等功能.但是實際工作中,像建立任務這樣的配置顯然cli非常吃力,不如直接在web管理介面操作,但是對於重啟Jenkins,檢視診斷資訊等,執行一個手動構建任務等,則直接使用cli比進入web管理介面操作更加方便.因此什麼時候web管理介面,什麼時候使用cli,要看是否有利於提升生產力,是否有利於提升個人能力,是否有利於提升團隊的自動化作業水平這些指標,不要以為使用cli就代表水平高而盲目使用cli從而導致效率下降或者問題增多.

jenkins cli可以通過jenkins提供的jar包來建立一個cli環境或者使用ssh客戶端來執行cli,本節也會分別介紹它們.

使用jenkins自身客戶端來執行cli

我們開啟jenkins的安裝目錄,進入到war\WEB-INF目錄,此目錄下面有一個jenkins-cli.jar檔案,它便是用來建立jenkins cli環境的.我們在這個目錄下開啟命令列工具,然後執行java -jar jenkins-cli.jar help便可以看到它的輸出幫助資訊

可以看到-s選項可以指定一個url,這個url就是jenkins web管理介面的url,現在是測試環境,url為http://localhost:8080

,當然想要執行cli,還需要輸入你的使用者名稱和密碼,這裡通過 -auth選項指定使用者名稱密碼.

我們把上以資訊綜合起來,組成以下命令

java -jar jenkins-cli.jar -s http://localhost:8080 -auth tylerzhou:密碼 help

以上語句中,help為要執行的命令.

需要注意的是,這裡執行的命令直接是命令名稱,不能加像其它命令列工具- -- 或/標識

如果你找不到Jenkins-cli.jar,可以通過在瀏覽器輸入http://localhost:8080/jnlpJars/jenkins-cli.jar進行下載儲存,注意把以上地址替換為您的實際地址

點選回車,可以看到所有Jenkins cli可執行的命令和命令的簡短描述.下面介紹幾個可能比較常用的命令

1) list-jobs,可以列出Jenkins裡所有的job,就像開啟jenkins web管理介面首頁看到的那樣.

命令如下

java -jar jenkins-cli.jar -s http://localhost:8080 -auth 您的賬戶:您的密碼 list-jobs

需要注意的是,Jenkins cli需要每次執行命令的時候都帶上java -jar jenkins-cli.jar -s http://localhost:8080 -auth 您的賬戶:您的密碼+要執行的命令,而不是進入一個環境後只輸入命令就行了.

2) build+要構建的job名,即可通過cli來觸發一次構建.

構建成功後,我們開啟web管理介面便可以看到多一次構建.

cli構建命令是一個非常實用的命令,雖然我們的大部分任務都是基於git的一個自動化流程.但是有些時候也需要手動執行一些指令碼來完成工作中的一些自動化操作.如果每次開啟web管理介面手動執行顯然不如通過cli來執行效率高.

3) restart/safe-restart 可以重啟jenkins服務,通過它們的名稱可以看到safe-restart為安全重啟,它會等到所有的操作都完成然後執行重啟

4) clear-queue 清除構建佇列.沒有實際jenkins使用經驗的朋友可能不知道,由於Jenkins自身原因或者我們指令碼測試不夠充分導致的bug,有時候會造成Jenkins構建阻塞,一直處於構建狀態無法完成,這時候通過web管理介面點選取消構建也無法取消掉.此時呆以嘗試這個命令.當然也可能仍然無法終止,此時需要使用restart命令暴力重啟服務.

使用api token登陸

以上我們都是通過使用者名稱:密碼的方式來登陸cli,這樣把明文密碼暴露出來是不可取的,其實Jenkins cli還可以通過使用者名稱:apitoken的方式來實現登陸cli.下面我們介紹五如何設定api token.

我們開啟jenkins web管理介面,點選左側的People按鈕,在出現的介面中會列出可能不止一個使用者,此時點選自身登陸jenkins的使用者名稱,在進入的介面中點選configure按鈕,在出現的介面中找到Api token

點選Add new token便會出現一個生成token的小介面,輸入token的名稱,可以是任意名稱,然後點選generate,這時候就會生成一個token

注意一定要把這個token複製下來然後儲存到其它地方,下次再找開的時候就看不到它了.

完成後點選儲存.

此時我們在cli中輸入以下命令

java -jar jenkins-cli.jar -s http://localhost:8080 -auth tylerzhou:11f52cef1324556a41d966083ffcf0ac1b

其中tylerhzou為使用者名稱,後面就是我們剛才建立的token

如果執行成功,以上命令就輸出jenkins cli的所有命令.

把命令資訊儲存到單獨檔案

我們可以看到,使用token的方式登陸會導致命令列非常長,嚴重影響命令可讀性,其實我們可以把auth資訊儲存到一個檔案檔案裡.我在Jenkins安裝目錄/war/WEB-INF目錄下建立了一個名為password.txt的文字檔案,內容如下

tylerzhou:11f52cef1324556a41d966083ffcf0ac1b

也即上面auth裡輸入的使用者名稱:apitoken

這時我們在-auth選項裡 通過指定@檔名方式指定包含使用者名稱(密碼或token)的檔案來實現登陸.

程式碼如下

java -jar jenkins-cli.jar -s http://localhost:8080 -auth @password.txt

以上@後面的password.txt即為我們建立的密碼檔案

SSH方式登陸Jenkins執行cli

使用SSH方式登陸Jenkins需要進行配置,預設情況下jenkins SSHD port使用的是一個隨機埠號,這樣顯然不利於ssh登陸,使用ssh登陸我們需要顯式知道埠號是多少.我們開啟Manage jenkins>Configure Global Security找到SSH Server欄,把預設random選項切為fixed然後輸入一個同用埠號,我使用的是16022配置完成後點選儲存.埠配置好了,我們還需要新增公鑰到當前使用者配置項,請參照上面使用api token登陸一節,進入到當前使用者設定介面,這次我們不配置apitoken,而是往下拉找到SSH Public Keys選項,把我們生成的ssh公鑰複製到這裡.關於生成ssh key請參閱其它資料或者前面章節,這裡不再贅述.

完成以後,我們就可以通過ssh方式執行命令了.

輸入以下命令

ssh -l tylerzhou -p 16022 localhost help

其中-l指定的使用者為我們登陸jenkins時的賬戶.
如果配置成功,以上命令就會列出所有的Jenkins 命令和簡短介紹.

ssh執行的命令和上面通過jenkins-cli.jar執行的命令是一樣,可以互相參照.

對jenkins cli進行簡單封裝

使用bat簡單封裝

可以看到,以上執行cli不論是通過工具還是ssh,每次都需要帶上一些固定的登陸資訊,非常煩,我們可以進行一下簡單的封裝,這樣每次只需要輸入命令,不再需要每次重複輸入固定內容

我們把它封裝成個bat命令,命令如下

@echo off
cls
:start
set /p arg="請輸入您的命令: "
java -jar jenkins-cli.jar -s http://localhost:8080 -auth @password.txt %arg%
goto start

以上命令產首先建立一個start標籤,然後提示使用者輸入命令,輸入以後傳到的jenkins cli工具裡,然後執行goto語句跳到start標籤.以上命令會重複執行,想要終止需要按下ctrl+c來終止

使用powershell指令碼進行封裝

由於筆者對bat不是很熟練,因此寫起復雜指令碼感覺比較費勁,這裡使用powershell進行一下封裝,支援清屏,檢視執行狀態和退出選項,指令碼內容如下

[System.Console]::ForegroundColor=[System.ConsoleColor]::Green
 $writeout= 
  "  退出請按1或者輸入exit
  清屏請按2或者輸入cls或者clear
  檢視執行狀態請按3
  檢視幫助請輸入help
  檢視提示資訊請按4"
  Write-Host $writeout
[System.Console]::ForegroundColor=[System.ConsoleColor]::White

while ($true) {
$myvar=Read-Host "請輸入命令 "
if(($myvar -eq 1)-or($myvar -eq "exit")){break}
elseif (($myval -eq 2) -or ($myvar -eq "cls") -or($myvar -eq "clear")) {
    Clear-Host
}
elseif ($myvar -eq 3) {
    if($LASTEXITCODE -eq 0){
      Write-Host "執行成功"
    }else{
        [System.Console]::ForegroundColor=[System.ConsoleColor]::Red
        Write-Host "執行失敗"
        [System.Console]::ForegroundColor=[System.ConsoleColor]::White
    }
}
elseif($myvar -eq 4){
[System.Console]::ForegroundColor=[System.ConsoleColor]::Green
Write-Host $writeout
[System.Console]::ForegroundColor=[System.ConsoleColor]::White
}
else {
   java -jar jenkins-cli.jar -s http://localhost:8080 -ssh -user tylerzhou $myvar.split(" ")
}
}

大家建立一個ps1檔案,把以上內容複製進去然後按提示操作,便可以執行指令碼了.

windows 沒有ssh客戶端的問題

有些童鞋在跟著做上面的ssh方式登陸時,可能在命令列輸入ssh會提示找不到命令,這是因為只有最新版本的windows 10(不是所有的版本都有).幸運的是,Jenkins-cli.jar也提供了ssh登陸方式.我們輸入以下命令

java -jar jenkins-cli.jar -s http://localhost:8080 -ssh -user tylerzhou help

通過以上方式指定ssh方式登陸,並指定-user,不需要指定埠,便可以使用ssh方式連線了.我們可以使用上面講到的封閉方法簡單的封閉一下,這樣就不用每次都輸入重複的,固定的內容