騰訊云上部署CICD(持續集成)+docker/k8s部署項目
1.部署流程
- 1、研發push到github代碼庫(或gitlab)
- 2、Jenkins 構建,pull git代碼使用maven進行編譯打包
- 3、打包生成的代碼,生成一個新版本的鏡像,push到本地docker倉庫harbor
- 4、發布,測試機器pull新版本的鏡像,并刪除原來的容器,重新運行新版本鏡像。
2.環境說明
服務及服務器說明騰迅云環境、代碼倉庫
1、 代碼倉庫
- github 或者 git-server 或者 gitlab
- 本次實驗使用github倉庫項目:https://github.com/ChenShiBao/testJenkins.git
2、容器鏡像倉庫,部署harbor
- ip:
公網:124.222.48.123 - 主機名:harbor
3、CI/CD服務器,部署jenkins
- ip:
公網:1.116.119.87 - 主機名:jenkins
- 安裝軟件:
- jdk
- jenkins
- git
- maven
- docker
4、應用服務器(docker/k8s)
- ip:
公網:47.236.196.111 - 主機名:docker
- 安裝軟件:
- jq
- docker或者k8s集群
3 部署Harbor鏡像倉庫
3.1、下載安裝
1.1 去官方地址下載harbor:
https://github.com/goharbor/harbor/releases
下載離線安裝包:需要FQ
如果離線包下載好了,,可以通過打開一個終端執行:scp root@服務器公網ip地址:/root/harbor-offline-installer-v2.12.2.tgz 本地電腦的保存路徑,將鏡像備份到本地電腦備用

下一步,復制鏈接地址

下一步,去124.222.48.123服務器上安裝harbor

如果特別慢的話,可以使用國內代理下載
wget https://ghproxy.com/https://github.com/goharbor/harbor/releases/download/v2.12.2/harbor-offline-installer-v2.12.2.tgz
harbor-offline-installer-v2.12.2.tgz鏡像下載好或者上傳好后,需要解壓
tar xvf harbor-offline-installer-v2.12.2.tgz
安裝
yum -y install lrzsz
安裝compose
-
第1種方式
curl -L https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose或者
curl -L https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose再執行以下命令,加上權限
chmod +x /usr/local/bin/docker-compose
第2種方式,去github下載發布版:

-
確保docker-compose-linux-x86_64上傳到服務器上了
-
移動文件并重命名:將文件移動到 /usr/local/bin/ 目錄下,并重命名為 docker-compose。這是安裝 Docker Compose 的標準位置和命名。
sudo mv /root/docker-compose-linux-x86_64 /usr/local/bin/docker-compose -
給docker-compose文件目錄添加權限
![image]()
下一步,切換到harbor解壓目錄,修改配置文件:
cd harbor/
ls
下一步,執行安裝docker,如果已經安裝過了可以忽略
yunm install docker -y
3.2 修改harbor.yml.tmpl文件
1.找到文件

2.執行 命令該文件名稱
cp harbor.yml.tmpl harbor.yml
3.修改配置
vim harbor.yml
1)修改 hostname:ip地址或域名
2)http端口可以設置一個沒有被占用的端口【harbor 端口使用9999】
3)去掉https的認證

修改完,保存退出。
4.啟動harbor,切換到harbor目錄,執行下面命令
./install.sh

下一步,出現以下界面說明harbor已經成功啟動

4 訪問harbor,登錄
訪問地址:http://ip:端口
初始化賬號/密碼:admin/Harbor12345

5 harbor的使用
5.1 創建項目

5.2 創建用戶:chenshibao/密碼

5.3 項目用戶授權

