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
- 安装软件:
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
复制代码 安装安装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文件目录添加权限
下一步,切换到harbor解压目录,修改配置文件:下一步,执行安装docker,如果已经安装过了可以忽略3.2 修改harbor.yml.tmpl文件
1.找到文件
2.执行 命令该文件名称- cp harbor.yml.tmpl harbor.yml
复制代码 3.修改配置1)修改 hostname:ip地址或域名
2)http端口可以设置一个没有被占用的端口【harbor 端口使用9999】
3)去掉https的认证
修改完,保存退出。
4.启动harbor,切换到harbor目录,执行下面命令
下一步,出现以下界面说明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软件源
- 安装docker
- dnf install -y docker-ce --nobest
复制代码 - 运行docker
- 查看docker信息
如果是阿里云的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进行测试【这一步可以不做】
如果拉取失败,如下图,可以去 /etc/docker/daemon.json,配置腾讯云docker镜像源加速镜像下载,
如果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
- 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
如果一切正常,那可以登录成功了;
1.执行推送,镜像名称(nginx,版本:v0)- docker push 124.222.48.124:9999/jenkins/nginx:v0
复制代码
以上出现,表示推送成功,可以登录harbor查看
- 业务服务器部署
1)先安装docker,步骤可参考上面步骤
2)安装jq(jq类似于sed/awk专门处理json格式的文件)3)执行 visudo(阿里云centos需要这样,腾迅云不需要)
visudo
4.3 Jenkins服务部署配置(如果Jenkins没有安装,需要先安装,可参考:jenkins安装配置流程)
查看是否已安装jenkins1.安装源,从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是否已安装成功5.启动jenkins6.查jenkins进程信息========================================================================================
由于在Jenkins机器上docker是使用root用户运行的,而Jenkins是使用普通用户jenkins 运行的,所以要先配置下jenkins用户可以使用docker命令。
使用以下步骤:
1.使用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 配置文件
[code] sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json |