1987WEB视界-分享互联网热门产品和行业

您现在的位置是:首页 > WEB开发 > 正文

WEB开发

持续集成部署神器:Jenkins2.0之流水线详解

1987web2023-10-06WEB开发91

好了继续接前面的文章,接下来咱们说说jenkins的流水线框架,后面文章可能比较长,主要介绍了原理,语法,详细构建过程.都是精华呦!!!都是 都是 都是 重要的事情多三遍!!!!!

pipeline是Jenkins2.X的最核心的特性,帮助Jenkins实现从CI到CD与DevOps的转变,下面我们先来看看他的基本概念以及基本语法,之后介绍如何创建以及后期应用.

什么是Jenkins的流水线?

Jenkins 流水线 (或简单的带有大写"P"的"Pipeline") 是一套插件,它支持实现和集成持续交付流水线 到Jenkins。

(CD) pipeline_是你的进程的自动表达,用于从版本控制向用户和客户获取软件。 你的软件的每次的变更 (在源代码控制中提交)在它被释放的路上都经历了一个复杂的过程 on its way to being released. 这个过程包括以一种可靠并可重复的方式构建软件, 以及通过多个测试和部署阶段来开发构建好的软件 (c成为 "build") 。

流水线提供了一组可扩展的工具,通过 Pipeline domain-specific language (DSL) syntax.[1]对从简单到复杂的交付流水线 "作为代码" 进行建模。

对Jenkins 流水线的定义被写在一个文本文件中 (成为 Jenkinsfile),该文件可以被提交到项目的源代码的控制仓库。[2]这是"流水线即代码"的基础; 将CD 流水线作为应用程序的一部分,像其他代码一样进行版本化和审查。 创建 `Jenkinsfile`并提交它到源代码控制中提供了一些即时的好处:

  • 自动地为所有分支创建流水线构建过程并拉取请求。
  • 在流水线上代码复查/迭代 (以及剩余的源代码)。
  • 对流水线进行审计跟踪。
  • 该流水线的真正的源代码[3], 可以被项目的多个成员查看和编辑。

