jenkinsPipline庖丁解牛
51reboot 将在9月12日晚21:00 为大家带来新一轮的直播分享,本次直播分享结合实际工作实战案例为大家带来 Jenkins Pipline 必知必会的一些知识。
主要内容如下:
- Pipline 语法讲解
- Pipline 项目实战-Maven JAVA 项目构建
- Pipline 项目实战-NodeJS 项目构建
- 分享一个多语言构建的 Pipeline 小栗子
1. Pipline 的组成
Jenkins Pipeline(或简称为Pipeline,大写字母为P)是一套插件,支持在Jenkins中实现和集成连续交付管道
一个持续交付(CD)管道是一直到你的用户和客户的过程正从版本控制软件的自动化表达。对软件的每次更改(在源代码管理中提交)都会在发布的过程中经历一个复杂的过程。此过程涉及以可靠且可重复的方式构建软件,以及通过多个测试和部署阶段推进构建的软件(称为构建)。
Pipeline提供了一组可扩展的工具,用于通过管道域特定语言(DSL)语法 作为代码对简单到复杂的传输管道进行建模 。
Jenkins管道的定义被写入一个文本文件(称为a Jenkinsfile),该文件 又可以提交给项目的源代码控制存储库。这是作为代码的管道的基础; 将 CD 管道视为应用程序的一部分,以便像任何其他代码一样进行版本控制和审查。
2. 为什么要使用 pipeline ?
Pipeline 五大特性
代码:Pipeline 以代码的形式实现,通常被检入源代码控制,使团队能够编辑、审查和迭代其 CD 流程。
可持续性:Jenklins 重启或者中断后都不会影响 Pipeline Job。
停顿:Pipeline 可以选择停止并等待任工输入或批准,然后再继续 Pipeline 运行。
多功能:Pipeline 支持现实世界的复杂 CD 要求,包括 fork/join 子进程,循环和并行执行工作的能力
可扩展:Pipeline 插件支持其 DSL 的自定义扩展以及与其他插件集成的多个选项。
3. Pipeline 的语法
- Declarative 声明式
- Scripted pipeline 脚本式
4. Pipline Declarative 格式
pipeline{agentanystages{stage(Build){steps{shecho Build}}stage(Test){steps{shecho Test}}stage(Deploy){steps{shecho Deploy}}}}
pipeline:代表整条流水线,包含整条流水线的逻辑。
- stages 部分:流水线中多个 stage 的容器。stages 部分至少包含一个stage。
- stage 部分:阶段,代表流水线的阶段。每个阶段都必须有名称。本例中,build 就是此阶段的名称。
- steps 部分:代表阶段中的一个或多
5. Scripted Pipeline
Scripted Pipeline对语法的要求比较宽松,顶层可以是 node,也可以是stage。node 可以嵌套stage,stage 反过来也可以嵌套 node。典型的脚本式 Pipeline 语法如下:
node{//node可以指定label例如node(label_name){}stage("Build"){shecho Building...}stage("Test"){shecho Testing...}}
6. Pipline Declarative 参数详解
pipeline{agentanyoptions{buildDiscarder(logRotator(numToKeepStr:1))timeout(time:1,unit:HOURS)}parameters{string(name:example,defaultValue:this is example,description:this is description)}environment{NODEJS_HOME="${tool nodejs}"PATH="${env.NODEJS_HOME}/bin:${env.PATH}"}tools{mavenmaven-3//这里是全局工具配置的名字,要对应nodejs"nodejs" //这里是全局工具配置的名字,要对应gradle"Gradle" //这里是全局工具配置的名字,要对应}stages{stage(Example){steps{echo"$NODEJS_HOME"echoHello Worldecho"Hello ${params.example}"shmvn --versionshnode --version}}}post{always{echoI will always say Hello again!}}}
有效的Declarative Pipeline必须包含在一个pipeline块内,例如:
pipeline { /* insert Declarative Pipeline here */ }
①.agent
agent部分指定整个Pipeline或特定阶段将在Jenkins环境中执行的位置,具体取决于该agent 部分的放置位置。该部分必须在pipeline块内的顶层定义
参数:
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 }或
②.stages部分
流水线中多个stage的容器。stages部分至少包含一个stage。
③.stage部分
阶段,代表流水线的阶段。每个阶段都必须有名称。本例中,build就是此阶段的名称。
④.steps部分
代表阶段中的一个或多
⑤.发布 post
post定义将在Pipeline运行或stage结束时运行的操作。一些条件后 的块的内支持post: always,changed,failure,success,unstable,和aborted。这些块允许在Pipeline运行或stage结束时执行步骤,具体取决于Pipeline的状态。
参数:
always: 无论Pipeline运行的完成状态如何都会运行。
changed: 只有当前Pipeline运行的状态与先前完成的Pipeline的状态不同时,才能运行。
failure: 仅当当前Pipeline处于失败状态时才运行,通常在Web UI中用红色指示表示。
success: 仅当当前Pipeline具有成功状态时才运行,通常在具有蓝色或绿色指示的Web UI中表示。
unstable: 只有当前Pipeline具有不稳定状态,通常由测试失败,代码违例等引起,才能运行。通常在具有黄色指示的Web UI中表示。
aborted: 只有当前Pipeline处于中止状态时,才会运行,通常是由于Pipeline被手动中止。通常在具有灰色指示的Web UI中表示。
cleanup: 无论管道或stage的状态如何,在跑完所有其他的post条件后运行此条件下 的post步骤
⑥.Environment
指令指定一系列键值对,这些键值对将被定义为所有step或特定stage的step的环境变量,具体取决于environment指令位于Pipeline中的位置。
⑦.Options
指令允许在Pipeline内配置Pipeline专用选项。Pipeline提供了许多这些选项,例如buildDiscarder,但它们也可能由插件提供,例如 timestamps。
可用选项
buildDiscarder : 持久化工件和控制台输出,用于保存Pipeline最近几次运行的数据。
例如:options { buildDiscarder(logRotator(numToKeepStr: 1)) }
checkoutToSubdirectory: 在工作区的子目录中执行源代码检出。
例如:options { checkoutToSubdirectory(foo) }
disableConcurrentBuilds: 不允许并行执行Pipeline。可用于防止同时访问共享资源等。
例如:options { disableConcurrentBuilds() }
preserveStashes: 保留已完成构建的存储,用于stage重新启动。
例如:options { preserveStashes() }
保存最近完成的构建中的stash,或者
options { preserveStashes(5) }
保留最近五个完成的构建中的stash。
quietPeriod: 设置管道的静默期(以秒为单位),覆盖全局默认值。
例如:options { quietPeriod(30) }
retry: 如果失败,请按指定的次数重试整个管道。
例如:options { retry(3) }
skipDefaultCheckout: 在agent指令中默认跳过源代码检出。
例如:options { skipDefaultCheckout() }
skipStagesAfterUnstable: 一旦构建状态进入了不稳定状态,就跳过stage。
例如:options { skipStagesAfterUnstable() }
timeout: 设置Pipeline运行的超时时间,之后Jenkins应该中止Pipeline。
例如:options { timeout(time: 1, unit: HOURS) }
timestamps: 当执行时,预处理由Pipeline生成的所有控制台输出运行时间。
例如:options { timestamps() }
⑧.parameters
parameters指令提供用户在触发Pipeline时应提供的参数列表。这些用户指定的参数的值通过该params对象可用于Pipeline步骤
可用参数
string: 字符串类型的参数
例如:parameters { string(name: DEPLOY_ENV, defaultValue: staging, description: ) }
文本: 一个text参数,可以包含多行
例如: parameters { text(name: DEPLOY_TEXT, defaultValue: One\nTwo\nThree\n, description: ) }
booleanParam: 一个布尔参数,例如:
parameters { booleanParam(name: DEBUG_BUILD, defaultValue: true, description: ) }
choice: 选择参数
例如: parameters { choice(name: CHOICES, choices: [one, two, three], description: ) }
file: 一个文件参数,指定用户在计划构建时要提交的文件
例如: parameters { file(name: FILE, description: Some file to upload) }
password: 密码参数
例如: parameters { password(name: PASSWORD, defaultValue: SECRET, description: A secret password) }
⑨.工具 tools(用的比较多)
定义自动安装和放置工具的部分PATH。如果指定agent none,这将被忽略。
支持的工具
maven
jdk
Gradle
nodejs
7. Pipline 支持的指令
Jenkins pipeline支持的指令有:
• environment:用于设置环境变量,可定义在stage或pipeline部分。
• tools:可定义在pipeline或stage部分。它会自动下载并安装我们指定的工具,并将其加入PATH变量中。
• input:定义在stage部分,会暂停pipeline,提示你输入内容。
• options:用于配置Jenkins pipeline本身的选项,比如options 2次。options指令可定义在stage或pipeline部分。
• parallel:并行执行多个step。在pipeline插件1.2版本后,parallel开始支持对多个阶段进行并行执行。
• parameters:与input不同,parameters是执行pipeline前传入的一些参数。
• triggers:用于定义执行pipeline的触发器。
• when:当满足when定义的条件时,阶段才执行。
在使用指令时,需要注意的是每个指令都有自己的作用域。如果指令使用的位置不正确,Jenkins将会报错
8.pipeline中使用脚本
pipeline{agentanystages{stage(Build){steps{shecho Build}}stage(Test){steps{shecho Test}}stage(Deploy){steps{script{echo"$num"if("$num" == 0 ) {echo"ok"}else{echo"Error"}}}}}}
传入参数num 如果 等于0 打印ok 否则 打印Error
项目实战
......
参与方式
本次内容分享时间:9.12日21:00
扫码添加小助手微信17812796384,备注【jenkins】,获取直播地址,也可进入直播分享群。
提示管理员秘密从/var/jenkins_home/secrets/initialAdminPassword路径获取(对于使用war包或者rpm包安装的Jenkins路径可能会有所差异),如果使用rpm方式或者war包安装,直接在jenkins所在服务器上cat一下该文件即可,如果是docker方式安装,可根据上面获取的Container_ID或者Container_name执行docker命令:
$dockerexec-it jenkins cat /var/jenkins_home/secrets/initialAdminPassword1dc17f65d83c4c56b13cbae230b5e7c6
获取到密码,密码输入成功后:
选择安装所需插件(如:gradle,maven,ant……),同样也可忽略这一步,后面有需要再安装所需插件,由于网络原因,安装时间可能有点长,需要耐心等待(或者参考下面的"修改插件更新源")。然后设置好管理员用户名和密码登录即可,下面就是安装好后的jenkins界面。
到这里 jenkins 就安装完成。
Jenkins基础配置
系统管理
安装好Jenkins后,首先来看一下Jenkins中的系统管理(Manage Jenkins)面板。系统管理面板是整个Jenkins管理、配置、维护的入口。该面板下包含多个菜单项,默认包括如下:
Configure System(系统配置):该菜单用来设置Jenkins的全局配置以及各种工具插件的全局配置,包括jenkins的工作目录、可同时构建的job的数量、jdk环境变量等等。
Jenkins的安装配置与日常维护
Jenkins安装与系统管理