1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 5557字,需瀏覽 12分鐘

         ·

        2021-10-25 00:11


        緣起

        由于公司的 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ù)解釋:

        • -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 用戶運(yùn)行的 Jenkins,如需以 root 用戶可以加參數(shù) -u root,本示例未指定 root。

        訪問(wèn) Jenkins Docker 容器

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

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

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

        配置后的結(jié)果

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

        之前的 Jenkins 任務(wù)是 FreeStyle 的方式創(chuàng)建的,這種方式不夠靈活,界面也不夠清爽,這里選擇使用聲明式流水線方式(Declarative Pipeline)創(chuàng)建,可以多分支獨(dú)立構(gòu)建,便于以后的擴(kuò)展。
        我們這里使用 BlueOcean 這種方式來(lái)完成此處 CI/CD 的工作,BlueOcean 是 Jenkins 團(tuán)隊(duì)從用戶體驗(yàn)角度出發(fā),專為 Jenkins Pipeline 重新設(shè)計(jì)的一套 UI 界面,仍然兼容以前的 fressstyle 類型的 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í)最大限度提高開發(fā)人員的生產(chǎn)力。

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

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

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

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

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

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

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

        我這里不知道為什么會(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)境',?'線上環(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 ==?'測(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 ==?'線上環(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的任何地方都可以訪問(wèn)
        • tools 項(xiàng)目使用到的構(gòu)建工具,聲明系統(tǒng)配置中已經(jīng)定義好的工具,如maven
        • parameters 定義參數(shù),可以提供用戶輸入或者選擇
        • post 構(gòu)建結(jié)束后會(huì)執(zhí)行這里,有success、failure、success,本示例將在success(構(gòu)建成功時(shí))發(fā)起釘釘通知
        原文鏈接:https://www.codingsky.com/m/doc/2021/8/21/357.html


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

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产三级农村妇女在线观看 | 国产特级婬片免费看车阵 | 亚洲午夜精品一区二区三区 | 又粗又大又爽免费视频 | 天天操操操操 | 亚洲三级电影在线观看 | 91蜜桃视频在线观看 | 女人高潮AAA大片App | 香蕉视频成人 | 亚洲电影一级片 |