找回密码
 立即注册
首页 业界区 安全 腾讯云上部署CICD(持续集成)+docker/k8s部署项目 ...

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

嗣伐 2025-6-23 18:32:31
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:
  1. https://github.com/goharbor/harbor/releases
  2. 下载离线安装包:需要FQ
  3. 如果离线包下载好了,,可以通过打开一个终端执行:scp root@服务器公网ip地址:/root/harbor-offline-installer-v2.12.2.tgz 本地电脑的保存路径,将镜像备份到本地电脑备用
复制代码
1.png

下一步,复制链接地址
2.png

下一步,去124.222.48.123服务器上安装harbor
3.png

如果特别慢的话,可以使用国内代理下载
  1. 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镜像下载好或者上传好后,需要解压
  1. tar xvf harbor-offline-installer-v2.12.2.tgz
复制代码
安装
  1. yum -y install lrzsz
复制代码
安装compose

  • 第1种方式
    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
    复制代码
    或者
    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
    复制代码
    再执行以下命令,加上权限
    1.   chmod +x /usr/local/bin/docker-compose
    复制代码
第2种方式,去github下载发布版:
4.png


  • 确保docker-compose-linux-x86_64上传到服务器上了
  • 移动文件并重命名:将文件移动到 /usr/local/bin/ 目录下,并重命名为 docker-compose。这是安装 Docker Compose 的标准位置和命名。
    1.   sudo mv /root/docker-compose-linux-x86_64 /usr/local/bin/docker-compose
    复制代码
  • 给docker-compose文件目录添加权限
    5.png

下一步,切换到harbor解压目录,修改配置文件:
  1. cd harbor/
  2. ls
复制代码
下一步,执行安装docker,如果已经安装过了可以忽略
  1. yunm install docker -y
复制代码
3.2 修改harbor.yml.tmpl文件

1.找到文件
6.png

2.执行 命令该文件名称
  1. cp harbor.yml.tmpl harbor.yml
复制代码
3.修改配置
  1. vim harbor.yml
复制代码
1)修改 hostname:ip地址或域名
2)http端口可以设置一个没有被占用的端口【harbor 端口使用9999】
3)去掉https的认证
7.png

修改完,保存退出。
4.启动harbor,切换到harbor目录,执行下面命令
  1. ./install.sh
复制代码
8.png

下一步,出现以下界面说明harbor已经成功启动
9.png

4 访问harbor,登录

访问地址:http://ip:端口
初始化账号/密码:admin/Harbor12345
10.png

5 harbor的使用

5.1 创建项目
11.png

5.2 创建用户:chenshibao/密码
12.png

5.3 项目用户授权
13.png

授权完成,新创建的账户就有管理这个项目的权限了。
4 Jenkins环境搭建

4.1 安装docker

如果docker未安装,可执行以下步骤安装:

  • 添加docker软件源
    1. dnf config-manager --add-repo=http://mirrors.tencent.com/docker-ce/linux/centos/docker-ce.repo
    复制代码
  • 查看已添加的docker软件源
    1. dnf list docker-ce
    复制代码
  • 安装docker
    1. dnf install -y docker-ce --nobest
    复制代码
  • 运行docker
    1. systemctl start docker
    复制代码
  • 查看docker信息
    1. docker info
    复制代码
如果是阿里云的centos服务器,可以执行以下操作安装docker:
  1.         1.yum install -y yum-utils device-mapper-persistent-data lvm2 git
  2.         2.yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  3.         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.         4.yum install -y container-selinux
  5.         5.ls
  6.         6.rpm -ivh containerd.io-1.2.6-3.3.el7.x86_64.rpm
  7.         7.yum install docker-ce -y
  8.         8.systemctl start docker
  9.        
  10.         ##以下是测试部分(可以不用操作)
  11.         docker pull nginx
  12.         docker tag nginx 124.222.48.124:9999/jenkins/nginx:v0
  13.         docker login 124.222.48.124:9999
  14.         rpm -ql docker-ce
  15.         vim /etc/docker/key.json
  16.         cd /etc/docker/
  17.         ls
复制代码
4.2 用nginx进行测试【这一步可以不做】


  • 拉取nginx镜像
    1. docker pull nginx
    复制代码
如果拉取失败,如下图,可以去 /etc/docker/daemon.json,配置腾讯云docker镜像源加速镜像下载,
14.png

