docker-CICD

三、Jenkins部署与配置

环境准备内下载

复制代码
下载地址  maven

https://dlcdn.apache.org/maven/maven-3/3.9.12/binaries/apache-maven-3.9.12-bin.tar.gz

https://maven.apache.org/download.cgi

1、jenkins镜像制作并且合并jdk、node和maven

1.1 拉取jenkins 镜像

复制代码
docker pull jenkins/jenkins:2.480-jdk21

1.2 创建一个文件夹准备 jenkins二次打包

主要打包 jdk node maven

创建一个文件夹 用于二次打包 然后切换进去

复制代码
mkdir -p /data/jenkins
cd /data/jenkins

1.3 准备jdk、maven、node包

提前准备好jdk、maven、node,并放到/data/jenkins下

复制代码
/data/jenkinsapache-maven-3.9.9-bin.tar.gz /usr/local
jdk-8u421-linux-x64.tar.gz /usr/local
node-v11.0.0-linux-x64.tar.gz /usr/local

在添加一个mavan settings.xml 放在 /data/jenkins

(由于3.8.x以上版本的maven只支持https协议,我们需要覆盖原有的settings.xml,让它支持http)

准备settings.xml,文件内容如下

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
</settings>

1.4 新建Dockerfile 准备制作镜像

我们需要将镜像进行二次打包,把我们所需要的东西都加进去,新建Dockerfile

复制代码
FROM jenkins/jenkins:2.480-jdk21
EXPOSE 8080
 
# 将maven和jdk添加到容器中
# tar.gz添加进去后会自动解压,无需手动解压
ADD apache-maven-3.9.9-bin.tar.gz /usr/local
ADD jdk-8u421-linux-x64.tar.gz /usr/local
ADD node-v11.0.0-linux-x64.tar.gz /usr/local
 
# 覆盖容器里的settings.xml
ADD settings.xml /usr/local/apache-maven-3.9.9/conf/
 
# 配置环境变量
ENV TZ=Asia/Shanghai
ENV M2_HOME=/usr/local/apache-maven-3.9.9
ENV NODE_HOME=/usr/local/node-v11.0.0-linux-x64
 
# 配置maven、node的环境变量
# jdk环境变量不可在这里配,会影响jenkins的运行
ENV PATH=$M2_HOME/bin:$NODE_HOME/bin:$PATH

在/data/jenkins 下创建好jenkins_home,并授予最高权限

复制代码
mkdir jenkins_home
chmod +777 jenkins_home

现在/data/jenkins下就会有这么几个文件

进行二次打包

复制代码
docker build -t jenkins .

1.5 验证

这里注意下 由于后期需要jenkins 调用docker 所以 授予docker.sock权限,因为一会儿进入jenkins容器的时候要用docker命令

复制代码
chmod +777 /var/run/docker.sock=

2 、Jeskins 运行 与 安装

2.1 Jenkins 运行启动

复制代码
docker run -d --name jenkins \
-p 0.0.0.0:8080:8080 \
-v /data/jenkins/jenkins_home:/var/jenkins_home \
-v /etc/localtime:/etc/localtime \
-v /run/docker.sock:/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
jenkins

2.2 访问 jenkins的首页

等待一两分钟,访问访问你的ip地址:8080即可看到jenkins的首页

安装推荐插件

等待

使用admin账户继续 点击保存完成

默认即可

安装完成 点击开始使用

进入Jenkins后要先修改密码,否则之后就进不去了 右上角,进入Security

修改成你想要的密码

登录用户名admin 密码 123456

还记得刚刚Dockerfile,我们并没有配置jdk的环境变量,所以这边要手动配置一下 进入工具配置

配置jdk的安装目录 bisheng-jdk1.8.0_412

2.3 开始测试

2.3.1 新建一个项目

2.3.2 创建流水线

任务名称随便填(test),选择流水线

确定之后会进入项目的配置,我们找到流水线,输入测试脚本,保存

测试脚本如下:

复制代码
这是一段 **Jenkins Declarative Pipeline(声明式流水线) 脚本,用来验证构建环境是否配置正确。逐行简单说明如下:
1️⃣ pipeline { ... }    #定义一个 Jenkins 流水线任务。
2️⃣ agent any       #表示该流水线可以在任意可用的 Jenkins 节点(agent) 上运行。
3️⃣ tools { jdk 'jdk8' }    #指定流水线使用 Jenkins 中已配置好的 JDK,名称叫 jdk8。执行时会自动把该 JDK 加入环境变量(如 JAVA_HOME)。
4️⃣ stages { ... }  #流水线的阶段定义区域。
5️⃣ stage('test')   #定义一个阶段,名称为test,通常用于环境测试或验证。
6️⃣ steps { ... }   #该阶段中要执行的具体步骤。
7️⃣ script { ... }    #使用 Groovy 脚本块,允许执行更灵活的逻辑。
8️⃣ sh """ ... """    #在 Linux / Unix 环境下执行 Shell 命令:

