授之以漁-運維平臺發(fā)布模塊三(Jenkins篇)

接上篇《授之以漁-運維平臺發(fā)布模塊二(Jenkins篇)》混卵,今天介紹下項目的回滾機制。

我的平臺用到Jenkins API的創(chuàng)建項目魂莫,刪除,更新爹耗,查看變更耙考,構(gòu)建。

一潭兽、利用Jenkins-python 創(chuàng)建項目

    def create_job(self, name, config_xml):
        if self.job_exists(name):
            raise JenkinsException('job[%s] already exists' % (name))

        headers = {'Content-Type': 'text/xml'}
        self.jenkins_open(urllib2.Request(
            self.server + CREATE_JOB % locals(), config_xml, headers))
        if not self.job_exists(name):
            raise JenkinsException('create[%s] failed' % (name))

我的平臺需要做的就是傳遞一個項目名稱倦始,一個config_xml(配置文檔),在用程序生成config_xml,我傳遞了下面幾個參數(shù):svn_daysToKeep,svn_numToKeep,svn_name,svn_publish_address,svn_address,svn_name,svn_name
svn_daysToKeep:構(gòu)建項目保存時間山卦,過了時間會自動刪除以前的
svn_numToKeep:構(gòu)建項目保存版本號數(shù)量鞋邑,過了數(shù)量會自動刪除以前的
svn_name:構(gòu)建項目名稱
svn_publish_address:發(fā)布地址(RPM包安裝地址,構(gòu)建FPM請參看之前的文章)
svn_address:SVN地址
config_xml如下:

"""<?xml version='1.0' encoding='UTF-8'?>
<project>
  <actions/>
  <description></description>
  <logRotator class="hudson.tasks.LogRotator">
    <daysToKeep>%s</daysToKeep>
    <numToKeep>%s</numToKeep>
    <artifactDaysToKeep>-1</artifactDaysToKeep>
    <artifactNumToKeep>-1</artifactNumToKeep>
  </logRotator>
  <keepDependencies>false</keepDependencies>
  <properties>
    <hudson.plugins.batch__task.BatchTaskProperty plugin="batch-task@1.16">
      <tasks>
        <hudson.plugins.batch__task.BatchTask>
          <name>%s</name>
            <script>mkdir -p /home/release/$JOB_NAME  && fpm -s dir -x .svn -t rpm -n $JOB_NAME -v $BUILD_NUMBER --prefix %s -C /var/lib/jenkins/workspace/$JOB_NAME -p  /home/release/$JOB_NAME  ./ && createrepo --update /home/release/$JOB_NAME/  && curl -d "job_id=$JOB_NAME" http://172.18.18.24/cmdb/salt_jenkins_post/</script>
        </hudson.plugins.batch__task.BatchTask>
      </tasks>
    </hudson.plugins.batch__task.BatchTaskProperty>
  </properties>
  <scm class="hudson.scm.SubversionSCM" plugin="subversion@1.45">
    <locations>
      <hudson.scm.SubversionSCM_-ModuleLocation>
        <remote>%s</remote>
        <local>.</local>
        <depthOption>infinity</depthOption>
        <ignoreExternalsOption>false</ignoreExternalsOption>
      </hudson.scm.SubversionSCM_-ModuleLocation>
    </locations>
    <excludedRegions></excludedRegions>
    <includedRegions></includedRegions>
    <excludedUsers></excludedUsers>
    <excludedRevprop></excludedRevprop>
    <excludedCommitMessages></excludedCommitMessages>
    <workspaceUpdater class="hudson.scm.subversion.UpdateUpdater"/>
    <ignoreDirPropChanges>false</ignoreDirPropChanges>
    <filterChangelog>false</filterChangelog>
  </scm>
  <canRoam>true</canRoam>
  <disabled>false</disabled>
  <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
  <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
  <triggers/>
  <concurrentBuild>false</concurrentBuild>
  <builders/>
  <publishers>
    <hudson.tasks.Mailer plugin="mailer@1.5">
      <recipients>21186716@qq.com</recipients>
      <dontNotifyEveryUnstableBuild>false</dontNotifyEveryUnstableBuild>
      <sendToIndividuals>true</sendToIndividuals>
    </hudson.tasks.Mailer>
    <hudson.plugins.batch__task.BatchTaskInvoker plugin="batch-task@1.16">
      <configs>
        <hudson.plugins.batch__task.BatchTaskInvoker_-Config>
          <project>%s</project>
          <task>%s</task>
        </hudson.plugins.batch__task.BatchTaskInvoker_-Config>
      </configs>
      <threshold>
        <name>UNSTABLE</name>
        <ordinal>1</ordinal>
        <color>YELLOW</color>
      </threshold>
    </hudson.plugins.batch__task.BatchTaskInvoker>
  </publishers>
  <buildWrappers/>
</project>"""%(svn_daysToKeep,svn_numToKeep,svn_name,svn_publish_address,svn_address,svn_name,svn_name)

