CI持续集成

一、概述

持续集成(Continuous Integration,CI)是软件开发中的一种实践,它旨在通过频繁地集成代码变更并自动运行测试,以确保代码的质量和稳定性。Jenkins 是一个广泛使用的开源持续集成工具,它能够自动化构建、测试和部署软件项目。我们将使用 Docker 搭建一个基于 Jenkins 的持续集成平台。

1.项目架构图

这个机构图什么意思:

第一步开发写好,更新代码之后将代码上传到Git仓库,第二步jenkins自动化拉去代码编译构建镜像,推送到Docker Registry私有仓库,最后推送到Deploy自动拉去镜像部署容器

二、基础环境准备

准备四台服务器

复制代码
192.168.22.156 dev            # 开发端电脑 1核1G
192.168.22.157 jenkins        # jenkins持续集成软件 4核4G
192.168.22.158 harbor         # 可视镜像仓库
192.168.22.159 server         # 测试端电脑

初始化服务器脚本

bash 复制代码
#!/bin/bash

#Desc 用于初始化服务器:主机名,hosts,防火墙,时间同步

if [ $# -eq 0 ];then
    echo "请输入主机名称参数"
    exit
fi
echo "开始设置主机名"
hostnamectl set-hostname $1
echo "主机名设置成功"

echo "配置yum源"
cd /etc/yum.repos.d
rm -rf *
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache
yum install epel-release -y

echo "开始设置时间同步,每隔30分钟同步一次时间"
echo "*/30 * * * * ntpdate time1.aliyun.com" > /var/spool/cron/root
echo "时间同步设置成功"
echo "查看计划任务"
crontab -l

echo "初始环境设置成功,开始安装docker-ce"
echo "安装docker需要的软件包"
yum install -y yum-utils device-mapper-persistent-data lvm2

echo "配置阿里云的docker-ce镜像源"
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

echo "编写docker镜像加速器"
mkdir /etc/docker
echo '{    "registry-mirrors": ["https://62c8d7mz.mirror.aliyuncs.com"] }' > /etc/docker/daemon.json

echo "重新加载配置文件"
systemctl daemon-reload

echo "安装docker-ce"
yum install -y docker-ce

echo "安装完成,修改docker的连接配置文件"
row=$(sed -n '/ExecStart/=' /usr/lib/systemd/system/docker.service)
sed -i $row"c ExecStart=/usr/bin/dockerd" /usr/lib/systemd/system/docker.service
echo '{    "registry-mirrors": ["https://docker.hubhub.vip"] }' > /etc/docker/daemon.json

echo "安装完成,启动docker"
systemctl daemon-reload
systemctl enable docker && systemctl start docker

echo "安装完成,验证docker"
docker version
reboot

每台服务器都初始化

1.dev环境

只需要安装git

bash 复制代码
yum install git -y

2.jenkins环境

1)jdk与jenkins安装配置

bash 复制代码
# 源码安装jdk21版本
tar -zvxf jdk-21_linux-x64_bin.tar.gz -C /usr/local
bash 复制代码
# 第一步:配置Jenkins的镜像源文件
cat > /etc/yum.repos.d/jenkins.repo <<EOF
[jenkins]
name=Jenkins-stable
baseurl=http://pkg.jenkins.io/redhat-stable
gpgcheck=1
EOF

# 第二步:安装Jenkins
# 导入jenkins的密钥
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
# 安装Jenkins
yum -y install jenkins

# 第三步:修改配置文件,指定JDK路径
# 编辑jenkins服务文件
vim /usr/lib/systemd/system/jenkins.service
# 在[Service]段添加两行,注意修改为你实际的JDK路径
Environment="JAVA_HOME=/usr/local/jdk-21.0.11"
Environment="JENKINS_JAVA_CMD=/usr/local/jdk-21.0.11/bin/java"

# 第四步:安装字体依赖,防止启动失败
yum install fontconfig -y