docker -v   # 查看 Docker 是否安装及版本
java -version  # 查看 Java 版本(是否为 jdk8)
mvn -v     # 查看 Maven 是否安装及版本
node -v    # 查看 Node.js 版本
npm -v     # 查看 npm 版本
>该 Jenkins Pipeline 用于在构建节点上,测试 Docker、Java(JDK8)、Maven、Node.js 和 npm 是否已正确安装并可用,通常作为流水线环境检查阶段。
====================================================================================================

pipeline {
    agent any
    tools {
        // 刚刚配置jdk的名称
        jdk 'jdk8'
    }
    stages {
        stage('test') {
            steps {
                script {
                    sh """
                        docker -v
                        java -version
                        mvn -v
                        node -v
                        npm -v
                    """
                }
            }
        }
    }
}

2.3.3 测试 点击立即构建

四、Mysql部署与数据迁移

4.1 mysql安装

注意:在192.168.10.13上部署

复制代码
docker run -d \
--name mysql \
-p 0.0.0.0:3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
--restart=always \
mysql:8.0.39

4.2 创建若依数据库

如果不知道创建什么库可以在配置文件中查看

创建数据库 ry-vue

4.3 若依数据库导入

复制代码
mysql> use ry-vue
Database changed

mysql> source /opt/ry_20250522.sql
mysql> source /opt/quartz.sql

导入后验证

五、redis部署

复制代码
docker run -d \
--name redis \
-p 0.0.0.0:6379:6379 \
--restart=always \
redis:7.4.1

验证测试

六、Jenkins实现CICD持续集成(前后端)

6.1 安装gitlab插件

如果想实现代码提交自动部署,需要安装gitlab插件进入系统管理,插件管理

安装成功即可,无需重启

6.2 部署后端

说明

1、拉取项目: 拉取若依项目,我们拉取的是若依项目的前后端分离(分成两个)

2、将这两个sql文件导入到数据库中(前面安装数据库的时候已做)

6.2.1 修改后端配置文件

① 修改后端连接mysql

到ruoyi-admin/src/main/resources/application-druid.yml中修改数据库的连接信息

② 修改redis的连接信息

到ruoyi-admin/src/main/resources/application-druid.yml中修改数据库的连接信息

③ 这边可以使用推送方式修改
复制代码
$ git status        #查看状态
On branch master
Your branch is up-to-date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   ruoyi-admin/src/main/resources/application-druid.yml
        modified:   ruoyi-admin/src/main/resources/application.yml

no changes added to commit (use "git add" and/or "git commit -a")


$ git add .  #添加缓存


$ git commit -m "xiu gai pei zhi"     #提交
[master 9838c2d2] xiu gai pei zhi
 2 files changed, 3 insertions(+), 3 deletions(-)


$ git push origin master       上传
Counting objects: 8, done.
Delta compression using up to 12 threads.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (8/8), 666 bytes | 666.00 KiB/s, done.
Total 8 (delta 4), reused 0 (delta 0)
To http://192.168.10.80/root/ruoyi-server.git
   5e83011d..9838c2d2  master -> master

6.2.2 创建若依后端镜像

根目录新建Dockerfile

复制代码
# 若依需要用jdk8来运行
FROM openjdk:8u342
# 解决时区问题
ENV TZ=Asia/Shanghai
# 将jar包添加到容器中
ADD ruoyi-admin/target/ruoyi-admin.jar app.jar
# 运行容器时应该执行的命令
ENTRYPOINT ["java", "-jar", "app.jar"]

6.2.3 编辑 Jenkinsfile 若依

