jenkins部署

  • 開發者將代碼push到git
  • 運維人員通過jenkins部署,自動到git上pull代碼
  • 通過maven構建成jar包,并結合dockerfile打包成鏡像,push docker鏡像到docker registry
  • 通過k8s發起 發布/更新 服務 操作

在這里插入圖片描述

通過Jenkins部署,自動到Git上PULL代碼

①、配置SSH-KEY

jenkins需要pull git上的代碼,正常來說,代碼都是私有的,git clone操作的時候會需要密碼,就不能完成自動化操作了。這里使用SSH-KEY 的方式,讓git clone操作無需密碼就能完成克隆

在jenkins所在環境里執行ssh-keygen -t ed25519 -C “xxxxx@xxxxx.com” ,生成/添加SSH公鑰

按照提示完成三次回車,即可生成 ssh key。通過查看 ~/.ssh/id_ed25519.pub 文件內容,獲取到你的 public key
在這里插入圖片描述
得到公鑰 public key 內容,cat ~/.ssh/id_ed25519.pub

cat ~/.ssh/id_ed25519.pub

②、將公鑰配置的git平臺

git平臺可以是github,gitee,也可以是自己搭建的gitlab等
通過倉庫主頁 「管理」->「部署公鑰管理」->「添加部署公鑰」 ,添加生成的 public key 添加到倉庫中。
在這里插入圖片描述

添加成功后,到jenkins所在環境運行 ssh -T git@gitee.com

在這里插入圖片描述
首次使用需要確認并添加主機到本機SSH可信列表。若返回 Hi XXX! You’ve successfully authenticated, but Gitee.com does not provide shell access. 內容,則證明添加成功

③、測試

在這里插入圖片描述
在jenkins所在環境執行git clone git@gitee.com:xxxx.git
在這里插入圖片描述

④、Jenkins創建任務
在這里插入圖片描述
選擇流水線 確定
在這里插入圖片描述

這里勾選參數化構建,選擇字符參數,用于輸入構建代碼的版本
在這里插入圖片描述
在這里插入圖片描述,默認值填master,根據自身項目實際填寫
在這里插入圖片描述
拉到最下面的流水線,寫pipeline腳本,如果不知道怎么寫,可以點擊流水線語法進行參考
在這里插入圖片描述
REPOSITORY 填寫項目的ssh地址,REPOSITORY_VERSION是剛剛配置的構建參數
在這里插入圖片描述

⑤、測試拉取代碼

返回Jenkins 首頁,選擇剛剛創建的項目
在這里插入圖片描述

點擊右邊的運行按鈕

在這里插入圖片描述
輸入代碼分支版本,點擊開始構建
在這里插入圖片描述
看到這里就是已經構建成功了
在這里插入圖片描述

jenkins需要先安裝maven工具,補充pipeline腳本

pipeline {agent anyenvironment {REPOSITORY="git@gitee.com:xxxxxx/cloud-demo.git"MODULE="cloud-demo-m-test-dubbo-service"}stages {stage('拉代碼') {steps {echo "start fetch code from git:${REPOSITORY}"deleteDir()git branch: "${REPOSITORY_VERSION}", url: "${REPOSITORY}"}}stage('編譯代碼') {steps {echo "start compile"sh "cd cloud-demo-project && mvn -U clean install"echo "compile project ................................"sh "cd cloud-demo-dependencies && mvn -U clean install"echo "compile dependencies ................................"sh "cd cloud-demo-common && mvn -U clean install"echo "compile common ................................"sh "cd cloud-demo-m-test && mvn -U -am clean install"echo "compile m-test ................................"sh "cd cloud-demo-m-test/cloud-demo-m-test-common && mvn -U -am clean install"echo "compile m-test-dubbo-api ................................"sh "cd cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-api && mvn -U -am clean install"echo "compile m-test-dubbo-service ................................"sh "cd cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service && mvn -U -am clean package"}}}
}

這里補充了stage(‘編譯代碼’) {} 部分,用于maven編譯。具體編譯腳本需要根據自己項目實際,這個是項目的編譯必須步驟。

⑥、測試拉代碼流程+構建項目過程
在這里插入圖片描述

將maven構建后的jar打包成docker鏡像 并 push docker鏡像到docker registry
在jenkins環境下,創建目錄用于存放腳本文件

mkdir /usr/local/project/.env/cloud-demo-m-test-dubbo-service/ -p

