Jenkins自动化部署(docker)

目标

把开源Java前后端分离项目smartAdmin,使用docker+Jenkins,完成代码提交后自动触发版本构建发布操作。

项目官网:https://smartadmin.vip/

项目技术栈

前端: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

http://服务器IP:4001/login

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的版本构建,把版本发布到服务器上,完成版本的自动更新操作。

相关推荐
胡萝卜3.02 小时前
Makefile 实战指南:从零到一掌握自动化构建
运维·机器学习·自动化·c++开发·makfile·gmu make
java_logo2 小时前
MinerU Docker 部署指南:PDF 结构化解析服务实践
docker·容器·pdf·mineru·mineru部署·mineru部署文档·mineru部署教程
❀͜͡傀儡师2 小时前
Docker打造全能媒体中心Plex
docker·容器·媒体
code tsunami2 小时前
DrissionPage 与 CapSolver:打造无痕、高效的自动化爬虫利器
运维·爬虫·自动化
tzhou644522 小时前
搭建Jenkins+GitLab持续集成环境
ci/cd·gitlab·jenkins
GAOJ_K3 小时前
滚珠花键的安装条件与适应性
运维·人工智能·科技·机器人·自动化·制造
王者鳜錸3 小时前
企业微信+豆包智能体:实现自动化智能客服与数据分析
数据分析·自动化·企业微信·智能客服·豆包智能体
qq_4557608515 小时前
docker - 镜像、存储卷和网络深入理解
运维·docker·容器
掌心向暖RPA自动化15 小时前
用影刀RPA获取公呺搜索关键词文章数据,如何判断文章条目元素是否在可视区域?| 文章列表的循环点击方案拆解
经验分享·自动化·新媒体运营·rpa·影刀rpa