复制代码
pipeline {
    // 任意节点都可以执行Jenkins流水线
    agent any
    tools {
        // 刚刚配置的java环境
        jdk 'jdk8'
    }
    // 环境变量
    environment {
        // 项目名称
        APP_NAME = 'ruoyi-server'
        // 端口
        APP_PORT = 9800
    }
    // 流水线阶段
    stages {
        // 构建阶段
        stage('build') {
            // 步骤
            steps {
                // 可以写流水线脚本,groovy语法
                script {
                    // 执行shell命令
                    sh 'mvn clean package -DskipTests=true'
                }
            }
        }
        // 部署阶段
        stage('deploy') {
            steps {
                script {
                    sh """
                        docker stop $APP_NAME || true
                        docker rm $APP_NAME || true
                        docker rmi $APP_NAME || true
                        docker build -t $APP_NAME .
                        docker run -d --name $APP_NAME \
                        -p 0.0.0.0:$APP_PORT:$APP_PORT \
                        --restart=always \
                        $APP_NAME \
                        --server.port=$APP_PORT
                    """
                }
            }
        }
    }
}

6.2.4 建立jenkins docker 构建速度

复制代码
根目录新建.dockerignore。这个是为了提高docker的构建速度,把不必要的文件屏蔽起来
.git
ruoyi-admin/src
ruoyi-admin/target/classes
ruoyi-admin/target/generated-sources
ruoyi-admin/target/maven-archiver
ruoyi-admin/target/maven-status
ruoyi-common
ruoyi-framework
ruoyi-generator
ruoyi-quartz
ruoyi-system
ruoyi-ui
sql

6.2.5 将项目提交到gitlab

复制代码
$ git add .

$ git commit -m "docker peizhi"
[master dcea5491] docker peizhi
 3 files changed, 68 insertions(+)
 create mode 100644 .dockerignore
 create mode 100644 Dockerfile
 create mode 100644 Jenkinsfile


$ git push origin master
Counting objects: 5, done.
Delta compression using up to 12 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 1.16 KiB | 1.16 MiB/s, done.
Total 5 (delta 1), reused 0 (delta 0)
To http://192.168.10.80/root/ruoyi-server.git
   9838c2d2..dcea5491  master -> master

6.2.6 Jenkins中新建后端任务

名称随便填(ruoyi-server),选

择流水线,确定

找到流水线,选择scm

点击gitlab

然后把ssh地址复制进去,不出意外的话,会出现无法连接仓库,原因是Jenkins无法拉取gitlab的代码

我们到Jenkins容器中

复制代码
#我们到Jenkins容器中
[root@localhost sql]# docker exec -it jenkins bash
jenkins@2e648c7b5dff:/$ ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/var/jenkins_home/.ssh/id_rsa): 
Created directory '/var/jenkins_home/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /var/jenkins_home/.ssh/id_rsa
Your public key has been saved in /var/jenkins_home/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:wEZ7T2uxhEgoUrB28ABQzMZ6YDZTCeP21cO0K+OiX+E jenkins@2e648c7b5dff
The key's randomart image is:
+---[RSA 3072]----+
|*%=...o.         |
|+*@..++o..       |
|+Oo+ .*=o +      |
|+ + .. oo+ +     |
| . . + .S =      |
|    o +  .       |
|   . E           |
|  . o            |
| ...             |
+----[SHA256]-----+
jenkins@2e648c7b5dff:/$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCc0degeP/hKtmZgiH/Ef3pkR4JqxB1xVtu/zGn50+nSmdadF59mxVXh3xL1S6poqZCQWUq1xYT1vD/SIgaj9fG2JJcQiw36OxUYLzZlXDKfNL2R17R9QDvC6Szl6NurEHoqCTOk5Xu+HWQuVo0YGxK//5RFcITzJNOqcM4dZOuMwwmoCseCU2j3wYdRuiCACUTEp2qYKw6jfowPn/jzsSYw18Vp1KrOdeGJ/whXceUP6+0u/gD9sAe9rhceNAQeLqwyjc+loQs5Qd+kmXOU7ymYC2+hoDJUDxuv2cF4xttL09j4aA50eJRmm/JGGpSrups0fj7dgmd4A9qHTNNaoHObHTByIgL+D0TkGxeMo5gBimNJ6L0+HJ9ZrtaqvJ6qsnWsecTfp1TbxCm6R+nNlEgDDZQEESJLqNyjhG05NxuZbpWgMFGj2lFKQ+ITXW2JSWXybbRZzQqbPeGDc6/ywqecKAUOttJBZKc1y31XuWdJFXAwJyYcyVOkFmii3b10Xc= jenkins@2e648c7b5dff

将公钥配置到gitlab中

进行一次ssh通信,然后将信息保存下来

这步仍然是在jenkins容器中操作的

