日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

用代碼實(shí)現(xiàn)流水線部署,像詩(shī)一般優(yōu)雅

來(lái)源: 責(zé)編: 時(shí)間:2024-04-03 17:44:17 238觀看
導(dǎo)讀你好,我是悟空。本文目錄如下:圖片這次我們要接著上面的話題聊下如何通過(guò)通過(guò)編寫代碼的方式實(shí)現(xiàn)自動(dòng)化部署 Java 項(xiàng)目。而用代碼方式其實(shí)就是使用 Jenkins 強(qiáng)大的 pipeline 功能來(lái)實(shí)現(xiàn)的。通過(guò)本篇你可以學(xué)習(xí)到如下內(nèi)

你好,我是悟空。APl28資訊網(wǎng)——每日最新資訊28at.com

本文目錄如下:APl28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片APl28資訊網(wǎng)——每日最新資訊28at.com

這次我們要接著上面的話題聊下如何通過(guò)通過(guò)編寫代碼的方式實(shí)現(xiàn)自動(dòng)化部署 Java 項(xiàng)目。APl28資訊網(wǎng)——每日最新資訊28at.com

而用代碼方式其實(shí)就是使用  Jenkins 強(qiáng)大的 pipeline 功能來(lái)實(shí)現(xiàn)的。APl28資訊網(wǎng)——每日最新資訊28at.com

通過(guò)本篇你可以學(xué)習(xí)到如下內(nèi)容:APl28資訊網(wǎng)——每日最新資訊28at.com

  • Pipeline 的概念、優(yōu)點(diǎn)、缺點(diǎn)。
  • 實(shí)戰(zhàn):通過(guò)編寫 pipeline 來(lái)部署一個(gè)完整的后端項(xiàng)目。
  • pipeline 傳參的合理利用。
  • 多選插件、遠(yuǎn)程傳輸文件、遠(yuǎn)程執(zhí)行命令的使用。

一、Pipeline

1.1 流水線

要了解什么是Pipeline,就必須知道什么是流水線。類似于食品工廠包裝食品,食品被放到傳送帶上,經(jīng)過(guò)一系列操作后,包裝完成,這種工程就是流水線工程。APl28資訊網(wǎng)——每日最新資訊28at.com

1.2 Pipeline 是什么

在自動(dòng)化部署中,開(kāi)發(fā)完成的代碼經(jīng)過(guò)一系列順序操作后被部署完成,這個(gè)就是部署過(guò)程中的流水線,我們通常稱作 pipeline。APl28資訊網(wǎng)——每日最新資訊28at.com

之前我們的部署步驟都是通過(guò)在 Jenkins 的 UI 界面上配置出來(lái)的,但其實(shí) Jenkisn 2.x 版本已經(jīng)可以支持編寫代碼的方式來(lái)啟動(dòng)自動(dòng)化部署了,通過(guò)“代碼”來(lái)描述部署流水線。APl28資訊網(wǎng)——每日最新資訊28at.com

Jenkins pipeline其實(shí)就是基于一種聲明式語(yǔ)言,用于描述整條流水線是如何進(jìn)行的。流水線的內(nèi)容包括執(zhí)行編譯、打包、測(cè)試、輸出測(cè)試報(bào)告等步驟。APl28資訊網(wǎng)——每日最新資訊28at.com

1.3 為什么要用 Pipeline

Pipeline 通過(guò)代碼來(lái)實(shí)現(xiàn),其實(shí)就具有很多代碼的優(yōu)勢(shì)了,比如:APl28資訊網(wǎng)——每日最新資訊28at.com

  • 支持傳參:可以在 Pipeline 代碼里面配置用戶要輸入或選擇的參數(shù),這個(gè)功能真的太棒了。比如可以傳 Gitlab 分支名、部署哪個(gè)服務(wù)等。
  • 更好地版本化:將 pipeline 代碼提交到軟件版本庫(kù)中進(jìn)行版本控制。
  • 更好地協(xié)作:pipeline 的每次修改對(duì)所有人都是可見(jiàn)的。除此之外,還可以對(duì)pipeline進(jìn)行代碼審查
  • 更好的重用性:手動(dòng)操作沒(méi)法重用,但是代碼可以重用。

當(dāng)然 pipeline 的缺點(diǎn)也是有的:APl28資訊網(wǎng)——每日最新資訊28at.com

  • 學(xué)習(xí)成本高:需要熟悉 pipeline 的語(yǔ)法規(guī)則。
  • 復(fù)雜:代碼不夠直觀,編寫的邏輯可能很復(fù)雜,容易出錯(cuò)。

1.4 如何使用 Pipeline

