<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          使用 Jenkins 構(gòu)建 CI/CD 之多分支流水線(xiàn)

          共 5538字,需瀏覽 12分鐘

           ·

          2021-10-25 01:02

          緣起

          由于公司的 Jenkins 配置沒(méi)有部署成功的通知,在我學(xué)了幾天的 Jenkins 后終于是對(duì)公司的 Jenkins 配置下手了,結(jié)果我剛裝完 dingtalk 插件自動(dòng)重啟后,發(fā)現(xiàn)之前主管配置的構(gòu)建項(xiàng)目數(shù)據(jù)都丟失了,正好給了我練手的機(jī)會(huì),于是就有了以下從0到1的辛酸歷程。

          在 Docker 中安裝并運(yùn)行 Jenkins

          這里假設(shè)你的服務(wù)器已經(jīng)裝好了docker

          使用的鏡像是 jenkinsci/blueocean,這是一個(gè) Jenkins 的穩(wěn)定及持續(xù)維護(hù)的鏡像源,本身就集成了 Blue Ocean 等使用插件,非常方便。

          拉取鏡像

          docker pull jenkinsci/blueocean

          運(yùn)行 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ù)解釋?zhuān)?/span>

          • -idt 以交互的方式、新建一個(gè)模擬終端運(yùn)行容器
          • —name 容器的別名
          • -p 指定容器映射宿主機(jī)的端口 -> 宿主機(jī)端口:容器端口
          • -v jenkins-data:/var/jenkins_home Jenkins容器在工作的時(shí)候,如果要執(zhí)行Docker的命令(例如 docker ps、docker run等),需要有個(gè)途徑能連接到宿主機(jī)的docker服務(wù),此參數(shù)就是用來(lái)建立容器和宿主機(jī)docker服務(wù)的連接的
          • -v /data/web-data/docker.sock:/var/run/docker.sock 將該容器的數(shù)據(jù)保留在宿主機(jī)的目錄,這樣即使容器崩潰了,里面的配置和任務(wù)都不會(huì)丟失
          需要注意的是,docker 中默認(rèn)是以 Jenkins 用戶(hù)運(yùn)行的 Jenkins,如需以 root 用戶(hù)可以加參數(shù) -u root,本示例未指定 root。

          訪(fǎng)問(wèn) Jenkins Docker 容器

          有時(shí)候需要進(jìn)入 Jenkins 容器執(zhí)行一些命令,可以通過(guò) docker exec 命令訪(fǎng)問(wèn),例如:docker exec -it [containerid] bash

          若要手動(dòng)重啟 Jenkins,可以執(zhí)行以下命令:docker restart [containerid]

          Jenkins 基本配置
          通過(guò)以上步驟,如果正常走到這里,可以通過(guò)以下地址訪(fǎng)問(wèn)http://121.41.16.183:9090/,IP 地址為服務(wù)器的地址。

          解鎖 Jenkins

          輸入一下命令獲取解鎖的 token,

          docker exec kmywjenkins cat /var/jenkins_home/secrets/initialAdminPassword


          在瀏覽器中輸入對(duì)應(yīng)的 token 以解鎖:

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

          我司用得版本管理工具是 gitte,以 gitte 為例,其它版本管理工具配置也一樣
          類(lèi)型選擇 Username with password,用戶(hù)名密碼為登錄 gitte 的賬號(hào)密碼,ID 是憑據(jù)的唯一標(biāo)識(shí),可自定義,后面在 JenkinsFile 中通過(guò) ID 去引用憑據(jù)。
          配置后的結(jié)果
          SSH 連接服務(wù)器時(shí)需要密鑰,我們先在服務(wù)器生成一對(duì)公私鑰,然后復(fù)制私鑰,填入即可。類(lèi)型選擇 SSH Username with private key,Username 是連接服務(wù)器的用戶(hù)名,如 Jenkins 在 Private Key 項(xiàng)選中 Enter directly,點(diǎn)擊 Add,粘貼剛復(fù)制的私鑰。

          配置后的結(jié)果

          創(chuàng)建一個(gè)多分支流水線(xiàn)

          之前的 Jenkins 任務(wù)是 FreeStyle 的方式創(chuàng)建的,這種方式不夠靈活,界面也不夠清爽,這里選擇使用聲明式流水線(xiàn)方式(Declarative Pipeline)創(chuàng)建,可以多分支獨(dú)立構(gòu)建,便于以后的擴(kuò)展。
          我們這里使用 BlueOcean 這種方式來(lái)完成此處 CI/CD 的工作,BlueOcean 是 Jenkins 團(tuán)隊(duì)從用戶(hù)體驗(yàn)角度出發(fā),專(zhuān)為 Jenkins Pipeline 重新設(shè)計(jì)的一套 UI 界面,仍然兼容以前的 fressstyle 類(lèi)型的 job,BlueOcean 具有以下的一些特性:
          • 連續(xù)交付(CD)Pipeline 的復(fù)雜可視化,允許快速直觀的了解 Pipeline 的狀態(tài)
          • 可以通過(guò) Pipeline 編輯器直觀的創(chuàng)建 Pipeline
          • 需要干預(yù)或者出現(xiàn)問(wèn)題時(shí)快速定位,BlueOcean 顯示了 Pipeline 需要注意的地方,便于異常處理和提高生產(chǎn)力
          • 用于分支和拉取請(qǐng)求的本地集成可以在 GitHub 或者 Bitbucket 中與其他人進(jìn)行代碼協(xié)作時(shí)最大限度提高開(kāi)發(fā)人員的生產(chǎn)力。

          如果安裝的是 Jenkinsci/blueocean 鏡像,默認(rèn)是已經(jīng)集成了 BlueOcean,沒(méi)有的可前往插件管理安裝對(duì)應(yīng)的插件。

          點(diǎn)擊打開(kāi)Blue Ocean,可以看到已經(jīng)創(chuàng)建好的兩個(gè)流水線(xiàn),分別是前端和后臺(tái),需要用到不同的工具,在后面會(huì)提到,如何創(chuàng)建流水線(xiàn)。

          點(diǎn)擊創(chuàng)建流水線(xiàn)

          我司用的是gitte,所以選擇Git,然后填入要連接的倉(cāng)庫(kù)地址,需要連接到Git倉(cāng)庫(kù)的憑據(jù),我們之前已經(jīng)創(chuàng)建好了,直接選中即可,如果未創(chuàng)建,在下面的表單直接編輯即可,最后點(diǎn)擊創(chuàng)建流水線(xiàn)。

          到這里我們就創(chuàng)建了一個(gè)多分支流水線(xiàn),Jenkins 會(huì)掃描倉(cāng)庫(kù),帶有 JenkinsFile 的分支會(huì)被檢測(cè)出來(lái),JenkinFile 是多分支流水線(xiàn)的配置文件,使用的是 Groovy 語(yǔ)法,可以直接點(diǎn)擊創(chuàng)建流水線(xiàn),Jenkins 會(huì)自動(dòng)為你的項(xiàng)目創(chuàng)建一個(gè) JenkinsFile。

          現(xiàn)在可以可視化地編輯想要執(zhí)行的階段及步驟,這里加了一個(gè)打包的階段,里面有個(gè)步驟是提示開(kāi)始打包,點(diǎn)擊保存。

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

          我這里不知道為什么會(huì)卡在這個(gè)地方不動(dòng),所以我在 vscode 直接創(chuàng)建并編輯 JenkinsFile,這種方式更靈活,我更推薦這種方式,下面我會(huì)先簡(jiǎn)單介紹下 JeninsFile 的基礎(chǔ)語(yǔ)法,僅包含本項(xiàng)目用到的,對(duì)于中小企業(yè)的構(gòu)建需求,基本夠用了。

          JenkinsFile 基礎(chǔ)語(yǔ)法

          只需先了解大致的語(yǔ)法,具體的用法會(huì)在后面說(shuō)明:

          // 前端項(xiàng)目JenkinsFile配置,后端項(xiàng)目配置稍有不同,后面會(huì)區(qū)分說(shuō)明
          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:?'你需要選擇哪個(gè)環(huán)境進(jìn)行部署 ?',
          ??????name:?'env',
          ??????choices:?['測(cè)試環(huán)境',?'線(xià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?'開(kāi)始安裝依賴(lài)'
          ??????????sh?'yarn'
          ??????????echo?'開(kāi)始打包'
          ??????????sh?'yarn run build'
          ????????}
          ??????}
          ????}

          ????stage('部署') {
          ??????when {
          ????????expression {
          ??????????params.env ==?'測(cè)試環(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 ==?'線(xiàn)上環(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:?'你有新的消息,請(qǐng)注意查收',
          ????????text:[
          ??????????'# 運(yùn)營(yíng)管理系統(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 定義了在哪個(gè)環(huán)境里執(zhí)行,默認(rèn)any
          • stages 階段,標(biāo)識(shí)構(gòu)建流程的標(biāo)簽塊,子節(jié)點(diǎn)是stage
          • steps 執(zhí)行步驟
          • post 所有階段執(zhí)行完成后執(zhí)行一些邏輯
          • when 可以控制該階段是否執(zhí)行
          • environment 環(huán)境變量,在這里定義的變量,JenkinsFile的任何地方都可以訪(fǎng)問(wèn)
          • tools 項(xiàng)目使用到的構(gòu)建工具,聲明系統(tǒng)配置中已經(jīng)定義好的工具,如maven
          • parameters 定義參數(shù),可以提供用戶(hù)輸入或者選擇
          • post 構(gòu)建結(jié)束后會(huì)執(zhí)行這里,有success、failure、success,本示例將在success(構(gòu)建成功時(shí))發(fā)起釘釘通知

          文章轉(zhuǎn)載:高效運(yùn)維
          (版權(quán)歸原作者所有,侵刪)


          點(diǎn)擊下方“閱讀原文”查看更多

          瀏覽 77
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  美女露出粉嫩的尿囗桶爽 | 黑人操屄视频 | 免费看黄片的视频 | 国产精品无码白浆高潮 | 2016av天堂网 |