构建开始,我来组成Pipeline

454 阅读4分钟

上一篇文章,我们一起来看了,用一个自由风格的方式来构建了一个简易的前端项目,我们还有另一种方式来完成这项工作,pipeline的方式去运行,

那么我们为什么要使用pipline呢?

本质上,jenkins是一个自动化引擎,它支持许多自动模式。通过标准的模板,创建一系列发布构建任务。支持从简单的持续集成到全面的 CD 管道的用例。通过对一系列相关任务进行建模,用户可以利用 Pipeline 的许多特性:

代码:管道在代码中实现,通常检查到源代码管理中,使团队能够编辑、审查和迭代他们的交付管道。

耐用:管道可以在 Jenkins 控制器的计划内和计划外重启中保存状态。

可暂停:流水线可以选择停止并等待人工输入或批准,然后再继续流水线运行。

多功能:管道支持复杂的CD部署 要求,包括分叉/加入、循环和并行执行工作的能力。

可扩展:Pipeline 插件支持对其DSL的自定义扩展 以及与其他插件集成的多个选项。

基于 Jenkins 可扩展性的核心价值,Pipeline 也可以由使用Pipeline Shared Libraries的用户和插件开发人员扩展。关于Pipeline Shared Libraries,我们会在之后的文章详细介绍

下面的流程图是在 Jenkins Pipeline 中轻松建模的一个 CD 场景的示例:

image.png

上面是来自官网的介绍,你可以访问下面的连接来查看

https://www.jenkins.io/doc/book/pipeline/
什么是pipeline?

关于流水线的运行,其实就想我们想的流水线一样,比如工厂的流水线。都是分阶段的,有机器各部分的装配,有出厂的测试。就像是Jenkins的stage。而流水线的(jenkinsfile),就是产品所经过的过程,比如:台式机转配过程和一体机就不一样。他们就经过了不同的流水线脚本。

Pipeline是Jenkins的核心功能,它提供了一组可扩展的工具。可以通过DSL语法可以完成从简单到复杂的交付流水线实现。Pipline可以过Jenkinsfile进行描述。

那么现在我们拥有了一个工厂(Jenkins),我们需要设计一个产品的生产线(Jenkinsfile),他会经过很多步骤(stage)。我们首先需要的就是编写Jenkinsfile

那么我们先聊一下Jenkinsfile的组成。enkinsfile使用两种语法进行编写,分别是声明式和脚本式。声明式和脚本式的流水线从根本上是不同的。声明式是jenkins流水线更友好的特性。脚本式的流水线语法,提供更丰富的语法特性。声明式流水线使编写和读取流水线代码更容易设计。

那么jenkinsfile到底是什么样子的呢?

jenkinsfile我们常用有4部分组成,agentoptionsstages``post

使用agent,指定node节点/workspace(定义好此流水线在某节点运行),timestamp需要安装插件Timestamper

    agent { node { 
            label "master"
            customWorkspace "${workspace}"
        }
    }

使用options 运行选项(定义好此流水线运行时的一些选项,例如输出日志的时间)
使用stages(stages包含多个stage,stage包含steps。是流水线的每个步骤)

    //流水线的阶段
    stages{

        //阶段1 获取代码
        stage("CheckOut"){
            steps{
                script{
                    println("获取代码")
                }
            }
        }
        stage("Build"){
            steps{
                script{
                    sh "pwd"
                }
            }
        }
        stage("Deploy"){
            steps{
                script{
                    println("进行部署")
                }
            }
        }
    }

使用post(定义好此流水线运行成功或者失败后,根据状态做一些任务,构建后的操作很重要),他有多重状态:

  • always: 总是执行脚本片段;
  • success: 成功后执行;
  • failure: 失败后的执行,比如我们可以失败以后发送邮件;
  • aborted: 取消后执行。
    post {
        always{
            script{
                println("流水线结束后,经常做的事情")
            }
        }
        
        success{
            script{
                println("流水线成功后,要做的事情")
            }
        
        }
        failure{
            script{
                println("流水线失败后,要做的事情")
            }
        }
        
        aborted{
            script{
                println("流水线取消后,要做的事情")
            }
        
        }
    }

这样我们可以得到一个完整的jenkins的框架,文件内容如下:

pipeline{
    //指定运行此流水线的节点
    agent { node { label "build"}}
    

    //流水线的阶段
    stages{

        //阶段1 获取代码
        stage("CheckOut"){
            steps{
                script{
                    println("获取代码")
                }
            }
        }
        stage("Build"){
            steps{
                script{
                    println("运行构建")
                }
            }
        }
        stage("Deploy"){
            steps{
                script{
                    println("进行部署")
                }
            }
        }
    }
    post {
        always{
            script{
                println("流水线结束后,经常做的事情")
            }
        }
        
        success{
            script{
                println("流水线成功后,要做的事情")
            }
        
        }
        failure{
            script{
                println("流水线失败后,要做的事情")
            }
        }
        
        aborted{
            script{
                println("流水线取消后,要做的事情")
            }
        
        }
    }
}

我们可以跑一下这个pipeline,你会发现他跑了4个部分

image.png

最后我来总结一下,今天我们主要介绍了什么是pipeline,pipeline由几部分组成,它的结构是什么。如果你还有什么问题,或者建议,可以给我留言,或者关注我的公众号 小圆和他的朋友们。期待与你共同进步。