Jenkins是为了顺应以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发,也就是敏捷开发模型
传统的瀑布模型
上一个的输出是下一个的输入,没有迭代与反馈,也就代表了没有回头路可以走,对于后期的更改成本巨大
敏捷模型
符合现在互联网思想,快交付、以人为本,用户可以参与其中,小版本迭代升级,但是相对的也带来频繁的重复打包、构建、测试、上线等等的操作,这个部分就交给了Jenkins 来完成自动化的持续集成
Jenkins常用项目类型
- 自由风格软件项目(FreeStyle Project):基于web表单形式完成各个部分的功能
- 优点:简单
- 缺点:缺乏灵活性、不易配置、逻辑单一
- 流水线项目(Pipeline Project):基于DSL领域特定语言(Groovy语言)的方式定义jenkins任务
- 流水线分为2个种方式
- 声明式流水线:基于DSL编写,类似于web表单的形式,有固定的结构,相对于脚本式简单很多
- 脚本式流水线:基于DSL编程编写,更好的提供灵活性和使用混合编程结构处理逻辑流程、决策、赋值等
声明式流水线
Pipeline支持2种方式编写
- 直接编写到jenkins表单里
- 读取脚本文件文件内容,可以基于git拉取文件,便于统一管理(推荐)
script指的就是表单的方式
SCM就是读取文件
Pipeline结构
Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
stages {
stage('Build') {
steps {
echo 'Building..'
}
}
stage('Test') {
steps {
echo 'Testing..'
}
}
stage('Deploy') {
steps {
echo 'Deploying....'
}
}
}
}
一个整体就是可以理解为是Jenkinsfile
指令解释
jenkins大部分都可以通过自带的工具生成代码
agent
整个流水线运行在哪里,代理节点或者非代理(指令和阶段都可以指定)
- agent any :可以运行在任意的代理节点上
- agent none :不设置节点,每个阶段自己指定
- agent {label “label”} :选择带有标签的代理节点
- agent {docker “image”} :基于docker运行流水线
environment(可选)
设置环境变量,在整个流水线中可以使用(指令和阶段都可以指定)
- K = “V” :就是常规的变量 = 值 ,引用变量使用${K}
- K = credentials(‘credentials_id’):值可以指定凭证,填写凭证ID号
environment {
K = "V"
K = credentials("credentials_id")
}
tools
tools指令能帮助我们自动下载并安装所指定的构建工具,并将其加入 PATH 变量中
- tools指令默认支持3种工具:JDK、Maven、Gradle。通过安装插件,tools 指令还可以支持更多的工具
- 同样也支持手动安装tools
agent none的情况下不会生效
tools {
gradle "gradle3.2"
}
options
就是web表单上的general配置,jenkins预定义项目选项的地方
- buildDiscarder :保留指定数量的流水线执行结果
- disableConcurrenBuilds :关闭并发运行项目,防止同时访问共享,或者代理节点资源紧张情况下
- retry : 流水线失败的重试次数
- skipDefaultCheckout :跳过隐含的checkout scm全局源检查
- timeout :执行项目超时时间
- timestamps : 添加时间戳到控制台输出中
- skipStagesAfterUnstable :如果流水线中的一个阶段设置了不稳定状态,系统就不会处理剩余的阶段
关于语法,可以借助自带的工具或者查看详细的文档
options {
retry(3)
buildDiscarder logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '', daysToKeepStr: '7', numToKeepStr: '20')
}
文档:https://www.jenkins.io/doc/book/pipeline/syntax/#options
triggers
以什么方式触发自带构建项目,不支持多分支流水线,github团队/项目等等
- cron :就是类似crontab 配置规律的执行
- upstream : 指定当其他项目构建完成后触发当前的流水线项目自动构建
- poll scm : 定时扫描项目代码的改变,改变后自动触发构建
- git hook (需要安装插件):由gitlab或者github代码发生变更后通过web hook发送请求给jenkins来触发自动构建
cron语法
同样也是5个*代表规律
- 第一个* :小时(取值:1-60分钟)
- 第二个* :天 (取值:1-24小时)
- 第三个* :月(取值:1-31天)
- 第四个* :年 (取值:1-12月)
- 第五个* :周(取值:0-7)0和7都是表示星期日
H符号的含义
jenkins中多了一个H符号,jenkins为了避免所有的项目cron都同一时间执行带来的服务器压力,就希望通过散列算法来错开执行
- 语法 :H(start-end)
triggers {
cron 'H(0-10) * * * *'
}
#每10分内的某个时间里启动
triggers {
pollSCM 'H(0-10) * * * *'
}
#每10分内的某个时间里轮询扫描SCM的变化
parameters
用户输入或者api调用的项目参数,也就是web表达的This project is parameterized
- booleanParam :布偶类型,true/false参数
- choice :选项列表
- file :选择文件
- passwd :用户输入密码,文本是被隐藏的
- string :字符串
- run :运行用户从某个任务中选定一个运行
调用方式:params.参数名
echo "xxxx = ${params.参数名}"
libraries
共享库就是代码的集合,可以被流水线调度和使用
- 提供共享和包含公共代码的使用
- 封装不是声明式而且不能直接在一个流水线中使用的代码
stage解释
在stages内部有一个或者多个单独的阶段,都至少包含了一个或者多个DSL步骤,还可以引入指令定义一些变量、参数,全局变量等等
stages {
stage('Build') {
steps {
echo 'Building..'
}
}
stage('Test') {
steps {
echo 'Testing..'
}
}
}
- stages :代表阶段的一个整体块
- stage:单个阶段,格式:stage(名称),这个名称会显示在流水线流程图上
- steps :实际要执行的DSL步骤,支持echo、git、sh、mail等等有效语句,支持条件结构(与、或、非)
- post :可选项,同时可以在阶段和流水线中使用
- stage:单个阶段,格式:stage(名称),这个名称会显示在流水线流程图上
post解释
post同时可以在阶段和流水线中使用,在流水线结尾或者阶段结尾条件满足就会被执行
- always :总是执行步骤
- changed :当前构建状态与之前状态不同,执行步骤
- success :当构建状态成功,执行步骤
- failure :当构建失败,执行步骤
- unstable :当构建状态不稳定,执行步骤
stages {
stage('Build') {
steps {
echo 'Building..'
}
}
stage('Test') {
steps {
echo 'Testing..'
}
}
post {
always {
echo 'build stage complete'
}
}
}
Pipeline_syntax:https://www.jenkins.io/doc/book/pipeline/syntax/