一.pipeline是什么?

pipeline是部署流水线(Deployment pipeline),指从软件版本控制库到用户手中这一过程的自动化表现形式。

Jenkins 1.x只能通过界面手动配置来配置描述过程,让Jenkins完成任务,例如选择自由风格的项目,通过选项等操作进行配置,让jenkins可以下载代码、编译构建、然后部署到远程服务器上。

而Jenkins 2.x终于支持pipeline as code了,可以通过代码来描述部署流水线,还是同样的功能,部分操作通过代码配置运行后,也会在界面里显示出来。

Pipeline 简而言之,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。

pipeline的功能由pipeline插件提供,有的jenkins会自带,若没有则需要安装。

使用代码而不是UI的意义在于:

  • 更好的版本化:将pipeline提交到版本库中进行版本控制
  • 更好地协作:pipeline的每次修改对所有人都是可见的。除此之外,还可以对pipeline进行代码审查
  • 更好的重用性:手动操作没法重用,但是代码可以重用

二.jenkinsfile是什么

Jenkinsfile就是一个文本文件,里面记录着逻辑,在执行jenkins job的时候,会读取这个文件按照上面的描述来进行各种操作。像Dockerfile之于Docker,Playbook之于Ansible。

Jenkinsfile有2种方式,可以直接在web配置中进行编写,这样只适合临时项目调试或简短的内容。

更多的是将pipeline的脚本在远程仓库上进行管理,这里配置远程仓库地址,让job每次执行的时候拉取这个项目,然后执行其中的某个文件。

可以将脚本放到一个仓库集中管理,也可以放到每个项目中,和代码在一起进行维护,具体方式可以根据公司情况来安排。

三.pipeline语法选择

Jenkins pipeline有2种语法:脚本式(Scripted)语法和声明式(Declar-ative)语法。pipeline插件从2.5版本开始,才同时支持两种格式的语法,推荐使用声明式语法,它的使用人群更广泛,也更好表达维护。

Jenkins团队在一开始实现Jenkins pipeline时,Groovy语言被选择作为基础来实现pipeline。所以,在写pipeline脚本时,就是在写groovy脚本。但区别是,pipeline是在上面封装了一层,需要用固定格式,jenkins才可以识别。

pipeline {
    agent any     stages {
        stage('pull') {
            steps {
git branch: 'master', credentialsId: 'jenkins', url: 'http://代码'
                echo '开始拉取代码'
            }
        }
    }
}

按照格式编写,在其中可以加入groovy的脚本,例如循环、判断、添加变量等等。这样的好处是降低了学习成本,例如上面的下载代码的git指令,用groovy单纯实现就如下方式。

"git clone http://代码".execute().text

那如果根据不同分支拉取、配置秘钥等操作,这里还要再增加切换的操作,要单独学习groovy相关的知识。

四.脚本式和声明式

脚本式语法比较灵活,编写清晰简单,groovy的语法可以直接使用套用,例如直接定义个变量。

node () {
def branch = 'test'     stage 'pull'
        sh " echo 拉取代码" stage 'build'
    sh " echo 构建代码"
}

声明式的语法在内容多的时候会更清晰

pipeline {
    agent any     stages {
        stage('pull') {
            steps {
                echo '拉取代码'
            }
        } stage('build') {
            steps {
                echo '构建代码'
            }
        }
    }
}

对比2个例子,可以发现声明式好像才是复杂的那个。但其实在后续使用中,可以发现脚本式会比较凌乱,就像没用函数的感觉,没有一个标准和结构。脚本式和声明式只是语法上有些区别,对于方法和功能大多都是一样支持的。

五.插件与pipeline

pipeline基本结构决定的是pipeline整体流程,stage代表每个阶段,但实际具体做操作的是pipeline中的每一个步骤。步骤是pipeline中已经不能再拆分的最小操作。像echo执行echo指令,sh执行shell命令。

那是不是说,Jenkins pipeline内置了所有可能需要用到的步骤呢?显然没有必要,因为很多步骤可能永远不会用到。

就像自由Jenkins的插件,安装各种插件后,可以在自由风格的项目里,看到多出来的选项,进行配置。pipeline也是如此,安装某些插件后,就可以在pipeline中用代码调用插件了。

哪些插件适配了Jenkins pipelien,官方有列表方便检索,步骤具体说明可以查看官方步骤参考文档

