金牛运财 發表於 2025-6-23 18:44:00

腾讯云上部署CICD(持续集成)+docker/k8s部署项目

<h2 id="1部署流程">1.部署流程</h2>
<ul>
<li>1、研发push到github代码库(或gitlab)</li>
<li>2、Jenkins 构建,pull git代码使用maven进行编译打包</li>
<li>3、打包生成的代码,生成一个新版本的镜像,push到本地docker仓库harbor</li>
<li>4、发布,测试机器pull新版本的镜像,并删除原来的容器,重新运行新版本镜像。</li>
</ul>
<h2 id="2环境说明">2.环境说明</h2>
<h3 id="服务及服务器说明腾迅云环境代码仓库">服务及服务器说明腾迅云环境、代码仓库</h3>
<p>1、 代码仓库</p>
<ul>
<li>github 或者 git-server 或者 gitlab</li>
<li>本次实验使用github仓库项目:https://github.com/ChenShiBao/testJenkins.git</li>
</ul>
<p>2、容器镜像仓库,部署harbor</p>
<ul>
<li>ip:<br>
公网:124.222.48.123</li>
<li>主机名:harbor</li>
</ul>
<p>3、CI/CD服务器,部署jenkins</p>
<ul>
<li>ip:<br>
公网:1.116.119.87</li>
<li>主机名:jenkins</li>
<li>安装软件:
<ul>
<li>jdk</li>
<li>jenkins</li>
<li>git</li>
<li>maven</li>
<li>docker</li>
</ul>
</li>
</ul>
<p>4、应用服务器(docker/k8s)</p>
<ul>
<li>ip:<br>
公网:47.236.196.111</li>
<li>主机名:docker</li>
<li>安装软件:
<ul>
<li>jq</li>
<li>docker或者k8s集群</li>
</ul>
</li>
</ul>
<h2 id="3-部署harbor镜像仓库">3 部署Harbor镜像仓库</h2>
<h3 id="31下载安装">3.1、下载安装</h3>
<p>1.1 去官方地址下载harbor:</p>
<pre><code>https://github.com/goharbor/harbor/releases
下载离线安装包:需要FQ
如果离线包下载好了,,可以通过打开一个终端执行:scp root@服务器公网ip地址:/root/harbor-offline-installer-v2.12.2.tgz 本地电脑的保存路径,将镜像备份到本地电脑备用
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/2212230/202502/2212230-20250228122255535-837675300.png"></p>
<p>下一步,复制链接地址</p>
<p><img src="https://img2024.cnblogs.com/blog/2212230/202502/2212230-20250228122419088-238923812.png"></p>
<p>下一步,去124.222.48.123服务器上安装harbor<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202502/2212230-20250228122627786-417408246.png"></p>
<p>如果特别慢的话,可以使用国内代理下载</p>
<pre><code>wget https://ghproxy.com/https://github.com/goharbor/harbor/releases/download/v2.12.2/harbor-offline-installer-v2.12.2.tgz
</code></pre>
<p>harbor-offline-installer-v2.12.2.tgz镜像下载好或者上传好后,需要解压</p>
<pre><code>tar xvf harbor-offline-installer-v2.12.2.tgz
</code></pre>
<p>安装</p>
<pre><code>yum -y install lrzsz
</code></pre>
<p>安装compose</p>
<ul>
<li>
<p>第1种方式</p>
<pre><code>curl -L https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
</code></pre>
<p>或者</p>
<pre><code>curl -L https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
</code></pre>
<p>再执行以下命令,加上权限</p>
<pre><code>chmod +x /usr/local/bin/docker-compose
</code></pre>
</li>
</ul>
<p>第2种方式,去github下载发布版:<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250306134106137-778715415.png"></p>
<ul>
<li>
<p>确保docker-compose-linux-x86_64上传到服务器上了</p>
</li>
<li>
<p>移动文件并重命名:将文件移动到 /usr/local/bin/ 目录下,并重命名为 docker-compose。这是安装 Docker Compose 的标准位置和命名。</p>
<pre><code>sudo mv /root/docker-compose-linux-x86_64 /usr/local/bin/docker-compose
</code></pre>
</li>
<li>
<p>给docker-compose文件目录添加权限<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250306134505580-637521150.png"></p>
</li>
</ul>
<p>下一步,切换到harbor解压目录,修改配置文件:</p>
<pre><code>cd harbor/
ls
</code></pre>
<p>下一步,执行安装docker,如果已经安装过了可以忽略</p>
<pre><code>yunm install docker -y
</code></pre>
<h3 id="32-修改harborymltmpl文件">3.2 修改harbor.yml.tmpl文件</h3>
<p>1.找到文件<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250306153109756-1180989775.png"></p>
<p>2.执行 命令该文件名称</p>
<pre><code>cp harbor.yml.tmpl harbor.yml
</code></pre>
<p>3.修改配置</p>
<pre><code>vim harbor.yml
</code></pre>
<p>1)修改 hostname:ip地址或域名<br>
2)http端口可以设置一个没有被占用的端口【harbor 端口使用9999】<br>
3)去掉https的认证<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250306154023418-1248907858.png"></p>
<p>修改完,保存退出。</p>
<p>4.启动harbor,切换到harbor目录,执行下面命令</p>
<pre><code>./install.sh
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250306154236018-1870778623.png"></p>
<p>下一步,出现以下界面说明harbor已经成功启动</p>
<p><img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250306154807869-2081620351.png"></p>
<h3 id="4-访问harbor登录">4 访问harbor,登录</h3>
<p>访问地址:http://ip:端口<br>
初始化账号/密码:admin/Harbor12345</p>
<p><img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250306155943387-563636548.png"></p>
<h3 id="5-harbor的使用">5 harbor的使用</h3>
<p>5.1 创建项目</p>
<p><img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250306160340028-1871414941.png"></p>
<p>5.2 创建用户:chenshibao/密码<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250306160823211-365505139.png"></p>
<p>5.3 项目用户授权<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250306161233428-1465334074.png"></p>
<p>授权完成,新创建的账户就有管理这个项目的权限了。</p>
<h2 id="4-jenkins环境搭建">4 Jenkins环境搭建</h2>
<h3 id="41-安装docker">4.1 安装docker</h3>
<p>如果docker未安装,可执行以下步骤安装:</p>
<ol>
<li>
<p>添加docker软件源</p>
<pre><code> dnf config-manager --add-repo=http://mirrors.tencent.com/docker-ce/linux/centos/docker-ce.repo
</code></pre>
</li>
<li>
<p>查看已添加的docker软件源</p>
<pre><code> dnf list docker-ce
</code></pre>
</li>
<li>
<p>安装docker</p>
<pre><code> dnf install -y docker-ce --nobest
</code></pre>
</li>
<li>
<p>运行docker</p>
<pre><code> systemctl start docker
</code></pre>
</li>
<li>
<p>查看docker信息</p>
<pre><code> docker info
</code></pre>
</li>
</ol>
<p>如果是阿里云的centos服务器,可以执行以下操作安装docker:</p>
<pre><code>        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
</code></pre>
<h3 id="42-用nginx进行测试这一步可以不做">4.2 用nginx进行测试【这一步可以不做】</h3>
<ol>
<li>
<p>拉取nginx镜像</p>
<pre><code> docker pull nginx
</code></pre>
</li>
</ol>
<p>如果拉取失败,如下图,可以去 /etc/docker/daemon.json,配置腾讯云docker镜像源加速镜像下载,<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250306225307132-903909900.png"></p>
<p>如果daemon.json文件不存在,可以创建;</p>
<pre><code>touch daemon.json
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250306225632319-276747838.png"></p>
<p>daemon.json文件内容如下:</p>
<pre><code>        {
           "registry-mirrors": [
           "https://mirror.ccs.tencentyun.com"
          ]
        }
