沒(méi)有網(wǎng)站可以域名備案嗎西安網(wǎng)站seo診斷
各位小伙伴們大家好呀,我是小金,本篇文章我們將介紹如何使用Pipeline流水線部署我們自己的微服務(wù)項(xiàng)目,之前沒(méi)怎么搞過(guò)部署相關(guān)的,以至于構(gòu)建流水線的過(guò)程中中也遇到了很多自己以前沒(méi)有考慮過(guò)的問(wèn)題,特寫(xiě)此篇,用于個(gè)人記錄與分享。
一 、基礎(chǔ)插件安裝
1.1 安裝與配置Maven插件
安裝Maven 插件。
搜索 maven,選中 Maven Integration
進(jìn)行安裝。
配置maven工具
安裝完成后,需要配置Maven工具,我們的自動(dòng)化構(gòu)建任務(wù)是使用 Maven 構(gòu)建的,需要告知Jenkins Maven的安裝位置。
1.2 安裝與配置ndoe插件
安裝NodeJS插件
配置NodeJS工具
1.3 安裝與配置ssh插件
安裝ssh插件
這個(gè)插件的作用就是將 Jenkins 構(gòu)建的 SpringBoot 項(xiàng)目的 jar 包發(fā)布的業(yè)務(wù)服務(wù)器上。
配置業(yè)務(wù)服務(wù)器
找到系統(tǒng)配置
拉到最下面找到 Publish over SSH
,安裝完 SSH 插件才有這個(gè)選項(xiàng)。
Server是可以有多個(gè)的,新增一個(gè) SSH Server。
在最下面有個(gè)測(cè)試的按鈕,可以測(cè)試一下配置有沒(méi)有問(wèn)題,沒(méi)有問(wèn)題,保存配置。
二 、構(gòu)建微服務(wù)項(xiàng)目流水線
2.1 創(chuàng)建構(gòu)建任務(wù)
編寫(xiě)流水線腳本,依照需求實(shí)現(xiàn)不同的步驟,這里貼出博主的一個(gè)配置僅供參考
2.2 shell腳本
1、jenkins腳本命令,這里博主的服務(wù)器和jenkins是在一臺(tái)服務(wù)器上,所以在jar發(fā)送階段直接使用的shell命令,如果不在一臺(tái)服務(wù)器上則使用ssh插件,這里不在贅述
pipeline {agent anytools {maven 'maven3'}stages {stage('拉取代碼') {steps {git branch: 'dev', credentialsId: '20250730-853d-40dc-be30-xxxxxxxx', url: 'https://gitee.com/xxx/xxx.git'echo '拉取代碼完成!'}}stage('執(zhí)行構(gòu)建') {steps {dir('kingoffice-auth') {sh """mvn --versionmvn clean package -DskipTests"""echo '執(zhí)行構(gòu)建成功!'}}}stage('執(zhí)行更新安裝包文件進(jìn)程') {steps {script {def currentTime = new Date().format("yyyyMMddHHmmss")def jarFile = 'kingoffice-auth/target/kingoffice-auth.jar'def targetDir = '/kim/project/auth/'def targetFile = "${targetDir}kingoffice-auth.jar"def dockerFile = 'docker/kim/auth/Dockerfile'def deployScript = 'docker/kim/auth/deploy.sh'// 檢查并創(chuàng)建目標(biāo)目錄sh "sudo mkdir -p ${targetDir}"// 檢查目標(biāo)目錄是否存在同名 JAR 文件if (fileExists(targetFile)) {// 重命名 JAR 文件def newTargetFile = "${targetDir}kingoffice-auth-${currentTime}.jar"sh "sudo mv ${targetFile} ${newTargetFile}"echo "已重命名文件為: ${newTargetFile}"}// 復(fù)制新生成的 JAR 文件sh "sudo cp ${jarFile} ${targetDir}"echo '發(fā)送 JAR 文件成功!'// 刪除目標(biāo)目錄下的同名 Dockerfile 和 deploy.sh 文件sh "sudo rm -f ${targetDir}Dockerfile"sh "sudo rm -f ${targetDir}deploy.sh"// 復(fù)制新的 Dockerfile 和 deploy.sh 文件sh "sudo cp ${dockerFile} ${targetDir}"sh "sudo cp ${deployScript} ${targetDir}"echo '發(fā)送 Dockerfile 和 deploy.sh 成功!'}}}stage('構(gòu)建并啟動(dòng)容器') {steps {script {def targetDir = '/kim/project/auth/'def deployScriptPath = "${targetDir}deploy.sh"// 確保 deploy.sh 腳本具有執(zhí)行權(quán)限sh "sudo chmod +x ${deployScriptPath}"// 執(zhí)行 deploy.sh 腳本sh "sudo ${deployScriptPath}"echo '執(zhí)行啟動(dòng)容器完成!'}}}}
}
2.3 部署腳本 deploy.sh
#!/bin/bash# 項(xiàng)目名稱(chēng)
projectName=kingoffice-auth# 年月日時(shí)分的時(shí)間戳
timestamp=$(date +%Y%m%d%H%M)# 新鏡像的名稱(chēng)
newImageName=$projectName:$timestamp# 切換到包含Dockerfile的目錄
echo "切換到包含Dockerfile的目錄 /kim/project/auth/"
cd /kim/project/auth/ || { echo "切換目錄失敗,退出腳本"; exit 1; }echo "開(kāi)始構(gòu)建新鏡像: $newImageName"
# 1.首先使用Dockerfile打鏡像
docker build -t $newImageName .
if [ $? -ne 0 ]; then
echo "構(gòu)建新鏡像失敗"
exit 1
else
echo "構(gòu)建新鏡像成功"
fiecho "正在停止并刪除之前運(yùn)行的容器..."
# 2.停止并刪除之前運(yùn)行的容器
runningContainerId=$(docker ps | grep "$projectName" | awk '{print $1}')
if [ -n "$runningContainerId" ]; then
docker stop "$runningContainerId" && echo "容器已停止: $runningContainerId"
docker rm "$runningContainerId" && echo "容器已刪除: $runningContainerId"
fiecho "正在刪除舊鏡像..."
# 刪除除最新外的所有舊鏡像
oldImageTags=$(docker images | grep "$projectName" | awk '{print $2}' | grep -v "$timestamp" | sort | uniq)
for tag in $oldImageTags; dodocker rmi "${projectName}:${tag}" && echo "舊鏡像已刪除: ${projectName}:${tag}";
doneecho "創(chuàng)建日志目錄..."
# 在宿主機(jī)上創(chuàng)建logs目錄,用于容器掛載,這樣查看日志可以直接在宿主機(jī)查看,比較方便
mkdir -p ~/kim/project/auth/logsecho "正在運(yùn)行新的鏡像..."
# 3.運(yùn)行新的鏡像
docker run -d -p 9200:9200 --restart=always -v ~/kim/project/auth/logs:/kim/logs $newImageNameif [ $? -eq 0 ]; then
echo "新容器運(yùn)行成功"
else
echo "新容器運(yùn)行失敗"
exit 1
fi
2.4 使用沙盒生成命令
上述配置完畢后,點(diǎn)擊生成流水線腳本,即生成對(duì)應(yīng)的腳本語(yǔ)言,復(fù)制到腳本文件中即可。
流水線創(chuàng)建完成后,就可以進(jìn)行第一次構(gòu)建嘗試了。
三 、部署vue項(xiàng)目
3.1 創(chuàng)建構(gòu)建任務(wù)創(chuàng)建任務(wù)
選擇構(gòu)建一個(gè)自由風(fēng)格的軟件項(xiàng)目
3.2 源碼管理
與上述添加遠(yuǎn)程倉(cāng)庫(kù)步驟一致。
3.3構(gòu)建環(huán)境
勾選 Provider Node & npm bin/folder to PATH
。
3.4 構(gòu)建步驟:
執(zhí)行構(gòu)建的時(shí)候,執(zhí)行 npm 命令進(jìn)行構(gòu)建就可以了,所以在 Build Step 選擇執(zhí)行 shell:
3.5 shell命令
# 安裝依賴(lài)
npm install --registry=https://registry.npmmirror.com
# 構(gòu)建項(xiàng)目
npm run build:prod
# 將構(gòu)建結(jié)果打包
zip -r dist.zip dist
echo "打包成功"
# 檢查/kim/nginx/html/目錄下是否存在dist.zip文件,并進(jìn)行重命名處理
if [ -f "/kim/nginx/html/dist.zip" ]; thensudo mv /kim/nginx/html/dist.zip "/kim/nginx/html/dist_$(date +%Y%m%d%H%M%S).zip"
fi
# 將dist.zip文件移動(dòng)到/kim/nginx/html/目錄下
sudo mv dist.zip /kim/nginx/html/
# 刪除/kim/nginx/html/目錄下的dist文件夾
sudo rm -rf /kim/nginx/html/dist
# 解壓dist.zip至/kim/nginx/html/目錄,完成部署
sudo unzip /kim/nginx/html/dist.zip -d /kim/nginx/html/
echo "部署成功"
四 、問(wèn)題總結(jié)
4.1 構(gòu)建時(shí)間 相差八個(gè)小時(shí)
系統(tǒng)管理->腳本命令行->運(yùn)行下面代碼
System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone','Asia/Shanghai')
4.2 構(gòu)建過(guò)程報(bào)錯(cuò) 找不到maven
查看構(gòu)建腳本 是否有此命令,此命令是告知jenkins使用哪個(gè)maven進(jìn)行構(gòu)建,博主使用的版本,不輸此命令,會(huì)報(bào)mvn找不到的錯(cuò)誤。
tools {maven 'maven3'}
4.3 微服務(wù)私有jar找不到
博主最初maven使用的是阿里云的公開(kāi)鏡像,但是在微服務(wù)中有些依賴(lài)使我們項(xiàng)目生成的關(guān)系依賴(lài)jar,這在公共平臺(tái)是不可能找到的,博主想到的辦法是搭建個(gè)人私服倉(cāng)庫(kù),但是這個(gè)成本過(guò)大,于是就使用了阿里云免費(fèi)提供的私人云效倉(cāng)庫(kù)。創(chuàng)建過(guò)程不再贅述,這里只講重點(diǎn)遇到的問(wèn)題。
1、maven配置文件,直接使用阿里settings文件即可,或者按需配置。
2、第一次推送成功,第二次推送取失敗
1、私有jar上傳前改一下版本號(hào)
2、開(kāi)啟允許覆蓋指令。
4.4 執(zhí)行shell命令腳本權(quán)限不夠
jenkins使用的用戶一般默認(rèn)是jenkins,有兩種解決方案
1、將jenkins改成root 一般配置文件是在這個(gè)目錄下 /etc/sysconfig/jenkins
2、賦予jenkins用戶權(quán)限
編輯 /etc/sudoers
文件,在文件最下為 Jenkins 用戶賦予無(wú)密碼執(zhí)行 sudo
的權(quán)限
jenkins ALL=(ALL) NOPASSWD:ALL