一、概述

持续集成(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         # 测试端电脑

初始化服务器脚本

#!/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

yum install git -y

2.jenkins环境

1)jdk与jenkins安装配置

# 源码安装jdk21版本
tar -zvxf jdk-21_linux-x64_bin.tar.gz -C /usr/local
# 第一步:配置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安装包安装后配置环境变量

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

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安装

yum install -y git

4)配置非安全访问

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

vim /etc/docker/daemon.json

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

3.harbor安装配置

1)安装harbor

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

# 下载安装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)修改配置文件

修改其中的配置文件

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 主机上,生成密钥对

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要拉去源码,因此恶意需要上传公钥

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 用户

cat /etc/passwd | grep -w jenkins

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

cat /etc/group | grep -w docker

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

# 其中 -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 主机来创建数据

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项目中

# 设置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运行的,下面只是演示的制作镜像的过程

cd
mkdir tomcat
cd tomcat

vim Dockerfile
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仓库,在上传镜像

docker login 192.168.22.158

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

7.构建镜jenkins任务

clean install -Dmaven.test.skip=true

其中构建镜像shell代码为

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

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

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导致权限未生效重启一手

systemctl restart docker
systemctl restart jenkins

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

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