持續集成高級篇之Jenkins cli與Jenkins ssh

  • 2019 年 10 月 3 日
  • 筆記

系列目錄

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的安裝目錄,進入到warWEB-INF目錄,此目錄下面有一個jenkins-cli.jar文件,它便是用來創建jenkins cli環境的.我們在這個目錄下打開命令行工具,然後執行java -jar jenkins-cli.jar help便可以看到它的輸出幫助資訊

img

可以看到-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

img

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

img

注意一定要把這個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方式連接了.我們可以使用上面講到的封閉方法簡單的封閉一下,這樣就不用每次都輸入重複的,固定的內容了.