【Jenkins pipeline】语法详解

Jenkins pipeline 总体介绍

pipeline 是一套运行于jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。

pipeline 是jenkins2.X 最核心的特性, 帮助jenkins 实现从CI 到 CD与 DevOps的转变

pipeline 提供一组可扩展的工具, 通过 pipeline domain specific language syntax 可以到达pipeline as code 目的

pipiline as code : jenkinsfile 存储在项目的 源代码库

为什么要使用pipeline

  1. 代码: pipeline 以代码的形式实现,通过被捡入源代码控制, 使团队能够编译,审查和迭代其cd流程

2 可连续性: jenkins 重启 或者中断后都不会影响pipeline job

3.停顿: pipeline 可以选择停止并等待人工输入或者批准,然后在继续pipeline运行

4.多功能: pipeline 支持现实世界的复杂CD要求, 包括fork、join子进程,循环和并行执行工作的能力

5.可扩展: pipeline 插件支持其DSL的自动扩展以及其插件集成的多个选项。

jenkins pipeline 入门

pipeline 脚本是有groovy 语言实现的,学习过java或者groovy语言的小伙伴学习起来会锦上添花

pipeline 支持两种语法

-  Declarative 声明式

-  Scripted pipeline 脚本式

如何创建基本的pipeline

-  直接在jenkins web ui 网页界面输入脚本

-  通过常见一个jenkins 可以检入项目的源代码管理库

Declarativ 声明式 pipeline

声明式pipeline 基本语法和表达式遵循 groovy语法,但是有以下例外:

-  声明式pipeline 必须包含在固定格式的pipeline{} 块内

-  每个声明语句必须独立一行, 行尾无需使用分号

-   块(Blocks{}) 只能包含章节(Sections),指令(Directives),步骤(Steps),或者赋值语句

-  属性引用语句被视为无参数方法调用。 如input()

块(Blocks{})

-  由大括号括起来的语句: 如 Pipeline{}, Sections{}, parameters{}, script{}

章节(Sections)

-  通常包括一个或者多个指令或步骤 如 agent,post,stages,steps

指令(Directives)

-  environment, options, parameters, triggers, stage, tools, when

步骤(steps)

-  执行脚本式pipeline, 如script{}

agent

agent
需要必须存在,agent必须在pipeline块内的顶层定义,但是stage内是否使用为可选
参数any/none/label/node/docker/dockerfile
常用参数label/customWorkspace/reuseNode

展示:

agent { label 'this k8s-api-label'} 

agent {
	node{
		label ' this is k8sapi-label'
		customWorkspace '/some/other/path'
	}
}

agent {
	docker {
  	image 'im-web'
     label 'this is k8sapi-label'
     args '-v /tmp:/tmp'
  }
}

customWorkspace node节点的工作空间
post

post
需要否,用于pipeline的最外层或者stage{}中
参数
常用选项构建后操作的内置判定条件always,changed,failure,sucess,unstable,aborted

展示:

pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
    post {
        always {
            echo 'I will ........!'
        }
    }
}

stages

stages
需要是,包括顺序执行的一个或者多个stage命令
参数
常用选项构建后操作的内置判定条件always,changed,failure,sucess,unstable,aborted

展示:

pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
    stage('echo') {
    	steps {
	        echo 'I will ........!'
        }
    }
}

steps

steps
需要是,steps位于stage指令块内部,包括一个或者多个step
参数
说明仅有一个step的情况下可以忽略关键字step及其{}

展示:

pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
      stage('echo') {
          steps {
              echo 'I will ........!'
          }
      }
}

Directives (指令)

environment指令指定一系列键值对,这些键值对将被定义为所有step或stage-specific step的环境变量,具体取决于environment指令在Pipeline中的位置。
该指令支持一种特殊的方法credentials(),可以通过其在Jenkins环境中的标识符来访问预定义的凭据。
对于类型为“Secret Text”的凭据,该 credentials()方法将确保指定的环境变量包含Secret Text内容;对于“标准用户名和密码”类型的凭证,指定的环境变量将被设置为username:password。

environment
需要 是,environment 定义了一组全局的环境变量键值对
参数 无
说明

存在于pipeline{} 或者stage指令内,