</code></pre>
<p>配置完后,需要重启docker,再拉取镜像</p>
<pre><code>sudo systemctl restart docker
docker pull nginx
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250306225924852-2344505.png"></p>
<ol start="2">
<li>
<p>打包一个nginx的镜像</p>
<pre><code> docker tag nginx 124.222.48.124:9999/jenkins/nginx:v0
</code></pre>
</li>
<li>
<p>登录harbor,输入username和password<br>
docker login 124.222.48.124<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250306230856093-1949463024.png"></p>
</li>
</ol>
<p><img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250306230202499-113512579.png"></p>
<pre><code>Error response from daemon: Get "https://124.222.48.124/v2/": tls: failed to verify certificate: x509:
</code></pre>
<p>如果出现上面的错误,需要改一下daemon.json的配置,配置上124.222.48.124(harbor的ip)和端口,</p>
<pre><code>{
                   "registry-mirrors": [
                                          "https://mirror.ccs.tencentyun.com"

                   ],
                   "insecure-registries":["124.222.48.124:9999"]
}
</code></pre>
<p>原因是我们docker client使用的是https,而我们搭建的Harbor私库用的是http的,所以会有这样的报错,导致访问不了。</p>
<p>在Harbor所在的服务器上修改daemon.json文件</p>
<pre><code>{
                   "registry-mirrors": [
                                          "https://mirror.ccs.tencentyun.com"

                   ],
                   "insecure-registries":["124.222.48.124:9999"] #ip写Harbor所在的服务器ip,端口是harbor.yml文件中配置的port
}
</code></pre>
<p>重启docker</p>
<pre><code>systemctl daemon-reload
systemctl restart docker
</code></pre>
<p>查看harbor是否已经启动,如果没有重新启动harbor</p>
<p>如果一切正常,那可以登录成功了;<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250307001613896-172459522.png"></p>
<ol start="4">
<li>将打包好的镜像上传到 harbor的镜像仓库</li>
</ol>
<p>1.执行推送,镜像名称(nginx,版本:v0)</p>
<pre><code>docker push 124.222.48.124:9999/jenkins/nginx:v0
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250307003116464-2142094859.png"></p>
<p>以上出现,表示推送成功,可以登录harbor查看</p>
<ol start="5">
<li>
<p>业务服务器部署</p>
<p>1)先安装docker,步骤可参考上面步骤</p>
<p>2)安装jq(jq类似于sed/awk专门处理json格式的文件)</p>
<pre><code> yum install docker jq -y
</code></pre>
<p>3)执行 visudo(阿里云centos需要这样,腾迅云不需要)</p>
<p>visudo<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250307112314319-400356945.png"></p>
</li>
</ol>
<h3 id="43-jenkins服务部署配置如果jenkins没有安装需要先安装可参考jenkins安装配置流程">4.3 Jenkins服务部署配置(如果Jenkins没有安装,需要先安装,可参考:jenkins安装配置流程)</h3>
<p>查看是否已安装jenkins</p>
<pre><code>which jenkins
</code></pre>
<p>1.安装源,从Jenkins的官方网站下载稳定版的Jenkins YUM仓库配置文件,并将其保存到/etc/yum.repos.d/目录下,命名为jenkins.repo</p>
<pre><code>wget-0 /etc/yum.repos.d/jenkins.repo https: //pkg. jenkins.io/redhat-stable/jenkins.repo
</code></pre>
<p>2.导入key,使用rpm工具导入Jenkins的官方GPG密钥。</p>
<pre><code>rpm --import https: //pkg.jenkins.io/redhat- stable/jenkins.io. key
</code></pre>
<p>3.安装,在服务器上自动安装Jenkins、Git和Maven这三个软件包</p>
<pre><code>yum Install -y jenkins git maven
</code></pre>
<p>4.查看java是否已安装成功</p>
<pre><code>java --version
</code></pre>
<p>5.启动jenkins</p>
<pre><code>systemctl start jenkins
</code></pre>
<p>6.查jenkins进程信息</p>
<pre><code>ps -ef|grep jenkins
</code></pre>
<p>========================================================================================</p>
<p>由于在Jenkins机器上docker是使用root用户运行的,而Jenkins是使用普通用户jenkins 运行的,所以要先配置下jenkins用户可以使用docker命令。<br>
使用以下步骤:</p>
<p>1.使用visudo命令</p>
<pre><code>visudo
</code></pre>
<p>2.在配置文件里添加用户,如下图所示</p>
<pre><code>jenkins ALL=(root) NOPASSWD: /usr/bin/docker
Defaults: jenkins !requiretty
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250307235835956-1813647427.png"></p>
<p>如果不配置的话,会报以下错误</p>
<p><img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250308000104386-2042885985.png"></p>
<p>3.安装插件</p>
<p>浏览器登录jenkins,http://1.116.119.87:7777,进行初始化配置<br>
点击“系统管理”,点击“插件管理”,搜索插件“Maven Integration”和“SSH”,进行安装。</p>
<p>4.配置远程机器<br>
登录jenkins,点击“Credentials”,点击 "Add domain".<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250315161630352-1671516890.png"></p>
<p>添加域<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250315161856721-1697365000.png"></p>
<p>添加凭证<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250315162040228-2023052434.png"></p>
<p>用户名和密码是登录这台服务器的 用户和密码<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250315162205741-2046479619.png"></p>
<p>凭证生成完成。<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250315162338325-1740398042.png"></p>
<p>下一步:<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250315162545460-1170072185.png"></p>
<p>下一步:<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250315162715040-1614083523.png"></p>
<p>配置docker应用服务器的ip地址,如果有多台服务器,可以再次新增<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250315163011453-2122768169.png"></p>
<p><img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250315163258188-1856187831.png"></p>
<h2 id="5jenkins构建job">5.Jenkins构建Job</h2>
<h3 id="1构建maven风格的job">1.构建Maven风格的Job</h3>
<p><img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250315195659739-397737572.png"></p>
<p>下一步<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250315195752164-854292070.png"><br>
下一步<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250315195841103-465999662.png"><br>
下一步<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250315200055860-914029676.png"><br>
下一步:<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250315200245679-764576260.png"></p>
<p>选择执行shell脚本,脚本内容如下</p>
<pre><code>#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} . &amp;&gt;/dev/null
# Push to the harbor registry.

