一篇文章讲明白JenkinsPipelinescript指令创建和变量定义

简介: 一篇文章讲明白JenkinsPipelinescript指令创建和变量定义

一、Jenkins Pipeline

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

Stage:阶段,一个Pipeline可以划分成若干个Stage,每个Stage代表一组操作,例如:“Build”,“Test”,“Deploy”。

【注意】Stage是一个逻辑分组的概念,可以跨多个Node

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

Step:步骤,Step是最基本的操作单元,小到创建一个目录,大到构建一个Docker镜像,由各类Jenklins Plugin提供,例如:sh ‘make’

Pipeline五大特性

代码:Pipeline以代码的形式实现,通常被检入源代码控制,使团队能够编辑、审查和迭代其CD流程。

可持续性:Jenklins重启或者中断后都不会影响Pipeline Job。

停顿:Pipeline可以选择停止并等待任工输入或批准,然后再继续Pipeline运行。

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

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

声明式Pipeline的基本语法和表达式遵循与Groovy语法相同的规则,但有以下例外:

1、声明式pipeline必须包含在固定格式pipeline{}快内

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

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

4、属性引用语句被视为无参数方法调用。例:输入被视为 input()

块(blocks{})

由大括号括起来的语句,如pipeline{},Section{},parameters{},script{}

章节(Sections)

通常包含一个或多个指令或步骤。如 agent 、post、stages、steps

指令(Directives)

environment、options、parameters、triggers(触发)、stage、tools、when

步骤(Steps)

Pipeline steps reference

执行脚本式pipeline:使用script{}

指令agent

必须存在,agent必须在pipeline块内的顶层定义,但stage内是否使用使可选的

指令stages 必须,包括顺序执行的一个或多个stage命令,在pipeline内仅能使用一次,通常位于agent/options后面,例子如上

指令steps 必须,steps位于stage指令块内部,包括一个或多个step。仅有一个step的情况下可以忽略关键字step及其{},例子如上

指令environment 不是必须的,该environment指令指定一系列键值对,这些对值将被定义为所有步骤的环境变量或阶段特定步骤,具体取决于environment指令位于Pipeline中的位置。

解释一下什么意思,environment{…}, 大括号里面写一些键值对,也就是定义一些变量并赋值,这些变量就是环境变量。环境变量的作用范围,取决你environment{…}所写的位置,你可以写在顶层环境变量,让所有的stage下的step共享这些变量,也可以单独定义在某一个stage下,只能供这个stage去调用变量,其他的stage不能共享这些变量。一般来说,我们基本上上定义全局环境变量,如果是局部环境变量,我们直接用def关键字声明就可以,没必要放environment{…}里面。

environment //代码效果参考:http://www.zidongmutanji.com/zsjx/593349.html

{CC='clang'}

environment {AN_ACCESS_KEY = credentials('my-prefined-secret-text')}

steps {sh 'printenv'}

指令options ,该options指令允许在Pipeline本身内配置Pipeline专用选项,不是必须的 预定义pipeline专有的配置信息,仅可定义一次

pipeline {

agent any

options{

timeout(time:1,unit: 'HOURS')

}

...

}

指令parameters ,改parameters是参数的意思,不是必须的 定义参数化构建的参数,可选参数如下:

booleanParam布尔值参数

就是定义一个布尔类型参数,用户可以在Jenkins UI上选择是还是否,选择是表示代码会执行这部分,如果选择否,会跳过这部分。一般需要使用布尔值的场景有,执行一些特定集成的脚本或则工作,或者事后清除环境,例如清楚Jenkins的workspace这样的动作。

Pipeline {

agent any

parameters {

booleanParam(name: 'DEBUG_BUILD', defaultValue: true, description: '')

}

}

choice选择参数

#选择(choice)参数就是支持用户从多个选择项中,选择一个值用来表示这个变量的值。工作中常用的场景,有选择服务器类型,选择版本号等。

Pipeline {

agent any

parameters {

choice(name: 'ENV_TYPE', choices: 【'test', 'dev', 'product'】, description: 'test //代码效果参考:http://www.zidongmutanji.com/bxxx/275230.html

means test env,….')

}

}

file文件参数

文件(file)参数就是在Jenkins 参数化构建UI上提供一个文件路径的输入框,Jenkins会自动去你提供的网络路径去查找并下载。一般伴随着还有你需要在Pipleline代码中写解析文件。也有这样场景,这个构建job就是把一个war包部署到服务器上特定位置,你可以使用这个文件参数。

Pipeline {

agent any

parameters {

name: 'FILE', description: 'Some file to upload')

}

}

