Jenkins Pipeline

Stella981
• 阅读 739

https://jenkins.io/zh/doc/book/pipeline/syntax/

https://blog.csdn.net/taishanduba/article/details/61423121

https://www.cnblogs.com/kevingrace/p/6022447.html

通用规则

Agent

Agent通常是一个机器或容器,它连接到Jenkins主机,并在主控器指导时执行任务。

Artifact

在Build或Pipeline 运行期间生成的不可变文件,该文件归档到Jenkins Master上以供用户随后检索。

Build

项目 单次执行的结果

Cloud

提供动态代理 配置和分配的系统配置,例如由Azure VM Agents 或 Amazon EC2插件提供的配置和分配 。

Core

主要的Jenkins应用程序(jenkins.war)提供了 可以构建Plugins的基本Web UI,配置和基础。

Downstream

配置Pipeline或项目时被触发作为一个单独的Pipeline或项目的执行的一部分。

Executor

用于执行由节点上的Pipeline或 项目定义的工作的插槽。节点可以具有零个或多个配置的执行器,其对应于在该节点上能够执行多少并发项目或Pipeline。

Fingerprint

考虑全局唯一性的哈希追踪跨多个Pipeline或项目的工件或其他实体 的使用 。 

Folder

类似于文件系统上的文件夹的Pipeline和/或 项目 的组织容器。

Item

Web UI中的实体对应于:Folder, Pipeline, or Project.

Job

一个不推荐的术语,与项目同义。

Label

用于分组代理的用户定义的文本,通常具有类似的功能或功能。例如linux对于基于Linux的代理或 docker适用于支持Docker的代理。

Master

存储配置,加载插件以及为Jenkins呈现各种用户界面的中央协调过程。

Node

作为Jenkins环境的一部分并能够执行Pipeline或项目的机器。无论是the Master还是Agents都被认为是Nodes。

Project

用户配置的Jenkins应该执行的工作描述,如构建软件等。

Pipeline

用户定义的连续输送Pipeline模型,以便更多阅读本手册中的“ Pipeline”一章。

Plugin

与Jenkins Core分开提供的Jenkins功能扩展。

Publisher

完成发布报告,发送通知等的所有配置步骤后的 构建的 一部分。

Stage

stage是Pipeline的一部分,用于定义整个Pipeline的概念上不同的子集,例如:“构建”,“测试”和“部署”,许多插件用于可视化或呈现Jenkins Pipeline状态/进度。

Step

单一任务从根本上讲,指的是Jenkins 在Pipeline或项目中做了_什么_。

Trigger

触发新Pipeline运行或构建的标准。

Update Center

托管插件和插件元数据的库存,以便在Jenkins内部进行插件安装。

Upstream

配置的Pipeline或项目,其触发单独的Pipeline或项目作为其执行的一部分。

Workspace

Noede文件系统上的一次性目录, 可以由Pipeline或项目完成工作。在Build或 Pipeline运行完成后,工作区通常会保留原样,除非在Jenkins Master上已经设置了特定的Workspace清理策略。

1.Freestyle project
这个是jenkins的基础功能,可以用它来执行各种构建任务,他只能构建在一个电脑上,如果没有太多的需求,这个job基本够用了,它包含了所有基础功能.
2.Pipeline
真实的工作环境有很多job,比如先编译,然后执行静态代码检查、单元测试、然后部署服务器、服务器重启、进行ui测试等。我们需要对这些job进行一些设置将它们的上下游关系配置好。这个时候就需要pipeline配置了.详细的可以参考这篇文章

3.External job
用来监视外部执行的job.

4.Multi-configuration project
可以让job跑在不同的机器上.这个需要添加机器(节点),流程的话可以参考这篇文章

后面还有一些,这里不一一介绍了,有需要的可以自己google.
我们选择最基础的freestyle创建一个job,点击ok按钮.

1)代码上线要经历四个场景:Dev开发环境-->Test测试环境-->Beta验收环境-->Online线上环境
Dev开发环境:开发人员在开发机上自行开发,开发后将代码上传到svn/git版本控制系统里。
Test测试环境:将代码从svn下载并同步到测试机(Test环境发版),通知测试同事进行上线前的业务测试。
Beta验收环境:测试同事测试ok后,将代码同步到Beta机上(Beta环境发版),然后通知产品/运营同事进行上线前的验收。
Online线上环境:待Beta验收ok后,再将代码同步到线上机器上,最终完成Online发版。

