SpringBoot + 自建GitLab + Jenkins + CentOS Stream 9 来实现自动化部署
人越懒,工具就要越先进,自动部署也从,纯人工 到半自动化 到全自动化的 进步
SpringBoot + 自建GitLab + Jenkins + CentOS Stream 9 的自动化部署完整方案,
结合实践经验和避坑指南:
🚀 一、环境准备(CentOS Stream 9)
-
系统配置
# 关闭SELinux(避免权限冲突) sudo setenforce 0 sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config# 防火墙放行端口 sudo firewall-cmd --permanent --add-port={8080,8888,22,443}/tcp sudo firewall-cmd --reload
-
依赖安装
sudo dnf install -y git java-17-openjdk-devel docker docker-compose sudo systemctl enable --now docker
⚙️ 二、自建GitLab部署(Docker版)
# docker-compose.yml
version: '3'
services:gitlab:image: gitlab/gitlab-ce:latestcontainer_name: gitlabrestart: alwaysenvironment:GITLAB_OMNIBUS_CONFIG: |external_url 'http://<服务器IP>:8888'gitlab_rails['gitlab_shell_ssh_port'] = 2222 # 避免与宿主机SSH冲突ports:- "8888:8888"- "443:443"- "2222:22" # 映射容器SSH端口volumes:- ./gitlab/config:/etc/gitlab- ./gitlab/logs:/var/log/gitlab- ./gitlab/data:/var/opt/gitlab
docker-compose up -d
# 查看初始密码
sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
避坑指南:
- 若访问
http://IP:8888
报502,等待3分钟(初始化较慢)- 修改SSH端口后,克隆地址格式:
ssh://git@IP:2222/username/project.git
🛠️ 三、Jenkins部署(rpm安装)
-
安装Jenkins
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key sudo dnf install jenkins sudo systemctl enable --now jenkins
-
修改配置
# 调整端口和JDK路径 sudo vi /usr/lib/systemd/system/jenkins.service
修改以下参数:
Environment="JENKINS_PORT=6000" # 避免与GitLab冲突 Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk"
-
安装插件
访问http://<IP>:6000
,解锁后安装:- GitLab、Git、Pipeline、SSH Pipeline Steps
🔗 四、GitLab-Jenkins联动配置
-
Jenkins连接GitLab
- 系统管理 → GitLab配置:
- GitLab URL:
http://<IP>:8888
- API Token:从GitLab
用户设置 → Access Tokens
生成
- GitLab URL:
- 凭据配置:添加GitLab账号密码或SSH密钥
- 系统管理 → GitLab配置:
-
GitLab添加Webhook
- 项目设置 → Webhooks:
- URL:
http://<Jenkins_IP>:6000/project/<任务名>
- 触发事件:
Push events
和Merge request events
- URL:
- 项目设置 → Webhooks:
-
Pipeline脚本示例
pipeline {agent anystages {stage('拉取代码') {steps {git credentialsId: 'gitlab-key', url: 'http://<IP>:8888/root/springboot-demo.git'}}stage('Maven构建') {steps {sh 'mvn clean package -DskipTests'}}stage('部署') {steps {sshPublisher(publishers: [sshPublisherDesc(configName: 'prod-server', // 预先配置的SSH服务器transfers: [sshTransfer(sourceFiles: 'target/*.jar',removePrefix: 'target',remoteDirectory: '/opt/app',execCommand: 'cd /opt/app && ./restart.sh')])])}}} }
⚠️ 五、SpringBoot专属配置
-
重启脚本
restart.sh
#!/bin/bash APP_NAME="demo.jar" PID=$(ps -ef | grep $APP_NAME | grep -v grep | awk '{print $2}') if [ -n "$PID" ]; thenkill -9 $PID fi nohup java -jar /opt/app/$APP_NAME > app.log 2>&1 &
-
解决Jenkins杀进程问题
在Jenkins任务的Environment Options
中添加:BUILD_ID=dontKillMe
🔍 六、全流程验证
-
提交代码触发构建
git push origin main # 自动触发Jenkins流水线
-
检查部署结果
# 查看目标服务器日志 ssh user@prod-server "tail -f /opt/app/app.log"
🧩 附:避坑总结
问题现象 | 原因 | 解决方案 |
---|---|---|
GitLab SSH克隆超时 | 防火墙或端口映射错误 | 检查firewall-cmd --list-ports 和docker端口映射 |
Jenkins构建后进程被终止 | Jenkins默认清理子进程 | 添加BUILD_ID=dontKillMe |
Webhook触发失败 | Jenkins反代或网络隔离 | 关闭GitLab防火墙或使用Nginx反代 |
Docker内GitLab启动慢 | 服务器资源不足 | 分配≥4GB内存,或调整/etc/gitlab/gitlab.rb 中的unicorn['worker_processes'] = 2 |
本方案已验证环境:
- CentOS Stream 9 x86_64
- Jenkins 2.485 + GitLab CE 16.10
- SpringBoot 3.1.0 + OpenJDK 17