發表文章

從 Python script 停止 Jenkins Job

之前分享過如何 使用 Jenkins API 取得 Job result ,這次來記錄一下如何 停止 執行中的 Job。 這次直接使用 requests ,如果沒有安裝可以先執行 pip install requests 安裝。 這個是比較簡潔的寫法,其實也可以直接用  python-jenkins 這類的 python wrapper 來控制 Jenkins server,通常如果有很多 jenkins server 控制的行為,就建議直接使用 python-jenkins 了。 以下是使用 requests 的範例: 1 2 3 4 5 6 7 8 9 10 11 import requests jenkinsMaster = "http://jenkinshost:8080" userID = "myaccount" APIToken = "1234567890" def stopJenkinsJob(job_name): url = jenkinsMaster + "/job/" + jobName + "/lastBuild/stop" auth = (userID, APIToken) r = requests . post(url, auth = auth) return r . status_code

常用的 Human Sorting with Python

簡單來說,當 sorting 的結果跟預期的不同,可以試一下。其中奧妙就不多說了,附上原始網址,可以研究一下。 https://stackoverflow.com/questions/5967500/how-to-correctly-sort-a-string-with-a-number-inside 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import re , os def atoi(text): return int (text) if text . isdigit() else text def natural_keys(text): ''' alist.sort(key=natural_keys) sorts in human order http://nedbatchelder.com/blog/200712/human_sorting.html (See Toothy's implementation in the comments) ''' return [ atoi(c) for c in re . split( '(\d+)' , text) ] try : dirs = os . listdir(folder) dirs . sort(key = natural_keys) # just in case we need the reverse order #dirs = reversed(dirs) for file in dirs: if not file . endswith( "csv" ): continue csv_path = "%s\\%s" % (folder, file ) print (csv_path) except Exc...

在 Jenkins 環境下使用 adb

因為 Jenkins 在結束工作的時候,會將所有 fork 出來的子進程全部砍掉,來確保不會有 leakage 的情況發生,讓 Jenkins 可以長時間運行。通常這個行為是沒有問題的,有時候也可以仰賴這個行為來讓 Job Script 寫起來簡潔一些,省一些功夫。 但是如果某個 Jenkins Job 會啟動 server or daemon 性質的 process,而我們希望當 Job 結束後, daemon process 可以保留,這個時候需要在一開始啟動這個 daemon 的時候,加上 "dontKillMe" 的環境變數,來告知 Jenkins 不要回收這個 process。 詳細說明可以參考 這裡 adb 就是一個很好的例子。 adb daemon 可以同時間處理很多 connection,通常在大規模的自動化測試中,一台 PC 會接著很多 device,如果 adb daemon 被砍掉,其他 device connection 就會中斷,這並不是我們希望看到的。 以下是針對指定 adb server 不要被 Jenkins 回收的範例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 jenkins_env = os . environ . copy() jenkins_env[ "BUILD_ID" ] = "dontKillMe" start_time = time . clock() event = Event() is_device_timeout = False cmd = "adb -s %s wait-for-device" % (deviceNo) try : adb_pid = subprocess . Popen(cmd, env = jenkins_env) while adb_pid . poll() is None : event . wait(timeout = 1.0 ) if (time . clock() -...

如何用 Jenkins API 取得 Job Build Result

當需要建構網頁取得 Jenkins Job 的結果,或是需要整理 Job 狀態並發送通知或郵件的時候,通常會需要透過 API 取得 Job Result Jenkins API 的 URL :  http://jenkinshost:8080/job/[jobName]/[buildNum]/api/json/ 但是如果打開 Jenkins Security 設定,使用 API 必須要登入 Jenkins 並有合法的權限 這個時候可以填上 APIToken,便可以登入並使用 API user 的 APIToken 可以從這個網址找到: http://jenkinshost:8080/user/[myaccount]/configure 以下是完整的實作方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 import json , urllib , urllib2 from threading import Event jenkinsMaster = "http://jenkinshost:8080" userID = "myaccount" APIToken = "1234567890" class HTTPBasic403AuthHandler (urllib2 . HTTPBasicAuthHandler): # retry with basic auth when facing a 403 forbidden def http_error_403( self , req, fp, code, msg, headers): host = req . get_host() realm = None return self . retry_http_basic_auth(host, req, realm) def get...