# 第五步:启动Jenkins并设置开机自启
systemctl daemon-reload
systemctl enable jenkins
systemctl start jenkins

# 第六步:访问验证
# 浏览器访问:http://192.168.217.159:8080

2)Maven安装

先上传Maven安装包安装后配置环境变量

bash 复制代码
tar -zvxf /root/apache-maven-3.5.4-bin.tar.gz -C /usr/local


vim /etc/profile

# 1.最后两行添加
export MAVEN_HOME=/usr/local/apache-maven-3.5.4
export PATH=$PATH:$MAVEN_HOME/bin
bash 复制代码
vim /usr/local/apache-maven-3.9.7/conf/settings.xml


#####################################################
<mirrors>
    <mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>
    </mirror>
</mirrors>

3)git安装

bash 复制代码
yum install -y git

4)配置非安全访问

配置docekr可以访问harbor镜像仓库,配置docker配置文件

bash 复制代码
vim /etc/docker/daemon.json

# 添加以下内容
"insecure-registries":["http://192.168.22.158"]
bash 复制代码
systemctl daemon-reload
systemctl restart docker

3.harbor安装配置

1)安装harbor

如果下载不了harbor不可用直接复制github地址开魔法下载上传到服务器

bash 复制代码
# 下载安装docker‑compose
curl -L "https://mirror.ghproxy.com/https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

docker-compose version

# 下载harbor安装包
wget https://mirror.ghproxy.com/https://github.com/goharbor/harbor/releases/download/v2.9.4/harbor-offline-installer-v2.9.4.tgz --no-check-certificate

tar -zvxf harbor-offline-installer-v2.9.4.tgz -C /usr/local

cd /usr/local/harbor

2)修改配置文件

修改其中的配置文件

bash 复制代码
cd /usr/local/harbor 
# 1.注释掉所有与https的访问模式,我们直接用安全模式访问
cp harbor.yml.tmpl harbor.yml
vim harbor.yml

# 2.修改主机名
hostname:harbor

# 3.修改密码,改为自己想要的
harbor_admin_password: 123456

# 4.修改数据存储位置,路径不存在自动创建
data_volume: /data/harbor

修改保存之后

3)编译启动容器

复制代码
# 1.在harbor目录下,编译
./prepare
复制代码
./install # 安装

这时候就会启动些容器

访问复制自己ip地址就就能访问到harbor页面

三、秘钥配置

1.开发人员dev主机密钥配置

1)在 dev 主机上,生成密钥对

bash 复制代码
ssh-keygen -t rsa -f /root/.ssh/id_rsa -C "dev@vp21.cn" -N ""

# -t:指定要创建的密钥类型。可能的值为"dsa"、"ecdsa"、"ecdsa‑sk"、"ed25519"、"ed25519‑sk"或"rsa"
# -C:添加注释
# -f:指定用来保存密钥的文件名

生成了一个公钥私钥

2)上传公钥到gitee

右上角账号社会里面的ssh公钥,将生成的公钥起个名字复制上去

3)将源码上传到dev主机

这里最好找一个小一点的项目把不然mvn打包打包半天,我这里找的jpress开源论坛

2.jenkins密钥配置

1)将jenkins密钥上传到gitee

由于jenkins要拉去源码,因此恶意需要上传公钥

bash 复制代码
ssh-keygen -t rsa -f /root/.ssh/id_rsa -C "jenkins@vp21.cn" -N ""

生成之后将公钥上传到gitee

2)jenkins主机私钥到凭据列表

上传公钥到gitee因此jenkins主机能够访问到gitee,但是不代表jenkins服务能够连接gitee,因此还需要给jenkins服务配置私钥访问gitee

这里jenkins的公钥私钥配置好了

3)jenkins使用docker

