1. 程式人生 > >快速獲取Jenkins上build

快速獲取Jenkins上build

egg 得到 ret courier 多公司 服務 big -s tun

很多公司都會做CI持續集成,一般CI都用Jenkins.如何快速獲取Jenkins 上的build?

一般公司都會有CI服務器,各個項目build都在上面觸發或生成。
如何快速獲取CI服務器上最新的build呢?

有的人可能想到爬蟲,當然爬蟲可以做到,但是比較復雜,還要判斷最新的build是否是success.

其實不用這麽麻煩,Jenkins提供了一些接口,直接用接口就能獲得build相關的信息。例如:

http://$host/job/$jobname/lastSuccessfulBuild/api/json
  • lastBuild,
  • lastStableBuild,
  • lastSuccessfulBuild,
  • lastFailedBuild,
  • lastUnstableBuild,
  • lastUnsuccessfulBuild,
  • lastCompletedBuild

用得較多的是lastSuccessfulBuild, 當然也可以獲取失敗的build來分析構建失敗的原因。

舉個例子,我們android 在CI 上build 並且archive APK 文件。
那麽我們就可以很輕松的得到想要的build.
如果我用UI的automation test來做BVT,那麽代碼可以這樣寫

from globals import *
import requests, re, os
import shutil
from ptest.plogger import preporter

JENKINS_HOST_ANDROID = "XXX"
current_dir = os.path.split(os.path.realpath(__file__))[0]
apk_path = current_dir + "/apk/"
build_name = "XXX"

class Jenkins:
    def __init__(self):
        self.Jenkins_build_url = JENKINS_HOST_ANDROID + "/job/{0}/lastSuccessfulBuild/api/json".format(
            current_device_info.jenkins_job)

    def get_build_url(self):
        preporter.info(self.Jenkins_build_url)
        builds_urls = requests.get(self.Jenkins_build_url)

        builds = [each_build[‘relativePath‘] for each_build in builds_urls.json()[‘artifacts‘]]
        preporter.info(builds)
        current_build = re.findall(
            "/build/outputs/apk/{}-{}-{}.*?.apk".format(build_name,
                                                                     current_device_info.device_env,
                                                                     current_device_info.build_type), ‘,‘.join(builds))

        preporter.info(current_build)

        if current_build:
            apk_url = builds_urls.json()[‘url‘] + "artifact/" + current_build[0]
            apk_name = current_build[0].split("/")[-1]
            preporter.info(apk_url)
            preporter.info(apk_name)
            return apk_url, apk_name

        else:
            preporter.info("cannot find the build ")

    def check_folder(sef, folder):
        if os.path.exists(folder):
            shutil.rmtree(folder)
        os.makedirs(folder)

    def download_file(self, url, path):
        file = requests.get(url).content
        with open(path, ‘wb‘) as f:
            f.write(file)

    def download_build(self):
        apk_url, apk_name = self.get_build_url()
        self.check_folder(apk_path)
        self.download_file(apk_url, apk_path + apk_name)

很容易就獲取的最新的daily build.
結合build,就可以做其它的自動化測試了。

更多精彩,請關註微信公眾號: python愛好部落

技術分享

?

快速獲取Jenkins上build