目标
把开源Java前后端分离项目smartAdmin,使用docker+Jenkins,完成代码提交后自动触发版本构建发布操作。
项目技术栈
前端:vue
后端:spring boot3
数据库:MySQL
缓存:redis
中间件:nginx
后端工程管理工具:maven
CI/CD技术栈
要完成自动化版本构建,需要部署以下平台:
gitlab:代码管理仓库
Jenkins:流水线构建核心平台
服务器环境
linux:操作系统
docker:用于容器化部署
安装软件
docker中安装gitlab
bash
mkdir -p /etc/gitlab
mkdir -p /var/log/gitlab
mkdir -p /var/opt/gitlab
chmod -R 755 /etc/gitlab
chmod -R 755 /var/log/gitlab
chmod -R 755 /var/opt/gitlab
docker run -d --name gitlab --restart always \
-p 3001:80 -p 3002:443 -p 3003:22 \
-v /etc/gitlab:/etc/gitlab \
-v /var/log/gitlab:/var/log/gitlab \
-v /var/opt/gitlab:/var/opt/gitlab \
gitlab/gitlab-ce
登录gitlab
http://服务器IP:3001/dashboard/projects
安装maven
创建文件夹 /opt/soft/maven
bash
cd /opt/soft/maven
wget --no-check-certificate https://manongbiji.oss-cn-beijing.aliyuncs.com/ittailkshow/devops/download/apache-maven-3.8.6-bin.tar.gz
tar zxvf apache-maven-3.8.6-bin.tar.gz
cd /opt/soft/maven/apache-maven-3.8.6/conf
rm -f settings.xml
wget --no-check-certificate https://manongbiji.oss-cn-beijing.aliyuncs.com/ittailkshow/devops/download/settings.xml
命令解读:进入maven文件夹,拉取完整的maven软件包。删除maven原始settings.xml文件,更换新的settings.xml文件,新的settings.xml文件中配置了阿里云的下载仓库,下载文件速度快。
docker中安装Jenkins
bash
mkdir -p /var/jenkins/
chmod -R 777 /var/jenkins/
docker pull jenkins/jenkins:jdk17
docker run -d --name jenkins \
--restart=always \
-p 4001:8080 \
-p 4002:50000 \
-v /var/jenkins:/var/jenkins_home \
-v /opt/soft/maven/apache-maven-3.8.6:/opt/soft/maven/apache-maven-3.8.6 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
--group-add 999 \
jenkins/jenkins:jdk17
注意: --group-add 999 是给容器赋予权限,可以访问宿主机docker。
通过 cat /etc/group | grep docker 命令查询出docker 组的 GID 是多少。
登录Jenkins
docker中安装redis
bash
docker run -d \
--name redis \
-p 6379:6379 \
-v /opt/redis/data:/data \
-v /opt/redis/conf/redis.conf:/etc/redis/redis.conf \
-v /opt/redis/logs:/var/log/redis \
redis:7-alpine \
redis-server /etc/redis/redis.conf --appendonly yes --requirepass 123456
123456是redis的密码。
docker中安装MySQL
bash
docker run -d --name mysql8 --hostname mysql8 \
--restart=always \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e TZ=Asia/Shanghai \
-v mysql-data:/var/lib/mysql \
mysql:8.0.22 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci \
--default-time-zone=+8:00
123456是MySQL的密码。
mysql-data:为MySQL数据库创建的卷,用于在宿主机存储物理的数据文件。
软件配置
gitlab配置
新建项目,用于完成代码的管理

通过git工具,把代码推送到gitlab代码仓库。
集成中找到Jenkins,并进行配置:


Jenkins配置
全局工具配置



新建任务(job),构建流水线。




