• Jenkins自动化部署之流水线模式部署


    任务类型

    Jenkins中,有不同类型的任务(项目)适用于不同的构建需求。以下是一些常见的Jenkins任务类型:

    自由风格项目(FreeStyle Project):

    • 自由风格项目是Jenkins中最灵活的项目类型。
    • 允许通过简单的构建步骤配置来构建软件项目,支持Shell脚本、Windows批处理脚本等。
    • 适用于简单的构建需求,例如编译、打包、测试和部署

    Maven项目:

    • Maven项目是专为使用Maven构建工具的项目设计的。
    • 允许配置Maven构建步骤,自动下载依赖、执行生命周期阶段等。
    • 适用于Java项目,特别是使用Maven构建工具的项目

    Pipeline流水线项目:

    • Pipeline项目使用Jenkins Pipeline语法,允许以代码形式定义整个CI/CD流水线。
    • 支持复杂的构建、测试、部署和其他自动化流程,有更强大的灵活性。
    • 可以在Jenkinsfile中定义Pipeline,并将Pipeline存储在源代码仓库中。
    • 支持从版本控制系统中读取Jenkinsfile,以代码的方式定义整个流水线
    • 适用于复杂的CI/CD流程,需要定义多个阶段和任务的项目

    实际企业项目中大多数使用Pipeline流水线项目类型。

    Pipeline流水线项目

    Pipeline(流水线)是Jenkins中的一种工作流插件,允许你以代码的形式定义整个CI/CD过程

    实现单个任务难以完成的复杂流程编排和可视化的工作

    可编程性: 使用Groovy脚本语言编写Pipeline脚本,这意味着你可以通过代码控制流水线的每个步骤。

    可视化: 提供了可视化的流水线编辑器,帮助你直观地了解和修改整个流程。

    可重用性: Pipeline的脚本可以存储在版本控制系统中(如Git),从而提供了可重用的、版本化的构建配置。

    持久化: 支持将Pipeline的定义保存为代码(Jenkinsfile),从而可以将流水线的配置与代码一起存储。

    Pipeline支持两种语法声明式(Declarative)和脚本式(Scripted Pipeline)语法。

    声明式的Pipeline

    stages:代表整个流水线的所有执行阶段,通常stages只有1个,里面包含多个stage。

    stage:代表流水线中的某个阶段,可能出现n个。一般分为拉取代码、编译构建、部署等阶段。

    steps:代表一个阶段内需要执行的逻辑。steps里面是shell脚本,git拉取代码、ssh远程发布等任意内容。

    pipeline {
     agent any
     stages {
       stage('拉取代码') {
        steps {
          echo '拉取代码'
        }
       }
       stage('编译构建') {
        steps {
          echo '编译构建'
        }
       }
       stage('项目部署') {
        steps {
          echo '项目部署'
        }
       }
     }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    运行完阶段视图如下

    日志如下

    Started by user laker
    [Pipeline] Start of Pipeline
    [Pipeline] node
    Running on Jenkins in /root/.jenkins/workspace/ppp
    [Pipeline] {
    [Pipeline] stage
    [Pipeline] { (拉取代码)
    [Pipeline] echo
    拉取代码
    [Pipeline] }
    [Pipeline] // stage
    [Pipeline] stage
    [Pipeline] { (编译构建)
    [Pipeline] echo
    编译构建
    [Pipeline] }
    [Pipeline] // stage
    [Pipeline] stage
    [Pipeline] { (项目部署)
    [Pipeline] echo
    项目部署
    [Pipeline] }
    [Pipeline] // stage
    [Pipeline] }
    [Pipeline] // node
    [Pipeline] End of Pipeline
    Finished: SUCCESS
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    脚本式Pipeline

    Node :节点,一个 Node 就是一个 Jenkins 节点,Master 或者 Agent,是执行 Step 的具体运行环境。

    Stage :阶段,一个 Pipeline 可以划分为若干个 Stage,每个 Stage 代表一组操作,比如:Build、Test、Deploy,Stage 是一个逻辑分组的概念。

    Step :步骤,Step 是最基本的操作单元,可以是打印一句话,也可以是构建一个 Docker 镜像,由各类 Jenkins 插件提供,比如命令:sh ‘make’,就相当于我们平时 shell 终端中执行 make 命令一样。

    node {
       def mvnHome
       stage('Preparation') {
           echo '拉取代码'
       }
       stage('Build') {
           echo '编译构建'
       }
       stage('Results') {
           echo '项目部署'
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    示例脚本

    可以参考看图中的示例代码在线可视化的流水线语法

    生成Tools配置示例

    示例脚本

    pipeline {
        // 在任何代理节点运行
        agent any
    
        tools {
            // maven3.6.0 要在 jenkins全局工具配置中提前配置好
            maven 'maven3.6.0'
        }
    
        stages {
            stage('构建') {
                steps {
                    // 从Gitee仓库获取代码
                    git 'https://gitee.com/lakernote/easy-admin.git'
    
                    // 运行Maven
                    sh "mvn -Dmaven.test.failure.ignore=true clean package"
                }
    
                post {
                    // 如果Maven能够运行测试,即使有一些测试失败,也记录测试结果并归档jar文件。
                    success {
                        junit '**/target/surefire-reports/TEST-*.xml'
                        // 会把target/*.jar文件归档到Jenkins的工作目录中的 archive 目录下
                        archiveArtifacts 'target/*.jar'
                    }
                }
            }
    
            stage('部署') {
                steps {
                    // TODO: 在这里添加部署步骤,将构建生成的文件部署到服务器或其他目标。
                    // 示例:可以使用SCP、SSH或其他部署工具
                    sh "echo 'Add your deployment steps here'"
                }
            }
        }
    
        post {
            // 构建后的操作
            always {
                // TODO: 在这里添加任何构建后操作,例如清理、通知等。
                sh "echo 'Add your post-build steps here'"
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    高级

    Pipeline Script from SCM

    上面是直接在Jenkins的UI界面编写Pipeline代码,这样不方便脚本维护,建议把Pipeline脚本放在项目中(一起进行版本控制)。

    第一步 在项目根目录建立Jenkinsfile文件,把内容复制到该文件中,然后提交到Git。

    第二步 配置流水线

    执行结果

    错误不用管,只是演示这个过程。

    Downloaded from aliyun-public: https://maven.aliyun.com/repository/public/org/codehaus/plexus/plexus-io/3.0.0/plexus-io-3.0.0.jar (74 kB at 191 kB/s)
    [[1;34mINFO[m] Reading assembly descriptor: assembly/assembly.xml
    [[1;34mINFO[m] Building zip: /root/.jenkins/workspace/ppp/target/easyAdmin-local-1.0.0.zip
    [[1;34mINFO[m] [1m------------------------------------------------------------------------[m
    [[1;34mINFO[m] [1;32mBUILD SUCCESS[m
    [[1;34mINFO[m] [1m------------------------------------------------------------------------[m
    [[1;34mINFO[m] Total time:  01:50 min
    [[1;34mINFO[m] Finished at: 2024-02-29T15:21:24+08:00
    [[1;34mINFO[m] [1m------------------------------------------------------------------------[m
    Post stage
    [Pipeline] junit
    Recording test results
    No test report files were found. Configuration error?
    Error when executing success post condition:
    Also:   org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId: 92192139-d4ce-4bf3-8572-6c7c73bf5d32
    hudson.AbortException: No test report files were found. Configuration error?
    	at hudson.tasks.junit.JUnitParser$ParseResultCallable.invoke(JUnitParser.java:193)
    	at hudson.FilePath.act(FilePath.java:1232)
    	at hudson.FilePath.act(FilePath.java:1215)
    	at hudson.tasks.junit.JUnitParser.parseResult(JUnitParser.java:125)
    	at hudson.tasks.junit.JUnitResultArchiver.parse(JUnitResultArchiver.java:160)
    	at hudson.tasks.junit.JUnitResultArchiver.parseAndSummarize(JUnitResultArchiver.java:254)
    	at hudson.tasks.junit.pipeline.JUnitResultsStepExecution.run(JUnitResultsStepExecution.java:63)
    	at hudson.tasks.junit.pipeline.JUnitResultsStepExecution.run(JUnitResultsStepExecution.java:29)
    	at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:47)
    	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    	at java.base/java.lang.Thread.run(Thread.java:829)
    
    [Pipeline] }
    [Pipeline] // withEnv
    [Pipeline] }
    [Pipeline] // stage
    [Pipeline] stage
    [Pipeline] { (部署)
    Stage "部署" skipped due to earlier failure(s)
    [Pipeline] }
    [Pipeline] // stage
    [Pipeline] stage
    [Pipeline] { (Declarative: Post Actions)
    [Pipeline] sh
    + echo Add your post-build steps here
    Add your post-build steps here
    [Pipeline] }
    [Pipeline] // stage
    [Pipeline] }
    [Pipeline] // withEnv
    [Pipeline] }
    [Pipeline] // node
    [Pipeline] End of Pipeline
    ERROR: No test report files were found. Configuration error?
    Finished: FAILURE
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    阶段视图

  • 相关阅读:
    JTS-通过Coordinate点截断几何Geometry
    IntelliJ IDEA 2023:创新不止步,开发更自由 mac/win版
    Mybatis(第三篇:不同的返回值类型:Map和JavaBean)
    FFmpeg入门详解之9:Audacity音频工具
    【NOI模拟赛】独家墙(数位DP)
    关于 Vue-iClient-MapboxGL 的使用注意事项
    RocketMQ 消费者
    Node.js 框架 star 星数量排名——NestJs跃居第二
    京东店铺公司名爬虫
    Visual Paradigm 如何在大型项目中实现最佳性能
  • 原文地址:https://blog.csdn.net/abu935009066/article/details/136372801