复制代码
# 192.168.10.182是gitlab的地址,222是gitlab的ssh端口
jenkins@b1e5abd55b5c:/$ ssh-keyscan -p 222 192.168.10.182 >> ~/.ssh/known_hosts
# 192.168.10.182:222 SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.4
# 192.168.10.182:222 SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.4
# 192.168.10.182:222 SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.4
# 192.168.10.182:222 SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.4
# 192.168.10.182:222 SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.4

查看一下.ssh目录下的文件

复制代码
ls -l ~/.ssh

如果有这3个文件,就说明Jenkins可以拉取gitlab的代码了

下一步,找到这个,把它勾上

展示高级

找到Secret token,点击Generate生成,就会生成一串token,这串token一会儿到gitlab中会用上

我们到gitlab中Settings中有一个Webhooks 填写相关信息

立即构建

6.3 部署前端

RuoYi-Vue\ruoyi-ui 下创建

6.3.1 在ruoyi-ui项目下 添加dockerfile与配置

① 添加nginx.conf,真实的后端地址根据实际情况修改
复制代码
复制代码
server {
    # 前端访问端口
    listen 9801;
    charset utf-8;
    # 前端
    location / {
        # 前端页面路径
        root /usr/share/nginx/html;
        # 尝试着从$uri寻找静态资源,找不到就到$uri/找,如果还是找不到就找/index.html
        try_files $uri $uri/ /index.html;
    }
 
    # 后端
    location /prod-api {
        # 去掉/prot-api开头
        rewrite ^/prod-api/(.*)$ /$1 break;
        # 真实的后端地址,根据实际情况修改
        proxy_pass http://192.168.10.13:9800;
    }
}
复制代码
② 添加Dockerfile
复制代码

使用nginx镜像来部署

FROM nginx:1.26.2

解决文件名乱码问题

ENV LC_ALL=C.UTF-8

删除默认的配置文件

RUN rm -rf /etc/nginx/conf.d/default.conf

将nginx配置文件添加到容器

ADD nginx.conf /etc/nginx/conf.d

前端打包后,将dist下的文件复制到容器里

COPY dist/ /usr/share/nginx/html/

复制代码
③ 添加.dockerignore
复制代码
node_modules
src
④ 添加Jenkinsfile
复制代码
pipeline {
    agent any
    environment {
        // 项目名称
        APP_NAME = 'ruiyi-ui'
        // 端口
        APP_PORT = 9801
    }
    stages {
        stage('build') {
            steps {
                script {
                    // 进行打包
                    sh """
                        npm install
                        npm run build:prod
                    """
                }
            }
        }
        stage('deploy') {
            steps {
                script {
                    sh """
                        docker stop $APP_NAME || true
                        docker rm $APP_NAME || true
                        docker rmi $APP_NAME || true
                        docker build -t $APP_NAME .
                        docker run -d --name $APP_NAME \
                        -p 0.0.0.0:$APP_PORT:$APP_PORT \
                        --restart=always \
                        $APP_NAME
                    """
                }
            }
        }
    }
}
⑤ 重新建立ruoyi-ui前端

先建立仓库ruoyi-ui

复制代码
$ git remote add origin http://192.168.10.180/root/ruoyi-ui.git
git add .
git commit -m "Initial commit"
git push -u origin mastergit init
Reinitialized existing Git repository in E:/java-项目/docker-cicd-若依/全部合成项目/RuoYi-Vue/ruoyi-ui/.git/


$ git remote add origin http://192.168.10.80/root/ruoyi-ui.git


$ git add .


$ git commit -m "Initial commit"
[master (root-commit) a0ef41d] Initial commit
 298 files changed, 26540 insertions(+)
 create mode 100644 .dockerignore
 create mode 100644 .editorconfig
 create mode 100644 .env.development
 create mode 100644 .env.production
 create mode 100644 .env.staging


$ git push -u origin master
Counting objects: 391, done.
Delta compression using up to 12 threads.
Compressing objects: 100% (340/340), done.
Writing objects: 100% (391/391), 1.25 MiB | 4.38 MiB/s, done.
Total 391 (delta 23), reused 0 (delta 0)
remote: Resolving deltas: 100% (23/23), done.
To http://192.168.10.80/root/ruoyi-ui.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

linux 下操作

