2026/2/22 1:04:28
网站建设
项目流程
适合做网站的软件有哪些,做直播网站找哪个网站好,wordpress+采集小说,wordpress 动态主题下载CICD#xff08;持续集成/持续部署#xff09;是提升研发效率、保障代码质量的核心实践。本文将基于Docker容器化技术#xff0c;通过两台物理机/虚拟机搭建完整的CICD流水线#xff0c;实现若依(RuoYi-Vue)前后端分离项目的自动化构建、测试与部署。全程步骤详细、解析透彻…CICD持续集成/持续部署是提升研发效率、保障代码质量的核心实践。本文将基于Docker容器化技术通过两台物理机/虚拟机搭建完整的CICD流水线实现若依(RuoYi-Vue)前后端分离项目的自动化构建、测试与部署。全程步骤详细、解析透彻适合DevOps入门者和企业级项目实践参考。一、整体架构与环境规划1.1 核心技术栈容器化Docker 20.10.18代码管理GitLab 10.7.5持续集成Jenkins 2.480数据库MySQL 8.0.39缓存Redis 7.4.1项目RuoYi-VueSpring BootVue前后端分离反向代理Nginx 1.26.21.2 两台主机角色分配主机IP配置要求部署服务清单核心作用192.168.10.132C 8GJenkins、MySQL、Redis、Nginx、Spring Boot后端构建节点应用运行环境192.168.10.801C 4GGitLab、Docker代码仓库版本控制中心1.3 核心流程说明开发者提交代码到GitLab仓库GitLab通过WebHook触发Jenkins构建Jenkins拉取代码执行自动化构建编译、打包构建产物生成Docker镜像推送至本地镜像仓库Jenkins部署镜像到目标主机自动启动服务部署结果实时通知本文以日志反馈为例二、前置条件两台主机统一安装Docker所有服务均基于Docker部署需先在两台主机完成Docker环境初始化步骤完全一致。2.1 安装Docker依赖包# 安装yum工具集和存储依赖yuminstall-yyum-utils device-mapper-persistent-data lvm22.2 配置阿里云Docker镜像源默认官方镜像源下载速度较慢替换为阿里云镜像源提升效率yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo2.3 安装指定版本Docker并设置开机自启# 安装Docker-CE 20.10.18稳定版yuminstall-ydocker-ce-20.10.18 docker-ce-cli-20.10.18 containerd.io# 启动Docker服务systemctl start docker.service# 设置开机自动启动systemctlenabledocker.service2.4 配置华为镜像加速器关键优化进一步提升Docker镜像下载速度配置华为云加速器# 创建Docker配置目录mkdir-p/etc/docker# 写入加速器配置tee/etc/docker/daemon.json-EOF { registry-mirrors: [https://0a40cefd360026b40f39c00627fa6f20.mirror.swr.myhuaweicloud.com] } EOF# 重启Docker使配置生效systemctl daemon-reload systemctl restartdocker2.5 验证Docker安装成功docker--version# 输出Docker版本信息即成功三、主机192.168.10.80部署GitLab代码仓库GitLab用于存储项目源代码、管理分支和触发CICD流水线是整个流程的代码入口。3.1 下载GitLab镜像dockerpull beginor/gitlab-ce# 社区版镜像轻量且满足需求3.2 创建数据卷挂载目录核心步骤为避免容器删除导致配置、数据和日志丢失需将GitLab关键目录挂载到宿主机# 创建挂载目录mkdir-p/data/gitlab/etc /data/gitlab/log /data/gitlab/data# 授予目录最高权限避免容器访问权限不足chmod777/data/gitlab/etc /data/gitlab/log /data/gitlab/data3.3 启动GitLab容器dockerrun-itd\--namegitlab\--restartalways\# 容器异常自动重启--privilegedtrue\# 授予容器特权避免文件权限问题-p8443:443\# HTTPS端口映射-p80:80\# HTTP端口映射-p222:22\# SSH端口映射避免与宿主机22端口冲突-v/data/gitlab/etc:/etc/gitlab\# 配置文件挂载-v/data/gitlab/log:/var/log/gitlab\# 日志挂载-v/data/gitlab/data:/var/opt/gitlab\# 数据挂载beginor/gitlab-ce3.4 配置GitLab访问地址与SSH端口容器启动后需修改配置文件指定访问地址否则无法正常访问# 1. 修改外部访问地址GitLab Web界面地址sed-i/external_url GENERATED_EXTERNAL_URL/a external_url\thttp://192.168.10.80 /data/gitlab/etc/gitlab.rb# 2. 修改SSH连接主机与Web地址一致sed-i/gitlab_ssh_host/a gitlab_rails[gitlab_ssh_host] 192.168.10.80 /data/gitlab/etc/gitlab.rb# 3. 修改SSH连接端口与容器映射的222端口一致sed-i/gitlab_shell_ssh_port/a gitlab_rails[gitlab_shell_ssh_port] 222/data/gitlab/etc/gitlab.rb# 重启GitLab使配置生效dockerrestart gitlab3.5 初始化GitLab管理员账号访问GitLab Web界面浏览器输入http://192.168.10.80首次启动需等待3-5分钟初始化root密码首次登录会提示设置密码本文设置为1qazWSX登录使用用户名root 新设密码登录3.6 配置SSH密钥免密拉取代码为了让Jenkins和本地开发机免密拉取GitLab代码需配置SSH密钥# 在GitLab宿主机或开发机生成SSH密钥以GitLab宿主机为例ssh-keygen# 一路回车无需设置密码# 查看公钥内容cat~/.ssh/id_rsa.pub将输出的公钥复制到GitLab Web界面登录GitLab → 右上角头像 → Settings → SSH Keys粘贴公钥设置标题如Jenkins访问密钥点击Add Key3.7 上传若依项目到GitLab3.7.1 下载若依源码# 本地开发机Windows需安装Git BashLinux需安装gitgitclone https://gitee.com/y_project/RuoYi-Vue.git3.7.2 在GitLab创建项目登录GitLab → New Project → 项目名称ruoyi-server后端、ruoyi-ui前端可见等级选择私有仅团队成员可访问点击Create project3.7.3 推送代码到GitLab# 进入若依项目根目录cdRuoYi-Vue# 初始化本地Git仓库gitinit# 关联GitLab后端项目远程仓库gitremoteaddorigin ssh://git192.168.10.80:222/root/ruoyi-server.git 如果已经存在则gitremote set-url origin ssh://git192.168.10.80:222/root/ruoyi-server.git# 添加所有文件到暂存区gitadd.# 提交代码gitcommit-mInitial commit: 若依后端项目初始化# 推送到GitLab master分支gitpush-uorigin master## 四、主机192.168.10.13部署Jenkins持续集成工具Jenkins是CICD流水线的核心负责拉取代码、构建打包、部署发布等自动化操作。由于若依项目需要JDK、Maven、Node.js环境需对Jenkins镜像二次打包。### 4.1 准备Jenkins二次打包资源#### 4.1.1 创建工作目录bashmkdir-p/data/jenkinscd/data/jenkins4.1.2 下载依赖包JDK、Maven、Node.js将以下包上传到/data/jenkins目录可通过wget或本地传输JDKjdk-8u421-linux-x64.tar.gz若依后端需JDK8Mavenapache-maven-3.9.9-bin.tar.gz构建Java项目Node.jsnode-v11.0.0-linux-x64.tar.gz构建Vue前端4.1.3 配置Maven settings.xml3.8.x以上Maven默认不支持HTTP仓库需自定义配置文件teesettings.xml-EOF ?xml version1.0 encodingUTF-8? settings xmlnshttp://maven.apache.org/SETTINGS/1.2.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd /settings EOF4.2 编写Dockerfile二次打包Jenkins# 基础镜像Jenkins 2.480 JDK21后续手动配置JDK8 FROM jenkins/jenkins:2.480-jdk21 # 暴露Jenkins默认端口 EXPOSE 8080 # 复制并自动解压JDK、Maven、Node.js到容器 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 # 覆盖Maven配置文件 ADD settings.xml /usr/local/apache-maven-3.9.9/conf/ # 配置环境变量时区、Maven、Node.js ENV TZAsia/Shanghai ENV M2_HOME/usr/local/apache-maven-3.9.9 ENV NODE_HOME/usr/local/node-v11.0.0-linux-x64 ENV PATH$M2_HOME/bin:$NODE_HOME/bin:$PATH4.3 构建自定义Jenkins镜像# 创建Jenkins数据目录并授权mkdirjenkins_homechmod777 jenkins_home# 构建镜像镜像名jenkinsdockerbuild-tjenkins.# 授予Docker sock权限Jenkins需调用宿主机Docker命令chmod777 /var/run/docker.sock4.4 启动Jenkins容器dockerrun-d\--namejenkins\-p8080:8080\# Jenkins Web端口-v/data/jenkins/jenkins_home:/var/jenkins_home\# 数据挂载-v/etc/localtime:/etc/localtime\# 同步宿主机时区-v/run/docker.sock:/run/docker.sock\# 挂载Docker sock-v/usr/bin/docker:/usr/bin/docker\# 挂载Docker命令jenkins4.5 初始化Jenkins4.5.1 获取初始管理员密码dockerexecjenkinscat/var/jenkins_home/secrets/initialAdminPassword输出类似a07829a8375a47f7b6e516ca2f0bad1f的密码用于首次登录。4.5.2 登录并安装插件访问Jenkins Web界面http://192.168.10.13:8080输入初始密码 → 选择安装推荐插件包含Git、Pipeline等核心插件安装完成后创建管理员账号本文设置用户名admin密码123456配置Jenkins URL默认http://192.168.10.13:8080直接保存4.5.3 配置JDK环境关键步骤Jenkins二次打包时未配置JDK环境变量需手动配置进入Jenkins → 系统管理 → 全局工具配置 → JDK点击新增JDK取消自动安装名称填写jdk8后续Jenkinsfile需引用JAVA_HOME填写/usr/local/jdk1.8.0_421容器内JDK实际路径点击保存4.5.4 安装GitLab插件为了让Jenkins接收GitLab的WebHook触发需安装GitLab插件系统管理 → 插件管理 → 可选插件搜索GitLab → 勾选安装 → 重启Jenkins五、主机192.168.10.13部署MySQL与Redis若依项目依赖MySQL数据库和Redis缓存需在应用主机部署这两个服务。5.1 部署MySQL 8.0.39dockerrun-d\--namemysql\-p3306:3306\# 数据库端口映射-eMYSQL_ROOT_PASSWORD123456\# root密码--restartalways\mysql:8.0.395.1.1 创建若依数据库并导入数据# 进入MySQL容器dockerexec-itmysqlbash# 登录MySQLmysql-uroot-p123456# 创建数据库若依默认数据库名ry-vuecreate database ry-vue;# 使用数据库use ry-vue;# 导入若依SQL文件需先将ry_20250522.sql和quartz.sql上传到容器/opt目录source/opt/ry_20250522.sql;source/opt/quartz.sql;# 验证导入成功查看表结构show tables;5.2 部署Redis 7.4.1dockerrun-d\--nameredis\-p6379:6379\# 缓存端口映射--restartalways\redis:7.4.15.3 验证服务可用性# 查看容器运行状态均为Up状态即正常dockerps|grep-Emysql|redis六、Jenkins实现CICD自动化部署前后端6.1 后端部署ruoyi-server6.1.1 修改若依后端配置文件需修改数据库和Redis连接信息指向主机192.168.10.13的服务本地开发机打开ruoyi-admin/src/main/resources/application-druid.yml修改MySQL配置spring:datasource:url:jdbc:mysql://192.168.10.13:3306/ry-vue?useUnicodetruecharacterEncodingutf-8useSSLfalseserverTimezoneAsia/Shanghaiusername:rootpassword:123456修改Redis配置spring:redis:host:192.168.10.13port:6379password:# 默认为空若有密码需填写提交配置修改到GitLabgitadd.gitcommit-m修改数据库和Redis连接配置gitpush origin master6.1.2 新增后端构建部署文件在若依项目根目录新增3个文件用于Jenkins构建和Docker部署1. Dockerfile构建后端镜像# 基础镜像JDK8若依后端依赖JDK8 FROM openjdk:8u342 # 配置时区 ENV TZAsia/Shanghai # 复制打包后的jar包到容器 ADD ruoyi-admin/target/ruoyi-admin.jar app.jar # 容器启动命令 ENTRYPOINT [java, -jar, app.jar]2. .dockerignore优化构建速度屏蔽不必要的文件减少镜像体积和构建时间.git ruoyi-admin/src ruoyi-admin/target/classes ruoyi-admin/target/generated-sources ruoyi-common ruoyi-framework ruoyi-generator ruoyi-quartz ruoyi-system ruoyi-ui sql3. Jenkinsfile流水线脚本定义CICD构建和部署流程pipeline{agent any// 任意Jenkins节点执行tools{jdkjdk8// 引用之前配置的JDK环境}environment{APP_NAMEruoyi-server// 项目名称APP_PORT9800// 后端服务端口}stages{// 构建阶段编译打包stage(build){steps{script{shmvn clean package -DskipTeststrue// Maven打包跳过测试}}}// 部署阶段构建镜像并启动容器stage(deploy){steps{script{// 停止并删除旧容器和镜像shdocker stop $APP_NAME || trueshdocker rm $APP_NAME || trueshdocker rmi $APP_NAME || true// 构建新镜像shdocker build -t $APP_NAME .// 启动新容器shdocker run -d --name$APP_NAME-p 0.0.0.0:$APP_PORT:$APP_PORT--restartalways$APP_NAME--server.port$APP_PORT}}}}}6.1.3 提交构建文件到GitLabgitadd.dockerignore Dockerfile Jenkinsfilegitcommit-m新增Jenkins构建和Docker部署文件gitpush origin master6.1.4 Jenkins创建后端流水线任务Jenkins → 新建Item → 任务名称ruoyi-server→ 选择流水线 → 确定配置流水线选择Pipeline script from SCM从GitLab拉取JenkinsfileSCM选择Git仓库URLssh://git192.168.10.80:222/root/ruoyi-server.gitGitLab项目SSH地址Credentials添加Jenkins的SSH密钥与GitLab配置的一致分支*/master脚本路径Jenkinsfile项目根目录下的Jenkinsfile路径配置GitLab WebHook触发勾选Build when a change is pushed to GitLab点击Generate生成Secret token后续GitLab配置需用到保存配置6.1.5 GitLab配置WebHook登录GitLab → 进入ruoyi-server项目 → Settings → IntegrationsURL填写http://192.168.10.13:8080/project/ruoyi-serverJenkins项目地址Secret token填写Jenkins生成的令牌触发器选择Push events代码推送时触发构建点击Add webhook → 测试连接显示200即成功6.2 前端部署ruoyi-ui6.2.1 新增前端构建部署文件进入ruoyi-ui目录新增4个文件1. nginx.conf前端反向代理配置server { listen 9801; // 前端访问端口 charset utf-8; # 前端静态资源访问 location / { root /usr/share/nginx/html; try_files $uri $uri/ /index.html; // 解决Vue路由刷新404问题 } # 后端接口代理转发/prod-api请求到后端服务 location /prod-api { rewrite ^/prod-api/(.*)$ /$1 break; proxy_pass http://192.168.10.13:9800; // 后端服务地址 } }2. Dockerfile构建前端镜像# 基础镜像Nginx 1.26.2 FROM nginx:1.26.2 # 解决中文乱码 ENV LC_ALLC.UTF-8 # 删除默认Nginx配置 RUN rm -rf /etc/nginx/conf.d/default.conf # 复制自定义Nginx配置 ADD nginx.conf /etc/nginx/conf.d # 复制前端打包后的dist目录到Nginx静态资源目录 COPY dist/ /usr/share/nginx/html/3. .dockerignore优化构建node_modules src4. Jenkinsfile前端流水线脚本pipeline{agent any environment{APP_NAMEruoyi-ui// 前端项目名称APP_PORT9801// 前端访问端口}stages{// 构建阶段安装依赖并打包stage(build){steps{script{shnpm install// 安装Node依赖shnpm run build:prod// 打包生产环境版本}}}// 部署阶段构建镜像并启动容器stage(deploy){steps{script{shdocker stop $APP_NAME || trueshdocker rm $APP_NAME || trueshdocker rmi $APP_NAME || trueshdocker build -t $APP_NAME .shdocker run -d --name$APP_NAME-p 0.0.0.0:$APP_PORT:$APP_PORT--restartalways$APP_NAME}}}}}6.2.2 提交文件到GitLab并配置Jenkins提交前端构建文件到GitLab步骤同后端Jenkins新建ruoyi-ui流水线任务配置同后端仓库URL改为前端项目地址GitLab配置前端项目WebHook步骤同后端七、测试CICD流水线7.1 手动触发构建进入Jenkins → 选择ruoyi-server→ 点击立即构建查看构建日志点击构建记录 → Console Output显示Finished: SUCCESS即构建成功同理触发ruoyi-ui构建7.2 自动触发构建验证WebHook本地开发机修改若依项目代码如修改前端页面标题提交并推送代码到GitLabgitadd.gitcommit-m测试WebHook自动构建gitpush origin master观察Jenkins自动触发对应项目构建无需手动操作7.3 访问若依项目前端访问http://192.168.10.13:9801输入用户名admin密码admin123后端接口http://192.168.10.13:9800/prod-api/system/index返回JSON即正常八、常见问题排查Jenkins无法拉取GitLab代码检查SSH密钥是否配置正确Jenkins容器内是否生成known_hosts文件可通过ssh-keyscan -p 222 192.168.10.80 ~/.ssh/known_hosts生成Maven打包失败检查Maven配置文件是否正确依赖是否能正常下载Docker构建镜像失败检查Dockerfile路径是否正确.dockerignore文件是否屏蔽必要文件前端访问后端接口404检查Nginx配置中的proxy_pass是否指向正确的后端地址九、总结本文基于两台主机搭建了完整的DockerCICD流水线实现了若依项目的自动化构建、测试和部署。核心优势在于容器化部署所有服务隔离运行环境一致性强迁移方便自动化流水线代码提交后自动触发构建部署减少人工操作架构清晰两台主机分工明确兼顾性能和稳定性