授權完成,新創建的賬戶就有管理這個項目的權限了。
4 Jenkins環境搭建
4.1 安裝docker
如果docker未安裝,可執行以下步驟安裝:
-
添加docker軟件源
dnf config-manager --add-repo=http://mirrors.tencent.com/docker-ce/linux/centos/docker-ce.repo -
查看已添加的docker軟件源
dnf list docker-ce -
安裝docker
dnf install -y docker-ce --nobest -
運行docker
systemctl start docker -
查看docker信息
docker info
如果是阿里云的centos服務器,可以執行以下操作安裝docker:
1.yum install -y yum-utils device-mapper-persistent-data lvm2 git
2.yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
4.yum install -y container-selinux
5.ls
6.rpm -ivh containerd.io-1.2.6-3.3.el7.x86_64.rpm
7.yum install docker-ce -y
8.systemctl start docker
##以下是測試部分(可以不用操作)
docker pull nginx
docker tag nginx 124.222.48.124:9999/jenkins/nginx:v0
docker login 124.222.48.124:9999
rpm -ql docker-ce
vim /etc/docker/key.json
cd /etc/docker/
ls
4.2 用nginx進行測試【這一步可以不做】
-
拉取nginx鏡像
docker pull nginx
如果拉取失敗,如下圖,可以去 /etc/docker/daemon.json,配置騰訊云docker鏡像源加速鏡像下載,

如果daemon.json文件不存在,可以創建;
touch daemon.json

daemon.json文件內容如下:
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
]
}
配置完后,需要重啟docker,再拉取鏡像
sudo systemctl restart docker
docker pull nginx

-
打包一個nginx的鏡像
docker tag nginx 124.222.48.124:9999/jenkins/nginx:v0 -
登錄harbor,輸入username和password
docker login 124.222.48.124
![image]()

Error response from daemon: Get "https://124.222.48.124/v2/": tls: failed to verify certificate: x509:
如果出現上面的錯誤,需要改一下daemon.json的配置,配置上124.222.48.124(harbor的ip)和端口,
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
],
"insecure-registries":["124.222.48.124:9999"]
}
原因是我們docker client使用的是https,而我們搭建的Harbor私庫用的是http的,所以會有這樣的報錯,導致訪問不了。
在Harbor所在的服務器上修改daemon.json文件
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
],
"insecure-registries":["124.222.48.124:9999"] #ip寫Harbor所在的服務器ip,端口是harbor.yml文件中配置的port
}
重啟docker
systemctl daemon-reload
systemctl restart docker
查看harbor是否已經啟動,如果沒有重新啟動harbor
如果一切正常,那可以登錄成功了;

- 將打包好的鏡像上傳到 harbor的鏡像倉庫
1.執行推送,鏡像名稱(nginx,版本:v0)
docker push 124.222.48.124:9999/jenkins/nginx:v0

以上出現,表示推送成功,可以登錄harbor查看
-
業務服務器部署
1)先安裝docker,步驟可參考上面步驟
2)安裝jq(jq類似于sed/awk專門處理json格式的文件)
yum install docker jq -y3)執行 visudo(阿里云centos需要這樣,騰迅云不需要)
visudo
![image]()
4.3 Jenkins服務部署配置(如果Jenkins沒有安裝,需要先安裝,可參考:jenkins安裝配置流程)
查看是否已安裝jenkins
which jenkins
1.安裝源,從Jenkins的官方網站下載穩定版的Jenkins YUM倉庫配置文件,并將其保存到/etc/yum.repos.d/目錄下,命名為jenkins.repo
wget-0 /etc/yum.repos.d/jenkins.repo https: //pkg. jenkins.io/redhat-stable/jenkins.repo
2.導入key,使用rpm工具導入Jenkins的官方GPG密鑰。
rpm --import https: //pkg.jenkins.io/redhat- stable/jenkins.io. key
3.安裝,在服務器上自動安裝Jenkins、Git和Maven這三個軟件包
yum Install -y jenkins git maven
4.查看java是否已安裝成功
java --version
5.啟動jenkins
systemctl start jenkins
6.查jenkins進程信息
ps -ef|grep jenkins
========================================================================================
由于在Jenkins機器上docker是使用root用戶運行的,而Jenkins是使用普通用戶jenkins 運行的,所以要先配置下jenkins用戶可以使用docker命令。
使用以下步驟:
1.使用visudo命令
visudo
2.在配置文件里添加用戶,如下圖所示
jenkins ALL=(root) NOPASSWD: /usr/bin/docker
Defaults: jenkins !requiretty

如果不配置的話,會報以下錯誤

3.安裝插件
瀏覽器登錄jenkins,http://1.116.119.87:7777,進行初始化配置
點擊“系統管理”,點擊“插件管理”,搜索插件“Maven Integration”和“SSH”,進行安裝。
4.配置遠程機器
登錄jenkins,點擊“Credentials”,點擊 "Add domain".

