Linux自动化--Jenkins构建之 1.Pipline详解
注:为方便讲解,Jenkins仪表盘语言显示调节为中文,如使用英文仪表盘同版本Jenkins仪表盘图标和位置为相同的。
1.Jenkins-Credentials
可以理解为“钥匙”,比如以git(版本控制器)为例来进行说明,当访问gitlab时,gitlab是需要提供相应登录的的账号与密码。那么假如说我们把要访问的URL(*.git.project-shell.git)地址理解为锁,那么所提供的账号与密码就对应于开这把锁的钥匙(无论是用ssh认证,http或者https方式认证),所以说“Credentials”中所记录的这类钥匙,而该钥匙(凭据)对应的锁是有多种可能的,可能是git,也可能是SVN等,而“Credentials”就是对于这些钥匙所进行的统一管理。
注:全局凭据/凭据都可以作为认证方式,不同的是,全局凭据在整个Jenkins总项目中的任何项目可以调用凭据作为认证,而在某个项目中创建非全局凭据仅用于该项目的认证,如果是个人人账号则更为安全。
1.1 添加Credentials
[root@jenkins-server1 ~]# cat /root/.ssh/id_rsa
2. Jenkins-Pipeline流水线
jenkins的pipeline功能,在一线企业收到广泛的应用;
Jenkins Pipeline :Pipeline,简言之,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化,即通过Jenkins相关流程、配置、插件工具等,行程一套自动化的流水线,大大节约人工。
Pipeline是Jenkins2.X的最核心的特性,帮助Jenkins实现从CI到CD与DevOps的转变 ,Pipeline是一组插件,让Jenkins可以实现持续交付管道的落地和实施。
持续交付管道(CD Pipeline)是将软件从版本控制阶段到交付给用户或客户的完整过程的自动化表现。软件的每一次更改(提交到源代码管理系统)都要经过一个复杂的过程才能被发布。
Pipeline提供了一组可扩展的工具,通过Pipeline Domain Specific Language(DSL)syntax可以达到Pipeline as Code(Jenkinsfile存储在项目的源代码库)的目的。
2.1 Jenlins Pipeline的基础语法
Pipeline脚本是由Groovy语言实现(无需专门学习)
支持两种语法
Declarative 声明式(在Pipeline plugin 2.5中引入)
Scripted Pipeline 脚本式
2.2 声明式(jenkins2.5新加入的语法)
特点:
1. 最外层必须由pipline{ //do something }来进行包裹
2. 不需要分号作为分隔符,每个语句必须在一行内
3. 不能直接使用groovy语句(例如循环判断等),需要被script {}包裹
声明式pipeline案例:
pipeline {agent any //没有指定agentstages{ //步骤stage('checkout code'){ //第一个步骤steps{sh 'echo "打印出来的标识"'}}}
}
pipeline{agent anystages{stage('mvn-version'){steps{sh 'mvn -v'}}stage('jdk-version'){steps{sh 'java -version'}}}
}
1.参数详解
agent:该部分指定整个Pipeline或特定阶段将在Jenkins环境中执行的位置,具体取决于该agent 部分的放置位置。该部分必须在pipeline块内的顶层定义 ,也可以使用在stage级。
stage:表示这个Pipeline的某一个执行阶段(使用stage使得逻辑变得更加简单明了)
steps: 包含一个或者多个在stage块中执行的step序列(在这里执行操作:运行maven或者部署等等)
environment:指定键值对,可用于step中,主要是为常量或者变量赋值,根据所在的位置来决定其作用范围(类似于java中全局和局部的概念)
options:允许执行pipeline内置的专用选项,也可以使用由插件提供的
parameters:提供触发pipeline时的参数列表
trigger:定义了触发pipeline的方式(jenkins1.x中的pollscm定时构建)
tools:自动安装工具,注意这里使用的一定是在jenkins全局配置中已经定义好了的
when:可以用来执行一些代码逻辑
post:可以根据pipeline的状态来执行一些操作
agent的一些参数如下:
any : 在任何可用的机器上执行pipeline
none : 当在pipeline顶层使用none时,每个stage需要指定相应的agent
agent{ label 'slave1'}
3.agent指定
3.1 labels
pipeline{agent { label 'master'} //指定在哪个节点运行,后面的步骤都在指定的节点运行stages{stage('mvn-version'){steps{sh 'mvn -v'}}stage('jdk-version'){steps{sh 'java -version'}}}
}
3.2 agent none
pipeline{agent none //如果这里是none,后面每一步,都要指定运行节点stages{stage('mvn-version'){agent { label 'master'}steps{sh 'mvn -v'}}stage('jdk-version'){agent { label 'node'}steps{sh 'java -version'}}}
}
3.3 agent docker
pipeline {agent {docker { image 'maven:latest' }}stages {stage('Test') {steps {sh 'mvn -v'}}}
}
3.4 options
## 设置保存最近的记录
options { buildDiscarder(logRotator(numToKeepStr: '1')) }## 禁止并行构建,因为用的worksapce还是同一个
options { disableConcurrentBuilds() }## 跳过默认的代码检出
options { skipDefaultCheckout() }## 设定流水线的超时时间(可用于阶段级别)
options { timeout(time: 1, unit: 'HOURS') }## 设定流水线的重试次数(可用于阶段级别)
options { retry(3) }## 设置日志时间输出(可用于阶段级别)
options { timestamps() }#示例:
pipeline {agent anyoptions {buildDiscarder(logRotator(numToKeepStr: '1'))disableConcurrentBuilds()skipDefaultCheckout()timeout(time: 1, unit: 'HOURS')timestamps()retry(3)}stages {stage ('test1') {environment {name = 'vc'}steps {sh 'echo "The username is ${name}"'}}}
}
3.5 environment
pipeline {agent anyenvironment {unit_test = 'ops'username = 'yongchina'company = 'inc'}stages {stage('Example') {steps {sh 'echo ${username} 在 ${company} work ${unit_test}' }}}
}
3.6 parameters
pipeline {agent anyenvironment {unit_test = 'true'username = 'youngchina'company = 'inc'}parameters {string defaultValue: 'jenkins:1.1.1', description: 'version', name: 'Version', trim: true}stages {stage('Example') {steps {sh 'echo ${username} 在 ${company} work ${unit_test}的' echo "${params.Version}"}}}
}
3.7 tools
// String description = "版本号"
pipeline {agent anyenvironment {unit_test = 'true'username = 'youngchina'company = 'inc'}parameters {string defaultValue: 'jenkins:1.1.1', description: 'version', name: 'Version', trim: true}tools {maven 'maven-jdk8'jdk 'java1.8'}stages {stage('Example') {steps {sh 'echo ${username} 在 ${company} work ${unit_test}的' echo "${params.Version}"sh 'java -version'sh 'mvn -v'}}}
}
3.8 Parallel并串行化
// String description = "版本号"
pipeline {agent anystages {stage('Stage1') {steps {sh 'echo "步骤1"'}}stage('并行执行的 Stage') {parallel {stage('Stage2.1') { //Stage2.1、2.2和2.3是并行的,但是Stage2.3中的2步仍是串行的// agent { label "test1" }steps {echo "在 agent test1 上执行的并行任务 1."}}stage('Stage2.2') {// agent { label "test2" }steps {echo "在 agent test2 上执行的并行任务 2."}}stage('Stage2.3') {stages {stage ('串行1') {steps {echo "在 agent test2 上执行的串行任务 1."} }stage ('串行2') {steps {echo "在 agent test2 上执行的串行任务 2."}}}}}}}
}
3.9 post钩子
post 步骤在Jenkins pipeline语法中是可选的,包含的是整个pipeline或阶段完成后一些附加的步骤。 比如我们希望整个pipeline执行完成之后或pipeline的某个stage执行成功后发生一封邮件,就可以使用post,可以理解为”钩子“。根据pipeline或阶段的完成状态,post部分分成多种条件块,包括:
• always:不论当前完成状态是什么,都执行。
• changed:只要当前完成状态与上一次完成状态不同就执行。
• fixed:上一次完成状态为失败或不稳定(unstable),当前完成状态为成功时执行。
• regression:上一次完成状态为成功,当前完成状态为失败、不稳定或中止(aborted)时执行。
• aborted:当前执行结果是中止状态时(一般为人为中止)执行。
• failure:当前完成状态为失败时执行。
• success:当前完成状态为成功时执行。
• unstable:当前完成状态为不稳定时执行。
• cleanup:清理条件块。不论当前完成状态是什么,在其他所有条件块执行完成后都执行。post部分可以同时包含多种条件块。以下是 post 部分的完整示例
pipeline {agent { label 'master' }stages {stage('buildCode') {steps {echo "building all codes1"} post {always {echo 'scp code.tar to apps'}}}}post {changed {echo 'pipeline post changed'}always {echo 'pipeline post always'}success {echo 'pipeline post success'}// 省略其他条件块}
}
//failure测试
pipeline {agent { label 'master' }stages {stage('buildCode') {steps {echo "building all codes1"} post {always {sh 'mkdir /opt/a/ab' //这一步是会失败的}}}}post {failure {echo 'pipeline post failure' //会执行这一步}}
}
3.10 when
指令2: when该when指令允许Pipeline根据给定的条件确定是否执行该阶段。该when指令必须至少包含一个条件。如果when指令包含多个条件,则所有子条件必须为舞台执行返回true。这与子条件嵌套在一个allOf条件中相同(见下面的例子)。更复杂的条件结构可使用嵌套条件建:not,allOf或anyOf。嵌套条件可以嵌套到任意深度。When{…}是写在stage{…}里面一层条件控制,下面来看看when{…}支持的一些内置条件命令。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' } }
举例一个 使用expression条件的when的代码示例。
pipeline {agent anystages {stage('Example Build') {steps {script {echo 'Hello World'}}}stage('Example Deploy') {when {expression { return (1 == 1) //返回值为True}}steps {echo 'Deploying'}}}
}
##environment测试
##environment测试
pipeline {agent anyenvironment {username = 'youngchina'}stages {stage('Example Build') {steps {script {echo 'Hello World'}}}stage('Example Deploy') {when {environment name: 'username', value: 'youngchina'}steps {echo 'youngchina'}}}
}
Linux自动化--Jenkins构建之 1.Pipline详解相关推荐
- Linux中的软件源详解,linux软件管理构建本地源实例详解
构建本地光盘源 1.将本地光盘挂载/mnt下, mount /dev/cdrom /mnt 2.在/etc/yum.repos.d/目录下创建自己的源文件,文件名称自定义,必须以repo结尾, 3.此 ...
- linux开发 | 根文件系统构建实验及过程详解
<2.uboot和系统移植-第19部分-2.19.根文件系统构建实验及过程详解> 第一部分.章节目录 2.19.1.根文件系统的构建路线 2.19.2.busybox的移植实战 2.19. ...
- jenkins流水线(jenkinsfile)详解,保姆式教程
jenkins流水线(jenkinsfile)详解 在学习本篇文章的时候,可以去看看jenkins官网的文档,jenkins官网支持中文,观看十分便捷 此教程使用的是gitee+docker+jenk ...
- linux oracle 用户创建,LINUX下Oracle数据库用户创建方法详解
本文实例分析了LINUX下Oracle数据库用户创建方法.分享给大家供大家参考,具体如下: 1)登录linux,以oracle用户登录(如果是root用户登录的,登录后用 su - oracle命令切 ...
- Linux文本处理必杀技之awk应用详解
AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一.这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德·艾侯.彼得·温伯格和布莱恩·柯林汉姓氏的首个字母 ...
- Linux redis安装教程,Linux 下redis5.0.0安装教程详解
Linux redis5.0.0安装,教程如下所示: 1.从官网下载,然后传到服务器,tar -zxvf解压 2.进入redis ? 3.安装:make, (1)若提示:: gcc: Command ...
- Linux中history历史命令使用方法详解
在/etc/profile里添加如下:#History export HISTTIMEFORMAT="[%F %T]" HISTDIR=/home/common/.hist if ...
- linux查看根目录使用率,Linux 查看空间使用情况的实例详解
Linux 查看空间使用情况的实例详解 在日常的Linux巡检中,我们会遇到文件系统目录使用空间很高的情况,例如如下利用"df -h "查看到根目录空间使用超过80%.而我们仅仅知 ...
- linux的阻塞waitqueue,Linux阻塞控制 wait_event与wait_event_interruptible函数详解
Linux阻塞控制 wait_event与wait_event_interruptible函数详解 最近研究了一下linux驱动对进程的阻塞与非阻塞的控制,感觉linux对进程的控制真的是牛逼,各种进 ...
最新文章
- 69.2. wget - retrieves files from the web
- Linux命令 查看文件中指定行号的内容
- FreeType(字体渲染引擎):支持多种字体格式(TTF,TTC等)
- Maven 配置文件 POM 的常用依赖配置代码
- React之setState使用
- javaScript命名规范
- B端——复杂业务表单设计
- 网吧版XP系统制作与优化终极版(转)
- 如何查询手机当前基站编号信息
- Android模拟器群控,安卓模拟器多开哪个好 流畅不卡、省资源、群控刷机都有
- 二元二次不定方程(佩尔方程)
- 天梯赛题目练习——查询水果价格(附带测试点)
- 【Unity2D好项目分享】提高游戏人物打击感
- sublime主题配色
- Android 高仿腾讯旗下app的 皮肤加载技术
- mysql bitmap index_位图索引:原理(BitMap index)
- cocos2dx fnt字体、自定义字体制作
- 蓝奏云打不开解决方法
- BYK-A500消泡剂:泡沫的一切都在计算中
- ASP.NET验证控件合集 含代码演示
热门文章
- SpringBoot 开启Druid监控统计功能
- Ipad/Iphone键盘输入慢、切换数字键盘慢的问题-iOS
- WAV格式音频转G.711A
- 如何用WordPress+SRS做直播网站
- docker入门(启用容器)
- python基础笔记(二)
- tower(普及组多校模拟赛)
- 小米8探索版android版本,小米 8 透明探索版,首款 Android Face ID 手機,支援螢幕下指紋辨識...
- babelrc 和 babel.config.js区别
- Oracle-创建表以及插入数据一