如果daemon.json文件不存在,可以创建;
  1. touch daemon.json
复制代码
15.png

daemon.json文件内容如下:
  1.         {
  2.            "registry-mirrors": [
  3.            "https://mirror.ccs.tencentyun.com"
  4.           ]
  5.         }
复制代码
配置完后,需要重启docker,再拉取镜像
  1. sudo systemctl restart docker
  2. docker pull nginx
复制代码
16.png


  • 打包一个nginx的镜像
    1. docker tag nginx 124.222.48.124:9999/jenkins/nginx:v0
    复制代码
  • 登录harbor,输入username和password
    docker login 124.222.48.124
    17.png

18.png
  1. 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)和端口,
  1. {
  2.                    "registry-mirrors": [
  3.                                           "https://mirror.ccs.tencentyun.com"
  4.                    ],
  5.                    "insecure-registries":["124.222.48.124:9999"]
  6. }
复制代码
原因是我们docker client使用的是https,而我们搭建的Harbor私库用的是http的,所以会有这样的报错,导致访问不了。
在Harbor所在的服务器上修改daemon.json文件
  1. {
  2.                    "registry-mirrors": [
  3.                                           "https://mirror.ccs.tencentyun.com"
  4.                    ],
  5.                    "insecure-registries":["124.222.48.124:9999"] #ip写Harbor所在的服务器ip,端口是harbor.yml文件中配置的port
  6. }
复制代码
重启docker
  1. systemctl daemon-reload
  2. systemctl restart docker
复制代码
查看harbor是否已经启动,如果没有重新启动harbor
如果一切正常,那可以登录成功了;
19.png


  • 将打包好的镜像上传到 harbor的镜像仓库
1.执行推送,镜像名称(nginx,版本:v0)
  1. docker push 124.222.48.124:9999/jenkins/nginx:v0
复制代码
20.png

以上出现,表示推送成功,可以登录harbor查看

  • 业务服务器部署
    1)先安装docker,步骤可参考上面步骤
    2)安装jq(jq类似于sed/awk专门处理json格式的文件)
    1. yum install docker jq -y
    复制代码
    3)执行 visudo(阿里云centos需要这样,腾迅云不需要)
    visudo
    21.png

4.3 Jenkins服务部署配置(如果Jenkins没有安装,需要先安装,可参考:jenkins安装配置流程)

查看是否已安装jenkins
  1. which jenkins
复制代码
1.安装源,从Jenkins的官方网站下载稳定版的Jenkins YUM仓库配置文件,并将其保存到/etc/yum.repos.d/目录下,命名为jenkins.repo
  1. wget-0 /etc/yum.repos.d/jenkins.repo https: //pkg. jenkins.io/redhat-stable/jenkins.repo
复制代码
2.导入key,使用rpm工具导入Jenkins的官方GPG密钥。
  1. rpm --import https: //pkg.jenkins.io/redhat- stable/jenkins.io. key
复制代码
3.安装,在服务器上自动安装Jenkins、Git和Maven这三个软件包
  1. yum Install -y jenkins git maven
复制代码
4.查看java是否已安装成功
  1. java --version
复制代码
5.启动jenkins
  1. systemctl start jenkins
复制代码
6.查jenkins进程信息
  1. ps -ef|grep jenkins
复制代码
========================================================================================
由于在Jenkins机器上docker是使用root用户运行的,而Jenkins是使用普通用户jenkins 运行的,所以要先配置下jenkins用户可以使用docker命令。
使用以下步骤:
1.使用visudo命令
  1. visudo
复制代码
2.在配置文件里添加用户,如下图所示
  1. jenkins ALL=(root) NOPASSWD: /usr/bin/docker
  2. Defaults: jenkins !requiretty
复制代码
22.png

如果不配置的话,会报以下错误
23.png

3.安装插件
浏览器登录jenkins,http://1.116.119.87:7777,进行初始化配置
点击“系统管理”,点击“插件管理”,搜索插件“Maven Integration”和“SSH”,进行安装。
4.配置远程机器
登录jenkins,点击“Credentials”,点击 "Add domain".
24.png

添加域
25.png

添加凭证
26.png

用户名和密码是登录这台服务器的 用户和密码
27.png

凭证生成完成。
28.png

下一步:
29.png

下一步:
30.png

配置docker应用服务器的ip地址,如果有多台服务器,可以再次新增
31.png

32.png

5.Jenkins构建Job