While定义流水线的语法, 无论是在 web UI 还是在 Jenkinsfile 中都是相同的, 通常认为在`Jenkinsfile` 中定义并检查源代码控制是最佳实践。

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

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流水线很关键的一方面 , 它与流水线语法紧密相连 (参考 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. 创建一个工作区(特定为特定流水间建立的目录),其中工作可以在从源代码控制检出的文件上完成。
  3. Caution:根据你的 Jenkins 配置,在一系列的空闲后,一些工作区可能不会自动清理 。

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" 阶段相关的步骤。

如何创建呢?

1.通过 Blue Ocean

什么是 Blue Ocean?

Blue Ocean 主要是重新思考Jenkins的用户体验,从头开始设计Jenkins Pipeline, 但仍然与自由式作业兼容,Blue Ocean减少了混乱而且进一步明确了团队中每个成员 Blue Ocean 的主要特性包括:

  • 持续交付(CD)Pipeline的复杂可视化,可以让您快速直观地理解管道状态。
  • Pipeline 编辑器- 引导用户通过直观的、可视化的过程来创建Pipeline,从而使Pipeline的创建变得平易近人。
  • 个性化以适应团队中每个成员不同角色的需求。
  • 在需要干预和/或出现问题时精确定位。 Blue Ocean 展示 Pipeline中需要关注的地方, 简化异常处理,提高生产力
  • 本地集成分支和合并请求, 在与GitHub 和 Bitbucket中的其他人协作编码时实现最大程度的开发人员生产力。

下面简要介绍一下Blue Ocean的简单构建过程如果需要详细的请去官方了解呦

流水线可以由源代码控制中存在的`Jenkinsfile` 生成, 或者使用 Blue Ocean 流水线编辑器 生成一个新的流水线(作为 Jenkinsfile 会提交到源代码控制中)。

配置流水线项目

要在 Blue Ocean中开始配置你的流水线项目, 在 Blue Ocean Dashboard的右上方, 点击New Pipeline按钮。

如果你的Jenkins 实例是新生成的或者没有流水线项目或其他的配置项(仪表盘是空的), Blue Ocean显示Welcome to Jenkins消息框 ,你可以点击Create a new Pipeline按钮来开始配置你的流水线项目。

现在,你要从下面选择一个创建你的流水线项目:

  • 标准Git库
  • GitHub仓库或 GitHub企业
  • Bitbucket Cloud仓库 或 Bitbucket 服务器

这里我主要以Git本地仓库为例进行说明至于其他的读者可以自动参考官方文档

要为git仓库创建你的流水线项目, 点击Where do you store your code?*下的 *Git按钮。

Connect to a Git repository部分, 在*Repository URL*字段输入你的Git仓库的 URL 。

仓库主要分为两种

本地仓库

如果你的 URL 是本地目录路径 (比如以一个正斜杠 /`开头 比如/home/cloned-git-repos/my-git-repo.git`),你要继续点击Create Pipeline按钮。

之后,Blue Ocean 会扫描你本地仓库的分支来获得 Jenkinsfile,并将为每个包含`Jenkinsfile`的分支运行流水线。 如果 Blue Ocean 找不到任何 Jenkinsfile, 将提示你开始通过流水线编辑器创建一个。

远程仓库

由于流水线编辑器将经过编辑的流水线作为`Jenkinsfile`保存到 Git 仓库‍, Blue Ocean 只支持通过SSH协议连接到远程Git仓库。

如果你的 URL 是远程 Git 仓库的路径, 当你开始输入URL时, 你可以从以下两种方式开始:

  • ssh:// - 例如 ssh://gituser@git-server-url/git-server-repos-group/my-git-repo.git
  • user@host:path/to/git/repo.git - 例如 gituser@git-server-url:git-server-repos-group/my-git-repo.git,

Blue Ocean 自动生成一个 SSH 公共/私有密钥对 (或提供已存在的一个) 作为你当前/登录的 Jenkins 用户。该凭证自动地注册,为该Jenkins用户提供以下详细信息:

  • Domain: blueocean-private-key-domain
  • ID: jenkins-generated-ssh-key
  • Name: (jenkins-generated-ssh-key)

你要确保 SSH 公共/私有秘钥对在继续之前已经被注册到你的Git服务器。如果没有, 遵循下面的 2 个步骤。否则, 继续。

  1. 配置这个密钥对的 SSH 公钥组件(你可以从 Blue Ocean界面复制粘贴),用于远程 Git 服务器的用户账户(比如在机器的`gituser/.ssh`目录的 authorized_keys 文件中)。
  2. Note:该进程允许 Jenkins 用户访问你的Git服务器的用户账户 (比如 gituser)能够访问到的仓库。了解更多请参考Pro Git documentation的 Setting Up the Server。
  3. 完成后, 回到Blue Ocean 界面。

点击*Create Pipeline* 按钮。

之后,Blue Ocean 会扫描过本地仓库的分支来获得 Jenkinsfile 并开始为每个包含 Jenkinsfile`的分支运行流水线。 如果 Blue Ocean 找不到任何 `Jenkinsfile, 将会提示你通过 流水线编辑器开始创建一个

ssh远程连接git仓库

如果 Blue Ocean 在我们代码库里面找不到任何 Jenkinsfile, 将会提示你通过 流水线编辑器开始创建一个

第一步就是选择代理这个决定了jenkins中命令的执行位置,里面我们可以选择所有节点以及从docker构建为了方便介绍这里我们以any为例(在任何可用的代理上执行流水线或阶段)至于环境变量选项,制定一个 键-值对序列,该序列将被定义为所有步骤的环境变量

第二步就开始定义我们整个CICD中的阶段,每个阶段stage又会包括很多步骤steps这里我定义3个阶段 构建---测试---部署

这里主要是为了简单(因为我很懒)使用shell script类型直接打印构建

下面过程跟此类似

之后我们单击保存按钮之后jenkins会自动提交commit文件(也就是Jenkinsfile)到我们的项目中去确实不错,

提交完成后我们点击save&run即可

如果你是Jenkins 流水线的新人, Blue Ocean UI 帮助你 设置流水线项目, 并通过图形化流水线编辑器自动创建和编写 (即 Jenkinsfile),这个主要是一步步引导你设置pipeline流水线.

作为在Blue Ocean中设置流水线项目的一部分, Jenkins 给你项目的源代码控制仓库配置了一个安全的、经过身份验证的适当的连接因此,你通过Blue Ocean的流水线编辑器在 `Jenkinsfile`中做的任何更改都会自动的保存并提交到源代码控制。

2.通过经典UI

主要是通过jenkins基础界面进行pipeline的定义而不是上面谈到的blue ocean引导界面

下面简单介绍一下

通过Jenkins经典UI创建一个基本流水线:

  1. I如果需要的话, 确保你已登录进 Jenkins。
  2. 从Jenkins 主页 (即Jenkins经典 UI 的仪表盘), 点击左上的New Item
  1. Enter an item name域, 填写你新建的流水线项目的名称。
  2. Caution:Jenkins 使用这个项目名称在磁盘上创建目录。建议不要在项目名称中使用空格, 因为这样做可能会发现在脚本中不能正确处理目录路径中的空格的bug。
  3. 向下滚动并点击*Pipeline*, 然后点击页面底部的OK打开流水线配置页(General选项已被选)。
  1. 点击页面顶部的Pipeline选项卡向下滚动到Pipeline部分。
  2. Note:如果你在源代码控制中定义 Jenkinsfile, 请按照下面的 In SCM 的说明。
  3. 在*Pipeline* 部分, 确保Definition域显示Pipeline script选项。
  4. 将你的流水线代码输入到*Script* 闻不如你区域。
  5. 例如, 复制并粘贴下面的声明式示例流水线代码 (在Jenkinsfile ( …​ )标题下) 或者它的脚本化的版本到Script文本区域。 (T下面的声明式示例将在整个过程的其余部分使用)
  6. Jenkinsfile (Declarative Pipeline)
pipeline {
 agent any 
 stages {
 stage(Stage 1) {
 steps {
 echo Hello world! 
 }
 }
 }
}
  1. Toggle Scripted Pipeline(Advanced)
  2. agent i指示 Jenkins 为整个流水线配置一个执行器 (在Jenkins环境下的任何可用的 代理/节点上) 和工作区。 echo 在控制台输出中写入一个简单的字符串。 node 与 agent (上面的)做了同样的事情。
  1. Note:你也可以从Script*文本区域的右上方的 *try sample Pipeline选项选择已Scripted的流水线示例。注意该区域没有可用的声明式流水线示例。
  2. 点击Save打开流水线项目视图页面。
  3. 在该页面, 点击左侧的Build Now运行流水线。
  1. 在左侧的*Build History* 下面, 点击1来访问这个特定流水线运行的详细信息。
  2. 点击Console Output来查看流水线运行的全部输出。下面的输出显示你的流水线已成功运行。

好了下面就介绍这些了,如果有问题请留言给我哦,后面主要是分享一些实战例子.