<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 之多分支流水線

          共 5557字,需瀏覽 12分鐘

           ·

          2021-10-25 00:11


          緣起

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

          在 Docker 中安裝并運行 Jenkins

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

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

          拉取鏡像

          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ù)都不會丟失
          需要注意的是,docker 中默認(rèn)是以 Jenkins 用戶運行的 Jenkins,如需以 root 用戶可以加參數(shù) -u root,本示例未指定 root。

          訪問 Jenkins Docker 容器

          有時候需要進(jìn)入 Jenkins 容器執(zhí)行一些命令,可以通過 docker exec 命令訪問,例如: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ù)為例:

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

          配置后的結(jié)果

          創(chuàng)建一個多分支流水線

          之前的 Jenkins 任務(wù)是 FreeStyle 的方式創(chuàng)建的,這種方式不夠靈活,界面也不夠清爽,這里選擇使用聲明式流水線方式(Declarative Pipeline)創(chuàng)建,可以多分支獨立構(gòu)建,便于以后的擴展。
          我們這里使用 BlueOcean 這種方式來完成此處 CI/CD 的工作,BlueOcean 是 Jenkins 團(tuán)隊從用戶體驗角度出發(fā),專為 Jenkins Pipeline 重新設(shè)計的一套 UI 界面,仍然兼容以前的 fressstyle 類型的 job,BlueOcean 具有以下的一些特性:
          • 連續(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)的插件。

          點擊打開Blue Ocean,可以看到已經(jīng)創(chuàng)建好的兩個流水線,分別是前端和后臺,需要用到不同的工具,在后面會提到,如何創(chuàng)建流水線。

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

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

          到這里我們就創(chuàng)建了一個多分支流水線,Jenkins 會掃描倉庫,帶有 JenkinsFile 的分支會被檢測出來,JenkinFile 是多分支流水線的配置文件,使用的是 Groovy 語法,可以直接點擊創(chuàng)建流水線,Jenkins 會自動為你的項目創(chuàng)建一個 JenkinsFile。

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

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

          我這里不知道為什么會卡在這個地方不動,所以我在 vscode 直接創(chuàng)建并編輯 JenkinsFile,這種方式更靈活,我更推薦這種方式,下面我會先簡單介紹下 JeninsFile 的基礎(chǔ)語法,僅包含本項目用到的,對于中小企業(yè)的構(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


          瀏覽 55
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  91AV视频| 呜呜呜视频在线观看 | 日韩一级无码毛片 | 无码破解日韩AV无码 | 在线日韩aaa |