sudo docker push ${HARBOR_IP}:9999/${REPOSITORIES}:${TAG} &amp;&gt;/dev/null
</code></pre>
<h3 id="以上shell脚本有问题时可以使用以下这个shell脚本">以上shell脚本有问题时,可以使用以下这个shell脚本</h3>
<pre><code>#!/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} . &gt; ${LOG_DIR}/docker_build.log 2&gt;&amp;1

# 推送镜像到 Harbor
sudo docker push ${HARBOR_IP}:${HARBOR_PORT}/${REPOSITORIES}:${TAG} &gt; ${LOG_DIR}/docker_push.log 2&gt;&amp;1
</code></pre>
<p>===============================================================================================================================================</p>
<p>JENKINS_WAR_HOME='/root/jenkins/workspace/maven-docker-test/target'目录在服务器不存在时创建,<br>
DockerFile_Home='/root/jenkins/docker-file/maven-docker-test_war' ,这个目录如果在jenkins服务器上没有的话,可以先创建,maven-docker-test_war这个目录可以根据自己项目自定义(可以定义为:任务名称_war)<br>
,然后再这个目录下创建DockerFile文件,输如一下内容:</p>
<pre><code>cd /root/jenkins/docker-file/maven-docker-test_war
vim Dockerfile
</code></pre>
<h3 id="dockerfile文件内容">Dockerfile文件内容:</h3>
<pre><code># Version 1.0
# Base image
FROM tomcat:8.0.36-alpine