text文本参数

文本(text)的参数就是支持写很多行的字符串:

Pipeline {

agent any

parameters {

text(name: 'Welcome_text', defaultValue: 'One\nTwo\nThree\n', description: '')

}

}

password密码参数

密码(password)参数就是在Jenkins 参数化构建UI提供一个暗文密码输入框,例如,我需要在一些linux机器上做自动化操作,需要提供机器的用户名和密码,由于密码涉及安全问题,一般都采用暗文显示,这个时候你就不能用string类型参数,就需要使用password参数类型。

Pipeline {

agent any

parameters {

password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'A secret password')

}

}

string字符串参数

就是定义一个字符串参数,用户可以在Jenkins UI上输入字符串,常见使用这个参数的场景有,用户名,收件人邮箱,文件网络路径,主机名称的或者url等

Pipeline {

agent any

parameters {

string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '')

}

}

tool字符串参数

定义自动安装和放置工具的部分PATH。如果agent none指定,这将被忽略。特点:只支持定义maven jdk gradle三种工具的环境变量。代码举例:

pipeline {

agent any

tools {

// Install the Maven version configured as "M3" and add it to the path.

maven "M3"

}

}

多参数情况

paramenters {

choice(name:'PerformMavenRelease',choices:'False\nTrue',description:'desc')

   choice(name:'ENV_TYPE',choices:【'test', 'dev', 'product'】,description:'test means test env,…')

   password(name:'CredsToUse',description:'Apassword to build with',defaultValue:'')

   string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '')

}

environment {

BUILD_USR_CHOICE="${params.PerformMavenRelease}"

BUILD_USR_CREDS="${params.CredsToUse}"

}

二、快速创建一个pipeline

  1.新建 Item ,点击红框中的"新建Item":

  2.新建 pipeline,输入任务名称,点击红框中的"新建流水线",点击确定:

  3.接下来会弹出详细设置的表单,如下图,选择"流水线"的Tab页,在页面上直接输入一段pipeline内容,再点击左下角的"保存"按钮:

pipeline script参考:

pipeline{

agent any

stages {

stage('Build') {

steps{

echo 'This is a build step'

}

}

stage('Test') {

steps{

echo 'This is a test step'

}

}

stage('Deploy') {

steps{

echo 'This is a deploy step'

}

}

}

}

  4.点击下图红框中的"立即构建",即可执行刚才输入的pipeline脚本:

  5.任务执行完毕后如下图所示,点击红框中的图标,即可查看本次任务执行过程中的控制台输出:

常用的辅助工具

· Snipper Generator(代码片段生成器,语法检查器)

· Replay Pipeline(重放pipeline,可以修改script,修改后的不存入config.xml)

· DSL Reference 语法参考手册

· 全局变量引用

· Stage View

· BlueOcean(可视化)

· Pipeline神器:可视化编辑器

· 命令行Pipeline调试工具

三、变量的传递

自定义变量(局部)

def username = 'Jenkins'

echo "Hello Mr.${username}"

#注意一定要用双引号,单引号识别为字符串

  2.环境变量(局部)

withEnv(【'MYTOOL_HOME=/usr/local/mytool'】){

sh '$MYTOOL_HOME/bin/start'

}

  3.环境变量(全局)

environment {CC='clang'}

echo "Compiler is ${env.CC}"

  4.参数化构建(全局)

parameters {string(name:'Jenkins',defaultValue:'Hello',description:'How should I greet the world')}

ehco "${params.Greeting} World!"

判断

when仅用于stage内部

when的内置条件为:

- when {branch 'master'}

- when {environment name:'DEPLOY_TO',value:'production'}

#当有环境变量 name 为 DEPLOY_TO 值是 production 条件成立

- when {expression {return params.DEBUG_BUILD}}

#表达式返回值为真时

- when {not {branch 'master'}}

- when {allOf {branch 'master'; environment name:'DEBUG_TO',value:'production'}}

#allOf 所有条件都满足时

