2.1.1、为什么使用pipeline?

本质上,jenkins是一个自动化引擎,它支持许多自动模式。流水线向Jenkins添加了一组强大的工具,支持用例、简单的持续集成到全面的持续交付流水线。 通过对一系列的发布任务建立标准的模板,用户可以利用更多流水线的特性,比如:

  • 代码化: 流水线是在代码中实现的,通常会存放到源代码控制,使团队具有编辑、审查和更新他们项目的交付流水线的能力。
  • 耐用性:流水线可以从Jenkins的master节点重启后继续运行。
  • 可暂停的:流水线可以由人功输入或批准继续执行流水线。
  • 解决复杂发布: 支持复杂的交付流程。例如循环、并行执行。
  • 可扩展性: 支持扩展DSL和其他插件集成。

构建一个可扩展是Jenkins的核心价值,流水线可以通过ShareLibrary的方式来扩展。

2.1.2、pipeline定义

关于Jenkins流水线的运行我们可以抽象一下,例如:可以把流水线(pipeline)想象成13号线地铁,把流水线的阶段(stage)想象成地铁的每一个站点,把流水线脚本(jenkinsfile)想象成地铁线路图。这就是流水线的多样性,每条线路都有不同的站点。

2.1、开始编写Jenkinsfile - 图1

现在地铁(Jenkins)已经有了,我们需要设计地铁的运行线路图(Jenkinsfile),在线路图中指定要经过的站点(stages)。这下你是否已经知道我们要运行一条流水线,需要先做什么呢? –编写jenkinsfile

Pipeline

  • Jenkins的Pipeline通过Jenkinsfile进行描述(类似于Dockerfile)
  • Jenkinsfile是Jenkins的特性(pipeline as code)
  • Pipeline是Jenkins的核心功能,提供一组可扩展的工具。
  • 通过Pipeline 的DSL语法可以完成从简单到复杂的交付流水线实现。

Jenkinsfile

  • Jenkinsfile使用两种语法进行编写,分别是声明式和脚本式。
  • 声明式和脚本式的流水线从根本上是不同的。
  • 声明式是jenkins流水线更友好的特性。
  • 脚本式的流水线语法,提供更丰富的语法特性。
  • 声明式流水线使编写和读取流水线代码更容易设计。

2.1.3、pipeline演示

来我们一起看下这里的配置,看下Jenkinsfile的组成及每个部分的功能含义。

  • 使用agent{},指定node节点/workspace(定义好此流水线在某节点运行)
  • 指定options{}运行选项(定义好此流水线运行时的一些选项,例如输出日志的时间)
  • 指定stages{}(stages包含多个stage,stage包含steps。是流水线的每个步骤)
  • 指定post{}(定义好此流水线运行成功或者失败后,根据状态做一些任务)
  1. pipeline{
  2. //指定运行此流水线的节点
  3. agent { node { label "build"}}
  4. //流水线的阶段
  5. stages{
  6. //阶段1 获取代码
  7. stage("CheckOut"){
  8. steps{
  9. script{
  10. println("获取代码")
  11. }
  12. }
  13. }
  14. stage("Build"){
  15. steps{
  16. script{
  17. println("运行构建")
  18. }
  19. }
  20. }
  21. }
  22. post {
  23. always{
  24. script{
  25. println("流水线结束后,经常做的事情")
  26. }
  27. }
  28. success{
  29. script{
  30. println("流水线成功后,要做的事情")
  31. }
  32. }
  33. failure{
  34. script{
  35. println("流水线失败后,要做的事情")
  36. }
  37. }
  38. aborted{
  39. script{
  40. println("流水线取消后,要做的事情")
  41. }
  42. }
  43. }
  44. }

2.1.4、验证流水线效果

查看Jenkins构建日志(正确效果)2.1、开始编写Jenkinsfile - 图2

通过BlueOcean查看(如果没有BlueOcean图标,需要自行在插件中心安装插件)2.1、开始编写Jenkinsfile - 图3

到此一个简单的Jenkinfile完成了! 后面我们来详细分析每个步骤的作用。


2.1.5、通用模板

  1. String workspace = "/opt/jenkins/workspace"
  2. //Pipline
  3. pipeline {
  4. agent {
  5. node {
  6. label "master" //z指定运行节点的标签或者名称
  7. customWorkspace "${workspace}"
  8. }
  9. }
  10. options {
  11. timestamps() //日志会有时间
  12. skipDefaultCheckout() //删除隐藏checkout scm语句
  13. disableConcurrentBuilds() //禁止并行
  14. timeout(time: 1, unit: 'HOURS') //流水线超时设置1h
  15. }
  16. stages {
  17. //下载代码
  18. stage("GetCode"){//阶段名称
  19. steps{//步骤
  20. timeout(time:5, unit: "MINUTES"){//步骤超时时间
  21. script{//填写运动代码
  22. println('获取代码')
  23. }
  24. }
  25. }
  26. }
  27. //构建
  28. stage("Build"){//阶段名称
  29. steps{//步骤
  30. timeout(time:20, unit: "MINUTES"){//步骤超时时间
  31. script{//填写运动代码
  32. println('应用打包')
  33. }
  34. }
  35. }
  36. }
  37. //代码扫描
  38. stage("CodeScan"){//阶段名称
  39. steps{//步骤
  40. timeout(time:30, unit: "MINUTES"){//步骤超时时间
  41. script{//填写运动代码
  42. println('代码扫描')
  43. }
  44. }
  45. }
  46. }
  47. }
  48. post {
  49. always {
  50. script {
  51. println("always")
  52. }
  53. }
  54. success {
  55. script {
  56. currentBuild.description = "\n 构建成功"
  57. }
  58. }
  59. failure {
  60. script {
  61. currentBuild.description = "\n 构建失败"
  62. }
  63. }
  64. aborted {
  65. script {
  66. currentBuild.description = "\n 构建取消"
  67. }
  68. }
  69. }
  70. }

效果如下:

2.1、开始编写Jenkinsfile - 图4