需要 Jenkins 服务器中使用 docker 对从 gitee 仓库中拉取过来的代码打包成镜像,并上传到 harbor 镜像仓库,所以,需要 Jenkins 用户能够使用 docker,故需要将 Jenkins 用户添加至 docker 用户组中将 Jenkins 用户添加到 docker 用户组,这样就可以执行 docker 的相关命令了

1.查询是否存在 Jenkins 用户

bash 复制代码
cat /etc/passwd | grep -w jenkins

2.查询是否存在 docker 用户组

bash 复制代码
cat /etc/group | grep -w docker

3.将 jenkins 用户添加至 docker 用户组,使jenkins能够使用docker命令

bash 复制代码
# 其中 -G是增加副组 -g 修改主组
usermod -G docker jenkins


# 加入之后记得重启,不然仍然没权限执行
systemctl restart jenkins
systemctl restart docker

4)jenkins增加插件

安装的插件有:

  • ssh 用于 jenkins‑server 对 web‑server 进行操作
  • git parameter 用于 git 版本提交进行参数构建
  • gitlab 用于 jenkins‑server 拉取项目(gitlab hook 用于项目自动构建)
  • maven integration 用于编译

进入设置点击插件管理

搜索安装即可,安装好之后配置一个ssh登录让jenkins服务能够登录server服务器执行shell脚本

添加server服务器的用户名密码

添加好之后保存

5)jenkins配置

1.jdk配置

2.git配置

3.Maven配置

这样配置就完成了

四、项目发布流程

1、获取项目代码并修改配置

2、安装数据库

3、创建项目仓库

4、上传项目代码

5、创建基础镜像

6、上传镜像到仓库

7、验证基础镜像是否可用

8、Jenkins 构建任务

9、测试验证

1.安装数据库

运行项目需要数据的支撑,此处我们暂时不用容器来创建数据库,使用 server 主机来创建数据

bash 复制代码
yum -y install mariadb mariadb-server python2-PyMySQL
systemctl enable mariadb.service && systemctl start mariadb.service
mysql_secure_installation        # 设置密码为123456
mysql -uroot -p123456             # 登录mysql

# 创建数据库
create database if not exists xiaobai_db default charset utf8 collate utf8_general_ci;
# 执行sql文件
source /root/woniu_car.sql

# 权限设置
grant all on xiaobai_db.* to 'root'@'%' identified by "123456";
# 刷新权限
flush privileges;

2.修改项目中连接数据库的配置

因为这个项目是开源自己安装数据库的这里不需要配置

3.创建gitee仓库

4.上传项目源码

在 dev 主机中,将就jpress 项目的代码上传到 gitee 仓库中 jpress项目中

bash 复制代码
# 设置git的初始参数
git config --global user.name "dev"
git config --global user.email "dev@vp21.cn"

# 移除原有的git信息
cd /root/jpress
git remote remove origin

# 关联到gitee的仓库(你自己的仓库)
git remote add origin git@gitee.com:xaiobai663/test.git

# 提交代码
git add .
git commit -m "update message"
git push -uf origin master

# 查看标签
git tag

# 创建标签
git tag v1.0

# 将标签推送到远程仓库
git push origin v1.0

上传源码之后,会有一个.dockerignore文件

因为在Dockerfile执行创建镜像文件的时候会根据.dockerignore中内容做处理,如果不排除掉start-tomcat/target/start-tomcat-5.0.war的话会导致Dockerfile找不到打包出来的war文件因此需要修改成上述的代码

5.创建基础镜像

在 Jenkins 主机上创建用于运行项目的 Tomcat 基础镜像,这里我将tomcat和jdk都打包放在了同一个目录下

这里的tomcat和jdk需要源码的所需要的一致,这里的开源项目jpress用上述的jdk和tomcat运行不起来,因此我直接拉去的tomcat:8.5运行的,下面只是演示的制作镜像的过程

bash 复制代码
cd
mkdir tomcat
cd tomcat

vim Dockerfile
bash 复制代码
FROM centos:7

