- 開發者將代碼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