首页 > 其他分享 >【Jenkins】如何在Pipeline中实现复杂的工作流?

【Jenkins】如何在Pipeline中实现复杂的工作流?

时间:2024-11-12 12:14:52浏览次数:3  
标签:Pipeline NAME 复杂 sh steps Jenkins expression stage

在Jenkins Pipeline中实现复杂的工作流通常涉及多个步骤、条件逻辑、并行执行以及错误处理等。Jenkins提供了强大的声明式语法(Declarative Pipeline)和脚本式语法(Scripted Pipeline),使得构建复杂的工作流变得可能。下面我将通过一个具体的例子来说明如何使用声明式Pipeline实现一个复杂的工作流。

示例场景

假设我们有一个项目,该项目需要进行以下工作流程:

  • 在开发分支上运行单元测试。
  • 如果单元测试通过,则将代码打包。
  • 将打包后的文件部署到开发环境。
  • 如果开发环境部署成功,且代码已经合并到了主分支,则运行集成测试。
  • 如果集成测试通过,则将代码部署到生产环境。

声明式Pipeline示例

pipeline {
    agent any
    environment {
        BRANCH_NAME = 'develop' // 默认为开发分支
    }
    stages {
        stage('Checkout') {
            steps {
                script {
                    // 获取当前分支名
                    env.BRANCH_NAME = sh(script: 'git rev-parse --abbrev-ref HEAD', returnStdout: true).trim()
                }
                git branch: "${env.BRANCH_NAME}", url: 'https://repo.example.com/project.git'
            }
        }
        stage('Run Unit Tests') {
            when {
                expression { env.BRANCH_NAME ==~ /develop/ }
            }
            steps {
                sh 'mvn test'
            }
        }
        stage('Package Application') {
            when {
                expression { currentBuild.result == 'SUCCESS' }
            }
            steps {
                sh 'mvn package'
            }
        }
        stage('Deploy to Dev Environment') {
            when {
                expression { currentBuild.result == 'SUCCESS' }
            }
            steps {
                sh 'deploy-to-dev.sh'
            }
        }
        stage('Run Integration Tests') {
            when {
                allOf {
                    expression { env.BRANCH_NAME ==~ /main/ }
                    expression { currentBuild.result == 'SUCCESS' }
                }
            }
            steps {
                sh 'mvn verify'
            }
        }
        stage('Deploy to Production') {
            when {
                allOf {
                    expression { currentBuild.result == 'SUCCESS' }
                    expression { env.BRANCH_NAME ==~ /main/ }
                }
            }
            steps {
                sh 'deploy-to-prod.sh'
            }
        }
    }
    post {
        always {
            echo 'This will always run.'
        }
        success {
            echo 'Pipeline succeeded!'
        }
        failure {
            echo 'Pipeline failed!'
            mail to: '[email protected]',
                 subject: "Failed Pipeline: ${currentBuild.fullDisplayName}",
                 body: "Something is wrong with ${env.BUILD_URL}"
        }
    }
}

详细解释

  1. 环境变量:定义了默认的分支名为develop
  2. Checkout阶段:从指定的仓库拉取代码,并获取当前的分支名称。
  3. Run Unit Tests阶段:仅当当前分支是develop时才执行单元测试。
  4. Package Application阶段:如果前一阶段成功,则打包应用程序。
  5. Deploy to Dev Environment阶段:如果打包成功,则部署到开发环境。
  6. Run Integration Tests阶段:如果当前分支是main且之前的所有阶段都成功,则运行集成测试。
  7. Deploy to Production阶段:如果集成测试成功且当前分支是main,则部署到生产环境。
  8. Post部分:无论成功还是失败,都会执行一些收尾动作,比如发送邮件通知。

并行执行和条件逻辑

如果需要并行执行某些任务,可以在stages中嵌套parallel指令。例如,如果有多个独立的集成测试需要并行执行,可以这样写:

stage('Run Parallel Integration Tests') {
    when {
        allOf {
            expression { env.BRANCH_NAME ==~ /main/ }
            expression { currentBuild.result == 'SUCCESS' }
        }
    }
    parallel {
        stage('Integration Test 1') {
            steps {
                sh 'mvn -Ptest1 verify'
            }
        }
        stage('Integration Test 2') {
            steps {
                sh 'mvn -Ptest2 verify'
            }
        }
    }
}

这个例子展示了如何在Jenkins Pipeline中构建一个复杂的工作流,包括条件判断、阶段间的依赖关系以及并行执行。通过这种方式,你可以灵活地定制适合你项目的CI/CD流程。


