文章目录

  • 一、Jenkins Pipeline介绍
  • 为什么要使用Pipeline
  • 二、pipeline语法种类
  • 1、申明式
  • 2、脚本式
  • 三、申明式语法
  • 1.核心结构
  • pipieline
  • agent
  • stages
  • stage
  • steps
  • post
  • 2.指令
  • environment
  • options
  • parameters
  • triggers
  • tools
  • input
  • when
  • 脚本
  • 3.常见参数


一、Jenkins Pipeline介绍

1.Jenkins Pipeline是一组插件,让Jenkins可以实现持续交付管道的落地和实施。
2.持续交付管道(CD Pipeline)是将软件从版本控制阶段到交付给用户或客户的完
整过程的自动化表现。
3.软件的每一次更改(提交到源代码管理系统)都要经过一个复杂的过程才能被发布
4.Pipeline提供了一组可扩展的工具,通过Pipeline Domain Specific Language
(DSL) syntax可以达到Pipeline as Code的目的
5.Pipeline as Code:Jenkinsfile 存储在项目的源代码库

为什么要使用Pipeline

本质上,Jenkins 是一个自动化引擎,它支持许多自动模式。 Pipeline向Jenkins中添加了一组强大的工具, 支持用例 简单的CI到全面的CD pipeline。通过对一系列的相关任务进行建模, 用户可以利用pipeline的很多特性:

  • 代码:Pipeline以代码的形式实现,通常被检入源代码控制,使团队能够编辑,
    审查和迭代其CD流程。
  • 可持续性:Jenkins重启或者中断后都不会影响Pipeline Job。
  • 停顿:Pipeline可以选择停止并等待人工输入或批准,然后再继续Pipeline运行。
  • 多功能:Pipeline支持现实世界的复杂CD要求,包括fork/join子进程,循环和
    并行执行工作的能力。
  • 可扩展:Pipeline插件支持其DSL的自定义扩展以及与其他插件集成的多个选项

二、pipeline语法种类

1、申明式