ENV JAVA_HOME=/usr/local/jdk-18
ENV TOMCAT_HOME=/usr/local/apache-tomcat-9.0.93
ENV PATH=$JAVA_HOME/bin:$TOMCAT_HOME/bin:$PATH

ADD openjdk-18_linux-x64_bin.tar.gz /usr/local/
ADD apache-tomcat-9.0.93.tar.gz /usr/local/

RUN rm -rf ${TOMCAT_HOME}/webapps/* && \
    mkdir -p ${TOMCAT_HOME}/webapps/ROOT

EXPOSE 8080

CMD ["/usr/local/apache-tomcat-9.0.93/bin/catalina.sh", "run"]

6.将镜像上传到仓库

先登录harbor仓库,在上传镜像

bash 复制代码
docker login 192.168.22.158

# 上传镜像
docker push 192.168.22.158/library/tomcat:v1

7.构建镜jenkins任务

bash 复制代码
clean install -Dmaven.test.skip=true

其中构建镜像shell代码为

bash 复制代码
REPOSITORY=192.168.22.158/library/jpress:${tag}

# 确保在正确的目录(如果是 Jenkins,通常默认已经是 $WORKSPACE)
cd ${WORKSPACE}

# 生成 Dockerfile
cat > Dockerfile << EOF
FROM 192.168.22.158/library/tomcat:v1
RUN rm -rf /usr/local/apache-tomcat-9.0.93/webapps/ROOT
COPY starter-tomcat/target/starter-tomcat-5.0.war /usr/local/apache-tomcat-9.0.93/webapps/ROOT.war
CMD ["/usr/local/apache-tomcat-9.0.93/bin/catalina.sh", "run"]
EOF


# 构建镜像
docker build -t $REPOSITORY .

# 推送镜像
docker login 192.168.22.158 -u admin -p 123456
docker push $REPOSITORY
docker logout 192.168.22.158

这一步远程登录服务器执行脚本构建容器,写入代码

bash 复制代码
docker login 192.168.22.158 -u admin -p 123456
REPOSITORY=192.168.22.158/library/jpress:${tag}
# 部署
docker rm -f jpress | true
docker image rm $REPOSITORY | true
docker pull $REPOSITORY
docker run -di --name=jpress $REPOSITORY -p 8090:8080 $REPOSITORY
docker logout

全部写入保存之后,重启一下docker和jenkins,

这里上传失败了,因为忘了重启docker和jenkins导致权限未生效重启一手

bash 复制代码
systemctl restart docker
systemctl restart jenkins

这里也是安装上了,自己安装数据库就行了上面安装的数据,这里数据版本不支持,需要mysql5.7上面安装的是mariadb,只需要重新安装一下就行了

相关推荐
裴东青4 小时前
07-Harbor镜像仓库
ci/cd
撸码老九5 小时前
GitHub Actions + 阿里云 ACR + Docker 自动化 CI/CD 部署到云服务器
ci/cd
红球yyds5 小时前
CICD 持续集成与持续交付
ci/cd
终端行者1 天前
jenkins Pipeline 企业级别的流水线构建 Docker 负责打包 最后上传到Nexus
ci/cd·docker·jenkins
x-cmd1 天前
[260520] x-cmd v0.9.5:x install 支持 skill 安装,新增 git ci 命令让 AI 帮你写 commit
人工智能·git·ci/cd·agent·install·x-cmd
浮尘笔记1 天前
Java Snowy框架CI/CD云效自动化部署流程
java·运维·服务器·阿里云·ci/cd·自动化
与遨游于天地2 天前
CI-CD 发展阶段详解
人工智能·ci/cd
前端若水2 天前
版本控制:智能体提示与配置的CI/CD
大数据·elasticsearch·ci/cd
冷小鱼2 天前
2026 年企业级 CI/CD 自动化流水线搭建实战:从 GitOps 到 DevSecOps 的完整落地指南
ci/cd·自动化