标签:Pipeline,NAME,复杂,sh,steps,Jenkins,expression,stage
From: https://blog.csdn.net/qq_24766857/article/details/143709192

相关文章

  • 使用LangGraph构建复杂AI工作流:子图架构详解
    一、子图架构概述子图(Subgraph)是LangGraph中一个强大的特性,它允许我们将复杂的工作流程分解成更小、更易管理的组件。通过子图,我们可以实现模块化设计,提高代码的可重用性和可维护性。1.1子图的基本概念子图本质上是一个完整的图结构,可以作为更大图结构中的一个节点使用。它具......
  • 网络安全现状:复杂的威胁形势导致压力水平飙升
    《2024年网络安全状况》报告深入分析了当前网络安全挑战和趋势。该报告重点介绍了几个关键的关注领域,包括人员短缺、技能差距、不断演变的威胁和预算限制,同时还指出了取得进展的领域,例如对威胁响应能力的信心增强以及对网络风险评估的认识不断提高。报告中最令人担忧的趋......
  • 告别复杂判断!Python 中实现函数重载的终极技巧
    引言说到函数重载,学过Java的同学应该不陌生,最常用的地方应该就是打印log了,对于不同的参数,调用的是不同的重载函数。那么Python如何实现函数重载呢?重载概念函数重载是指在同一作用域内,允许多个同名函数存在,但它们的参数列表不同。虽然许多编程语言(如Java和C++)支持函数......
  • 在复杂环境中,算法定制LiteAIServer视频智能分析平台如何提高对比度识别的准确率?
    随着科技的飞速发展,视频监控已经成为各行各业不可或缺的一部分。然而,视频质量的好坏直接影响到监控效果,其中对比度作为衡量图像质量的重要指标之一,对于视频内容的清晰度和细节表现至关重要。为了提高对比度误报识别的准确率,算法定制LiteAIServer视频智能分析平台凭借其先进的图......
  • 大模型--训练 加速之 流水线并行Pipeline Parallelism-10
    目录1.参考2.概述3.目标4.模型并行4.流水线并行4.1切分micro-batch4.2re-materialization(activecheckpoint)5.实验效果5.1GPU数量VS模型大小ofModelParameter表示模型的参数量5.2GPU数量VS训练速度5.3Gpipe下时间消耗分布1.参考https://zhuanlan.zhihu.com/p/6......
  • likeadmin多表关联复杂查询
    <?php//+----------------------------------------------------------------------//|likeadmin快速开发前后端分离管理后台(PHP版)//+----------------------------------------------------------------------//|欢迎阅读学习系统程序代码,建议反馈是我们前进的动力//......
  • C语言数据结构--详细讲解算法复杂度
    C语言数据结构-算法复杂度前言一、时间复杂度1.大O渐进表示法2时间复杂度的计算二、空间复杂度1.什么是空间复杂度2时间复杂度的计算总结前言我们都清楚计算机存储和组织数据是通过数据结构来实现的。当计算机对这些数据结构中的数据进行遍历等操作时,这个过程就......
  • Python——数据结构与算法-时间复杂度&空间复杂度-链表&树状结构
    1.数据结构和算法简介程序可以理解为:程序=数据结构+算法概述/目的:都可以提高程序的效率(性能)数据结构指的是存储,组织数据的方式.算法指的是为了解决实际业务问题而思考思路和方法,就叫:算法.2.算法的5大特性介绍概述:为了解决实际业务问题,......
  • FPGA实现复杂状态机的跳转-判断标准数据帧
    填补之前的状态机跳转挖的坑;数据源对比标准帧:第一步:ROM当做数据源:使能开启,使用地址addr控制其输出。(使用状态机写入RAM时的控制选用addr)RAM作为标准帧的缓存,使用addr_ram作为RAM的写入地址。此时ROM的地址比RAM的地址延迟了一个节拍;(addr_ram<=addr;)第二步:RAM缓存写满之......
  • 如何使用程序生成一个复杂的2D迷宫游戏地图
    相关:ISolvedTheWorld'sHardestMaze(withCode)本文不做过多的内容介绍,本文主要是分享上面的这个视频内容,该内容介绍了一些自动生成复杂2D迷宫的算法,当然本文不对此做过多介绍,这里可以当作是一个内容收藏的功能,因为曾经有段时间自己想去写这么一个迷宫生成的算法,后来发现......