[Jenkins]如何自動停止超時任務?

 公司的Jenkins伺服器運行一段時間了,每天編譯github cocos2d-x倉庫的所有pull request,還算穩定。但有個問題比較鬱悶,由於實際執行編譯的slave就放在辦公室里,網路不太穩定,特別是訪問github時,有時會導致整個編譯任務掛起。由於我們在每個slave上只放了一個執行單元(Excutor),只要一個編譯任務掛起,就會導致整個jenkins掛起,所有後續的編譯任務都在排隊。這個時候只能手動殺掉掛起的任務,以便其他排隊的任務可以繼續執行。這個問題很蛋疼,因為我們不可能派個人一直盯著jenkins主站,等發現有任務掛起時,已經有10幾個pull
request在排隊了。

    被這個問題折磨了幾次之後,我下定決心要把它解決掉,分析了一下,其實可以用jenkins自己來解決:構建一個監控任務(jenkins-job-watchdog),每幾分鐘跑一次,看看其他任務有沒有超時,如果超時,就把它關掉,呵呵,思路並不複雜。熟悉jenkins的童鞋可能會注意到:如果jenkins已經被掛起,就沒有辦法執行watchdog任務,怎麼可能殺掉掛起的任務呢?呵呵,訣竅在於部署:在阿里雲上部署一台jenkins master,在公司本地網路部署多台jenkins
slave,master上不執行實際的編譯任務,只執行觸發器任務:響應任務請求,觸發實際編譯任務(在slave上執行),然後馬上結束。這樣,就保證了master不會被掛起,只要在master上執行watch-dog任務就可以了。那麼:如何獲取當前運行的任務,要怎麼結束任務呢?必須介紹一下強大的jenkins python api, github地址:

https://github.com/salimfadhley/jenkinsapi

用法很簡單:

J = Jenkins('http://localhost:8080',username,password)

for key,job in J.iteritems():

last_build = job.get_last_buildnumber()//獲得最後一個構建的編號

 running = build.is_running()//任務是否在運行

        start_time =  last_build.get_timestamp()//獲得構建的開始時間

       last_build.stop()//停止構建

將watchdog部署上去以後,還可以分別指定每個任務的超時時間,一旦超時就會被自動殺掉,再也不用半夜起床檢查jenkins了~~

From: https://www.xuebuyuan.com/zh-tw/2126660.html

猜你喜欢

转载自blog.csdn.net/tony2278/article/details/81977299