有了項目名和配置文件账蓉,只需要調(diào)用jenkins-python接口即可:

from cmdb.myapi.jenkins import jenkins_remote
J = jenkins_remote.Jenkins(jenkins服務(wù)器地址,jenkins用戶名,jenkins token)
J.create_job(項目名, 項目的config_xml)

至于Jenkins的Token如何生成呢枚碗?

登錄系統(tǒng)-點擊右上角你的用戶名稱

Paste_Image.png

點擊設(shè)置-點擊Show API Token

Paste_Image.png

二、利用Jenkins-python 構(gòu)建項目

    def build_job(self, name, parameters=None, token=None):
        if not self.job_exists(name):
            raise JenkinsException('no such job[%s]' % (name))
        return self.jenkins_open(urllib2.Request(
            self.build_job_url(name, parameters, token)))

構(gòu)建一樣要用token铸本,然后的動作就是傳入項目名了肮雨。

怎么判斷一次構(gòu)建是否完成呢?

    def get_job_info(self, name):
        try:
            response = self.jenkins_open(urllib2.Request(
                self.server + JOB_INFO % locals()))
            if response:
                return json.loads(response)
            else:
                raise JenkinsException('job[%s] does not exist' % name)
        except urllib2.HTTPError:
            raise JenkinsException('job[%s] does not exist' % name)
        except ValueError:
            raise JenkinsException(
                "Could not parse JSON info for job[%s]" % name)

返回結(jié)果

>>> J.get_job_info('bbs.youth.cn')
{u'scm': {}, u'color': u'blue', u'lastSuccessfulBuild': {u'url': u'http://172.18.11.98:8080/job/bbs.youth.cn/137/', u'number': 137}, u'actions': [{}, {}], u'lastCompletedBuild': {u'url': u'http://172.18.11.98:8080/job/bbs.youth.cn/137/', u'number': 137}, u'lastUnsuccessfulBuild': None, u'upstreamProjects': [], u'lastFailedBuild': None, u'healthReport': [{u'iconUrl': u'health-80plus.png', u'score': 100, u'description': u'Build stability: No recent builds failed.'}], u'queueItem': None, u'lastBuild': {u'url': u'http://172.18.11.98:8080/job/bbs.youth.cn/137/', u'number': 137}, u'lastStableBuild': {u'url': u'http://172.18.11.98:8080/job/bbs.youth.cn/137/', u'number': 137}, u'description': u'\u9752\u7f51\u8bba\u575b', u'downstreamProjects': [], u'concurrentBuild': False, u'lastUnstableBuild': None, u'buildable': True, u'displayNameOrNull': None, u'inQueue': False, u'keepDependencies': False, u'name': u'bbs.youth.cn', u'displayName': u'bbs.youth.cn', u'builds': [{u'url': u'http://172.18.11.98:8080/job/bbs.youth.cn/137/', u'number': 137}, {u'url': u'http://172.18.11.98:8080/job/bbs.youth.cn/136/', u'number': 136}, {u'url': u'http://172.18.11.98:8080/job/bbs.youth.cn/135/', u'number': 135}, {u'url': u'http://172.18.11.98:8080/job/bbs.youth.cn/134/', u'number': 134}, {u'url': u'http://172.18.11.98:8080/job/bbs.youth.cn/133/', u'number': 133}, {u'url': u'http://172.18.11.98:8080/job/bbs.youth.cn/132/', u'number': 132}, {u'url': u'http://172.18.11.98:8080/job/bbs.youth.cn/131/', u'number': 131}, {u'url': u'http://172.18.11.98:8080/job/bbs.youth.cn/130/', u'number': 130}, {u'url': u'http://172.18.11.98:8080/job/bbs.youth.cn/129/', u'number': 129}, {u'url': u'http://172.18.11.98:8080/job/bbs.youth.cn/128/', u'number': 128}], u'url': u'http://172.18.11.98:8080/job/bbs.youth.cn/', u'firstBuild': {u'url': u'http://172.18.11.98:8080/job/bbs.youth.cn/128/', u'number': 128}, u'nextBuildNumber': 138, u'property': [{}]}