這個目錄下存放4個文件

  • build.sh
  • Dockerfile
  • application.properties
  • bootstrap.properties

application.properties 和 bootstrap.properties 是springcloud的配置文件,內容根據自己項目情況

buils.sh 文件內容

#!/usr/bin/env bashREPOSITORY_VERSION=$1
GIT_REVISION=`git log -1 --pretty=format:"%h"`
TIME=`date "+%Y.%m.%d.%H.%M"`
IMAGE_NAME=192.168.31.100:5000/cloud-demo/cloud-demo-m-test-dubbo-service
IMAGE_TAG=${REPOSITORY_VERSION}-${GIT_REVISION}-${TIME}docker build -t ${IMAGE_NAME}:${IMAGE_TAG} .docker push ${IMAGE_NAME}:${IMAGE_TAG}echo "${IMAGE_NAME}:${IMAGE_TAG}" > IMAGE
## 內容說明
REPOSITORY_VERSION 是需要傳入的參數,傳項目git分支名,用于打標簽使用
GIT_REVISION 是獲取當前git的提交版本 如 c9c8525,線上問題可以根據這個版本查找具體代碼問題
TIME 年.月.日.時.分  記錄打包時間,也用于打標簽使用
IMAGE_NAME 鏡像名,這里前綴包含了192.168.31.100:5000 是因為我打包之后會push到192.168.31.100:5000,其他服務器可以到這里來pull鏡像
docker build -t ${IMAGE_NAME}:${IMAGE_TAG} . 構建鏡像
docker push ${IMAGE_NAME}:${IMAGE_TAG}  推送鏡像
echo "${IMAGE_NAME}:${IMAGE_TAG}" > IMAGE  把鏡像名:鏡像標簽 輸出到IMAGE文件里,方便后續步驟獲取

Dockerfile文件內容

FROM openjdk:8u342-jdk
MAINTAINER yanger yanger@qq.comCOPY target/cloud-demo-m-test-dubbo-service-1.0-SNAPSHOT.jar /cloud-demo-m-test-dubbo-service.jar
COPY application.properties /application.properties
COPY bootstrap.properties /bootstrap.properties
ENTRYPOINT ["java", "-jar", "/cloud-demo-m-test-dubbo-service.jar"]
## 內容說明
FROM openjdk:8u342-jdk 使用openjdk:8u342-jdk 作為基礎鏡像
COPY 文件到鏡像
ENTRYPOINT ["java", "-jar", "/cloud-demo-m-test-dubbo-service.jar"] 啟動時運行 java -jar /cloud-demo-m-test-dubbo-service.jar

這里用到了docker registry 如果還沒有registry 請先啟動,可以用docker的方式啟動

docker run -d -p 5000:5000 --name registry registry

build.sh文件需要可執行權限:build.sh文件需要可執行權限

補充pipeline腳本

pipeline {agent anyenvironment {REPOSITORY="git@gitee.com:xxxxxx/cloud-demo.git"SCRIPT_PATH="/usr/local/project/.env/cloud-demo-m-test-dubbo-service/"}stages {stage('拉代碼') {steps {echo "start fetch code from git:${REPOSITORY}"deleteDir()git branch: "${REPOSITORY_VERSION}", url: "${REPOSITORY}"}}stage('編譯代碼') {steps {echo "start compile"sh "cd cloud-demo-project && /usr/local/maven/bin/mvn -U clean install"echo "compile project ................................"sh "cd cloud-demo-dependencies && /usr/local/maven/bin/mvn -U clean install"echo "compile dependencies ................................"sh "cd cloud-demo-common && /usr/local/maven/bin/mvn -U clean install"echo "compile common ................................"sh "cd cloud-demo-m-test && /usr/local/maven/bin/mvn -U -am clean install"echo "compile m-test ................................"sh "cd cloud-demo-m-test/cloud-demo-m-test-common && /usr/local/maven/bin/mvn -U -am clean install"echo "compile m-test-dubbo-api ................................"sh "cd cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-api && /usr/local/maven/bin/mvn -U -am clean install"echo "compile m-test-dubbo-service ................................"sh "cd cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service && /usr/local/maven/bin/mvn -U -am clean package"}}stage('構建鏡像') {steps {echo "start build image"sh "cp ${SCRIPT_PATH}/build.sh cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"sh "cp ${SCRIPT_PATH}/Dockerfile cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"sh "cp ${SCRIPT_PATH}/application.properties cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"sh "cp ${SCRIPT_PATH}/bootstrap.properties cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"sh "cd cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/ && ./build.sh ${REPOSITORY_VERSION}"}}}
}

