在 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 回收的範例:
上面只是用來說明原理,可以觀察一下有設定dontKillMe 與沒有設定的差異,
通常像是這類 daemon process,還是會希望在 Job 開始之前就先跑起來,在每個 Job 裡面就不需要這樣設定 dontKillMe,不然每個 Job 都要這樣處理就很麻煩了。
但是如果某個 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() - start_time) > bootup_timeout: print ("adb wait-for-device timeout after %s seconds"%str(bootup_timeout)) is_device_timeout = True break if not is_device_timeout: waiting_time = time.clock() - start_time print ("adb device ready. already waiting %s seconds"%str(waiting_time)) except Exception as e: print ("Exception happened during wait-for-device") print (str(e)) |
上面只是用來說明原理,可以觀察一下有設定dontKillMe 與沒有設定的差異,
通常像是這類 daemon process,還是會希望在 Job 開始之前就先跑起來,在每個 Job 裡面就不需要這樣設定 dontKillMe,不然每個 Job 都要這樣處理就很麻煩了。
留言
張貼留言