注意特殊方法credentials() ,可以获取jenkins中预定义的凭证明文内容
展示:
复制代码

pipeline {
agent any

environment {
    SONAR_SERVER = 'http://172.16.230.171:9000'
}

stages {
    stage('Example') {
        steps {
            echo "${SONAR_SERVER}"
        }
    }
}

}

复制代码

options

buildDiscarder
    pipeline保持构建的最大个数。例如:options { buildDiscarder(logRotator(numToKeepStr: ‘1’)) }
  disableConcurrentBuilds
    不允许并行执行Pipeline,可用于防止同时访问共享资源等。例如:options { disableConcurrentBuilds() }
  skipDefaultCheckout
    默认跳过来自源代码控制的代码。例如:options { skipDefaultCheckout() }
  skipStagesAfterUnstable
    一旦构建状态进入了“Unstable”状态,就跳过此stage。例如:options { skipStagesAfterUnstable() }
  timeout
    设置Pipeline运行的超时时间。例如:options { timeout(time: 1, unit: ‘HOURS’) }
  retry
    失败后,重试整个Pipeline的次数。例如:options { retry(3) }
  timestamps
    预定义由Pipeline生成的所有控制台输出时间。例如:options { timestamps() }

options
需要 否,预定义pipeline专有的配置信息,仅可定义一次
参数 无
说明

authorizationMatrix, buildDiscarder, catchError, disableConcurrentBuilds, overrideIndexTriggers,
retry, script, skipDefaultCheckout, skipStagesAfterUnstable, timeout, waitUntil, withContext,
withCredentials, withEnv, ws

展示: 设置构建超时时间 为1个小时
复制代码

pipeline {
agent any

options {
    timeout(time:1, unit: 'HOURS')
}

environment {
    SONAR_SERVER = 'http://172.16.230.171:9000'
    JAVA_HOME='/data/jdk'
}

stages {
    stage('sonarserver') {
        steps {
            echo "${SONAR_SERVER}"
        }
    }
    stage('javahome') {
        steps {
            echo "${JAVA_HOME}"
        }
    }
}

}

复制代码

parameters

parameters指令提供用户在触发Pipeline时的参数列表。这些参数值通过该params对象可用于Pipeline步骤

可用参数
  string
    A parameter of a string type, for example: parameters { string(name: ‘DEPLOY_ENV’, defaultValue: ‘staging’, description: ‘’) }
  booleanParam
    A boolean parameter, for example: parameters { booleanParam(name: ‘DEBUG_BUILD’, defaultValue: true, description: ‘’) }
  目前只支持[booleanParam, choice, credentials, file, text, password, run, string]这几种参数类型,其他高级参数化类型还需等待社区支持。

parameters
需要 否,定义参数化构建的参数
参数 无
说明

booleanParam,choice,file,text,password,run,string

示例

复制代码

pipeline {
agent any

options {
    timeout(time:1, unit: 'HOURS')
}

parameters {
    choice(name:'PerformMavenRelease',choices:'False\nTrue',description:'desc')
 //   password(name:'CredsToUse',defaultValue:'',description:'A password to build with')
}

environment {
    SONAR_SERVER = 'http://172.16.230.171:9000'
    JAVA_HOME='/data/jdk'
}

stages {
    stage('sonarserver') {
        steps {
            echo "${SONAR_SERVER}"
        }
    }
    stage('javahome') {
        steps {
            echo "${JAVA_HOME}"
        }
    }
    stage('get parameters') {
        steps {
            echo "${params.PerformMavenRelease}"
        }
    }        
}

}

复制代码

调用定义的参数, 需要使用 params.PerformMavenRelease

triggers

triggers指令定义了Pipeline自动化触发的方式。对于与源代码集成的Pipeline,如GitHub或BitBucket,triggers可能不需要基于webhook的集成也已经存在。目前只有两个可用的触发器:cron和pollSCM。
triggers
需要 否,定义pipeline被自动触发的方式
参数 无
说明

cron,pollSCM,upstream

示例

复制代码