補充了stage(‘構建鏡像’){} 內容和 environment 部分加了個參數 SCRIPT_PATH

SCRIPT_PATH參數是上面創建的文件夾路徑

stage(‘構建鏡像’){}這一步是復制相應文件到項目目錄下,并且執行build.sh腳本

測試
在這里插入圖片描述
可以看到鏡像已經打包好,并且已經push到registry了
瀏覽器訪問http://192.168.31.100:5000/v2/cloud-demo/cloud-demo-m-test-dubbo-service/tags/list
可以看到registry有cloud-demo/cloud-demo-m-test-dubbo-service:master-7012e1d-2023.05.01.10.16這個鏡像

⑦、通過k8s發起 發布/更新 服務 操作

配置構建K8S資源的描述文件,在 /usr/local/project/.env/cloud-demo-m-test-dubbo-service/ 目錄新增文件 cloud-demo-m-test-dubbo-service.yaml

apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:app: cloud-demo-m-test-dubbo-servicename: cloud-demo-m-test-dubbo-service
spec:replicas: 1selector:matchLabels:app: cloud-demo-m-test-dubbo-servicestrategy: {}template:metadata:creationTimestamp: nulllabels:app: cloud-demo-m-test-dubbo-servicespec:containers:- image: IMAGE_AND_TAGname: cloud-demo-m-test-dubbo-serviceresources: {}volumeMounts: - name: log-pathmountPath: /logsvolumes: - name: log-pathhostPath: path: /root/k8s/cloud-demo-m-test-dubbo-service/logs
status: {}---apiVersion: v1
kind: Service
metadata:creationTimestamp: nulllabels:app: cloud-demo-m-test-dubbo-servicename: cloud-demo-m-test-dubbo-service
spec:ports:- port: 20881protocol: TCPtargetPort: 20881selector:app: cloud-demo-m-test-dubbo-servicetype: NodePort
status:loadBalancer: {}

這個文件是構建K8S資源的描述文件,創建deployment 和service,暴露端口20881,掛載/logs目錄到主機
其中 IMAGE_AND_TAG 是需要替換為相應 容器名:容器標簽 的

⑧、完善jenkins步驟

pipeline {agent anyenvironment {REPOSITORY="git@gitee.com:xxxxxx/cloud-demo.git"SCRIPT_PATH="/usr/local/project/.env/cloud-demo-m-test-dubbo-service"IMAGE=""}stages {stage('拉代碼') {steps {echo "start fetch code from git:${REPOSITORY}"deleteDir()git branch: "${REPOSITORY_VERSION}", url: "${REPOSITORY}"}}stage('編譯代碼') {steps {echo "start compile"sh "cd cloud-demo-project && /usr/local/maven/bin/mvn -U clean install"echo "compile project ................................"sh "cd cloud-demo-dependencies && /usr/local/maven/bin/mvn -U clean install"echo "compile dependencies ................................"sh "cd cloud-demo-common && /usr/local/maven/bin/mvn -U clean install"echo "compile common ................................"sh "cd cloud-demo-m-test && /usr/local/maven/bin/mvn -U -am clean install"echo "compile m-test ................................"sh "cd cloud-demo-m-test/cloud-demo-m-test-common && /usr/local/maven/bin/mvn -U -am clean install"echo "compile m-test-dubbo-api ................................"sh "cd cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-api && /usr/local/maven/bin/mvn -U -am clean install"echo "compile m-test-dubbo-service ................................"sh "cd cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service && /usr/local/maven/bin/mvn -U -am clean package"}}stage('構建鏡像') {steps {echo "start build image"sh "cp ${SCRIPT_PATH}/build.sh cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"sh "cp ${SCRIPT_PATH}/Dockerfile cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"sh "cp ${SCRIPT_PATH}/application.properties cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"sh "cp ${SCRIPT_PATH}/bootstrap.properties cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"sh "cd cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/ && ./build.sh ${REPOSITORY_VERSION}"}}stage('發布') {steps {echo "start deploy"script {IMAGE = readFile "cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/IMAGE"IMAGE = IMAGE.trim()if (IMAGE == "") {throw new Exception("獲取鏡像名文件失敗,請重試")}}echo "IMAGE: -- ${IMAGE}"sh "cp ${SCRIPT_PATH}/cloud-demo-m-test-dubbo-service.yaml cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"sh "sed -i \"s#IMAGE_AND_TAG#${IMAGE}#g\" cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/cloud-demo-m-test-dubbo-service.yaml"sh "kubectl apply -f cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/cloud-demo-m-test-dubbo-service.yaml"}}}
}

