使用 Jenkins 構(gòu)建 CI/CD 之多分支流水線
緣起
由于公司的 Jenkins 配置沒有部署成功的通知,在我學(xué)了幾天的 Jenkins 后終于是對公司的 Jenkins 配置下手了,結(jié)果我剛裝完 dingtalk 插件自動重啟后,發(fā)現(xiàn)之前主管配置的構(gòu)建項目數(shù)據(jù)都丟失了,正好給了我練手的機會,于是就有了以下從0到1的辛酸歷程。
在 Docker 中安裝并運行 Jenkins
這里假設(shè)你的服務(wù)器已經(jīng)裝好了docker
拉取鏡像
docker pull jenkinsci/blueocean運行 Jenkins
docker run -idt —name kmywjenkins -p 9090:8080 -p 60000:50000 -v jenkins-data:/var/jenkins_home -v /data/web-data/docker.sock:/var/run/docker.sock jenkinsci/blueocean參數(shù)解釋:
-idt 以交互的方式、新建一個模擬終端運行容器 —name 容器的別名 -p 指定容器映射宿主機的端口 -> 宿主機端口:容器端口 -v jenkins-data:/var/jenkins_home Jenkins容器在工作的時候,如果要執(zhí)行Docker的命令(例如 docker ps、docker run等),需要有個途徑能連接到宿主機的docker服務(wù),此參數(shù)就是用來建立容器和宿主機docker服務(wù)的連接的 -v /data/web-data/docker.sock:/var/run/docker.sock 將該容器的數(shù)據(jù)保留在宿主機的目錄,這樣即使容器崩潰了,里面的配置和任務(wù)都不會丟失
訪問 Jenkins Docker 容器
docker exec -it [containerid] bash若要手動重啟 Jenkins,可以執(zhí)行以下命令:docker restart [containerid]
Jenkins 基本配置
通過以上步驟,如果正常走到這里,可以通過以下地址訪問http://121.41.16.183:9090/,IP 地址為服務(wù)器的地址。
解鎖 Jenkins
輸入一下命令獲取解鎖的 token,
docker exec kmywjenkins cat /var/jenkins_home/secrets/initialAdminPassword在瀏覽器中輸入對應(yīng)的 token 以解鎖:

創(chuàng)建憑據(jù)
連接 git 倉庫,ssh 連接服務(wù)器均需要相應(yīng)的憑據(jù),可以在憑據(jù)管理中先創(chuàng)建好,然后需要使用的地方直接選擇憑據(jù)即可。這里以連接git、ssh需要的憑據(jù)為例:



配置后的結(jié)果

創(chuàng)建一個多分支流水線
之前的 Jenkins 任務(wù)是 FreeStyle 的方式創(chuàng)建的,這種方式不夠靈活,界面也不夠清爽,這里選擇使用聲明式流水線方式(Declarative Pipeline)創(chuàng)建,可以多分支獨立構(gòu)建,便于以后的擴展。
連續(xù)交付(CD)Pipeline 的復(fù)雜可視化,允許快速直觀的了解 Pipeline 的狀態(tài) 可以通過 Pipeline 編輯器直觀的創(chuàng)建 Pipeline 需要干預(yù)或者出現(xiàn)問題時快速定位,BlueOcean 顯示了 Pipeline 需要注意的地方,便于異常處理和提高生產(chǎn)力 用于分支和拉取請求的本地集成可以在 GitHub 或者 Bitbucket 中與其他人進(jìn)行代碼協(xié)作時最大限度提高開發(fā)人員的生產(chǎn)力。
如果安裝的是 Jenkinsci/blueocean 鏡像,默認(rèn)是已經(jīng)集成了 BlueOcean,沒有的可前往插件管理安裝對應(yīng)的插件。


點擊創(chuàng)建流水線




填入提交信息,點擊 Save & Run,會講 JenkinsFile 上傳到 git,并根據(jù) JenkinsFile 執(zhí)行一個構(gòu)建任務(wù),目前的構(gòu)建步驟只有一個,是提示開始打包。

