SpringBoot + 自建GitLab + Jenkins + CentOS Stream 9 来实现自动化部署

发布于:2025-06-12 ⋅ 阅读:(274) ⋅ 点赞:(0)

人越懒,工具就要越先进,自动部署也从,纯人工 到半自动化 到全自动化的 进步

SpringBoot + 自建GitLab + Jenkins + CentOS Stream 9 的自动化部署完整方案,
结合实践经验和避坑指南:


🚀 一、环境准备(CentOS Stream 9)

  1. 系统配置

    # 关闭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
    
  2. 依赖安装

    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:latest
    container_name: gitlab
    restart: always
    environment:
      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安装)

  1. 安装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
    
  2. 修改配置

    # 调整端口和JDK路径
    sudo vi /usr/lib/systemd/system/jenkins.service
    

    修改以下参数:

    Environment="JENKINS_PORT=6000"  # 避免与GitLab冲突
    Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk"
    
  3. 安装插件
    访问 http://<IP>:6000,解锁后安装:

    • GitLab、Git、Pipeline、SSH Pipeline Steps

🔗 四、GitLab-Jenkins联动配置

  1. Jenkins连接GitLab

    • 系统管理 → GitLab配置
      • GitLab URL:http://<IP>:8888
      • API Token:从GitLab 用户设置 → Access Tokens 生成
    • 凭据配置:添加GitLab账号密码或SSH密钥
  2. GitLab添加Webhook

    • 项目设置 → Webhooks:
      • URL: http://<Jenkins_IP>:6000/project/<任务名>
      • 触发事件:Push eventsMerge request events
  3. Pipeline脚本示例

    pipeline {
      agent any
      stages {
        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专属配置

  1. 重启脚本restart.sh

    #!/bin/bash
    APP_NAME="demo.jar"
    PID=$(ps -ef | grep $APP_NAME | grep -v grep | awk '{print $2}')
    if [ -n "$PID" ]; then
      kill -9 $PID
    fi
    nohup java -jar /opt/app/$APP_NAME > app.log 2>&1 &
    
  2. 解决Jenkins杀进程问题
    在Jenkins任务的Environment Options中添加:

    BUILD_ID=dontKillMe
    

🔍 六、全流程验证

  1. 提交代码触发构建

    git push origin main  # 自动触发Jenkins流水线
    
  2. 检查部署结果

    # 查看目标服务器日志
    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

网站公告

今日签到

点亮在社区的每一天
去签到