pipeline是什么?的更多相关文章

  1. redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作

    前段时间在做用户画像的时候,遇到了这样的一个问题,记录某一个商品的用户购买群,刚好这种需求就可以用到Redis中的Set,key作为productID,value 就是具体的customerid集合, ...

  2. Building the Testing Pipeline

    This essay is a part of my knowledge sharing session slides which are shared for development and qua ...

  3. Scrapy:为spider指定pipeline

    当一个Scrapy项目中有多个spider去爬取多个网站时,往往需要多个pipeline,这时就需要为每个spider指定其对应的pipeline. [通过程序来运行spider],可以通过修改配置s ...

  4. 图解Netty之Pipeline、channel、Context之间的数据流向。

    声明:本文为原创博文,禁止转载.       以下所绘制图形均基于Netty4.0.28版本. 一.connect(outbound类型事件)  当用户调用channel的connect时,会发起一个 ...

  5. 初识pipeline

    1.pipeline的产生 从一个现象说起,有一家咖啡吧生意特别好,每天来的客人络绎不绝,客人A来到柜台,客人B紧随其后,客人C排在客人B后面,客人D排在客人C后面,客人E排在客人D后面,一直排到店面 ...

  6. MongoDB 聚合管道(Aggregation Pipeline)

    管道概念 POSIX多线程的使用方式中, 有一种很重要的方式-----流水线(亦称为"管道")方式,"数据元素"流串行地被一组线程按顺序执行.它的使用架构可参考 ...

  7. SSIS Data Flow 的 Execution Tree 和 Data Pipeline

    一,Execution Tree 执行树是数据流组件(转换和适配器)基于同步关系所建立的逻辑分组,每一个分组都是一个执行树的开始和结束,也可以将执行树理解为一个缓冲区的开始和结束,即缓冲区的整个生命周 ...

  8. Kafka到Hdfs的数据Pipeline整理

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 找时间总结整理了下数据从Kafka到Hdfs的一些pipeline,如下 1> Kafka ...

  9. SQL Queries from Transactional Plugin Pipeline

    Sometimes the LINQ, Query Expressions or Fetch just doesn't give you the ability to quickly query yo ...

  10. One EEG preprocessing pipeline - EEG-fMRI paradigm

    The preprocessing pipeline of EEG data from EEG-fMRI paradigm differs from that of regular EEG data, ...

随机推荐

  1. hover 背后的数学和图形学

    前端开发中,hover是最常见的鼠标操作行为之一,用起来也很方便,CSS直接提供:hover伪类,js可以通过mouseover+mouseout事件模拟,甚至一些第三方库/框架直接提供了 hover ...

  2. [hdu7035]Game

    称区间$[i,j]$为普通区间,当且仅当$j-i\ge 3$​​​且其操作两次内不会变为给定区间 结论:若$[i,j]$为普通区间,则$[i,j]$和$[i+1,j-1]$​​​​​​​​​​的状态( ...

  3. [atARC110F]Esoswap

    先构造使得$p_{i}$降序(即$p_{i}=n-1-i$),只需要从后往前,不断执行$i$操作直至合法即可 正确性的证明:首先保证了$[0,n-i)$这些数字都已经出现,因此操作不会破坏已确定的数字 ...

  4. [nowcoder5669J]Jumping on the Graph

    考虑枚举$k$并求出$f(k)=\sum_{i=1}^{n}\limits\sum_{j=i+1}^{n}\limits [D(i,j)\le k]$,那么答案就是$\sum_{i=1}^{1e9}( ...

  5. 前端jsdebug调试

    前端如何像java一样的debug呢? 1.在js页面加入debugger next: function(){ debugger var type=this.quiz[this.progress].s ...

  6. ISIJ2021 游记

    Day -419 ~ ? - 2020.5.8 ~ ? 咦?ISIJ2021 怎么会扯到 2020 年的事情呢? 好吧这似乎真的是一个长篇大论,事情真的要从那一天开始讲起-- 仍依稀记得 2020 年 ...

  7. 洛谷 P7078 - [CSP-S2020] 贪吃蛇(贪心)

    题面传送门 题意: 有 \(n\) 条蛇,每条蛇有个实力 \(a_i\) 我们称编号为 \(x\) 的蛇比编号为 \(y\) 的蛇强,当且仅当 \(a_x>a_y\) 或 \(a_x=a_y\) ...

  8. 洛谷 P6788 - 「EZEC-3」四月樱花(整除分块)

    题面传送门 题意: 求 \[\prod\limits_{x=1}^n\prod\limits_{y|x}\frac{y^{d(y)}}{\prod\limits_{z|y}z+1} \pmod{p} ...

  9. CF 786 E ALT

    CF 786 E ALT 一个居民有两个选择:分配一只宠物,路上都有宠物 一个守卫有两种选择:分配一只宠物,不分配宠物 我们找一个原点,到每个居民都有一条边,表示是否给他宠物 从每个居民向他路上的守卫 ...

  10. perl 子函数传入多个数组

    perl中的引用和C中的指针一样,用"\"标识,引用后可使用符号"->"取值.解引用则在对应的数据类型前加$,@ 或%. 这里这里用两数组求和做示例,引用 ...