声明式和脚本化的流水线语法

Jenkinsfile 能使用两种语法进行编写 - 声明式和脚本化。

声明式和脚本化的流水线从根本上是不同的。 声明式流水线的是 Jenkins 流水线更近的特性:

  • 相比脚本化的流水线语法,它提供更丰富的语法特性,

  • 是为了使编写和读取流水线代码更容易而设计的。

然而,写到`Jenkinsfile`中的许多单独的语法组件(或者 "步骤"), 通常都是声明式和脚本化相结合的流水线。 在下面的 [pipeline-concepts][pipeline-syntax-overview] 了解更多这两种语法的不同。

Why Pipeline?

本质上,Jenkins 是一个自动化引擎,它支持许多自动模式。 流水线向Jenkins中添加了一组强大的工具, 支持用例 简单的持续集成到全面的CD流水线。通过对一系列的相关任务进行建模, 用户可以利用流水线的很多特性:

  • Code: 流水线是在代码中实现的,通常会检查到源代码控制, 使团队有编辑, 审查和迭代他们的交付流水线的能力。

  • Durable: 流水线可以从Jenkins的主分支的计划内和计划外的重启中存活下来。

  • Pausable: 流水线可以有选择的停止或等待人工输入或批准,然后才能继续运行流水线。

  • Versatile: 流水线支持复杂的现实世界的 CD 需求, 包括fork/join, 循环, 并行执行工作的能力。

  • Extensible:流水线插件支持扩展到它的DSL [1]的惯例和与其他插件集成的多个选项。

然而, Jenkins一直允许以将自由式工作链接到一起的初级形式来执行顺序任务, [4] 流水线使这个概念成为了Jenkins的头等公民。

构建一个的可扩展的核心Jenkins值, 流水线也可以通过 Pipeline Shared Libraries 的用户和插件开发人员来扩展。 [5]

下面的流程图是一个 CD 场景的示例,在Jenkins中很容易对该场景进行建模:

Jenkins Pipeline

流水线概念

下面的概念是Jenkins流水线很关键的一方面 , 它与流水线语法紧密相连 (参考 overview below).

流水线

流水线是用户定义的一个CD流水线模型 。流水线的代码定义了整个的构建过程, 他通常包括构建, 测试和交付应用程序的阶段 。

另外 , pipeline 块是 声明式流水线语法的关键部分.

节点

节点是一个机器 ,它是Jenkins环境的一部分 and is capable of执行流水线。

另外, `node`块是 脚本化流水线语法的关键部分.

阶段

stage 块定义了在整个流水线的执行任务的概念性地不同的的子集(比如 "Build", "Test" 和 "Deploy" 阶段), 它被许多插件用于可视化 或Jenkins流水线目前的 状态/进展. [6]

步骤

本质上 ,一个单一的任务, a step 告诉Jenkins 在特定的时间点要做_what_ (或过程中的 "step")。 举个例子,要执行shell命令 ,请使用 sh 步骤: sh 'make'。当一个插件扩展了流水线DSL, [1] 通常意味着插件已经实现了一个新的 _step_。

流水线语法概述

下面的流水线代码骨架说明了声明式流水线语法脚本化流水线语法之间的根本差异。

请注意 阶段 and 步骤 (上面的) 都是声明式和脚本化流水线语法的常见元素。

声明式流水线基础

在声明式流水线语法中, pipeline 块定义了整个流水线中完成的所有的工作。

Jenkinsfile (Declarative Pipeline)

pipeline {
    agent any #1
    stages {
        stage('Build') { #2
            steps {
                // #3
            }
        }
        stage('Test') { #4
            steps {
                // #5
            }
        }
        stage('Deploy') { #6
            steps {
                // #7
            }
        }
    }
}

 1

在任何可用的代理上,执行流水线或它的任何阶段。

 2

定义 "Build" 阶段。

 3

执行与 "Build" 阶段相关的步骤。

 4

定义"Test" 阶。

 5