添加域

添加憑證

用戶名和密碼是登錄這臺服務器的 用戶和密碼

憑證生成完成。

下一步:

下一步:

配置docker應用服務器的ip地址,如果有多臺服務器,可以再次新增


5.Jenkins構建Job
1.構建Maven風格的Job

下一步

下一步

下一步

下一步:

選擇執行shell腳本,腳本內容如下
#Jenkins機器:編譯完成后,build生成一個新版本的鏡像,push到遠程docker倉庫variables
JENKINS_WAR_HOME='/root/jenkins/workspace/maven-docker-test/target'
DOCKERFILE_HOME='/root/jenkins/docker-file/maven-docker-test_war'
# harbor服務器上的配置項
HARBOR_IP='124.222.48.123'
REPOSITORIES='jenkins/maven-docker-test'
HARBOR_USER='chenshibao'
HARBOR_USER_PASSWD='Csb'
HARBOR_USER_EMAIL='714183244@qq.com'
#Copy the newest war to docker-file directory.
\cp -f ${JENKINS_WAR_HOME}/easy-springmvc-maven.war ${DOCKERFILE_HOME}/maven-docker-test.war
#Delete image early version.
sudo docker login -u ${HARBOR_USER} -p ${HARBOR_USER_PASSWD} ${HARBOR_IP}:9999
IMAGE_ID='sudo docker images | grep ${REPOSITORIES} | awk '{print $3}''
if [-n "$(IMAGE_ID}" ];then
sudo docker rmi ${IMAGE_ID}
fi
# Build image.
cd ${DOCKERFILE_HOME}
TAG='date +%Y%m%d-%H%M%S'
sudo docker build -t ${HARBOR_IP}:9999/${REPOSITORIES}:${TAG} . &>/dev/null
# Push to the harbor registry.
sudo docker push ${HARBOR_IP}:9999/${REPOSITORIES}:${TAG} &>/dev/null
以上shell腳本有問題時,可以使用以下這個shell腳本
#!/bin/bash
JENKINS_WAR_HOME='/root/jenkins/workspace/maven-docker-test/target'
DOCKERFILE_HOME='/root/jenkins/docker-file/maven-docker-test_war'
# Harbor 配置
HARBOR_IP='124.222.48.123'
HARBOR_PORT='9999'
REPOSITORIES='jenkins/maven-docker-test'
HARBOR_USER='chenshibao'
HARBOR_USER_PASSWD='Csb'
HARBOR_USER_EMAIL='714183244@qq.com'
# 復制最新的 war 包到 docker 目錄
\cp -f ${JENKINS_WAR_HOME}/easy-springmvc-maven.war ${DOCKERFILE_HOME}/maven-docker-test.war
# Harbor 登錄(更安全方式)
echo ${HARBOR_USER_PASSWD} | sudo docker login -u ${HARBOR_USER} --password-stdin ${HARBOR_IP}:${HARBOR_PORT}
# 刪除舊鏡像(確保只刪除目標鏡像)
IMAGE_IDS=$(sudo docker images ${HARBOR_IP}:${HARBOR_PORT}/${REPOSITORIES} --format "{{.ID}}")
if [ -n "$IMAGE_IDS" ]; then
sudo docker rmi -f $IMAGE_IDS
fi
# 生成新的鏡像 Tag
TAG=$(date +%Y%m%d-%H%M%S)
# 檢查 Dockerfile 目錄是否存在
if [ ! -d "$DOCKERFILE_HOME" ]; then
echo "錯誤: 目錄 $DOCKERFILE_HOME 不存在!"
exit 1
fi
cd ${DOCKERFILE_HOME}
# 設置日志目錄
LOG_DIR="/var/log/jenkins"
mkdir -p $LOG_DIR
# 構建新鏡像
sudo docker build -t ${HARBOR_IP}:${HARBOR_PORT}/${REPOSITORIES}:${TAG} . > ${LOG_DIR}/docker_build.log 2>&1
# 推送鏡像到 Harbor
sudo docker push ${HARBOR_IP}:${HARBOR_PORT}/${REPOSITORIES}:${TAG} > ${LOG_DIR}/docker_push.log 2>&1
===============================================================================================================================================
JENKINS_WAR_HOME='/root/jenkins/workspace/maven-docker-test/target'目錄在服務器不存在時創建,
DockerFile_Home='/root/jenkins/docker-file/maven-docker-test_war' ,這個目錄如果在jenkins服務器上沒有的話,可以先創建,maven-docker-test_war這個目錄可以根據自己項目自定義(可以定義為:任務名稱_war)
,然后再這個目錄下創建DockerFile文件,輸如一下內容:
cd /root/jenkins/docker-file/maven-docker-test_war
vim Dockerfile
Dockerfile文件內容:
# Version 1.0
# Base image
FROM tomcat:8.0.36-alpine
# Author information (使用 LABEL 代替 MAINTAINER)
LABEL maintainer="chenshibao <714183244@qq.com>"
# Add WAR file to Tomcat webapps directory
COPY maven-docker-test.war /usr/local/tomcat/webapps/
# Set working directory
WORKDIR /usr/local/tomcat/bin/
# Set environment variables
ENV PATH="/usr/local/tomcat/bin:$PATH"
# Define default command
CMD ["catalina.sh", "run"]
# Expose port (默認8080,如果你修改過server.xml就改成7777)
EXPOSE 8080
=====================================================================================================================
添加shell執行腳本:

拉取鏡像,發布腳本如下
#!/bin/bash
# Harbor 配置
HARBOR_IP='124.222.48.123'
HARBOR_PORT='9999'
REPOSITORIES='jenkins/maven-docker-test'
HARBOR_USER='chenshibao'
HARBOR_USER_PASSWD='Csb'
# 登錄 Harbor
docker login -u ${HARBOR_USER} -p ${HARBOR_USER_PASSWD} ${HARBOR_IP}:${HARBOR_PORT}
# 停止并刪除舊容器
CONTAINER_ID=$(docker ps | grep "maven-docker-test" | awk '{print $1}')
if [ -n "$CONTAINER_ID" ]; then
docker stop $CONTAINER_ID
docker rm $CONTAINER_ID
else
# 容器啟動失敗時,需要 `docker ps -a` 才能找到
CONTAINER_ID=$(docker ps -a | grep "maven-docker-test" | awk '{print $1}')
if [ -n "$CONTAINER_ID" ]; then
docker rm $CONTAINER_ID
fi
fi
# 刪除舊鏡像
IMAGE_ID=$(sudo docker images | grep "${REPOSITORIES}" | awk '{print $3}')
if [ -n "${IMAGE_ID}" ]; then
docker rmi ${IMAGE_ID}
fi
# 獲取最新鏡像 TAG
TAG=$(curl -s http://${HARBOR_IP}:${HARBOR_PORT}/api/repositories/${REPOSITORIES}/tags | jq -r '.[-1]')
echo "Latest TAG: ${TAG}"
# 拉取最新鏡像
echo "Pulling image: ${HARBOR_IP}:${HARBOR_PORT}/${REPOSITORIES}:${TAG}"
docker pull ${HARBOR_IP}:${HARBOR_PORT}/${REPOSITORIES}:${TAG} &>/dev/null
# 運行容器
docker run -d --name maven-docker-test -p 8080:8080 ${HARBOR_IP}:${HARBOR_PORT}/${REPOSITORIES}:${TAG}
====================================================================================================================================================
腳本如果沒有問題,執行下面操作,立即構建,如果構建成功,可以去docker應用服務器上查看新生成的docker鏡像

問題匯總及解決方式:
問題1.如果出現以下錯誤,說明maven沒有正確安裝好,Maven路徑配置不對,
Started by user chenshibao
Running as SYSTEM
Building in workspace /var/lib/jenkins/workspace/maven-docker-test
ERROR: A Maven installation needs to be available for this project to be built.Either your server has no Maven installations defined, or the requested Maven version does not exist.
Finished: FAILURE
可以通過查看 mvn -version版本,找到正確的安裝地址,

1.確保 Maven 已在 Jenkins 中正確配置
雖然 mvn -version 在命令行可用,但 Jenkins 可能沒有找到它,需要手動配置:
- 步驟 1:進入 Jenkins 全局配置
- 打開 Jenkins,進入 Manage Jenkins → Global Tool Configuration
- 找到 Maven 配置部分:
- 如果沒有任何 Maven 版本,點擊 Add Maven 添加一個。
- 確保名稱正確,例如 Maven 3.8.5。
- 取消勾選 Install automatically(因為你的服務器已經安裝了 Maven)。
- 在 Maven home 里填入 /usr/share/maven(你的 mvn -version 顯示的路徑)。
- 步驟 2:在 Jenkins 任務中選擇 Maven
- 進入你的 Job(maven-docker-test)
- 點擊 Configure,找到 Build Environment
- 找到 "Build" -> "Invoke top-level Maven targets"
- 確認 "Maven Version" 選擇的是你在全局配置里添加的 Maven 3.8.5
- 保存后重新構建
問題2.權限不足
出現以下問題:
cp: cannot stat '/root/jenkins/workspace/maven-docker-test/target/easy-springmvc-maven.war': Permission denied
原因:
- Jenkins 運行時,默認使用 jenkins 用戶,而你的 target 目錄和 war 文件可能是 root 創建的,導致 jenkins 沒有權限訪問。
解決方案
修改文件權限(臨時方案)
sudo chmod -R 777 /root/jenkins/workspace/maven-docker-test/target
問題3:Docker 登錄失敗
time="2025-03-18T15:07:30+08:00" level=info msg="Error logging in to endpoint, trying next endpoint"
error="Get \"https://124.222.48.124:9999/v2/\": http: server gave HTTP response to HTTPS client"
原因:
- 你的 Harbor 服務器 可能是 HTTP,但 Jenkins 試圖用 HTTPS 訪問。
- 你需要 在 Docker 配置文件里加入 HTTP 例外。
解決方案:
1.修改 Docker 配置文件
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
"insecure-registries": ["124.222.48.123:9999"]
}
EOF
修改后,這是正確的jenkins服務器上/etc/docker/daemon.json的內容:
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
],
"insecure-registries":["124.222.48.124:9999"]
}
2.重啟 Docker
sudo systemctl restart docker
3.jenkins服務器上,手動測試登錄
sudo docker login -u chenshibao -p 'Csb' 124.222.48.123:9999
登錄成功,說明docker配置已完成

