任務系統之Jenkins子任務

2023-05-05 12:01:53

今天下班即開啟五一假期,早上臨時定了行程去山東日照,原本計劃下班就出發,但下班看了看導航,這一路紅得發黑,於是決定還是晚點再走,現在有時間了,寫篇簡單的技術文章來提升下Blog逐漸降低的技術內容含量吧

之前有一系列的文章來介紹我們的任務系統,隨著任務系統在專案間的推廣,以及專案使用的深入,任務系統又增加了非常多實用又好用的功能,今天這篇文章就來介紹其中的一個:Jenkins子任務

任務系統通過組合各種不同型別的子任務來完成複雜的任務流程,之前的子任務支援命令和指令碼,支援審批和通知,能覆蓋絕大部分的釋出部署場景,但仍然有一部分專案因為各種各樣的原因依然使用了Jenkins來發布部署,想讓專案owner拋棄Jenkins而遷移到任務系統動力不足困難不小,於是我將Jenkins作為一個子任務型別給整合進了任務系統,原本Jenkins裡的Job完全不用動就可以簡單的整合進任務系統

Jenkins整合進任務系統,不僅僅是可以通過任務系統來執行Job而達到專案管理的統一,更重要的是可以藉助於任務系統的審批/通知/並行/告警/定時/週期等等強大的功能來實現完整的釋出部署任務流,同時由於我們任務系統完全相容手機端,那對於釋出部署任務將可以隨時隨地掏出手機來執行,運維的假期再也不用到哪都揹著電腦了,多了一份逍遙與自在

以一個模擬的Coffee專案更新流程為例,執行Jenkins的Job只是整個完整發布流程中的一步而已,通過任務系統可以將整個釋出流程完美閉環,省去了很多溝通和認為操作過程

以上介紹了我們為什麼需要將Jenkins整合進任務系統,同時也簡單說明了將Jenkins的Job整合進任務系統通過任務系統執行的優勢,那麼接下來講講我們是如何將Jenkins整合進任務系統的,其實也很簡單,藉助於Jenkins完善的API

Jenkins沒有統一的API入口,而是採用了{url}/api的API樣式,其中{url}代表Jenkins資源的URL,常見的Jenkins資源包括:站點、Job和Build,可以通過不同級別的URL地址檢視到當前級別的API資訊,例如:

結果支援兩種返回格式,分別是JSON和XML,通過加不同的URL字尾來實現,例如:https://jenkins.ops-coffee.cn/computer/api/json返回json格式的資料,https://jenkins.ops-coffee.cn/computer/api/xml則返回xml格式的資料

接入Jenkins子任務需要用到如下幾個API:

  1. 獲取Job列表

獲取Job列表使用GET方法

https://jenkins.ops-coffee.cn/api/json
  1. 獲取Job詳情

獲取Job詳情使用Get方法

https://jenkins.ops-coffee.cn/job/{job-name}/api/json

同時Job詳情頁面同時也能獲取到Job所需要的引數

  1. 執行Job

執行Job通過POST方法,分為帶引數和不帶引數兩個API,其中不帶引數使用

https://jenkins.ops-coffee.cn/job/{job-name}/build

帶引數使用

https://jenkins.ops-coffee.cn/job/{job-name}/buildWithParameters?namespace=dev&branch=master

執行完Job後,需要獲取到Job的BuildID,BuildID可以通過從返回結果headerLocation裡獲取

  1. 獲取Build輸出

獲取Build的Console輸出使用GET方法,通過Build的Console輸出我們可以實時獲取Job的執行情況

https://jenkins.ops-coffee.cn/job/{job-name}/{build-id}/logText/progressiveText
  1. 獲取Build詳情

獲取Build的詳情使用GET方法,通過Build詳情裡的result能知道Job的執行狀態及結果

https://jenkins.ops-coffee.cn/job/{job-name}/{build-id}/api/json
  1. 停止Job執行

停止Job執行使用POST方法,當Job執行的過程中不及我們預期需要緊急停止Job執行時需要藉助此API來完成

https://jenkins.ops-coffee.cn/job/{job-name}/{build-id}/stop

整個Jenkins子任務的整合我們主要用到了這幾個API,關於Jenkins的API認證用到了最基本的AuthBase方式,一個完整的獲取JobList的例子如下

class JenkinsAPI:
    def __init__(self, domain, username, password, verify=True):
        self.domain = domain

        self.session = requests.Session()
        self.session.auth = (username, password)
        self.session.verify = verify

    def job_list(self):
        try:
            r = self.session.get(self.domain + '/api/json')

            return True, r.status_code, r.json()
        except Exception as e:
            return False, 500, '獲取Job List失敗:' + str(e)

有了這些API我們就能輕鬆的將Jenkins整合進任務系統了,在任務系統中執行Jenkins的Job也是非常的簡單和方便,實時紀錄檔輸出,以及隨時可以終止執行,體驗與Jenkins無異了

好了,文章就寫到這裡,看了下導航,擁堵稍稍緩解,但依然嚴重,洗個澡睡個覺,凌晨起床出發