採用rancher2+kubernetes+skywalking部署springCloud項目(三[jenkins審覈發佈])

本系列文章目錄(計劃中)

前言

上一篇採用rancher2+kubernetes+skywalking部署springcloud項目(二[helm版本])文章裏完成了通過自已寫的shell腳本實現了對項目的自動化部署。

通過執行shell腳本來觸發部署還得操作linux輸入命令啥的,雖然B格高但始終還是覺得有點不方便。

對於發佈這種東西個人應該更傻瓜式一點就對了。所以,那就直接用jenkins吧!
哪個模塊想發佈就點哪裏!

對於spring cloud這種項目,子模塊動不動就好幾十個,如果還是通過傳統的jenkins項目來發布其實是很不方便的,修改某個項目的配置啥的還得點點點填填填,要是能用代碼來管理髮布的流程就好了。

對於這一點可能開發jenkins的大佬們也早已想到了,於是早在幾年前jenkins就早已推出了pipeline插件,允許用戶通過編寫部署腳本來對發佈的流程進行統一管理。我也還記得當時還試用過,感覺確實很不錯後那時的我還專門寫了一篇博文記錄了一下:jenkins2.0+pipeline體驗筆記

看到那篇文章的發佈時間是2017年(畢業那年)的,這讓我想到了一首歌的歌詞:

  • 猶記得那年我們都還很年幼
  • 而如今琴聲幽幽我的等候你沒聽過
  • ……

是呀!時光匆匆,轉眼已畢業三年

將發佈的流程用jenkins的pipeline來改造就比較簡單了,輕車熟路直接開寫就行!爲了方便,決定還是將jenkins通過docker來安裝

演示效果

傳統界面發佈演示
再來個Blue Ocean樣式的
blue ocean樣式發佈

docker中安裝jenkins

docker pull jenkins/jenkins:lts

創建一個jenkins目錄,用於存放jenkins的東西

sudo mkdir -p /data/jenkins_home

運行jenkins容器,暴露出8081端口出來

docker run -d --name jenkins -p 8081:8080 -v /data/jenkins_home:/var/jenkins_home jenkins/jenkins:lts

改變目錄的權限

chown -R 1000:1000 /data/jenkins_home/

查看下日誌,看下是否啓動正常

docker logs -f jenkins

待啓動好後,日誌會提示默認密碼在initialAdminPassword文件中,於是查看下日誌文件就行了

cat /data/jenkins_home/secrets/initialAdminPassword

獲取出密碼後直接登錄就行,然後安裝對應的插件

安裝插件

登錄jenkins系統後,進入插件管理界面,添加pipeline插件

菜單位於【系統管理】->【插件管理】下

jenkins插件管理

然後搜索下以下插件名稱:

  • Blue Ocean(好看的界面)
  • Pipeline(管道插件)
  • DingTalk(發釘釘消息)

編寫pipeline腳本

先寫一個感覺通用一點的腳本,內容主要包括釘釘發消息和審批功能

/**
 * 獲取項目模塊列表
 */
def static getModuleList() {
    return ['auth-service', 'config', 'gateway', 'monitor', 'registry', 'svca-service', 'svcb-service', 'zipkin']
}


/**
 * 發送釘釘審計消息
 * @param deployModuleName 部署的項目名稱
 * @param packageSubmitter 申請發佈人
 * @param auditSubmitterDingTalkMobile 審計人釘釘的手機號
 * @return
 */
def sendDingtalkAuditMsg(deployModuleName, packageSubmitter, auditSubmitterDingTalkMobile) {
    dingtalk(
            robot: dingTalkRobotId,
            type: 'ACTION_CARD',
            title: '審批通知消息',
            text: [
                    '審批提醒',
                    '---',
                    '大佬好呀,您有一個發佈項目的審批提醒喔!',
                    "- 模塊名稱: ${deployModuleName}",
                    "- 發起人: ${packageSubmitter}"
            ],
            btns: [
                    [
                            title    : '前往審批',
                            actionUrl: 'https://www.dingtalk.com/'
                    ],
                    [
                            title    : '不予處理',
                            actionUrl: 'https://www.dingtalk.com/'
                    ]
            ],
            at: [auditSubmitterDingTalkMobile]
    )
}
/**
 * 發佈部署成功的通知
 * @param deployModuleName 模塊名稱
 * @param packageSubmitter 發包人
 * @param aduitInputResult 審覈人
 */