添加了 stage(‘發布’) {} 部分

  • 通過讀取IMAGE文件,獲取鏡像名:鏡像標簽
  • 如果獲取不到鏡像名:鏡像標簽,拋出異常
  • 將cloud-demo-m-test-dubbo-service.yaml文件復制到工作目錄
  • 用鏡像名:鏡像標簽 替換掉 IMAGE_AND_TAG
  • 使用kubectl命令發布/更新服務

測試

在jenkins上構建項目

在這里插入圖片描述
在K8S master服務器上,執行 kubectl get all
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83524.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83524.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83524.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

BBR 的 buffer 動力學觀感

這周很忙,今天還加了一天班,但還是抽空實現了五一在安徽涇縣山區喝著一壺酒寫的 BBR ProbeRTT 的想法,沒多少行代碼,它真就消除了帶寬鋸齒,皮了個鞋👞,昨天我還在群里說了今天再說說 BBR 的&…

第9講、深入理解Scaled Dot-Product Attention

Scaled Dot-Product Attention是Transformer架構的核心組件,也是現代深度學習中最重要的注意力機制之一。本文將從原理、實現和應用三個方面深入剖析這一機制。 1. 基本原理 Scaled Dot-Product Attention的本質是一種加權求和機制,通過計算查詢(Query…

el-tree結合checkbox實現數據回顯

組件代碼 <el-tree:data"vertiList"show-checkboxnode-key"id":props"defaultProps"ref"treeRefx"class"custom-tree"check-change"handleCheckChange"> </el-tree>獲取選擇的節點 handleCheckChan…

OpenResty 深度解析:構建高性能 Web 服務的終極方案

引言 openresty是什么&#xff1f;在我個人對它的理解來看相當于嵌入了lua的nginx; 我們在nginx中嵌入lua是為了不需要再重新編譯,我們只需要重新修改lua腳本,隨后重啟即可; 一.lua指令序列 我們分別從初始化階段&#xff0c;重寫/訪問階段&#xff0c;內容階段&#xff0c;日志…

多商戶商城系統源碼解析:開發直播電商APP的技術底層實戰詳解

隨著直播電商的火爆&#xff0c;越來越多的創業者和企業都在尋求打造自己的多商戶商城系統&#xff0c;以實現“人、貨、場”三者的深度融合。然而&#xff0c;從一個簡單的電商平臺到一個功能完善的直播電商APP&#xff0c;其技術底層架構和實現過程并非一蹴而就。本文將從架構…

桌面端進程通信

以下是關于 Electron 桌面端進程通信的基本知識點總結: 一、Electron 進程模型基礎 1. 進程類型與職責 進程類型職責權限主進程(Main)創建窗口、系統級操作、IPC中樞完全Node.js訪問權限渲染進程(Renderer)展示Web內容、UI交互默認受限(可配置開啟Node.js)預加載腳本(Prelo…

openEuler24.03 LTS下安裝MySQL8.0.42

目錄 前提步驟 刪除原有mysql及maridb數據庫 安裝MySQL 啟動MySQL 啟動查看MySQL狀態 設置MySQL開機自啟動 查看登錄密碼 登錄MySQL 修改密碼及支持遠程連接 遠程連接MySQL 前提步驟 擁有openEuler24.03 LTS環境&#xff0c;可參考&#xff1a;Vmware下安裝openEule…

idea 保證舊版本配置的同時,如何從低版本升到高版本

文章目錄 前言idea 保證舊版本配置的同時,如何從低版本升到高版本1. 備份項目2. 下載最新的idea3. 安裝安裝包4. 導入idea2019舊配置5. 驗證前言 如果您覺得有用的話,記得給博主點個贊,評論,收藏一鍵三連啊,寫作不易啊^ _ ^。 ??而且聽說點贊的人每天的運氣都不會太差,…

填坑記: 古董項目Apache POI 依賴異常排除

當你看到NoSuchMethodError的時候&#xff0c;不要慌&#xff0c;深呼吸&#xff0c;這可能只是JAR包版本的問題… 引子&#xff1a;一個平靜的周二下午 那是一個看似平常的周二下午&#xff0c;系統運行良好&#xff0c;開發團隊在有條不紊地推進著新功能的開發。突然&#x…

CAPL Class: TcpSocket (此類用于實現 TCP 網絡通信 )

目錄 Class: TcpSocketacceptopenclosebindconnectgetLastSocketErrorgetLastSocketErrorAsStringlistenreceivesendsetSocketOptionshutdown函數調用的基本流程服務器端的基本流程客戶端的基本流程Class: TcpSocket學習筆記。來自CANoe幫助文檔。 Class: TcpSocket accept /…

微信小程序的開發及問題解決

HttpClient 測試例子 SpringBootTest public class HttpClientTest {/*** 測試通過httpclient發送get方式的請求*/Testpublic void testGET() throws IOException {//創建httpclient對象CloseableHttpClient httpClient HttpClients.createDefault();//創建請求對象HttpGet ht…

foreach中使用await的問題

目錄 1.說明 2.示例 3.解決方案 1.說明 在foreach中調用異步方法&#xff0c;即使使用了await&#xff0c;不會依次執行每個異步任務&#xff0c;也就是說Array.prototype.forEach不會等待 Promise 完成&#xff0c;即使你在回調函數中返回一個 Promise&#xff0c;forEach …

Linux調試生成核心存儲文件

1.核心存儲文件配置&#xff1a; 不知道理解對不對&#xff0c;Linux中的核心存儲文件的配置是在/proc/sys/kernel/core_pattern中的&#xff0c;使用 cat /proc/sys/kernel/core_pattern # 打印出 |/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E表示核…

Compose筆記(二十三)--多點觸控

這一節主要了解一下Compose中多點觸控&#xff0c;在Jetpack Compose 中&#xff0c;多點觸控處理需要結合Modifier和手勢API來實現&#xff0c;一般通過組合 pointerInput、TransformableState 和 TransformModifier 來創建支持縮放、旋轉和平移的組件。 一、 API 1. Pointer…

【Java ee初階】HTTP(4)

構造HTTP請求 1&#xff09;開發中&#xff0c;前后端交互。瀏覽器運行的網頁中&#xff0c;構造出HTTP請求 2&#xff09;調試階段&#xff0c;通過構造HTTP請求測試服務器 樸素的方案&#xff1a; 通過tcp socket 的方式構造HTTP請求 按照HTTP請求格式&#xff0c;往TCP…

STM32 __main

STM32開發中__main與用戶main()函數的本質區別及工作機制 在STM32開發中&#xff0c;__main和用戶定義的main()函數是啟動過程中的兩個關鍵節點&#xff0c;分別承擔運行時初始化和用戶程序入口的職責。以下是它們的核心差異及協作機制&#xff1a; 一、定義與層級差異 ?__ma…

什么是PMBus

一、PMBus的定義與背景 PMBus&#xff08;Power Management Bus&#xff0c;電源管理總線&#xff09; 是一種基于SMBus&#xff08;System Management Bus&#xff09;的開放標準數字通信協議&#xff0c;專為電源設備的監控、配置和控制設計。由PMBus聯盟&#xff08;現并入…

Python OOP核心技巧:如何正確選擇實例方法、類方法和靜態方法

Python方法類型全解析&#xff1a;實例方法、類方法與靜態方法的使用場景 一、三種方法的基本區別二、訪問能力對比表三、何時使用實例方法使用實例方法的核心場景&#xff1a;具體應用場景&#xff1a;1. 操作實例屬性2. 對象間交互3. 實現特定實例的行為 四、何時使用類方法使…

業務中臺-典型技術棧選型(微服務、容器編排、分布式數據庫、消息隊列、服務監控、低代碼等)

在企業數字化中臺建設中&#xff0c;業務中臺是核心支撐平臺&#xff0c;旨在通過技術手段將企業核心業務能力抽象、標準化和復用&#xff0c;以快速響應前端業務需求。其核心技術流涉及從業務抽象到服務化、治理和持續優化的全流程。以下是業務中臺建設中的核心技術體系及關鍵…

期望是什么:(無數次的均值,結合概率)21/6=3.5

https://seeing-theory.brown.edu/basic-probability/cn.html 期望是什么:(無數次的均值,結合概率)21/6=3.5 一、期望(數學概念) 在概率論和統計學中,**期望(Expectation)**是一個核心概念,用于描述隨機變量的長期平均取值,反映隨機變量取值的集中趨勢。 (一…