問題 4:Docker Daemon 未運行
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
原因:
- Docker 進程未啟動
- jenkins 用戶沒有訪問 docker.sock 權限
解決方案
1.檢查 Docker 運行狀態
sudo systemctl status docker
2.如果 Docker 未運行:
sudo systemctl start docker
sudo systemctl enable docker
3.給 Jenkins 訪問 Docker 權限
sudo usermod -aG docker jenkins
sudo systemctl restart jenkins
4.驗證
sudo -u jenkins docker ps
5.如果返回 permission denied,可能需要重啟服務器:
sudo reboot
如果返回以下的信息,說明設置可以了

問題5:Dockerfile 目錄不存在
錯誤: 目錄 /root/jenkins/docker-file/maven-docker-test_war 不存在!
解決方案
1.手動創建目錄
sudo mkdir -p /root/jenkins/docker-file/maven-docker-test_war
sudo chown -R jenkins:jenkins /root/jenkins/docker-file/maven-docker-test_war
2.確認 Jenkins 配置的路徑是否正確
打開 Jenkins 配置
檢查 DOCKERFILE_HOME 路徑是否正確
問題 6:Maven POM 文件找不到
ERROR: No such file /var/lib/jenkins/workspace/maven-docker-test/pom.xml
原因:
- GitHub 倉庫里可能沒有 pom.xml 文件,或者路徑不對。
解決方案
1.檢查 GitHub 倉庫
git ls-remote https://github.com/ChenShiBao/TestProject.git
如果沒有 pom.xml,說明 TestProject 不是 Maven 項目,你需要修改構建方式。
2.在 Jenkins 里設置正確的 POM.xml 路徑
進入 Jenkins → maven-docker-test → Configure
在 Build 選項中,確保 Root POM 設置為正確的路徑,比如:
./TestProject/pom.xml
保存并重試




浙公網安備 33010602011771號