# Author information (使用 LABEL 代替 MAINTAINER)
LABEL maintainer="chenshibao &lt;714183244@qq.com&gt;"

# 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
</code></pre>
<p>=====================================================================================================================</p>
<h3 id="添加shell执行脚本">添加shell执行脚本:</h3>
<p><img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250315203609533-881038085.png"></p>
<h4 id="拉取镜像发布脚本如下">拉取镜像,发布脚本如下</h4>
<pre><code>#!/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} &amp;&gt;/dev/null

# 运行容器
docker run -d --name maven-docker-test -p 8080:8080 ${HARBOR_IP}:${HARBOR_PORT}/${REPOSITORIES}:${TAG}
</code></pre>
<p>====================================================================================================================================================</p>
<p>脚本如果没有问题,执行下面操作,立即构建,如果构建成功,可以去docker应用服务器上查看新生成的docker镜像</p>
<p><img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250315214238244-966804182.png"></p>
<h2 id="问题汇总及解决方式">问题汇总及解决方式:</h2>
<h3 id="问题1如果出现以下错误说明maven没有正确安装好maven路径配置不对">问题1.如果出现以下错误,说明maven没有正确安装好,Maven路径配置不对,</h3>
<pre><code>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
</code></pre>
<p>可以通过查看 mvn -version版本,找到正确的安装地址,<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250318150145546-882333005.png"></p>
<p>1.确保 Maven 已在 Jenkins 中正确配置<br>
虽然 mvn -version 在命令行可用,但 Jenkins 可能没有找到它,需要手动配置:</p>
<ul>
<li>步骤 1:进入 Jenkins 全局配置
<ul>
<li>打开 Jenkins,进入 Manage Jenkins → Global Tool Configuration</li>
<li>找到 Maven 配置部分:</li>
<li>如果没有任何 Maven 版本,点击 Add Maven 添加一个。</li>
<li>确保名称正确,例如 Maven 3.8.5。</li>
<li>取消勾选 Install automatically(因为你的服务器已经安装了 Maven)。</li>
<li>在 Maven home 里填入 /usr/share/maven(你的 mvn -version 显示的路径)。</li>
</ul>
</li>
<li>步骤 2:在 Jenkins 任务中选择 Maven
<ul>
<li>进入你的 Job(maven-docker-test)</li>
<li>点击 Configure,找到 Build Environment</li>
<li>找到 "Build" -&gt; "Invoke top-level Maven targets"</li>
<li>确认 "Maven Version" 选择的是你在全局配置里添加的 Maven 3.8.5</li>
<li>保存后重新构建</li>
</ul>
</li>
</ul>
<h3 id="问题2权限不足">问题2.权限不足</h3>
<p>出现以下问题:</p>
<pre><code>cp: cannot stat '/root/jenkins/workspace/maven-docker-test/target/easy-springmvc-maven.war': Permission denied
</code></pre>
<p>原因:</p>
<ul>
<li>Jenkins 运行时,默认使用 jenkins 用户,而你的 target 目录和 war 文件可能是 root 创建的,导致 jenkins 没有权限访问。</li>
</ul>
<p>解决方案<br>
修改文件权限(临时方案)</p>
<pre><code>sudo chmod -R 777 /root/jenkins/workspace/maven-docker-test/target
</code></pre>
<h3 id="问题3docker-登录失败">问题3:Docker 登录失败</h3>
<pre><code>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"
</code></pre>
<p>原因:</p>
<ul>
<li>你的 Harbor 服务器 可能是 HTTP,但 Jenkins 试图用 HTTPS 访问。</li>
<li>你需要 在 Docker 配置文件里加入 HTTP 例外。</li>
</ul>
<p>解决方案:<br>
1.修改 Docker 配置文件</p>
<pre><code>        sudo mkdir -p /etc/docker
        sudo tee /etc/docker/daemon.json &lt;&lt;EOF
        {
          "insecure-registries": ["124.222.48.123:9999"]
        }
        EOF