pipeline {
agent any

options {
    timeout(time:1, unit: 'HOURS')
}

parameters {
    choice(name:'PerformMavenRelease',choices:'False\nTrue',description:'desc')
 //   password(name:'CredsToUse',defaultValue:'',description:'A password to build with')
}

environment {
    SONAR_SERVER = 'http://172.16.230.171:9000'
    JAVA_HOME='/data/jdk'
}

triggers {
     cron(‘H 4/* 0 0 1-5’)
}

stages {
    stage('sonarserver') {
        steps {
            echo "${SONAR_SERVER}"
        }
    }
    stage('javahome') {
        steps {
            echo "${JAVA_HOME}"
        }
    }
    stage('get parameters') {
        steps {
            echo "${params.PerformMavenRelease}"
        }
    }        
}

}

复制代码

when

when指令允许Pipeline根据给定的条件确定是否执行该阶段。该when指令必须至少包含一个条件。如果when指令包含多个条件,则所有子条件必须为stage执行返回true。这与子条件嵌套在一个allOf条件中相同(见下面的例子)。
更复杂的条件结构可使用嵌套条件建:not,allOf或anyOf。嵌套条件可以嵌套到任意深度

内置条件
  branch
    当正在构建的分支与给出的分支模式匹配时执行,例如:when { branch ‘master’ }。请注意,这仅适用于多分支Pipeline。
  environment
    当指定的环境变量设置为给定值时执行,例如: when { environment name: ‘DEPLOY_TO’, value: ‘production’ }
  expression
    当指定的Groovy表达式求值为true时执行,例如: when { expression { return params.DEBUG_BUILD } }
  not
    当嵌套条件为false时执行。必须包含一个条件。例如:when { not { branch ‘master’ } }
  allOf
    当所有嵌套条件都为真时执行。必须至少包含一个条件。例如:when { allOf { branch ‘master’; environment name: ‘DEPLOY_TO’, value: ‘production’ } }
  anyOf
    当至少一个嵌套条件为真时执行。必须至少包含一个条件。例如:when { anyOf { branch ‘master’; branch ‘staging’ } }

when
需要 否
参数 无
说明

inside a stage directive

复制代码

pipeline {
agent any
stages {
stage(‘Example Build’) {
steps {
echo ‘Hello World’
}
}
stage(‘Example Deploy’) {
when {
allOf {
branch ‘production’
environment name: ‘DEPLOY_TO’, value: ‘production’
}
}
steps {
echo ‘Deploying’
}
}
}
}

复制代码

Parallel(并行)

Declarative Pipeline近期新增了对并行嵌套stage的支持,对耗时长,相互不存在依赖的stage可以使用此方式提升运行效率。除了parallel stage,单个parallel里的多个step也可以使用并行的方式运行。
复制代码

pipeline {
agent any
stages {
stage(‘Non-Parallel Stage’) {
steps {
echo ‘This stage will be executed first.’
}
}
stage(‘Parallel Stage’) {
when {
branch ‘master’
}
parallel {
stage(‘Branch A’) {
agent {
label “for-branch-a”
}
steps {
echo “On Branch A”
}
}
stage(‘Branch B’) {
agent {
label “for-branch-b”
}
steps {
echo “On Branch B”
}
}
}
}
}
}

复制代码

变量传递

  1. 自定义变量(局部)

def username = ‘jenkins’

echo “hello Mr.${username}”

  1. 环境变量

withEnv([‘JAVA_HOME=/data/jdk’]) {

sh ‘$JAVA_HOME/bin/start.sh’

}

  1. 环境变量(全局)

environment {
JAVA_HOME=’/data/jdk’
}

echo " java path $JAVA_HOME"

  1. 参数化构建(全局)
    复制代码

parameters {
string(name: ‘GIT_BRANCH’, defaultValue: ‘master’, description: ‘default build branch’)
}

调用:
echo “${params.name}”

复制代码

判断:

1.when 仅用于stage内部

  1. when 的内置条件
    复制代码

1). when {branch ‘master’} #当是master的时候,才执行某些事情
2). when {envionment name:‘DEPLOY_TO’,value:‘production’} #当环境变量name 的值是production的时候,才执行某些事情
3). when {expression {return params.DEBUG_BUILD}} #表达式的返回值是真的情况下,才执行
4). when {not {branch ‘master’}}            #不是master的情况下,执行
5). when {allOf {branch ‘master’; environment name: ‘DEPLOY_TO’,value:‘production’}} #当大括号中所有的项都成立,才去做某些事情
6). when {anyOf {branch ‘master’; branch ‘staging’}} #只要满足大括号里面的某一个条件,才去做某些事情

复制代码

11111

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Jenkins Pipeline是一种基于Groovy语言的DSL(领域特定语言),用于定义Jenkins的持续交付流程。它提供了一种结构化的方式来描述构建、测试和部署流程,并且可以与Jenkins的其他功能(如构建历史记录、构建参数、环境变量等)进行交互。Pipeline语法包括stage、step、agent、environment等关键字,可以根据需要进行自定义配置,以实现灵活的持续交付流程。 ### 回答2: Jenkins Pipeline是一种极致可扩展和可定制的工具,实现了流水线编排和代码管道,支持复杂的持续集成和交付场景。 Jenkins Pipeline的核心是Pipeline语法Pipeline语法用于定义流水线并规定构建和部署任务。Pipeline语法基于Groovy,它可以使用Pipeline DSL或Pipeline Script编写。在Pipeline中,任务被组织成各个阶段,并运行在各自的执行器中。 Pipeline DSL是一种基于领域特定语言(DSL)的语法,使得用户可以完整地描述Pipeline。通过DSL,用户可以定义任务阶段,执行的步骤以及选择如何处理错误和异常。用户也可以轻松地扩展DSL,以满足他们特定的要求。 Pipeline Script是Jenkins Pipeline的另一种语法,使用Jenkinsfile来定义,是用Groovy编写的。Jenkinsfile是一个包含Pipeline语法的文本文件,它通常存储在与项目源代码同一源代码管理系统(SCM)中。在Jenkinsfile中,用户可以定义Pipeline,并指定包含在该Pipeline中的代码。 Pipeline语法的核心概念是步骤。步骤是执行器中的一个操作,可以是任何命令行、脚本或Jenkins插件。Pipeline步骤可分为构建、测试、部署和其他一般任务。 Pipeline还支持流程控制,如循环、条件和并行执行。流程控制允许用户创建高度定制的Pipeline。 总之,Jenkins Pipeline是一个灵活、可扩展的流水线编排工具,使用Pipeline语法可以非常方便地定义和管理CI/CD流程,支持复杂的处理流程和自定义操作。同时,在使用常见的Jenkins插件方面也有更多的选择,由此带来更卓越的性能和可用性。 ### 回答3: Jenkins pipeline是一种将所有构建步骤整合到一个文件中的工作流框架。它可以自动化构建、测试和部署软件。它包含了一套DSL(领域特定语言)来定义构建流程。Pipeline可以将构建流程分为多个步骤来执行,并且可以让开发团队更加容易地可视化和监控流程完成情况。Pipeline提供了两种定义流程的方式:Declarative Pipeline和Scripted Pipeline。 Declarative Pipeline是一种较为简单的Pipeline语法,使用一些关键字和指令来定义构建流程。Declarative Pipeline 中,可以定义整个 Pipeline 的阶段,以及每个阶段中执行的具体任务。同时也可以定义参数、环境变量以及其他细节信息。 可以通过定义多个代理和运行环境来自动创建构建管道。Declarative Pipeline 通过类似于YAML的结构来生成 流水线。 Scripted Pipeline提供了更高级的构建控制,这是因为它是通过脚本进行定义的。 Scripted Pipeline较为灵活,在脚本语言中定义一组构建步骤。与Declarative Pipeline不同,Scripted Pipeline允许开发人员使用脚本语言的各种功能性来控制构建流程。可以在任务中编写Groovy语句,这样就可以编写复杂 Build 逻辑。 Pipeline中使用的关键字包括:pipeline、stage、steps等。 pipeline关键字用于定义整个流程,stage用于定义流程中的阶段,steps包含了流程中要执行的具体构建步骤。根据需要,Pipeline也提供了许多其他的命令。例如,env可以定义环境变量,script可以插入自定义的脚本。 总之,Jenkins Pipeline是一个高度可伸缩和可定制的构建框架,可以帮助你将构建、测试和部署流程自动化和可视化。通过DSL,jenkins pipeline提供了灵活和强大的语法来定义复杂流程,以及丰富的集成方式,使得它可以与其他工具协同,从而大大提高效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值