1.构建Maven风格的Job

33.png

下一步
34.png

下一步
35.png

下一步
36.png

下一步:
37.png

选择执行shell脚本,脚本内容如下
  1. #Jenkins机器:编译完成后,build生成一个新版本的镜像,push到远程docker仓库variables
  2. JENKINS_WAR_HOME='/root/jenkins/workspace/maven-docker-test/target'
  3. DOCKERFILE_HOME='/root/jenkins/docker-file/maven-docker-test_war'
  4. # harbor服务器上的配置项
  5. HARBOR_IP='124.222.48.123'
  6. REPOSITORIES='jenkins/maven-docker-test'
  7. HARBOR_USER='chenshibao'
  8. HARBOR_USER_PASSWD='Csb'
  9. HARBOR_USER_EMAIL='714183244@qq.com'
  10. #Copy the newest war to docker-file directory.
  11. \cp -f ${JENKINS_WAR_HOME}/easy-springmvc-maven.war ${DOCKERFILE_HOME}/maven-docker-test.war
  12. #Delete image early version.
  13. sudo docker login -u ${HARBOR_USER} -p ${HARBOR_USER_PASSWD} ${HARBOR_IP}:9999
  14. IMAGE_ID='sudo docker images | grep ${REPOSITORIES} | awk '{print $3}''
  15. if [-n "$(IMAGE_ID}" ];then
  16.         sudo docker rmi ${IMAGE_ID}
  17. fi
  18. # Build image.
  19. cd ${DOCKERFILE_HOME}
  20. TAG='date +%Y%m%d-%H%M%S'
  21. sudo docker build -t ${HARBOR_IP}:9999/${REPOSITORIES}:${TAG} . &>/dev/null
  22. # Push to the harbor registry.
  23. sudo docker push ${HARBOR_IP}:9999/${REPOSITORIES}:${TAG} &>/dev/null
复制代码
以上shell脚本有问题时,可以使用以下这个shell脚本
  1. #!/bin/bash
  2. JENKINS_WAR_HOME='/root/jenkins/workspace/maven-docker-test/target'
  3. DOCKERFILE_HOME='/root/jenkins/docker-file/maven-docker-test_war'
  4. # Harbor 配置
  5. HARBOR_IP='124.222.48.123'
  6. HARBOR_PORT='9999'
  7. REPOSITORIES='jenkins/maven-docker-test'
  8. HARBOR_USER='chenshibao'
  9. HARBOR_USER_PASSWD='Csb'
  10. HARBOR_USER_EMAIL='714183244@qq.com'
  11. # 复制最新的 war 包到 docker 目录
  12. \cp -f ${JENKINS_WAR_HOME}/easy-springmvc-maven.war ${DOCKERFILE_HOME}/maven-docker-test.war
  13. # Harbor 登录(更安全方式)
  14. echo ${HARBOR_USER_PASSWD} | sudo docker login -u ${HARBOR_USER} --password-stdin ${HARBOR_IP}:${HARBOR_PORT}
  15. # 删除旧镜像(确保只删除目标镜像)
  16. IMAGE_IDS=$(sudo docker images ${HARBOR_IP}:${HARBOR_PORT}/${REPOSITORIES} --format "{{.ID}}")
  17. if [ -n "$IMAGE_IDS" ]; then
  18.         sudo docker rmi -f $IMAGE_IDS
  19. fi
  20. # 生成新的镜像 Tag
  21. TAG=$(date +%Y%m%d-%H%M%S)
  22. # 检查 Dockerfile 目录是否存在
  23. if [ ! -d "$DOCKERFILE_HOME" ]; then
  24.         echo "错误: 目录 $DOCKERFILE_HOME 不存在!"
  25.         exit 1
  26. fi
  27. cd ${DOCKERFILE_HOME}
  28. # 设置日志目录
  29. LOG_DIR="/var/log/jenkins"
  30. mkdir -p $LOG_DIR
  31. # 构建新镜像
  32. sudo docker build -t ${HARBOR_IP}:${HARBOR_PORT}/${REPOSITORIES}:${TAG} . > ${LOG_DIR}/docker_build.log 2>&1
  33. # 推送镜像到 Harbor
  34. 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文件,输如一下内容:
  1. cd /root/jenkins/docker-file/maven-docker-test_war
  2. vim Dockerfile