def sendDeploySuccessDingtalkMsg(deployModuleName, packageSubmitter, aduitInputResult) {
    dingtalk(
            robot: dingTalkRobotId,
            type: 'MARKDOWN',
            title: '部署完畢通知',
            atAll: true,
            text: [
                    '部署完畢通知',
                    '---',
                    "各位大佬好呀!",
                    "- 模塊名稱: <font color=blue>${deployModuleName}</font>",
                    "- 發起人: ${packageSubmitter}",
                    "- 審批人: ${aduitInputResult}",
                    "",
                    "已完成部署"
            ]
    )
}

pipeline {
    agent any

    environment {
        //打包輸入框結果
        packageInputResult = ''
        //審批輸入框結果
        aduitInputResult = ''
        packageSubmitter = 'puhaiyang(具有發起打包權限的用戶名)'
        auditSubmitter = 'puhaiyang(具有審覈權限的jenkins用戶名)'
        dingTalkRobotId = '釘釘機器人ID'
        auditSubmitterDingTalkMobile = '審覈人的釘釘手機號,用於在釘釘羣裏@他'
        moduleList = getModuleList()
    }

    stages {
        stage('打包') {
            steps {
                script {
                    //部署的模塊列表
                    packageInputResult = input id: 'Test_deploy_001', message: '請選擇將要發佈的模塊', ok: '確定',
                            parameters: [choice(choices: moduleList, description: '請選擇部署的項目', name: 'deployModuleName')],
                            submitter: "${packageSubmitter}", submitterParameter: 'packageSubmitter'
                }
                echo "${packageInputResult.deployModuleName} will deploy!!!"
            }
        }

        stage('審批') {
            steps {
                //發送通知告訴審批人有新的任務需要進行審批了
                sendDingtalkAuditMsg(packageInputResult.deployModuleName, packageInputResult.packageSubmitter, auditSubmitterDingTalkMobile)
                script {
                    aduitInputResult = input message: "確定發佈${packageInputResult.deployModuleName}模塊嗎?",
                            ok: '確定', submitter: "${auditSubmitter}", submitterParameter: 'auditSubmitter'
                }
                echo "${aduitInputResult}審覈完畢"
            }
        }

        stage('發佈') {
            steps {
                //TODO 執行發佈腳本;sh ssh -i /data/keys/mykeys [email protected] "~/helm-deploy.sh registry"
                echo "${packageInputResult.deployModuleName}發佈完畢"
                //發佈完,通知所有人發佈完成了
                sendDeploySuccessDingtalkMsg("${packageInputResult.deployModuleName}", "${packageInputResult.packageSubmitter}", "${aduitInputResult}")
            }
        }
    }
}

創建pipeline項目

將上面的插件安裝好後,創建一個流水線的項目
pipeline配置
對於pipeline script有兩種方式可以配置

  • 一種是直接將pipeline的腳本貼在框框裏
  • 另一種是配置一個倉庫地址,每次運行時jenkins自動從配置的地址中去拉取一次(較爲靈活,跟寫代碼一樣一樣的,本文中用的這種方式)
    在Repository URL中填寫git的地址,如我這裏的:

https://github.com/puhaiyang/spring-boot-cloud.git

腳本路徑處填寫jenkinsfile的路徑(https://github.com/puhaiyang/spring-boot-cloud/blob/master/devops/jenkins/jenkinsfile),如我這裏的:

devops/jenkins/jenkinsfile

運行查看效果

填好後,點下Build Now就行了
再截圖一下釘釘通知的內容
釘釘通知消息
還有這可愛的小蘑菇:
釘釘發佈通知

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章