本次成功構(gòu)建的版本號lastSuccessfulBuild的number是137箱玷,我需要現(xiàn)將本次構(gòu)建的nextBuildNumber存入數(shù)據(jù)庫的svn_next_no字段里(比如138)怨规,下次構(gòu)就通過while循環(huán)獲取get_job_info來獲得lastSuccessfulBuild的number(最后一次成功構(gòu)建的版本號),直到項目從137變成138后锡足,在和數(shù)據(jù)庫中的nextBuildNumber(下次構(gòu)建的版本號)進行對比波丰,如果一樣我就認為項目構(gòu)建成功了。

我的平臺代碼如下:

# -*- coding: utf-8 -*-
from cmdb.models import *
from cmdb.myredis.redis_conect import *
from cmdb.myapi.jenkins import jenkins_remote

from django.conf import settings

import time


def release_build_f(job):
    J = jenkins_remote.Jenkins(settings.JENKINS['server'],settings.JENKINS['username'],settings.JENKINS['token'])
    """初始化檢測構(gòu)建項目的當(dāng)前版本號和下一次版本號"""
    if Svn.objects.get(svn_name=job).svn_next_no == "None" or int(Svn.objects.get(svn_name=job).svn_next_no) != int(J.get_job_info(job)['lastSuccessfulBuild']['number']):
        Svn.objects.filter(svn_name=job).update(svn_next_no = J.get_job_info(job)['nextBuildNumber'])
    else:
        pass
    """構(gòu)建項目"""
    J.build_job("%s"%job)
    """進入監(jiān)測版本號變更循環(huán)"""
    while True:
        try:
            """如當(dāng)前構(gòu)建版本號等于下次構(gòu)建版本號舶得,跳出循環(huán)"""
            time.sleep(5)
            if int(J.get_job_info(job)['lastSuccessfulBuild']['number']) == int(Svn.objects.get(svn_name=job).svn_next_no):
                """跳出"""
                break
        except Exception as err:
            break
            return ("構(gòu)建異常",err)
    """項目發(fā)布后同步構(gòu)建項目的當(dāng)前版本號和下一次版本號"""
    try:
        Svn.objects.filter(svn_name=job).update(svn_no = J.get_job_info(job)['lastSuccessfulBuild']['number'],
                                                svn_next_no = J.get_job_info(job)['nextBuildNumber'],
                                                svn_time = '%s %s' %( str(J.get_build_info(job,J.get_job_info(job)['lastSuccessfulBuild']['number'])['id']).split('_')[0],
                                                                      str(J.get_build_info(job,J.get_job_info(job)['lastSuccessfulBuild']['number'])['id']).split('_')[1].replace('-',':'))
        )
    except Exception as err:
        print err
    """清空項目對應(yīng)的發(fā)布狀態(tài)緩存"""
    try:
        r = redis_conect_db6()
        r.delete(*r.keys('%s*' % job))
    except:
        pass
    return ("%s進入構(gòu)建隊列,版本變更為%s,10秒鐘后刷新更新頁面"%(job, J.get_job_info(job)['lastSuccessfulBuild']['number']))