复制代码
Dockerfile文件内容:
  1. # Version 1.0
  2. # Base image
  3. FROM tomcat:8.0.36-alpine
  4. # Author information (使用 LABEL 代替 MAINTAINER)
  5. LABEL maintainer="chenshibao <714183244@qq.com>"
  6. # Add WAR file to Tomcat webapps directory
  7. COPY maven-docker-test.war /usr/local/tomcat/webapps/
  8. # Set working directory
  9. WORKDIR /usr/local/tomcat/bin/
  10. # Set environment variables
  11. ENV PATH="/usr/local/tomcat/bin:$PATH"
  12. # Define default command
  13. CMD ["catalina.sh", "run"]
  14. # Expose port (默认8080,如果你修改过server.xml就改成7777)
  15. EXPOSE 8080
复制代码
=====================================================================================================================
添加shell执行脚本:

38.png

拉取镜像,发布脚本如下
  1. #!/bin/bash
  2. # Harbor 配置
  3. HARBOR_IP='124.222.48.123'
  4. HARBOR_PORT='9999'
  5. REPOSITORIES='jenkins/maven-docker-test'
  6. HARBOR_USER='chenshibao'
  7. HARBOR_USER_PASSWD='Csb'
  8. # 登录 Harbor
  9. docker login -u ${HARBOR_USER} -p ${HARBOR_USER_PASSWD} ${HARBOR_IP}:${HARBOR_PORT}
  10. # 停止并删除旧容器
  11. CONTAINER_ID=$(docker ps | grep "maven-docker-test" | awk '{print $1}')
  12. if [ -n "$CONTAINER_ID" ]; then
  13.   docker stop $CONTAINER_ID
  14.   docker rm $CONTAINER_ID
  15. else
  16.   # 容器启动失败时,需要 `docker ps -a` 才能找到
  17.   CONTAINER_ID=$(docker ps -a | grep "maven-docker-test" | awk '{print $1}')
  18.   if [ -n "$CONTAINER_ID" ]; then
  19.         docker rm $CONTAINER_ID
  20.   fi
  21. fi
  22. # 删除旧镜像
  23. IMAGE_ID=$(sudo docker images | grep "${REPOSITORIES}" | awk '{print $3}')
  24. if [ -n "${IMAGE_ID}" ]; then
  25.   docker rmi ${IMAGE_ID}
  26. fi
  27. # 获取最新镜像 TAG
  28. TAG=$(curl -s http://${HARBOR_IP}:${HARBOR_PORT}/api/repositories/${REPOSITORIES}/tags | jq -r '.[-1]')
  29. echo "Latest TAG: ${TAG}"
  30. # 拉取最新镜像
  31. echo "Pulling image: ${HARBOR_IP}:${HARBOR_PORT}/${REPOSITORIES}:${TAG}"
  32. docker pull ${HARBOR_IP}:${HARBOR_PORT}/${REPOSITORIES}:${TAG} &>/dev/null
  33. # 运行容器
  34. docker run -d --name maven-docker-test -p 8080:8080 ${HARBOR_IP}:${HARBOR_PORT}/${REPOSITORIES}:${TAG}
复制代码
====================================================================================================================================================
脚本如果没有问题,执行下面操作,立即构建,如果构建成功,可以去docker应用服务器上查看新生成的docker镜像
39.png

问题汇总及解决方式:

问题1.如果出现以下错误,说明maven没有正确安装好,Maven路径配置不对,
  1. Started by user chenshibao
  2. Running as SYSTEM
  3. Building in workspace /var/lib/jenkins/workspace/maven-docker-test
  4. 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.
  5. Finished: FAILURE
复制代码
可以通过查看 mvn -version版本,找到正确的安装地址,
40.png

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.权限不足

出现以下问题:
  1. cp: cannot stat '/root/jenkins/workspace/maven-docker-test/target/easy-springmvc-maven.war': Permission denied
复制代码
原因:

  • Jenkins 运行时,默认使用 jenkins 用户,而你的 target 目录和 war 文件可能是 root 创建的,导致 jenkins 没有权限访问。
解决方案
修改文件权限(临时方案)
  1. sudo chmod -R 777 /root/jenkins/workspace/maven-docker-test/target
复制代码
问题3:Docker 登录失败
  1. time="2025-03-18T15:07:30+08:00" level=info msg="Error logging in to endpoint, trying next endpoint"
  2. 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

相关推荐

您需要登录后才可以回帖 登录 | 立即注册