GitLab + Jenkins多分支流水线自动化部署

本篇主要讲述在多人协作的开发环境下,一人一分支的使用方法。

一、添加插件

到jenkins的插件管理中心下载GitLab Plugin 和 Multibranch Scan Webhook Trigger 插件

如果搜索不到,可能是已经添加过该插件,可以在左侧菜单installed plugins中查看

二、新建任务

三、配置

按照图中的红框内填写内容

仓库地址,凭证

按图中的红框选择,最后Trigger token是自己填写的,建议使用UUD

四、编写Jenkinsfile文件

Jenkinsfile的位置放在根项目下,如果模块中有应该在Jenkins流水线配置中的脚本路径中配置

Jenkins 声明式流水线主要语法块

Jenkinsfile 是一个文本文件,定义了 Jenkins 流水线的执行逻辑。它通常与代码库一起保存在版本控制系统,Jenkins语法分为两种即声明式流水和编程式,这里使用前者

语法块作用示例备注
pipeline顶层定义块,整个 Jenkinsfile 的根结构pipeline { ... }所有内容必须写在 pipeline {} 中
agent指定在哪个节点(Agent)上运行流水线agent any agent { label 'docker' }支持任意节点、指定标签、自定义 Docker 环境等
environment定义环境变量,供全局或局部使用environment { VAR = 'value' }可用于凭据、配置路径等
options设置流水线的一些可选参数buildDiscarder(logRotator(...)) timeout(...)比如保留构建记录、设置超时等
parameters定义构建参数(如输入分支名)parameters { string(name: 'BRANCH') }可用于动态控制构建逻辑
triggers设置触发器,如定时构建triggers { cron('H 2 * * 1-5') }支持 CRON 表达式
tools自动安装并设置构建工具tools { maven 'Maven 3.6.3' }常用于 Maven、JDK 等工具链配置
stages用于包含多个构建阶段stages { stage('Build') { ... } }是流水线的核心流程控制器
stage单个构建阶段,如构建、测试、部署stage('Test') { steps { ... } }可以嵌套条件、并发、输入等逻辑
steps构建步骤,定义实际执行的命令steps { sh 'npm install' }支持 shbatechoscript 等命令
script用于在声明式中运行 Groovy 脚本script { def x = 1; ... }适合复杂条件或逻辑
when条件判断块,用于控制阶段是否执行when { branch 'main' }支持多种条件,如分支、表达式、参数等
post构建后操作块post { success { ... } failure { ... } }常用于通知、清理、归档等

示例

pipeline {
    agent any
    environment {
        // 设置环境变量
        GIT_URL = '你的远程仓库地址'
        BRANCH_NAME = '分支名' 
        MODEL_NAME = '模块名'  //需要打包的模块名称
        CREDENTIALS_ID = 'gitlab'
        RUNTIME_DIR = "jar包在服务器的路径"
    }
    options {
        // 配置构建丢弃策略,保留最近的 5 次构建,删除其他构建历史.
        buildDiscarder(logRotator(numToKeepStr: '5'))
    }
    stages {
        stage('从Git仓库拉取代码') {
            steps {
                // 从Git仓库检出指定分支的代码
                git branch: BRANCH_NAME,
                    url: GIT_URL,
                    credentialsId: CREDENTIALS_ID
            }
        }
        stage('安装依赖') {
            steps {
                script {
                    echo "安装项目依赖..."
                    if (isUnix()) {
                        // 增加详细日志输出,帮助调试
                        sh "mvn clean install -pl ${MODEL_NAME} -am -DskipTests"
                        // 查看目标文件夹位置
                        echo "当前工作区路径:${WORKSPACE}"
                        sh "ls -l ${WORKSPACE}"  // 查看工作区文件结构
                    }
                }
            }
        }
        stage('启动前检查') {
            steps {
                script {
                    // 执行构建命令
                    if (isUnix()) {
                        sh "sudo pkill -15 -f java.*${MODEL_NAME}.jar || true"
                        // 调试输出,查看 `target` 文件夹路径
                        echo "检查 ${WORKSPACE}/${MODEL_NAME}/target 文件夹是否存在..."
                        sh """
                            if [ ! -d "${WORKSPACE}/${MODEL_NAME}/target" ]; then
                                echo "错误:${WORKSPACE}/${MODEL_NAME}/target 文件夹不存在"
                                exit 1
                            fi
                            echo "检查 ${WORKSPACE}/${MODEL_NAME}/target/${MODEL_NAME}.jar 文件是否存在..."
                            if [ ! -f "${WORKSPACE}/${MODEL_NAME}/target/${MODEL_NAME}.jar" ]; then
                                echo "错误:${WORKSPACE}/${MODEL_NAME}/target/${MODEL_NAME}.jar 文件不存在"
                                exit 1
                            fi
                        """
                        sh "sudo cp ${WORKSPACE}/${MODEL_NAME}/target/${MODEL_NAME}.jar ${RUNTIME_DIR}"
                    }
                }
            }
        }
        stage('部署') {
            steps {
                script {
                    echo '部署到服务器...'
                    // 部署命令
                    sh "nohup sudo java -Dspring.profiles.active=test -Xms64m -Xmx128m -jar ${RUNTIME_DIR}/${MODEL_NAME}.jar --server.port=端口号 > ${RUNTIME_DIR}/${MODEL_NAME}.txt 2>&1 &"
                    // 新增:检查 Java 进程是否启动
                    echo "检查 ${MODEL_NAME}.jar 是否正在运行..."
                    def processCheck = sh(script: "ps aux | grep ${MODEL_NAME}.jar | grep -v grep", returnStatus: true)
                    if (processCheck != 0) {
                        echo "错误:${MODEL_NAME}.jar 进程未启动,流水线将失败!"
                        currentBuild.result = 'FAILURE'  // 标记构建失败
                        error "进程未启动"  // 终止流水线并标记为失败
                    }
                    // 检查 Java 进程
                    sh "ps aux | grep ${MODEL_NAME}.jar"
                }
            }
        }
    }
    post {
        always {
            // 构建完成后清理工作区
            cleanWs()  // Workspace Cleanup 插件的功能
        }
        success {
            echo "流水线执行成功!"
        }
        failure {
            echo "流水线执行失败!"
        }
    }
}

如果以上的内容对您有帮助,希望给个免费的赞和关注,共勉!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值