复制代码
[root@ruoyi-ui]# ls -a
.   babel.config.js  build       .dockerignore  .env.development  .env.staging  Jenkinsfile  package.json  README.md  vue.config.js
..  bin              Dockerfile  .editorconfig  .env.production   .gitignore    nginx.conf   public        src
[root@ ruoyi-ui]# git config --global user.name "Administrator"
[root@ ruoyi-ui]# git config --global user.email "admin@example.com"
[root@ruoyi-ui]# git init       
初始化空的 Git 版本库于 /home/ruoyi/ruoyi-ui/.git/
[root@ ruoyi-ui]# ls -a
.   babel.config.js  build       .dockerignore  .env.development  .env.staging  .gitignore   nginx.conf    public     src
..  bin              Dockerfile  .editorconfig  .env.production   .git          Jenkinsfile  package.json  README.md  vue.config.js
[root@ ruoyi-ui]# git remote add origin ssh://git@192.168.10.80:222/root/ruoyi-ui.git
[root@ ruoyi-ui]# git add .
[root@ ruoyi-ui]# git commit -m "Initial commit"
[master(根提交) 537c85a] Initial commit
 298 files changed, 26540 insertions(+)
 create mode 100644 .dockerignore
 create mode 100644 .editorconfig
 create mode 100644 .env.development
 create mode 100644 .env.production .........
[root@ ruoyi-ui]# git push -u origin master
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

[root@ ruoyi-ui]# git remote -v
origin  ssh://git@192.168.10.80:222/root/ruoyi-ui.git (fetch)
origin  ssh://git@192.168.10.80:222/root/ruoyi-ui.git (push)
修改

[root@ ruoyi-ui]# git remote -v
origin  ssh://git@192.168.10.80:222/root/ruoyi-ui.git (fetch)
origin  ssh://git@192.168.10.80:222/root/ruoyi-ui.git (push)
[root@ ruoyi-ui]# git remote set-url origin http://192.168.10.180/root/ruoyi-ui.git
[root@ ruoyi-ui]# git remote -v
origin  http://192.168.10.180/root/ruoyi-ui.git (fetch)
origin  http://192.168.10.180/root/ruoyi-ui.git (push)


[root@ ruoyi-ui]# git push -u origin master
Username for 'http://192.168.10.180': root
Password for 'http://root@192.168.10.180': 
Counting objects: 391, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (340/340), done.
Writing objects: 100% (391/391), 1.26 MiB | 0 bytes/s, done.
Total 391 (delta 19), reused 0 (delta 0)
remote: Resolving deltas: 100% (19/19), done.
To http://192.168.10.80/root/ruoyi-ui.git
 * [new branch]      master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。

检查一下有没有这几个文件

6.3.2 Jenkins再新建前端ruoyi-ui项目

和刚刚一样,勾上

生成Secret token

结果


生成Secret token

6.4 ruoyi 项目自动化完成

root@ ruoyi-ui\]# git push -u origin master Username for 'http://192.168.10.180': root Password for 'http://root@192.168.10.180': Counting objects: 391, done. Delta compression using up to 2 threads. Compressing objects: 100% (340/340), done. Writing objects: 100% (391/391), 1.26 MiB \| 0 bytes/s, done. Total 391 (delta 19), reused 0 (delta 0) remote: Resolving deltas: 100% (19/19), done. To http://192.168.10.180/root/ruoyi-ui.git * \[new branch\] master -\> master 分支 master 设置为跟踪来自 origin 的远程分支 master。 ## 6.4 ruoyi 项目自动化完成 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e77be2dc342548cfb87347282588406f.png)

相关推荐
虫小宝3 分钟前
导购APP容器化CI/CD流程:Jenkins在返利系统持续部署中的实践
运维·ci/cd·jenkins
眠りたいです3 分钟前
Docker核心技术和实现原理第一部分-Docker镜像制作
运维·docker·容器·集群·镜像·dockerfile
面对疾风叭!哈撒给6 分钟前
Liunx之Docker 安装启动 influxdb2
java·spring cloud·docker
liuc03177 分钟前
docker下安装mysql
mysql·docker·容器
嚣张丶小麦兜7 分钟前
docker的简单应用
前端·docker
IT老胡17 分钟前
Docker入门与实操(1):Docker简介
运维·docker·容器
小锋学长生活大爆炸24 分钟前
【软件】AI Agent:无需电脑的手机自动化助手AutoGLM
运维·人工智能·智能手机·自动化·手机·agent·autoglm
仅此,25 分钟前
docker 方式,postgreSQL18 安装 jieba 分词器扩展
运维·docker·postgresql·容器·中文分词·jieba
南工孙冬梅31 分钟前
Linux中安装配置nfs
linux·运维·php
中科岩创35 分钟前
云南某地光伏站边坡自动化监测服务项目
运维·人工智能·物联网·自动化