三掰烟、利用Jenkins-python 查看構(gòu)建項目變更

    def get_build_info(self, name, number):
        try:
            response = self.jenkins_open(urllib2.Request(
                self.server + BUILD_INFO % locals()))
            if response:
                return json.loads(response)
            else:
                raise JenkinsException('job[%s] number[%d] does not exist'
                                       % (name, number))
        except urllib2.HTTPError:
            raise JenkinsException('job[%s] number[%d] does not exist'
                                   % (name, number))
        except ValueError:
            raise JenkinsException(
                'Could not parse JSON info for job[%s] number[%d]'
                % (name, number)
            )

我們需要傳入項目名,然后就是需要查看項目變更的構(gòu)建版本號

返回結(jié)果

>>> J.get_build_info('bbs.youth.cn',137)
{u'building': False, u'changeSet': {u'items': [], u'kind': u'svn', u'revisions': [{u'module': u'http://172.18.11.96/svndata/bbs_youth/trunk', u'revision': 209}]}, u'builtOn': u'', u'description': None, u'artifacts': [], u'timestamp': 1497414529627, u'number': 137, u'actions': [{u'causes': [{u'userName': u'\u5f20\u5e06', u'userId': u'zhangfan', u'shortDescription': u'Started by user \u5f20\u5e06'}]}, {}, {}, {}], u'id': u'2017-06-14_12-28-49', u'keepLog': False, u'url': u'http://172.18.11.98:8080/job/bbs.youth.cn/137/', u'culprits': [], u'result': u'SUCCESS', u'executor': None, u'duration': 1535, u'fullDisplayName': u'bbs.youth.cn #137', u'estimatedDuration': 1865}

changeSet里msg就是變更內(nèi)容啦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載沐批,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者纫骑。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市珠插,隨后出現(xiàn)的幾起案子惧磺,更是在濱河造成了極大的恐慌颖对,老刑警劉巖捻撑,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡顾患,警方通過查閱死者的電腦和手機番捂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來江解,“玉大人设预,你說我怎么就攤上這事±绾樱” “怎么了鳖枕?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長桨螺。 經(jīng)常有香客問我宾符,道長,這世上最難降的妖魔是什么灭翔? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任魏烫,我火速辦了婚禮,結(jié)果婚禮上肝箱,老公的妹妹穿的比我還像新娘哄褒。我一直安慰自己,他們只是感情好煌张,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布呐赡。 她就那樣靜靜地躺著,像睡著了一般骏融。 火紅的嫁衣襯著肌膚如雪罚舱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天绎谦,我揣著相機與錄音管闷,去河邊找鬼。 笑死窃肠,一個胖子當(dāng)著我的面吹牛包个,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播冤留,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼碧囊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了纤怒?” 一聲冷哼從身側(cè)響起糯而,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎泊窘,沒想到半個月后熄驼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體像寒,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年瓜贾,在試婚紗的時候發(fā)現(xiàn)自己被綠了诺祸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡祭芦,死狀恐怖筷笨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情龟劲,我是刑警寧澤胃夏,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站昌跌,受9級特大地震影響构订,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜避矢,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一悼瘾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧审胸,春花似錦亥宿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碍庵,卻和暖如春映企,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背静浴。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工堰氓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人苹享。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓双絮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親得问。 傳聞我的和親對象是個殘疾皇子囤攀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容