JenkinsFile 基礎(chǔ)語法
只需先了解大致的語法,具體的用法會在后面說明:
// 前端項目JenkinsFile配置,后端項目配置稍有不同,后面會區(qū)分說明
pipeline {
??agent any
??environment {
????HOST_TEST =?'[email protected]'
????HOST_ONLINE =?'[email protected]'
????SOURCE_DIR =?'dist/*'
????TARGET_DIR =?'/data/www/kuaimen-yunying-front'
??}
??parameters {
????choice(
??????description:?'你需要選擇哪個環(huán)境進(jìn)行部署 ?',
??????name:?'env',
??????choices:?['測試環(huán)境',?'線上環(huán)境']
????)
????string(name:?'update', defaultValue:?'', description:?'本次更新內(nèi)容?')
??}
??triggers {
????GenericTrigger(
?????genericVariables:?[
??????[key:?'ref', value:?'$.ref']
?????],
?????causeString:?'Triggered on $ref',
?????token:?'runcenter-front-q1w2e3r4t5',
?????tokenCredentialId:?'',
?????printContributedVariables:?true,
?????printPostContent:?true,
?????silentResponse: false,
?????regexpFilterText:?'$ref',
?????regexpFilterExpression:?'refs/heads/'?+ BRANCH_NAME
????)
??}
??stages {
????stage('獲取git commit message') {
?????steps {
???????script {
?????????env.GIT_COMMIT_MSG =?sh?(script:?'git log -1 --pretty=%B ${GIT_COMMIT}', returnStdout:?true).trim()
???????}
?????}
??}
????stage('打包') {
??????steps {
????????nodejs('nodejs-12.16') {
??????????echo?'開始安裝依賴'
??????????sh?'yarn'
??????????echo?'開始打包'
??????????sh?'yarn run build'
????????}
??????}
????}
????stage('部署') {
??????when {
????????expression {
??????????params.env ==?'測試環(huán)境'
????????}
??????}
??????steps {
????????sshagent(credentials:?['km-test2']) {
??????????sh?"ssh -o StrictHostKeyChecking=no ${HOST_TEST} uname -a"
??????????sh?"scp -r ${SOURCE_DIR} ${HOST_TEST}:${TARGET_DIR}"
??????????sh?'echo "部署成功~"'
????????}
??????}
????}
????stage('發(fā)布') {
??????when {
????????expression {
??????????params.env ==?'線上環(huán)境'
????????}
??????}
??????steps {
????????sshagent(credentials:?['km-online']) {
??????????sh?"ssh -o StrictHostKeyChecking=no ${HOST_ONLINE} uname -a"
??????????sh?"scp -r ${SOURCE_DIR} ${HOST_ONLINE}:${TARGET_DIR}"
??????????sh?'echo "發(fā)布成功~"'
????????}
??????}
????}
??}
??post {
????success {
??????dingtalk (
????????robot:?'77d4c82d-3794-4583-bc7f-556902fee6b0',
????????type:?'MARKDOWN',
????????atAll:?true,
????????title:?'你有新的消息,請注意查收',
????????text:[
??????????'# 運營管理系統(tǒng)發(fā)布通知',
??????????'---',
??????????'#### **所屬:前端**',
??????????"#### **構(gòu)建任務(wù):${env.BUILD_DISPLAY_NAME}**",
??????????"#### **Git commit:${env.GIT_COMMIT_MSG}**",
??????????"#### **本次更新內(nèi)容:${params.update}**",
??????????"#### **部署環(huán)境:${params.env}**",
??????????'#### **構(gòu)建結(jié)果:成功**'
????????]
??????)
????}
??}
}
pipeline 必須在最外層 agent 定義了在哪個環(huán)境里執(zhí)行,默認(rèn)any stages 階段,標(biāo)識構(gòu)建流程的標(biāo)簽塊,子節(jié)點是stage steps 執(zhí)行步驟 post 所有階段執(zhí)行完成后執(zhí)行一些邏輯 when 可以控制該階段是否執(zhí)行 environment 環(huán)境變量,在這里定義的變量,JenkinsFile的任何地方都可以訪問 tools 項目使用到的構(gòu)建工具,聲明系統(tǒng)配置中已經(jīng)定義好的工具,如maven parameters 定義參數(shù),可以提供用戶輸入或者選擇 post 構(gòu)建結(jié)束后會執(zhí)行這里,有success、failure、success,本示例將在success(構(gòu)建成功時)發(fā)起釘釘通知
原文鏈接:https://www.codingsky.com/m/doc/2021/8/21/357.html