pipeline{
    agent any
    stages{
        stage("build"){
            steps(){
            //
            }
        stage("test"){
            steps(){
            //
            }
        }
    }
}

申明式的特点:

  • 最外层必须由pipline{ //do something }来进行包裹
  • 不需要分号作为分隔符,每个语句必须在一行内
  • 不能直接使用groovy语句(例如循环判断等),需要被script {}包裹

2、脚本式

node{
        stage("build"){
        	//
            }
        stage("test"){
            //
            }
}

脚本式的特点

  • 1.最外层有node{}包裹
  • 2.可直接使用groovy语句

三、申明式语法

1.核心结构

pipeline{
    agent any
    stages{
        stage("first stage"){
            steps("first steps"){
                echo "this is first step"
            }
        }
    }
    post{
        always{
            echo "this is ending..."
        }
    }
}
pipieline

声明其内容为一个声明式的pipeline脚本

作用域:应用于全局最外层,表明该脚本为声明式pipeline
是否必须:必须
参数:无

agent

执行节点(job运行的slave或者master节点)

作用域:可用在全局与stage内
是否必须:是,
参数:any,none, label, node,docker,dockerfile

  • any:在任何可用的agent 上执行Pipeline或stage
  • none:当在pipeline块的顶层使用none时,将不会为整个Pipeline运行分配全局agent ,每个stage部分将需要包含其自己的agent部分
  • label:使用提供的label标签,在Jenkins环境中可用的代理上执行Pipeline或stage。例如:agent { label ‘my-defined-label’ }
  • node:agent { node { label ‘labelName’ } },等同于 agent { label ‘labelName’ },但node允许其他选项(如customWorkspace)
  • docker:定义此参数时,执行Pipeline或stage时会动态供应一个docker节点去接受Docker-based的Pipelines。 docker还可以接受一个args,直接传递给docker run调用。例如:agent { docker ‘maven:3-alpine’ }
  • dockerfile:使用从Dockerfile源存储库中包含的容器来构建执行Pipeline或stage 。为了使用此选项,Jenkinsfile必须从Multibranch Pipeline或“Pipeline from SCM"加载
stages

阶段集合,包裹所有的阶段(例如:打包,部署等各个阶段)

作用域:全局或者stage阶段内,每个作用域内只能使用一次
是否必须:全局必须
参数:无

stage

阶段,被stages包裹,一个stages可以有多个stage

作用域:被stages包裹,作用在自己的stage包裹范围内
是否必须:必须
参数:需要一个string参数,表示此阶段的工作内容
备注:stage内部可以嵌套stages,内部可单独制定运行的agent

steps

步骤,为每个阶段的最小执行单元,被stage包裹

作用域:被stage包裹,作用在stage内部
是否必须:必须
参数:无

post

执行构建后的操作,根据构建结果来执行对应的操作

作用域:作用在pipeline结束后者stage结束后
条件:always、changed、failure、success、unstable、aborted

2.指令

指令是帮助pipeline更容易的执行命令,可以理解为一个封装好的公共函数和方法,提供给pipeline使用

environment

声明一个全局变量或者步骤内部的局部变量

pipeline{
    agent any
    environment {
        P1="parameters 1"
    }
    stages{
        stage("stage2"){
            environment {
                P2="parameters 2"
            }
            steps{
                echo "$P1"
                echo "$P2"
            }
        }
    }
}
options

options指令能够提供给脚本更多的选项

  • buildDiscarder:指定build history与console的保存数量
    用法:options { buildDiscarder(logRotator(numToKeepStr: ‘1’)) }
  • disableConcurrentBuilds:设置job不能够同时运行
    用法:options { disableConcurrentBuilds() }
  • skipDefaultCheckout:跳过默认设置的代码check out
    用法:options { skipDefaultCheckout() }
  • skipStagesAfterUnstable:一旦构建状态变得UNSTABLE,跳过该阶段
    用法:options { skipStagesAfterUnstable() }
  • checkoutToSubdirectory:在工作空间的子目录进行check out
    用法:options { checkoutToSubdirectory(‘children_path’) }
  • timeout:设置jenkins运行的超时时间,超过超时时间,job会自动被终止
    用法:options { timeout(time: 1, unit: ‘MINUTES’) }
  • retry :设置retry作用域范围的重试次数
    用法:options { retry(3) }
  • timestamps:为控制台输出增加时间戳
    options { timestamps() }
pipeline{
    agent any
    options {
       timestamps() 
       disableConcurrentBuilds()
        
    }
    stages{
        
        stage("stage1"){
            options { timeout(time:1,unit:'MINUTES') 
                        retry(2)
            }
            steps{
                echo "beging===================="
                sh "xxx.sh"
            }
        }   
    }
}
parameters

提供pipeline运行的参数

  • 作用域:被最外层pipeline所包裹,并且只能出现一次,参数可被全局使用
  • 好处:使用parameters好处是能够使参数也变成code,达到pipeline as code,pipeline中设置的参数会自动在job构建的时候生成,形成参数化构建
pipeline{
    agent any
    parameters {
        string(name: 'P1', defaultValue: 'it is p1', description: 'it is p1')
        booleanParam(name: 'P2', defaultValue: true, description: 'it is p2')
    }
    stages{
        stage("stage1"){
            steps{
                echo "$P1"
                echo "$P2"
            }
        }
    }
}
triggers

作用域:被pipeline包裹,在符合条件下自动触发pipeline

  • 1.cron
  • 作用:以指定的时间来运行pipeline
  • 用法:triggers { cron(’*/1 * * * *’) }
  • 2.pollSCM
  • 以固定的时间检查代码仓库更新(或者当代码仓库有更新时)自动触发pipeline构建
  • triggers { pollSCM(‘H */4 * * 1-5’) }或者triggers { pollSCM() }(后者需要配置post-commit/post-receive钩子)
  • 3.upstream
  • 可以利用上游Job的运行状态来进行触发
  • triggers { upstream(upstreamProjects: ‘job1,job2’, threshold: hudson.model.Result.SUCCESS) }
tools

用于引用配置好的工具
引用的工具需要在管理页面的全局工具配置里配置过

pipeline {
    agent any
    tools {
        maven 'apache-maven-3.0.1' 
    }
    stages {
        stage('Example') {
            steps {
                sh 'mvn --version'
            }
        }
    }
}
input

input指令允许暂时中断pipeline执行,等待用户输入,根据用户输入进行下一步动作

pipeline {
    agent any
    stages {
        stage('Example') {
            input {
                message "Should we continue?"
                ok "Yes, we should."
                submitter "alice,bob"
                parameters {
                    string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')
                }
            }
            steps {
                echo "Hello, ${PERSON}, nice to meet you."
            }
        }
    }
}
when

根据when指令的判断结果来决定是否执行后面的阶段

  • branch :判断分支名称是否符合预期
    用法:when { branch ‘master’ }
  • environment : 判断环境变量是否符合预期
    用法:when { environment name: ‘DEPLOY_TO’, value: ‘production’ }
  • expression:判断表达式是否符合预期
    用法: when { expression { return params.DEBUG_BUILD } }
  • not : 判断条件是否为假
    用法:when { not { branch ‘master’ } }
  • allOf:判断所有条件是不是都为真
    用法:when { allOf { branch ‘master’; environment name: ‘DEPLOY_TO’, value: ‘production’ } }
  • anyOf:判断是否有一个条件为真
    用法:when { anyOf { branch ‘master’; branch ‘staging’ } }
pipeline {
    agent none
    stages {
        stage('Example Build') {
            steps {
                echo 'Hello World'
            }
        }
        stage('Example Deploy') {
            agent {
                label "some-label"
            }
            when {
                beforeAgent true //设置先对条件进行判断,符合预期才进入steps
                branch 'production'
            }
            steps {
                echo 'Deploying'
            }
        }
    }
}
脚本

在声明式的pipeline中默认无法使用脚本语法,但是pipeline提供了一个脚本环境入口:script{},通过使用script来包裹脚本语句,即可使用脚本语法

pipeline {
    agent any
    stages {
        stage('stage 1') {
            steps {
                script{
                    if ( "1" =="1" ) {
                        echo "lalala"
                    }else {
                        echo "oooo"
                    }
                }
            }
        }
    }
}
  • 异常处理
pipeline {
    agent any
    stages {
        stage('stage 1') {
            steps {
                script{
                    try {
                        sh 'exit 1'
                    }
                    catch (exc) {
                        echo 'Something failed'
                        
                    }
                }
            }
        }
    }
}

3.常见参数

  • any: