Jenkins集成必会技能——pipeline入门教程


作者:慧哥

一、什么是pipeline

什么是Pipeline?简单来说,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程(实用场景:将多个Jenkins构建任务轻松集成)

Pipeline的实现方式是一套Groovy DSL,任何发布流程都可以表述为一段Groovy脚本,并且Jenkins支持从代码库直接读取脚本,从而实现了Pipeline as Code的理念。

使用条件

要使用Jenkins Pipeline,需要: Jenkins 2.x或更高版本、Pipeline插件

使用语言

Pipeline脚本是用Groovy写的 。

二、pipeline在哪

首先确保Jenkins上已经有pipeline相关插件。如果想在Jenkins上新建一个pipeline Job,按照下列步骤操作:

1、单击Jenkins主页上的New Item。

2、输入Pipeline的名称,选择Pipeline,然后单击确定。

3、最后点击完成,一个pipeline项目就生成了

三、一个简单的pipeline脚本

pipeline项目中实际起作用的就是pipeline 脚本部分,这里写一个HelloWorld,编辑后点击保存,期望执行打印hello world操作。

由于这个脚本是无参数的,所以直接点击Build Now就可以了,来查看一下构建结果,

可以看到最后输出了期望的 Hello world!

这里对语法进行简单介绍

Example

stages
pipeline {
   agent any
   stages {
       stage('Example') {
           steps {
               echo 'Hello World'
           }
       }
   }
}

agent

在任何可用的agent 上执行Pipeline或stage。例如:agent any

还有其他的agent后面可跟的参数,例如:none,label,node,docker

none

当在pipeline块的顶层使用none时,将不会为整个Pipeline运行分配全局agent ,每个stage部分将需要包含其自己的agent部分。

label

使用提供的label标签,在Jenkins环境中可用的代理上执行Pipeline或stage。例如:agent { label 'my-defined-label' }

node

agent { node { label 'labelName' } },等同于 agent { label 'labelName' },但node允许其他选项(如customWorkspace)。

docker

定义此参数时,执行Pipeline或stage时会动态供应一个docker节点去接受Docker-based的Pipelines。docker还可以接受一个args,直接传递给docker run调用。例如:agent { docker 'maven:3-alpine' }

stages

包含一个或多个stage的序列,Pipeline的大部分工作在此执行。建议stages至少包含至少一个stage指令,用于连接各个交付过程,如构建,测试和部署等。

steps

steps包含一个或多个在stage块中执行的step序列。

总结:

1、Pipeline最基本的部分是“step”。基本上,step告诉Jenkins 要做什么,并且作为Declarative Pipeline和Scripted Pipeline语法的基本构建块。

2、Pipeline支持两种语法:Declarative Pipeline(在Pipeline 2.5中引入,结构化方式)和Scripted Pipeline,两者都支持建立连续输送的Pipeline。

3、所有有效的Declarative Pipeline必须包含在一个pipeline块内,例如:

pipeline { /* insert Declarative Pipeline here */ }

4、Declarative Pipeline中的基本语句和表达式遵循与Groovy语法相同的规则 ,但有以下例外:

a.Pipeline的顶层必须是块,具体来说是:pipeline { }

b.没有分号作为语句分隔符。每个声明必须在自己的一行

c.块只能包含Sections, Directives, Steps或赋值语句。

四、pipeline实际实用意义

前文说了Pipeline是将原本独立运行于单个或者多个节点的任务连接起来

我们来举两个例子

1、Git上拉取代码:

在pipeline中有一个流水线语法,加入想去git上拉代码,可以这么操作,点击图中的流水线语法,选择git

填写必要参数后,点击成成流水线语法

然后将生成的流水线脚本粘贴进入steps里面,就可以完成git代码的拉取了

jenkins会把代码拉到Workspace+项目名+projdir的目录下,当然也可以指定绝对路径.

2、利用pipeline去执行自动化脚本

前置条件:我已经有一个job,用来执行我的回归脚本,同时我的jmeter+ant+jenkins也已经集成好了,在那个job中,脚本的调用执行是通畅的

pipeline {
    agent any
    stages {
     stage ('Test'){
            steps{
                build job: 'hhh', 
                parameters: [[ $class: 'StringParameterValue', name:'ScriptName', value: 'hhh']]
                }
            }
    }
}

steps里面的第一行是调用的Job 第二行是我那个job下传输的参数

来看下执行结果

ps:pipeline可以结合实际情况,在pipeline语法中直接写打包,部署,执行脚本完成整个流的工作,也可以通过现有的job,去调用job完成持续继承。使用灵活,按需实操。

最后我们来看一下,如果结合了打包、部署、回归,它的执行效果,有没有感觉跟我们这篇文章的封面有异曲同工之处

出处:https://cloud.tencent.com/developer/article/1653828

=======================================================================================

框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。
??目前比较流行的pipeline实践方式如下。

  • gitlabrunner: 是gitlab内置的一套pipeline框架,脚本是yml语言。
  • jenkins: 通过安装插件的形式实现,脚本语言是jenkinsfile。

由于团队中的代码仓库没有使用gitlab,因此我这边选择了jenkins来实践pipeline。

jenkins识别并自动触发pipeline流程,jenkinsfile的编写可以参考jenkins官网:jenkinsfile语法

可视化的形式编辑jenkinsfile的一个插件,大家可以体验下,这里就不多说了,感觉刚开始入门的时候可以试试,可视化没有直接在脚本上编辑流程灵活。
参考网址:blueOcean

遇到的坑点

邮箱

??在最开始的实践是,本来打算用公司的邮箱进行通知,后来发现公司的邮箱不支持类似配置。我这边选择了163邮箱配置在jenkins上进行通知。

bundle exec命令

由于团队中对组件化进行预编译,实现了二进制形式的集成,在准备阶段执行如下命令的时候一直报错

bundle config set deployment 'true'
bundle install
bundle exec pod install --repo-update
 
  • 1
  • 2
  • 3

后来参考网上,在jenkins进行了全局环境变量配置。
在这里插入图片描述

内存不足

??最开始时候设置了pipeline的配置,当分支删除时,对应的pipeline构建会被删除,但是由于电脑配置太差,加上分支较多,出现了内存不足的现象。直接造成jenkins坏掉了,为了解决这个问题,我在jenkinsfile上写了一个脚本定期去删除项目中各个分支中的构建。
在这里插入图片描述

脚本具体如下:

#!/bin/bash
cd ..
cd ..
cd jobs
projects=("项目名字" "项目名字" "项目名字" "项目名字")
for project in ${projects[*]}
do
#进入对应项目目录
  cd $project
  project_dir=$(pwd)
  echo "project dir is:$project_dir"
  cd branches
  pwd=`pwd`
  filelist=`ls $dir`
  for biranch in $filelist:
  do
  #进入对应项目分支目录
    cd biranch
    rm -rf builds
    mkdir builds
    cd ..
  done
  
  cd ..

done
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

更多干货文章,扫描下方二维码关注公众号

出处:https://blog.csdn.net/hanhailong18/article/details/109861471