- when {anyOf {branch 'master' ; branch 'staging'}}

#anyOf有一个条件满足时即可

判断和异常处理

流程控制if/else条件

node {

stage('Example'){

if(env.BRANCH_NAME == 'master'){

echo 'I only execute on the master branch'

}else {

echo 'Iexecute elsewhere'

}

}

}

循环

for循环仅存在域脚本式pipeline中,但是可以通过在声明式pipeline中调用script step来执行

pipeline {

agent any

stages {

stage('Example'){

steps{

echo 'Hello world!'

script {

def browsers = 【'chrome','firefox'】

for (int i = 0;i < browers.size();++i){

echo "Testing the ${browsers【i】} browser"

}

}

}

}

}

}

实操举例:

pipeline {

agent any

  tools {定义maven工具和变量}

environment {定义Git地址,服务器IP,服务器目录}

parameters {定义参数默认值,名称,定义trim函数移除字符串两侧的空白字符或其他预定义字符}

stages {

stage('checkout')检出步骤

stage('build')编译步骤

stage('deploy')部署步骤

}

}

pipeline {

agent any

tools {

// Install the Maven version configured as "M3" and add it to the path.

maven "M3"

}

environment {

GIT_URL = ""

// APP_NAME = "bigdata-pv"

REMOTE_IP = "10.191.X.XXX"

REMOTE_DIR = "/opt/backend/"

}

parameters {

string defaultValue: 'master', description: '', name: 'BRANCH_TAG', trim: true

}

stages {

stage('checkout') {

steps {

// Get some code from a GitHub repository

checkout(【$class: 'GitSCM', branches: 【【name: '${BRANCH_TAG}'】】,

相关文章
|
1月前
|
存储 C++ 容器
学会在 C++ 中使用变量:从定义到实践
C++中的变量是数据容器,包括`int`、`double`、`char`、`string`和`bool`等类型。声明变量时指定类型和名称,如`int myNum = 15;`。`cout`与`&lt;&lt;`用于显示变量值。常量用`const`声明,值不可变。变量名应唯一,遵循特定命名规则,常量声明时需立即赋值。
131 1
|
2天前
|
jenkins Java 持续交付
一篇文章讲明白JenkinsPipelinescript指令创建和变量定义
一篇文章讲明白JenkinsPipelinescript指令创建和变量定义
|
1月前
|
C++
c++引用是什么意思?
c++引用是什么意思?
12 2
|
1月前
|
Python
Python的全局变量作用于整个程序,生命周期与程序相同,而局部变量仅限函数内部使用,随函数执行结束而销毁。
【5月更文挑战第11天】Python的全局变量作用于整个程序,生命周期与程序相同,而局部变量仅限函数内部使用,随函数执行结束而销毁。在函数内部修改全局变量需用`global`关键字声明,否则会创建新局部变量。
119 2
|
8月前
|
Python
python之数据的赋值方式,变量内存地址的获取方式,获取变量名的方法,不同方法之间的区别
python之数据的赋值方式,变量内存地址的获取方式,获取变量名的方法,不同方法之间的区别
|
1月前
|
存储 编译器 C++
c++ 变量详细解释
c++ 变量详细解释
50 0
|
10月前
|
缓存 运维 监控
【运维知识进阶篇】Ansible变量详解(变量定义+变量优先级+变量注册+层级定义变量+facts缓存变量)
【运维知识进阶篇】Ansible变量详解(变量定义+变量优先级+变量注册+层级定义变量+facts缓存变量)
161 0
|
11月前
|
Python
#PY小贴士# for 循环定义的变量,循环外可以用吗?
我们知道,在 python 中要获取一个变量的值,必须是先给它赋值过,不然就是未定义。那么这个 i,代码中没有显式的赋值,在循环体之外还可以用吗?
|
C语言
复习C部分:1.第一个C语言项目 2.初识数据类型 3.初识数据类型----变量和常量 4.初识变量的作用域和生命周期
复习C部分:1.第一个C语言项目 2.初识数据类型 3.初识数据类型----变量和常量 4.初识变量的作用域和生命周期
75 0
复习C部分:1.第一个C语言项目 2.初识数据类型 3.初识数据类型----变量和常量 4.初识变量的作用域和生命周期
函数的作用
函数的作用
88 0