在之前的文章中,我是通過(guò)創(chuàng)建一個(gè)自由風(fēng)格的項(xiàng)目來(lái)實(shí)現(xiàn)自動(dòng)化部署,其實(shí)還可以通過(guò)創(chuàng)建一個(gè)Pipeline 來(lái)實(shí)現(xiàn),如下圖所示:APl28資訊網(wǎng)——每日最新資訊28at.com

創(chuàng)建 Pipeline 任務(wù)創(chuàng)建 Pipeline 任務(wù)APl28資訊網(wǎng)——每日最新資訊28at.com

然后就可以在配置流水線的地方編寫代碼了。如下圖所示:APl28資訊網(wǎng)——每日最新資訊28at.com

編寫流水線代碼編寫流水線代碼APl28資訊網(wǎng)——每日最新資訊28at.com

1.5 Pipeline 基礎(chǔ)結(jié)構(gòu)

Pipeline 基礎(chǔ)結(jié)構(gòu)如下所示:APl28資訊網(wǎng)——每日最新資訊28at.com

pipeline{//指定運(yùn)行此流水線的節(jié)點(diǎn)agent any//流水線的階段stages{    //階段1 獲取代碼    stage("CheckOut") {        steps {            script {                echo "獲取代碼"            }        }    }}
  • pipeline 部分:代表整條流水線,包含整條流水線的邏輯。
  • stage 部分:代表流水線的某個(gè)階段。每個(gè)階段都必須有名稱,本例中,"CheckOut" 就是此階段的名稱。
  • stages 部分:流水線中多個(gè)stage的容器。stages 部分至少包含一個(gè) stage。steps 部分:代表階段中的一個(gè)或多個(gè)具體步驟(step)的容器。steps 部分至少包含一個(gè)步驟,本例中,echo就是一個(gè)步驟。在一個(gè) stage 中有且只有一個(gè)steps。
  • agent 部分:指定流水線的執(zhí)行位置(Jenkins agent)。流水線中的每個(gè)階段都必須在某個(gè)地方(物理機(jī)、虛擬機(jī)或Docker容器)執(zhí)行,agent 部分即指定具體在哪里執(zhí)行。

以上每一個(gè)部分都不能少,否則 Jenkins 會(huì)報(bào)錯(cuò)。APl28資訊網(wǎng)——每日最新資訊28at.com

二、部署思路

2.1 Jenkins 承擔(dān)的角色

Jenkins 承擔(dān)的角色如下圖所示:APl28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片APl28資訊網(wǎng)——每日最新資訊28at.com

Jenkins 打包部署原理圖APl28資訊網(wǎng)——每日最新資訊28at.com

  • (1)Jenkins 部署在一臺(tái)服務(wù)器上,然后安裝了很多必備的 Jenkins 插件。比如拉取 Gitlab 倉(cāng)庫(kù)代碼的插件、遠(yuǎn)程執(zhí)行命令和拷貝文件的插件。
  • (2)Jenkins 開(kāi)始運(yùn)行一個(gè)任務(wù)時(shí),通過(guò) Git 插件從 Gitlab 倉(cāng)庫(kù)拉取代碼到本地目錄。
  • (3)Jenkins 通過(guò) JDK 和 Maven 工具對(duì) Java 代碼進(jìn)行打包部署。
  • (4)Jenkins 將 JAR 包拷貝到遠(yuǎn)程服務(wù)器的固定目錄下。
  • (5)Jenkins 通過(guò) SSH 插件執(zhí)行遠(yuǎn)程命令,將包進(jìn)行備份操作。
  • (6)Jenkins 通過(guò)執(zhí)行遠(yuǎn)程命令,更新 JAR 包。
  • (7)Jenkins 通過(guò)執(zhí)行遠(yuǎn)程命令,重啟容器。

2.2 通過(guò)流水線來(lái)部署項(xiàng)目

我們項(xiàng)目是 Java 項(xiàng)目,所以通過(guò)流水線來(lái)部署項(xiàng)目的步驟如下圖所示:APl28資訊網(wǎng)——每日最新資訊28at.com

流水線部署步驟流水線部署步驟APl28資訊網(wǎng)——每日最新資訊28at.com

三、獲取 Gitlab 分支代碼

Pipeline 的強(qiáng)大之處是可以支持傳參以及獲取參數(shù),為了讓用戶可以選擇獲取不同的分支代碼,我在 pipeline 代碼中配置了一個(gè)參數(shù):獲取指定的 Gitlab 分支代碼。APl28資訊網(wǎng)——每日最新資訊28at.com

3.1 Gitlab 分支配置

在 流水線代碼中添加 parameters 節(jié)點(diǎn),指定類型為 string,配置相關(guān)的屬性。APl28資訊網(wǎng)——每日最新資訊28at.com

pipeline {      parameters {          string (            name: 'GIT_BRANCH', // 參數(shù)名,后面 steps 中會(huì)用到            defaultValue: 'dev-01.30', // 默認(rèn)值,會(huì)顯示在界面上,用戶可以改。            description: '請(qǐng)選擇部署的分支' // 說(shuō)明        )    }    // 其他代碼    ...}

通過(guò)參數(shù)部分,定義了一個(gè)名為GIT_BRANCH的參數(shù),它允許用戶在構(gòu)建過(guò)程中選擇要構(gòu)建的分支。默認(rèn)情況下,分支被設(shè)置為dev-01.30,用戶可以選擇不同的分支。APl28資訊網(wǎng)——每日最新資訊28at.com

在腳本中,這個(gè)參數(shù)可以通過(guò)params.GIT_BRANCH 獲取到。APl28資訊網(wǎng)——每日最新資訊28at.com

保存配置后,需要先運(yùn)行一次這個(gè)項(xiàng)目才能看到參數(shù)配置。如下圖所示:右邊就是參數(shù)配置。APl28資訊網(wǎng)——每日最新資訊28at.com

Build with ParametersAPl28資訊網(wǎng)——每日最新資訊28at.com

3.2 配置環(huán)境參數(shù)

接著我們還需要定義一些常用的環(huán)境變量信息,比如 Gitlab 的倉(cāng)庫(kù)地址,代碼如下所示:APl28資訊網(wǎng)——每日最新資訊28at.com

pipeline {    parameters {      // 配置信息      ...    }    // 環(huán)境變量:定義 GitLab 倉(cāng)庫(kù)的 URL 和分支      environment {          GIT_URL = 'https://xxx/xxx.git'             }    // 其他代碼    ...}

environment 節(jié)點(diǎn)為環(huán)境變量信息,GIT_URL 變量代表 Gitlab 的倉(cāng)庫(kù)地址。在腳本中,這個(gè)變量可以通過(guò)${GIT_URL}使用。APl28資訊網(wǎng)——每日最新資訊28at.com

3.3 獲取 Gitlab 分支代碼

接下來(lái)我們來(lái)看下如何在 pipeline 中添加一個(gè)獲取 gitlab 倉(cāng)庫(kù)代碼的步驟。APl28資訊網(wǎng)——每日最新資訊28at.com

pipeline {      agent any      parameters {          string(            name: 'GIT_BRANCH',             defaultValue: 'dev-01.30',             description: '請(qǐng)選擇部署的分支')    }    // 定義 GitLab 倉(cāng)庫(kù)的 URL 和分支      environment {          GIT_URL = 'https://XXX/xxx.git'    }       stages {          stage('獲取最新代碼') {              steps {                  script {                      // 使用 params 對(duì)象獲取參數(shù)值                      def branchName = params.GIT_BRANCH                      echo "Building branch: ${branchName}"                      // 使用 git 插件檢出倉(cāng)庫(kù)的特定分支                      checkout([                          $class: 'GitSCM',                          branches: [[name: "${branchName}"]],                          doGenerateSubmoduleConfigurations: false,                          extensions: [],                          submoduleCfg: [],                          userRemoteConfigs: [[                              credentialsId: '211583e9-8ee1-4fa2-9edd-d43a963de8f2', // 在 Jenkins 憑據(jù)中定義的 GitLab 憑據(jù) ID                              url: "${GIT_URL}"                          ]]                      ])                  }              }          }    }}
  1. 參數(shù)定義:通過(guò)參數(shù)部分,定義了一個(gè)名為GIT_BRANCH的參數(shù),它允許用戶在構(gòu)建過(guò)程中選擇要構(gòu)建的分支。默認(rèn)情況下,分支被設(shè)置為dev-01.30,用戶可以選擇不同的分支。
  2. 環(huán)境變量定義:在環(huán)境部分,設(shè)置了GIT_URL變量,它是GitLab倉(cāng)庫(kù)的URL。在腳本中,這個(gè)變量可以通過(guò)${GIT_URL}使用。
  3. 階段定義:在stages部分,定義了一個(gè)名為"獲取最新代碼"的階段。
  4. 步驟定義:在階段內(nèi),使用了script塊來(lái)執(zhí)行Groovy腳本。這個(gè)腳本首先獲取了GIT_BRANCH參數(shù)的值,然后使用Jenkins的Git插件檢出指定的分支。
  5. 檢出代碼:checkout步驟是用來(lái)從GitLab倉(cāng)庫(kù)檢出代碼的關(guān)鍵部分。它使用了GitSCM類,并傳遞了相應(yīng)的參數(shù),包括分支名、GitLab憑據(jù)等。

注意:獲取分支的憑證是一個(gè) ID,這個(gè)憑證信息是在 Jenkins 系統(tǒng)配置中加的。可以按照如下頁(yè)面路徑添加憑證:Dashboard->Manage Jenkins->Credentials->System->Add domain。也可以通過(guò)如下 URL 訪問(wèn)APl28資訊網(wǎng)——每日最新資訊28at.com

http://<你的服務(wù)器 IP>:8080/manage/credentials/store/system/

圖片圖片APl28資訊網(wǎng)——每日最新資訊28at.com

3.4  測(cè)試 pipeline 執(zhí)行

我們可以運(yùn)行一下這個(gè)項(xiàng)目來(lái)測(cè)試 pipeline 代碼。運(yùn)行結(jié)果如下圖所示,可以看到右側(cè)的階段視圖,整體耗時(shí)和每個(gè)步驟的耗時(shí),以及每個(gè)步驟的成功與否都顯示出來(lái)了,非常直觀。APl28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片APl28資訊網(wǎng)——每日最新資訊28at.com

四、編譯代碼

本篇主要講解的是部署 Java 項(xiàng)目,所以編譯項(xiàng)目也是采用 Maven 打包的方式。在 pipeline 腳本中執(zhí)行 mvn 打包命令即可。APl28資訊網(wǎng)——每日最新資訊28at.com

stage('編譯代碼') {     steps {       script {         echo "--------------- 步驟:開(kāi)始編譯 --------------- "       bat 'mvn clean package'       echo "--------------- 步驟:編譯完成 --------------- "     }  }  }

核心代碼:bat 'mvn clean package'APl28資訊網(wǎng)——每日最新資訊28at.com

因?yàn)槲业?Jenkins 是部署在 Windows 機(jī)器上,所以執(zhí)行命令用的 windows 自帶的 bat 工具來(lái)執(zhí)行的。APl28資訊網(wǎng)——每日最新資訊28at.com

關(guān)于 maven 工具的配置可以看之前寫的第二篇內(nèi)容:APl28資訊網(wǎng)——每日最新資訊28at.com

喝杯咖啡,一鍵部署完成!(建議收藏)APl28資訊網(wǎng)——每日最新資訊28at.com

五、上傳 JAR 包

編譯完成后,就可以將 Jenkins 工作空間的 JAR 包上傳到服務(wù)器的 temp 目錄下。APl28資訊網(wǎng)——每日最新資訊28at.com

如果你想部署指定的某些微服務(wù),可以通過(guò)傳參的方式來(lái)上傳和更新指定的微服務(wù)。原理圖如下所示:APl28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片APl28資訊網(wǎng)——每日最新資訊28at.com

5.1 支持勾選多個(gè)服務(wù)

為了實(shí)現(xiàn)可以選擇部署哪些微服務(wù),需要安裝一個(gè)多選插件:Extended Choice Parameter。APl28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片APl28資訊網(wǎng)——每日最新資訊28at.com

Extended Choice Parameter  插件APl28資訊網(wǎng)——每日最新資訊28at.com

接下來(lái)是編寫的參數(shù)配置代碼:APl28資訊網(wǎng)——每日最新資訊28at.com

parameters {    extendedChoice (         defaultValue: 'All',         description: '需要部署的微服務(wù)',         multiSelectDelimiter: ',',         name: 'SERVICE_NAME',         quoteValue: false,         saveJSONParameterToFile: false,         type: 'PT_CHECKBOX',         value:'All, passjava-account, passjava-file',        visibleItemCount: 10    )}
  • defaultValue: 參數(shù)的默認(rèn)值。在這里,默認(rèn)值為 'All'。
  • description: 參數(shù)的描述或提示。這里描述為 '需要部署的微服務(wù)',表示選擇需要部署的微服務(wù)。
  • multiSelectDelimiter: 多選時(shí)的分隔符。這里設(shè)置為 ',',表示使用逗號(hào)作為分隔符。
  • name: 參數(shù)的名稱。這里是 'SERVICE_NAME'。
  • quoteValue: 確定是否對(duì)值加上引號(hào)。這里設(shè)置為 false,表示不加引號(hào)。
  • saveJSONParameterToFile: 是否將 JSON 參數(shù)保存到文件。
  • type: 參數(shù)的類型。這里是 'PT_CHECKBOX',表示復(fù)選框類型。
  • value: 可選的值列表。在這里,可選的值有 'All'、'passjava-account'、'passjava-file'。
  • visibleItemCount: 可見(jiàn)的選項(xiàng)數(shù)量。這里設(shè)置為 10。

配置保存后并運(yùn)行一次后,就可以在 pipeline 中看到配置選項(xiàng):APl28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片APl28資訊網(wǎng)——每日最新資訊28at.com

實(shí)現(xiàn)的效果如下圖右下角所示,可以支持多選。APl28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片APl28資訊網(wǎng)——每日最新資訊28at.com

5.2 上傳 JAR 包

上傳需要使用 sshPublisher 插件,在第二篇文章中已介紹了。APl28資訊網(wǎng)——每日最新資訊28at.com

下面上傳代碼的作用是遍歷 filesToCopy 列表中的文件,然后通過(guò) SSH 將這些文件上傳到遠(yuǎn)程服務(wù)器的指定目錄中。APl28資訊網(wǎng)——每日最新資訊28at.com

filesToCopy.eachWithIndex { file, index ->     echo "開(kāi)始上傳 JAR 包 ${file} ..."    sshPublisher(        failOnError: true,        publishers: [            sshPublisherDesc(                configName: "${SSH_URL}",                verbose: true,                transfers: [                    sshTransfer(                        execCommand: '',                         execTimeout: 120000,                         flatten: false,                         makeEmptyDirs: false,                         noDefaultExcludes: false,                         patternSeparator: '[, ]+',                         remoteDirectory: 'apps/temp/',                         remoteDirectorySDF: false,                         removePrefix: removePrefixs[index],                         sourceFiles: file                    )                ]            )        ]    )    echo "完成上傳 JAR 包 ${file}"}
  1. filesToCopy.eachWithIndex { file, index -> ... }: 這是一個(gè) Groovy 中的迭代循環(huán),對(duì)列表 filesToCopy 中的每個(gè)文件執(zhí)行相應(yīng)的操作。file 是當(dāng)前迭代的文件,index 是該文件在列表中的索引。
  2. echo "開(kāi)始上傳 JAR 包 ${file} ...": 這是一個(gè)打印語(yǔ)句,用于輸出日志,顯示當(dāng)前正在上傳的 JAR 包的文件名。
  3. sshPublisher { ... }: 這是一個(gè) SSH 發(fā)布器,用于通過(guò) SSH 連接到遠(yuǎn)程服務(wù)器并執(zhí)行相應(yīng)的操作。
  4. failOnError: true: 如果 SSH 連接或傳輸過(guò)程中出現(xiàn)錯(cuò)誤,將會(huì)終止流水線執(zhí)行。
  5. configName: "${SSH_URL}": 這是 SSH 配置的名稱,${SSH_URL} 是一個(gè)變量,指定 SSH 連接的配置信息。
  6. transfers: [sshTransfer { ... }]: 這是 SSH 傳輸操作的列表,包含了將要執(zhí)行的文件傳輸任務(wù)。
  7. remoteDirectory: 'apps/temp/': 遠(yuǎn)程服務(wù)器上的目標(biāo)目錄,這里設(shè)置為 apps/temp/,表示將文件上傳到遠(yuǎn)程服務(wù)器的 apps/temp/ 目錄下。
  8. removePrefix: removePrefixs[index]: 這是一個(gè)用于移除文件路徑前綴的設(shè)置,根據(jù)當(dāng)前文件在列表中的索引,從相應(yīng)的 removePrefixs 數(shù)組中獲取相應(yīng)的前綴進(jìn)行移除。
  9. sourceFiles: file: 要傳輸?shù)脑次募串?dāng)前迭代的文件。
  10. echo "完成上傳 JAR 包 ${file}": 這是另一個(gè)打印語(yǔ)句,用于輸出日志,表示當(dāng)前文件的上傳已經(jīng)完成。

filesToCopy 就是通過(guò)用戶勾選的服務(wù)名轉(zhuǎn)成了對(duì)應(yīng)的本地 JAR 包路徑。APl28資訊網(wǎng)——每日最新資訊28at.com

switch(service) {    case 'passjava-account':        filesToCopy.add("passjava-modules/passjava-module-account/passjava-module-account-core/target/passjava-account.jar")        removePrefixs.add("passjava-modules/passjava-module-account/passjava-module-account-core/target")        break     case ...  }

六、備份服務(wù)器 JAR 包

備份的思路:逐個(gè)處理 serviceNameList 中的服務(wù)名稱,然后通過(guò) SSH 連接到遠(yuǎn)程服務(wù)器執(zhí)行備份操作。serviceNameList 就是用戶勾選的服務(wù)名的集合。原理圖如下所示:APl28資訊網(wǎng)——每日最新資訊28at.com

備份服務(wù)器 JAR 包備份服務(wù)器 JAR 包APl28資訊網(wǎng)——每日最新資訊28at.com

核心代碼如下:APl28資訊網(wǎng)——每日最新資訊28at.com

serviceNameList.each { service ->   echo "開(kāi)始備份微服務(wù) ${service} 包"  sshPublisher(      failOnError: true,      publishers: [          sshPublisherDesc(              configName: "${SSH_URL}",              verbose: true,              transfers: [                  sshTransfer(                      execCommand: "mkdir -p /nfs-data/wukong/apps/bak/${timestamp} && cd /nfs-data/wukong/apps && mv ${service}.jar ./bak/${timestamp}/${service}-${timestamp}.jar"                  )              ]          )      ]  )
  1. serviceNameList.each { service -> ... }: 這是一個(gè) Groovy 中的迭代循環(huán),對(duì)列表 serviceNameList 中的每個(gè)服務(wù)名稱執(zhí)行備份操作。service 是當(dāng)前迭代的服務(wù)名稱。
  2. echo "開(kāi)始備份微服務(wù) ${service} 包": 這是一個(gè)打印語(yǔ)句,用于輸出日志,顯示當(dāng)前正在備份的微服務(wù)的名稱。
  3. sshPublisher { ... }: 這是一個(gè) SSH 發(fā)布器,用于通過(guò) SSH 連接到遠(yuǎn)程服務(wù)器并執(zhí)行相應(yīng)的操作。
  4. failOnError: true: 如果 SSH 連接或執(zhí)行過(guò)程中出現(xiàn)錯(cuò)誤,將會(huì)終止流水線執(zhí)行。
  5. configName: "${SSH_URL}": 這是 SSH 配置的名稱,${SSH_URL} 是一個(gè)變量,用于指定 SSH 連接的配置信息。
  6. transfers: [sshTransfer { ... }]: 這是 SSH 傳輸操作的列表,包含了將要執(zhí)行的文件傳輸任務(wù)。
  7. execCommand: "...": 這是要在遠(yuǎn)程服務(wù)器上執(zhí)行的命令。在這里,使用了 mkdir 命令創(chuàng)建備份目錄,然后將當(dāng)前服務(wù)的 JAR 包移動(dòng)到備份目錄下,并加上時(shí)間戳作為文件名,以實(shí)現(xiàn)備份。

這段代碼的作用是遍歷 serviceNameList 列表中的服務(wù)名稱,然后通過(guò) SSH 連接到遠(yuǎn)程服務(wù)器執(zhí)行備份操作,將每個(gè)服務(wù)的 JAR 包移動(dòng)到指定的備份目錄,并根據(jù)時(shí)間戳進(jìn)行命名。APl28資訊網(wǎng)——每日最新資訊28at.com

七、更新 JAR 包

更新最新的 JAR 包就是將最新的 JAR 包放到對(duì)應(yīng)的容器映射的目錄,后面重啟容器的時(shí)候,就能用最新的 JAR 包啟動(dòng)了。原理圖如下所示:APl28資訊網(wǎng)——每日最新資訊28at.com

更新 JAR 包更新 JAR 包APl28資訊網(wǎng)——每日最新資訊28at.com

serviceNameList.eachWithIndex { service, index ->     echo "開(kāi)始更新第 ${index + 1} 個(gè) JAR 包,/nfs-data/wukong/apps/temp/${service}.jar ..."        sshPublisher(            failOnError: true,            publishers: [                sshPublisherDesc(                    configName: "${SSH_URL}",                    verbose: true,                    transfers: [                        sshTransfer(                            execCommand: "cd /nfs-data/wukong/apps && mv -f ./temp/${service}.jar ${service}.jar",                            execTimeout: 120000                        )                    ]                )            ]        )    echo "----- 完成更新 JAR 包 -----"}
  1. serviceNameList.eachWithIndex { service, index -> ... }: 這是一個(gè) Groovy 中的迭代循環(huán),對(duì)列表 serviceNameList 中的每個(gè)服務(wù)名稱執(zhí)行更新操作。service 是當(dāng)前迭代的服務(wù)名稱,index 是該服務(wù)在列表中的索引。
  2. echo "開(kāi)始更新第 ${index + 1} 個(gè) JAR 包,/nfs-data/wukong/apps/temp/${service}.jar ...": 這是一個(gè)打印語(yǔ)句,用于輸出日志,顯示當(dāng)前正在更新的 JAR 包的名稱及路徑。
  3. sshPublisher { ... }: 這是一個(gè) SSH 發(fā)布器,用于通過(guò) SSH 連接到遠(yuǎn)程服務(wù)器并執(zhí)行相應(yīng)的操作。
  4. failOnError: true: 如果 SSH 連接或執(zhí)行過(guò)程中出現(xiàn)錯(cuò)誤,將會(huì)終止流水線執(zhí)行。
  5. configName: "${SSH_URL}": 這是 SSH 配置的名稱,${SSH_URL} 是一個(gè)變量,用于指定 SSH 連接的配置信息。
  6. transfers: [sshTransfer { ... }]: 這是 SSH 傳輸操作的列表,包含了將要執(zhí)行的文件傳輸任務(wù)。
  7. execCommand: "cd /nfs-data/wukong/apps && mv -f ./temp/${service}.jar ${service}.jar": 這是要在遠(yuǎn)程服務(wù)器上執(zhí)行的命令。在這里,使用 mv 命令將位于 /nfs-data/wukong/apps/temp/ 目錄下的 ${service}.jar 移動(dòng)到 /nfs-data/wukong/apps/ 目錄,并覆蓋同名的文件。
  8. execTimeout: 120000: 這是執(zhí)行命令的超時(shí)時(shí)間,單位是毫秒。在這里,設(shè)置為 120000,即 120 秒。
  9. echo "----- 完成更新 JAR 包 -----": 這是另一個(gè)打印語(yǔ)句,用于輸出日志,表示當(dāng)前 JAR 包的更新操作已經(jīng)完成。

這段代碼的作用是遍歷 serviceNameList 列表中的服務(wù)名稱,然后通過(guò) SSH 連接到遠(yuǎn)程服務(wù)器執(zhí)行更新操作,將每個(gè)服務(wù)在 /nfs-data/wukong/apps/temp/ 目錄下的 JAR 包移動(dòng)到對(duì)應(yīng)的位置,完成更新。APl28資訊網(wǎng)——每日最新資訊28at.com

八、啟動(dòng)多個(gè)服務(wù)

啟動(dòng)服務(wù)就是將 docker swarm 管理的服務(wù)重啟下,原理圖如下所示:APl28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片APl28資訊網(wǎng)——每日最新資訊28at.com

后端項(xiàng)目使用 Docker Swarm 部署的,重啟服務(wù)的命令如下:APl28資訊網(wǎng)——每日最新資訊28at.com

sudo docker service update --force <服務(wù)名>

我們可以編寫遠(yuǎn)程執(zhí)行這行命令的代碼,pipeline 核心代碼如下:APl28資訊網(wǎng)——每日最新資訊28at.com

serviceNameList.eachWithIndex { service, index ->     echo "開(kāi)始重啟第 ${index + 1} 個(gè)微服務(wù),${service} ..."    sshPublisher(        failOnError: true,        publishers: [            sshPublisherDesc(                configName: "${SSH_URL}",                verbose: true,                transfers: [                    sshTransfer(                        execCommand: "sudo docker service update --force ${commands[service]}",                        execTimeout: 120000                    )                ]            )        ]    )    echo "----- 完成重啟微服務(wù) -----"}

這段代碼的作用是遍歷 serviceNameList 列表中的服務(wù)名稱,然后通過(guò) SSH 連接到遠(yuǎn)程服務(wù)器執(zhí)行重啟操作,完成微服務(wù)的重啟。APl28資訊網(wǎng)——每日最新資訊28at.com

最后整個(gè)執(zhí)行結(jié)果如下圖所示:總共耗時(shí) 3min41s。APl28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片APl28資訊網(wǎng)——每日最新資訊28at.com

九、總結(jié)

通過(guò)本篇的實(shí)戰(zhàn)內(nèi)容,我們學(xué)習(xí)到了通過(guò)編寫 pipeline 代碼來(lái)實(shí)現(xiàn)部署后端項(xiàng)目。推薦大家都用 pipeline 來(lái)部署項(xiàng)目,好處是更加靈活。APl28資訊網(wǎng)——每日最新資訊28at.com

另外本篇還沒(méi)有對(duì) Jenkins pipeline 的版本管理,我們其實(shí)可以將 pipeline 代碼作為一個(gè)文件上傳到 Gitlab,然后通過(guò) Jenkins 拉取最新的 jenkins pipeline 文件來(lái)執(zhí)行部署,這樣更便于管理 pipeline 文件。APl28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-81249-0.html用代碼實(shí)現(xiàn)流水線部署,像詩(shī)一般優(yōu)雅

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 加速 Rust 編譯時(shí)間,掌握這個(gè)技巧,速度全面提升 30 ~ 40 %

下一篇: 幾個(gè)祖?zhèn)鞔a不遵守就想罵的代碼規(guī)范

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 官方承諾:K60至尊版將會(huì)首批升級(jí)MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版將會(huì)搭載天璣9200+處理器和獨(dú)顯芯片X7的同時(shí),Redmi給出了官方承諾,K60至尊重大更新首批升級(jí),會(huì)首批推送MIUI 15。也就是說(shuō)雖然
  • 《英雄聯(lián)盟》夏季賽總決賽今日開(kāi)打!JDG對(duì)陣LNG首發(fā)名單來(lái)了 Knight:準(zhǔn)備三連冠

    8月5日消息,今日17:00,《英雄聯(lián)盟》2023LPL夏季賽總決賽將正式開(kāi)打,由JDG對(duì)陣LNG。對(duì)兩支隊(duì)伍來(lái)說(shuō),這場(chǎng)比賽不僅要爭(zhēng)奪夏季賽冠軍,更要決定誰(shuí)才是LPL賽區(qū)一
  • iPhone賣不動(dòng)了!蘋果股價(jià)創(chuàng)年內(nèi)最大日跌幅:市值一夜蒸發(fā)萬(wàn)億元

    8月5日消息,今天凌晨美股三大指數(shù)高開(kāi)低走集體收跌,道指跌0.41%;納指跌0.36%;標(biāo)普500指數(shù)跌0.52%。熱門科技股也都變化極大,其中蘋果報(bào)181.99美元,跌4.8%,創(chuàng)
  • Flowable工作流引擎的科普與實(shí)踐

    一.引言當(dāng)我們?cè)谌粘9ぷ骱蜆I(yè)務(wù)中需要進(jìn)行各種審批流程時(shí),可能會(huì)面臨一系列技術(shù)和業(yè)務(wù)上的挑戰(zhàn)。手動(dòng)處理這些審批流程可能會(huì)導(dǎo)致開(kāi)發(fā)成本的增加以及業(yè)務(wù)復(fù)雜度的上升。在這
  • 學(xué)習(xí)JavaScript的10個(gè)理由...

    作者 | Simplilearn編譯 | 王瑞平當(dāng)你決心學(xué)習(xí)一門語(yǔ)言的時(shí)候,很難選擇到底應(yīng)該學(xué)習(xí)哪一門,常用的語(yǔ)言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 一文搞定Java NIO,以及各種奇葩流

    大家好,我是哪吒。很多朋友問(wèn)我,如何才能學(xué)好IO流,對(duì)各種流的概念,云里霧里的,不求甚解。用到的時(shí)候,現(xiàn)百度,功能雖然實(shí)現(xiàn)了,但是為什么用這個(gè)?不知道。更別說(shuō)效率問(wèn)題了~下次再遇到,
  • 當(dāng)家的盒馬,加速謀生

    來(lái)源 | 價(jià)值星球Planet作者 | 歸去來(lái)自己&ldquo;當(dāng)家&rdquo;的盒馬,開(kāi)始加速謀生了。據(jù)盒馬官微消息,盒馬計(jì)劃今年開(kāi)放生鮮供應(yīng)鏈,將其生鮮商品送往食堂。目前,盒馬在上海已經(jīng)與
  • 2299元起!iQOO Pad明晚首銷:性能最強(qiáng)天璣平板

    5月23日,iQOO如期舉行了新品發(fā)布會(huì),除了首發(fā)安卓最強(qiáng)旗艦處理器的iQOO Neo8系列新機(jī)外,還在發(fā)布會(huì)上推出了旗下首款平板電腦——iQOO Pad,其最大的賣點(diǎn)
  • “買真退假” 這種“羊毛”不能薅

    □ 法治日?qǐng)?bào) 記者 王春   □ 本報(bào)通訊員 胡佳麗  2020年初,還在上大學(xué)的小東加入了一個(gè)大學(xué)生兼職QQ群。群主&ldquo;七王&rdquo;在群里介紹一些刷單賺
Top 主站蜘蛛池模板: 礼泉县| 通城县| 吉木乃县| 晋中市| 双流县| 尤溪县| 广河县| 新安县| 当阳市| 香格里拉县| 左云县| 绥滨县| 平山县| 湖州市| 晋中市| 两当县| 海口市| 海丰县| 大田县| 搜索| 大埔县| 山东省| 朔州市| 宜宾市| 巨野县| 武邑县| 封丘县| 阿拉善左旗| 莲花县| 田东县| 东光县| 广州市| 安国市| 灌南县| 思南县| 乳源| 高雄县| 阿巴嘎旗| 当涂县| 聊城市| 泰顺县|