执行与"Test" 阶段相关的步骤。

 6

定义 "Deploy" 阶段。

 7

执行与 "Deploy" 阶段相关的步骤。

脚本化流水线基础

在脚本化流水线语法中, 一个或多个 node 块在整个流水线中执行核心工作。 虽然这不是脚本化流水线语法的强制性要求, 但它限制了你的流水线的在`node`块内的工作做两件事:

  1. 通过在Jenkins队列中添加一个项来调度块中包含的步骤。 节点上的执行器一空闲, 该步骤就会运行。

  2. 创建一个工作区(特定为特定流水间建立的目录),其中工作可以在从源代码控制检出的文件上完成。
    Caution: 根据你的 Jenkins 配置,在一系列的空闲后,一些工作区可能不会自动清理 。参考 JENKINS-2111 了解更多信息。

    Jenkinsfile (Scripted Pipeline) node { #1 stage('Build') { #2 // #3 } stage('Test') { #4 // #5 } stage('Deploy') { #6 // #7 } }

 1

在任何可用的代理上,执行流水线或它的任何阶段。

 2

定义 "Build" 阶段。 stage blocks 在脚本化流水线语法中是可选的。 然而, 在脚本化流水线中实现`stage` 块 ,可以清楚的显示Jenkins UI中的每个`stage`的任务子集。

 3

执行与 "Build" 阶段相关的步骤。

 4

定义 "Test" 阶段。

 5

执行与 "Test" 阶段相关的步骤。

 6

定义 "Deploy" 阶段。

 7

执行与 "Deploy" 阶段相关的步骤。

流水线示例

这有一个使用声明式流水线的语法编写的`Jenkinsfile` 文件 - 可以通过点击下面 Toggle Scripted Pipeline 链接来访问它的等效的脚本化语法:

Jenkinsfile (Declarative Pipeline)

pipeline { #1
    agent any #2
    stages {
        stage('Build') { #3
            steps { #4
                sh 'make' #5
            }
        }
        stage('Test'){
            steps {
                sh 'make check'
                junit 'reports/**/*.xml' #6
            }
        }
        stage('Deploy') {
            steps {
                sh 'make publish'
            }
        }
    }
}

Toggle Scripted Pipeline (Advanced)

 1

pipeline 是声明式流水线的一种特定语法,他定义了包含执行整个流水线的所有内容和指令的 "block" 。

 2

agent是声明式流水线的一种特定语法,它 指示 Jenkins 为整个流水线分配一个执行器 (在节点上)和工作区。

 3

stage 是一个描述 stage of this Pipeline的语法块。在 Pipeline syntax 页面阅读更多有关声明式流水线语法的`stage`块的信息。如 above所述, 在脚本化流水线语法中,stage 块是可选的。

 4

steps 是声明式流水线的一种特定语法,它描述了在这个`stage`中要运行的步骤。

 5

sh 是一个执行给定的shell命令的流水线 step (由 Pipeline: Nodes and Processes plugin提供) 。

 6

junit 是另一个聚合测试报告的流水线 step (由 JUnit plugin提供)。

 7

node 是脚本化流水线的一种特定语法,它指示 Jenkins 在任何可用的代理/节点上执行流水线 (和包含在其中的任何阶段)这实际上等效于 声明式流水线特定语法的`agent`。

1.General:一般设置
Project name:项目名称
Description:项目描述,多人写作请一定要加上
Discard old builds:(discard 丢弃)该选项配置如何抛弃旧的构建
每次构建相关的文件都会保存下来,将会渐渐耗光磁盘空间,为此提供两种方式供选择:
- Days to keep builds:保留N天之内的构建文件
- Max # of builds to keep:保留最多#个最近构建的相关文件
- days to keep artifcts 指定产品保留时间,但是log,历史记录会保留
- builds to keep with artifacts 保留最近几个构建的产品
This project is parameterized(参数化构建过程):可以设置用户可输入的参数,没有输入则使用默认值,有字符串,多行字符串,布尔值等可以设置.wiki
Throttle builds:设置两个build任务之间最小间隔和同一个时间内最大任务数量
Disable this project:停止这个job,当例如源码不可用时,可以暂时勾选这个停止build
Execute concurrent builds if necessary: 如果可以会并发执行build.勾选上后.如果有足够的线程池则会并发,否则不会.并发构建会在不同的workspace中.如果用户自己设置的workspace则不会分开,这个是有风险的.
Restrict where this project can be run: 设置是否必须在某个机器上运行.如果是分布式部署或者迁移job,注意移除或修改此项配置
Quiet period:配置等待未发生提交变化的时间. 由于 jenkins检测到代码变化时,就自动立即构建,但是有些情况下, 需要多次提交代码到版本控制系统上,此时,可能发生代码还没完整提交就开始构建,造成构建失败,为防止此种情况发生,可以配置值X,则jenkins会在代码变化后等待X秒,如果没在发生代码提交,才开始构建,保证稳定性。
Block build when downstream project is building:该选项当多个相关联的项目由一个提交所影响,但是它们必须以一个指定的顺序进行构建的时候非常有用。当你选择这个选项的时候,Jenkins将会在启动这个构建之前,完成任何上游构建Job; 例如使用pipes的时候

2.Source Code Management:源码管理

通过这里设置源码管理路径,这个与后面的轮询源码变化触发编译是成对的.不想设置或者后面有脚本可以自主管理可以选择none

Build Triggers:构建(编译,任务等等)触发时机

Trigger builds remotely (e.g., from scripts):外部通过url命令触发,拼接token和url就可以进行远程触发了
Build after other projects are built:监控其他job的构建状态,触发此job.如监听代码提交,然后触发UITest,静态分析等.
Build periodically:定时触发.选择 Build periodically,在 Schedule 中填写 0 * * * .第一个参数代表的是分钟 minute,取值 059;第二个参数代表的是小时 hour,取值 023;第三个参数代表的是天 day,取值 131;第四个参数代表的是月 month,取值 112;最后一个参数代表的是星期 week,取值 0~7,0 和 7 都是表示星期天。所以 0 * * * 表示的就是每个小时的第 0 分钟执行一次构建。举个例子:每周六10点构建 0 10 * * 6,0-0分钟, 10-10点 -任意天 -任务月份 6-周六, 0可以改为H.
Poll SCM:定时感知代码分支是否有变化,如果有变化的话,执行一次构建.示例:H/5 * * * * 每五分钟去检查一下远程仓库,看代码是否发生变化。
**GitHub hook trigger for GITScm polling:**hookplugin检测到源码的push操作触发构建,感觉Poll SCM更方便些,如果提交频繁,则这个触发就会频繁,看业务需要设置.

3.Build Environment(设置构建环境)

Delete workspace before build starts:默认删除所有的,也可以设置删除特定的文件
- Patterns for files to be deleted:正则匹配删除哪些文件
- Apply pattern also on directories:规则是否也应用到文件夹
- Check parameter:是否删除,是个bool值,true则删除,false不删除.为毛感觉这个有点鸡肋
- External Deletion Command:执行外部删除命令
Abort the build if it’s stuck:构建阻塞的时候,根据超时策略处理.
- Time-out strategy:超时策略,有绝对时间,相对时间,根据以前的构建时间判断等
- Time-out variable:超时时间
- Time-out actions:超时后的处理,如终结,faile调或者写描述
- Add timestamps to the Console Output:在输出界面添加时间戳
- Use secret text(s) or file:使用密文,用于全局性的管理密码等,勾选后会在下方出现Binding,输入需要的用户名,密码证书等就可以了

4.Build(构建)

这个可以执行多种命令,如window的批处理,shell等一般shell就可以了.平时的自定义编译命令,打包等等,都可以写在这里.jenkins推荐将过长的命令写到下载的源码里,由这个里面的shell命令调用.jenkins执行的时候会默认把所有的命令都打印出来,这样方便调试.可以创建多个build step,这些step是串行的,一个faile,,后面的step都不会执行了.

5.Post-build Actions

可以根据build的结果设置发送邮件,打包,执行其他任务等等.build成功还是失败都会走到这一步.

三.总结
jenkins很强大,目前刚入门.他的作用不仅仅是编译代码,还可以执行其他任意定时任务,监控任务.配合分布式部署,可以实现大规模的协作使用.后面将对jenkins的插件开发和源码结构进行分析.

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这