pipeline脚本
bash
pipeline {
agent any
tools {
nodejs 'node-18'
}
environment {
// 只保留构建需要的变量
API_DIR = 'smart-admin-api-java17-springboot3'
WEB_DIR = 'smart-admin-web-javascript'
}
stages {
stage('1. 拉取 GitLab 代码') {
steps {
git credentialsId: 'b9bf2149-bf24-469c-89e1-bea894230f01',
url: 'http://gitlab所在服务器IP:3001/root/smartadmin'
}
}
stage('2. 后端项目打包') {
steps {
dir("${API_DIR}") {
sh '/opt/soft/maven/apache-maven-3.8.6/bin/mvn clean package -Dmaven.test.skip=true -P test'
sh 'cp sa-admin/target/*.jar ../myproject.jar'
}
}
post {
success {
archiveArtifacts artifacts: "${API_DIR}/sa-admin/target/*.jar", followSymlinks: false
}
}
}
stage('3. 前端项目打包') {
steps {
dir("${WEB_DIR}") {
sh 'npm install'
sh 'npm run build:test'
sh 'mkdir -p ../web-dist/admin && cp -r dist/* ../web-dist/admin/'
}
}
}
stage('4. 本地构建镜像') {
parallel {
stage('Backend Image') {
steps {
dir('docker/backend') {
sh 'cp ../../myproject.jar .'
sh 'docker build --no-cache -t smartadmin-backend:latest .'
}
}
}
stage('Frontend Image') {
steps {
dir('docker/frontend') {
sh 'cp -r ../../web-dist .'
sh 'docker build --no-cache -t smartadmin-frontend:latest .'
}
}
}
}
}
stage('5. 启动服务') {
steps {
sh 'docker compose -f docker/docker-compose.yaml up -d'
}
}
}
}
credentialsId:gitlab的用户名和密码生成的凭据,在Jenkins系统管理-凭据管理中添加。

邮件配置(非必须,配置了可以在Jenkins构建完成后发送邮件提醒),参考下面文章:
https://blog.csdn.net/2301_78843735/article/details/156014003
https://cloud.tencent.com/developer/article/2427934
项目代码调整
从官网拉取源代码后,保留smart-admin-api-java17-springboot3、smart-admin-web-javascript,其他删掉即可。

因为要用docker构建,所以需要编写Dockerfile文件。



目录结构如图所示,在前后端项目的平级目录下面,创建docker文件夹,里面创建前后端两个文件夹,名称为:backend、frontend。在前后端文件夹中再分别创建名称为Dockerfile的文件(不是txt文件,文件没有后缀名)。
backend/Dockerfile文件内容:
bash
FROM docker.1ms.run/khipu/openjdk17-alpine:latest
WORKDIR /app
# 复制 Jenkins 打包好的 jar(从项目根目录)
COPY myproject.jar /app/app.jar
# 暴露后端端口
EXPOSE 1024
# 启动应用
ENTRYPOINT ["java", "-jar", "/app/app.jar", "--server.port=1024"]
frontend/Dockerfile文件内容:
bash
FROM docker.1ms.run/library/nginx:alpine
# 复制 Jenkins 打包好的前端文件(从项目根目录)
COPY web-dist /usr/share/nginx/html
# 创建 nginx 配置,代理后端 API
RUN echo 'server {' > /etc/nginx/conf.d/default.conf && \
echo ' listen 8081;' >> /etc/nginx/conf.d/default.conf && \
echo ' location / {' >> /etc/nginx/conf.d/default.conf && \
echo ' root /usr/share/nginx/html;' >> /etc/nginx/conf.d/default.conf && \
echo ' try_files $uri $uri/ /index.html;' >> /etc/nginx/conf.d/default.conf && \
echo ' }' >> /etc/nginx/conf.d/default.conf && \
echo ' location /api/ {' >> /etc/nginx/conf.d/default.conf && \
echo ' proxy_pass http://backend:1024/;' >> /etc/nginx/conf.d/default.conf && \
echo ' proxy_set_header Host $host;' >> /etc/nginx/conf.d/default.conf && \
echo ' proxy_set_header X-Real-IP $remote_addr;' >> /etc/nginx/conf.d/default.conf && \
echo ' }' >> /etc/nginx/conf.d/default.conf && \
echo '}' >> /etc/nginx/conf.d/default.conf
# 暴露前端端口
EXPOSE 8081
CMD ["nginx", "-g", "daemon off;"]
打包用的是test环境的配置,所以需要更改test后端配置的MySQL数据库链接、redis数据库链接等信息。以下这些信息,需要修改成自己服务器的IP、用户名和密码。

调整完毕,通过git工具,把本地代码推送到前面已经建好的gitlab代码仓库。
项目代码提交后,gitlab如图所示:

到此为止,只要本地代码提交到gitlab或者合并了分支(根据实际需要,在gitlab和Jenkins中配置),就会自动触发Jenkins的版本构建,把版本发布到服务器上,完成版本的自动更新操作。