00:00
啊,大家好,那接下来呢,我们来学习关于流水线这一块啊,通过咱们前面的章节呢,相信大家对JS的一个使用上应该已经没有问题了,那么这节课开始啊,我们就开始去学习JS最核心的一部分就是流水线。呃,首先我要给大家分享就是流水线这部分的一个内容啊,流水线这部分呢,我们主要是先给大家讲一下关于流水线的一个语法啊,流水线就指的这里的pipeline啊,Pipeline的语法,呃,它要声明式和脚本式的语法啊,我们后面会用声明式嵌入脚本式这种方式啊,因为它足够灵活。那第二点呢,就会为大家讲一下关于share library啊,Share library的一个配置。通过library怎么去完善和优化我们的jpe,第三点呢,会为大家讲一下关于我们写流水线的时候,呃,经常会用到的一些这个自带的插件啊,所生成的这些DSL这些方法。
01:02
啊,最后呢,会为大家讲一下关于GR的一些基础语法啊,这是我们这一篇的一个,呃,主要的内容啊,我呢就不做过多的一个介绍了啊,那么我们来开始进入我们今天要学的啊PA烂。在我们之前,我在这里面。打开我们的JS,我们建了几个paland的项目是吧?Paland的项目啊,那么在这里面大家可以看到,咱们再熟悉一下它的过程啊,首先是不是在我这边新建项目的时候,我在这里面选一个流水线的项目对吧。啊,我就不重复创建了啊,然后在这个项目的配置里面,也就是你创建完项目之后,这里面会有一个配置,对吧,你看这里面有一个pipeline script,这里面写的就是pipeline脚本。啊,我们当然可以运行一个hello word,你看这里面就生成了一个hello word,对吧?啊,然后你点击构建。
02:03
啊,你会发现它,待会儿就会出现一个。啊,正在构建中是吧,然后你看它这个输出啊。正在启动排布拉啊,正在启动布拉。好,运行在这个节点上,诶,执行了一个hello word的一个输出啊,这其实你就可以看成是一个流水线的过程,那么hello是什么呢?Hello是它的步骤吧,那么咱们再来看一下它这个里边的内容,你看就是一个hello word流水线是吧,点流水线这样的一个格式是吧?那么我们今天学的就是怎么去写这个文件啊,你看这个文件跟那个文件很类似吧,我们怎么去写,以及写完之后怎么去用。啊,我呢给大家生成了一个框架啊,这是我的一个框架啊,我给大家设计这个课程呢,就是前面呢,我先按照我这个框架教会大家啊,我把模板什么都给大家写好,然后大家直接往里套啊,跟着我这个目录结构去套就可以了。
03:05
在后面呢,我会为大家详细的去讲解每一个模板当中每一个步骤,它代表的意思啊,以及它的含义。啊,总的来说一个一条流水线啊,什么叫一条流水线呢?你可以理解为这就是一条流水线。这呃,等会儿啊,T02,这就是一条流水线,而这条流水线包含了一个步骤,你也可以打开blue ocean啊,Ocean是JS的一个web UI的页面啊,能稍微慢一些。它这个图形化界面做的非常好。这其实也就相当于。这是一条流水线,然后有一个步骤啊,它也算是一条流水线,那么这个流水线是怎么运行的,它取决于你所编写的JS fair,记住一个概念叫JS fair。
04:03
啊,以后记住啊,我们写的代码都叫做JS fair,那么j fair呢,有两种方式啊,写它的语法,两种方式就跟我们写shell脚本一样,要根据它的语法去写,语法写错了,那么这个PA plan它就执行失败了。啊,那关于这个语法呢,有两种,一种是声明式的语法,一种是脚本式的语法。啊,什么样是声明式的,大家可以看到啊,这是声明式的啊,这是最简单的,那什么是脚本式的呢?诶给大家来看一下我的仓库啊。这里能不能点过去。OK。呀,这里边那个样式都没被拦截了是吧。啊呃,这里面我也整理了一些语法啊,那么关于这个声明是和脚本是我建议大家看一下我这个github上面我有一个share library啊,这个我目前没删除掉,是之前的一个旧的啊。
05:07
呃,这个是library。这里边儿你可以看到。我这里面用的语法啊。大家看到没有,这是。脚本式的。啊,脚本式的跟声明式的有什么区别啊,其实之前我一直在用脚本式,我觉得脚本式非常灵活啊,因为它可以加一些if else这些语句都可以。啊,而声明式的呢,它更有一个好处啊,因为我是从脚本式的转向声明式,所以建议大家直接用声明式啊,声明式的一个好处是它的功能更加强大一些,比如说我们构建失败后要做一些什么操作是吧?你看我在写脚本式的话,我得使用try catch去捕获异常,但是我在使用声明式这种语法的时候,你看构建后,比如构建成功了我做什么,构建失败了我做什么?
06:00
有现成的这些DSL直接去用就可以了。所以说声明式的比脚本式的啊,更加这个友好一些,对这来说啊,所以说这个呃,相对来说我们用的话就用这个声明式的,但是我们声明式的里面也可以嵌入一段脚本式的。比如说这个script标签就嵌入了脚本式的,所以说我目前所使用的这个j fair的一个结构就是脚本式啊,嵌入到了这个生命式里面。啊,总的来说它还是生命式的,但是里面嵌入了一些脚本式的一些语法。OK,当然这只是按照我的方法去实现的啊,各种各有所爱对吧,你如果说是不需要用到脚本式的,那没关系,那你可以直接就用生命式的就OK了。啊,一样的道理啊,好,那么这是脚本式跟生命式。好,那我们定下来就用这个声明式啊,声明式papeline它包含了一些这个组成啊,就几个部分来组成,首先一条流水线就是由一个jins fairll来组成,这是一个JS fairll啊,它是用GR语言啊,这是GR这个语法啊,那么它呢,有几个部分组成,你看最外层是一个PA烂的语句块,对吧?语句块啊,最外层也就是整个流水线都是用一个PA烂这个块来组成的。
07:22
然后里面呢,有一些标签啊,它分成了这几个部分,第一个agent是吧,Agent就是说我要指定我在哪个节点上去运行这条流水线。啊,我在哪个节点啊,指定它的一个节点名称之类的,那么option呢,这块就是指定我们运行时所需要的一些选项,后面的stage啊,指的是阶段啊,所有的阶段都在这个大的stage下面,然后它下面有很多小的stage啊,Stage,然后这里面每个stage都有每个步骤啊,就像刚才那个hello一样,它是一个步骤。啊,再往后呢,就是构建后的一个操作,诶,假如我前面流水线都执行完了,那么我成,如果他的状态是成功的,诶那么我要做什么,如果他是失败的,我要做什么。
08:11
假如说不管它成功或失败,我又要做什么啊,这是构建后的一个操作,所以说这是一条流水线,也就是一个J的一个整体的结构,就是这样的。OK,这是这一块。然后我们来详细的去看每一个部分啊,第一个部分agent大家一定要注意它这个标签是。带有结尾的啊,不要说少一个标签啊,这样的话排查起来很难受啊。第一个agent agent指定我们运行的节点,那么这里面有个node啊,Node可以指定以标签的方式指定我们的节点,比如说我现在的意思就是说我这条流水线要运行在具有master标签的或者是名称为master的节点上运行。然后我把它的工作目录做了一个自定义啊,自定义workspace,大家在前面的应该看到这里面定义那个workspace的一个路径是吧,一个是它的工作目录啊,运行时的工作目录,这个是可选的,你也可以不自定义,不自定义的话,它会使用默认的一个路径。
09:18
OK,这是前面这块,那么后面这块呢,就是运行时的一些选项,比如说我在排查问题的时候,我想查到我这个什么时候失败的,我执行这条命令,或者说我在运行这个阶段的时候,他什么时候失败的,那么我们就可以使用这个time STEM啊这个呢指的是我们的时间啊,会在日志里面打出我们的时间。第二个就是跳过默认的checkout,其实声明式的这些脚本啊,它会默认的去检查你有没有配代码库,如果有的话,它会自动的给你下载。啊,但是我没必要去让它下载,OK,所以说把它给跳过啊,跳过第二点呢,第三点就是并行啊,禁止并行,其实有的时候这个项目是需要并行的,有的时候它是不需要并行的,那么如果你要是把它变成。
10:09
不允许并行,那么你把这段加上就可以了。OK,最后我们设这个流水线的超时时间,嗯,我在企业中使用流水线的时候会遇到很多,就是比如说构建超时了啊,它一直卡在那儿,会运行单侧一直失败啊,那么这样会消耗很多的资源,而且会占用我们的构建队列,导致最后这个构建队列出现堵塞的这种情况啊,所以说在这里面我们可以设置一个时间,就是流水线的超时时间,给它一小时可以了啊,什么样的流水线会运行一小时呢?除非这个流水线肯定是有问题的。好吧,也相当于一小时之后,这个流水线就被定为超时自动结束了。好,然后我们再来看。下面就是关于。Stages啊,Stages这个指的是多个阶段,也就是我这块代码指定啥呢?同学们,你看stages下面有三个stage是吧,我添加了三个stage,每个stage执行了什么?
11:10
哎,第一个stage下代码是吧,第二个stage是执行打包,第三个stage呢,是执行一个代码扫描啊,但是大家看到有steps steps是步骤啊,是步骤,一般stage下边都会有一个steps啊,一般我就写成了一个步骤,然后这个步骤的超时时间呢是五分钟。你看有20分钟的,有30分钟的啊,然后我嵌入了一段脚本,脚本执行了什么打印的一个信息。啊,只进行打印信息。OK,这块明白了吗?这是stage啊。然后我们再来看最后一遍,就是关于post,就是构建后的操作。这个非常重要,同学们啊,给大家解释一下这四个啊,其实它有很多个啊,后面会详细的去讲,先来说这四个,第一个always。这个指的是什么呀?
12:01
总是执行,不管你是失败还是成功,都会执行这里面的一句。啊,然后后面如果成功了,然后我就去执行,如果失败了我就去执行,如果是取消了,我就去执行啊一般我们在企业的应用场景是这样的,如果执行成功了,我们可能会触发一个系统里面的一个状态,做一个变更啊,如果是执行失败了,我可能会给谁触发这条流水线,我给他发一个邮件通知,或者是我要做一些什么。啊,通知管理员,那构建被取消了,有时候我也会给他做一个通知,就按构建失败一样的去对待。明白吧,所以说这一块代码块啊,就照着这个模板去写,这是固定的格式,明白吧,固定的格式只有script里面这些脚本不是固定的,但前边这些框架是一样的。啊,那这里面你看到了current build啊,Current build这个指的是一个全局的变量。我们写代码要用很多变量,我们可以自己去定义变量,也可以用GIS的一些全局变量。
13:07
比如说carry build啊,它里面有个description这个字段,那么我把它的值是可以改的,就是构建描述,它一般会在哪里呢?会在这里。来吧,回到这里。了解了吗?这是一个完整的流水线啊,那么我们来运行一下这条流水线好吧。好,我们来打开一下。Co。然后放到我们刚才这个job里面配置。这里面流水线好,我们把它复制一下。好,大家可以看得出一个问题来,就是这这块我没有用这个共享库,对吧,诶我可以先把它删掉。这个是我们后面内容先去掉它啊。好,你看我把代码是不是都放到这里了,跟刚才一模一样的吧,好保存。
14:00
啊,点构建。啊,刷新。啊,大家可以看到啊,它现在正在运行是吧。好构建失败了,好构建失败了,我们就需要在这里面去查他为什么构建失败,他告诉我说这个没有找到这个stage是吧,没有这个类型。啊,那么怎么办?同学们,是因为它没有装插件,我们可以把它装上插件好吧。好,我们来找一下啊,系统设置,然后关于插件管理。然后这里面我们选一下。选一下我们要装的插件啊。搜索一下。啊,安装。现在插件安装的非常快啊,因为他直接代理到那个,呃,我直接在这里面做了一个N的一个代理,直接去下这个清华园那个镜像啊,稍等应该会很快的。
15:12
好,我们稍微等一下啊。好,那么正在安装啊。一般有时候安装完插件之后需要重启,需要重启啊,这是一个典型的一个错误,大家学会看这个错误信息,告诉你类型失败是吧,那么这个是需要插件的,你看他找不着这些,这也就是它可以配置信息看到吗。看了吧。这也就找出来了,他可以配置信息OK。OK,就这款啊。庄周。排错就是这样的,尤其是在调试这个流水线的时候啊,会出现各种各样的错误,所以说这个一定要学会看错误信息。
16:08
错误信息非常重要啊。那你看这里。这大家也可以结合我这个文档去看,好吧,结合文档去看啊。OK,已经完成了是吧,完成了之后呢,我再重新运行一遍啊,重新把它运行一遍,可以直接点构建。然后你可以去看他的日志。告诉你还是有错是吧,那我们重启一下啊,可能是跟这个。可能是跟这个有关系啊。我来看一下刚那个脚本有没有错误啊。嗯,没有错误啊,就是这样。OK,你们稍等一下,重启一下电。有的时候真的这个错误是很难排查的。
17:02
呃,但大部分写流水线还好,写流水线的时候最好咱们都加一个什么呀。呃,抛出啊打日志信息这样的一个习惯,这样的话呢,很快就会定位这个问题。否则这个问题不好定位啊。OK,我们登录一下啊。可能是这个插件升级的没有找到这个吗?应该是有的啊呃,其实跟大家说一下啊,就是再给大家扩展一下,就是比如说我们要想执行像刚才这样的这个时间是吧,其实这都是插件里面自带的一些方法。要把插件里面带的一些方法啊。
18:02
好,这次再试一下。来点个部件啊。还是失败了是吧。我看一下啊。看看为啥是,呃,还没有,还正在运行啊。正在启动一条热水线。大家那个应该没有我这个这么慢啊,你看同学们是不是成功了。是不是有时间呀,这个是时间的一个作用啊,很明显这步已经成功了是吧。哎,你看这就是构建描述啊,构建描述这个为什么会这样啊,是因为我这里边设置的是加的啊,我们来优化一下,哎,此时我运行流水线,但是我发现你看多了几个步骤,是不是一个是下代码构建扫描,还有一个是。它的这个构建后的操作啊,此时我想调试流水线怎么办呢?啊,我直接点回放。
19:04
在这里面我去把这个加等于改成什么呀。等于。因为这个值它默认是空的,哎,我们再运行一遍。好了,睡吧。好,我们再来看这个效果,哎,大家看到是不是构建成功了。是吧,勾选成功了吧,哎,然后我们就可以把我们调试好的这个代码做一个啥呀。做一个备份吧,或者是改改到这个里面来。OK,那么此时呢,我们现在这样的一条流水线就成功了,是不是包含了这几个步骤,虽然说里边还没有嵌入脚本,但是大家可以看到这就是一条流水线的过程。明白吧?对线的过程啊,那么我们再来看一下它的这个过程,看它这个详细的一个图啊。嗯,这个可能有点问题啊,但是不应该会这么慢。
20:03
好慢是吧。太慢了,我们不看blue ocean了啊,它是一个就是一个比较好看的一个美观的图片啊,好,大家可以看到这是一个流水线的运行过程。啊,这是咱们第一步要做的整个流水线的一个运行过程。好,你可以看到这是构建的日志。每一个阶段它这里面都会有写出来,这是我们打印的信息,对不对。你看最后。就是这样的。它的执行状态是成功的啊,这个就是刚才我们所安装时间的一个作用。OK,这块啊,我们就是我们所说的这个流水线这块。
我来说两句