</code></pre>
<p>修改后,这是正确的jenkins服务器上/etc/docker/daemon.json的内容:</p>
<pre><code>{
"registry-mirrors": [
        "https://mirror.ccs.tencentyun.com"
        ],
"insecure-registries":["124.222.48.124:9999"]
}
</code></pre>
<p>2.重启 Docker</p>
<pre><code>sudo systemctl restart docker
</code></pre>
<p>3.jenkins服务器上,手动测试登录</p>
<pre><code>sudo docker login -u chenshibao -p 'Csb' 124.222.48.123:9999
</code></pre>
<p>登录成功,说明docker配置已完成<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250318174120508-863621951.png"></p>
<h3 id="问题-4docker-daemon-未运行">问题 4:Docker Daemon 未运行</h3>
<pre><code>Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
</code></pre>
<p>原因:</p>
<ul>
<li>Docker 进程未启动</li>
<li>jenkins 用户没有访问 docker.sock 权限</li>
</ul>
<p>解决方案<br>
1.检查 Docker 运行状态</p>
<pre><code>sudo systemctl status docker
</code></pre>
<p>2.如果 Docker 未运行:</p>
<pre><code>sudo systemctl start docker
sudo systemctl enable docker
</code></pre>
<p>3.给 Jenkins 访问 Docker 权限</p>
<pre><code>sudo usermod -aG docker jenkins
sudo systemctl restart jenkins
</code></pre>
<p>4.验证</p>
<pre><code>sudo -u jenkins docker ps
</code></pre>
<p>5.如果返回 permission denied,可能需要重启服务器:</p>
<pre><code>sudo reboot
</code></pre>
<p>如果返回以下的信息,说明设置可以了<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202503/2212230-20250318174938096-712624848.png"></p>
<h3 id="问题5dockerfile-目录不存在">问题5:Dockerfile 目录不存在</h3>
<pre><code>错误: 目录 /root/jenkins/docker-file/maven-docker-test_war 不存在!
</code></pre>
<p>解决方案</p>
<p>1.手动创建目录</p>
<pre><code>sudo mkdir -p /root/jenkins/docker-file/maven-docker-test_war
sudo chown -R jenkins:jenkins /root/jenkins/docker-file/maven-docker-test_war
</code></pre>
<p>2.确认 Jenkins 配置的路径是否正确</p>
<pre><code>打开 Jenkins 配置
检查 DOCKERFILE_HOME 路径是否正确
</code></pre>
<h3 id="问题-6maven-pom-文件找不到">问题 6:Maven POM 文件找不到</h3>
<pre><code>ERROR: No such file /var/lib/jenkins/workspace/maven-docker-test/pom.xml
</code></pre>
<p>原因:</p>
<ul>
<li>GitHub 仓库里可能没有 pom.xml 文件,或者路径不对。</li>
</ul>
<p>解决方案<br>
1.检查 GitHub 仓库</p>
<pre><code>git ls-remote https://github.com/ChenShiBao/TestProject.git
</code></pre>
<p>如果没有 pom.xml,说明 TestProject 不是 Maven 项目,你需要修改构建方式。</p>
<p>2.在 Jenkins 里设置正确的 POM.xml 路径</p>
<p>进入 Jenkins → maven-docker-test → Configure<br>
在 Build 选项中,确保 Root POM 设置为正确的路径,比如:</p>
<pre><code>./TestProject/pom.xml
</code></pre>
<p>保存并重试</p><br><br>
来源:https://www.cnblogs.com/chenshibao/p/18742950
頁: [1]
查看完整版本: 腾讯云上部署CICD(持续集成)+docker/k8s部署项目