Jenkins: The Foundations

Posted on Tue, Jun 6, 2023 Jenkins CI

Last Updated: @2023/06/06

现在我们对 Jenkins 有了一个基本的了解,下面来了解 Jenkins 如何支持 pipeline-as-code。在我们创建 pipeline 时,最重要的第一步是了解我们的 pipeline 运行在什么环境。这包含了如何创建,执行以及监控 pipeline。我们以下四个方面进行阐述:

我们从介绍 Jenkins 的一些重点概念开始,首先对两种风格的语法进行比较,然后了解什么是 DSL。接下来以创建 pipeline 为例,介绍了 Jenkins 提供的一些工具。从在写 pipeline code 时,Jenkins 帮助我们进行语法检查以及通过界面方式生成代码,在运行结束时,如何更好的查看日志,以及在不改变源代码的情况下,允许我们调试 Pipeline。

Syntax: Scripted Pipelines Versus Declarative Pipelines

Scripted Pipeline 是实现 pipeline-as-code 最早的方式,更像是用 Groovy, Shell 等编写的脚本来实现程序流程和逻辑控制。

Declarative Pipeline 是新的一种方案,它提供了一种结构化的方式来定义流水线。

下面可以看下两种语法的区别:

// Scripted Pipeline
node('worker_node1') {
    stage('Source') { // Get code
        // get code from our Git repository
        git 'git@diyvb2:/home/git/repositories/workshop.git'
    }
    stage('Compile') { // Compile and do unit testing
       // run Gradle to execute compile and unit testing
       sh "gradle clean compileJava test"
    }
}

// Declarative Pipeline
pipeline {
    agent {label 'worker_node1'}
    stages {
        stage('Source') { // Get code
            steps {
                // get code from our Git repository
                git 'git@diyvb2:/home/git/repositories/workshop.git'
            }
        }
        stage('Compile') { // Compile and do unit testing
            steps {
                // run Gradle to execute compile and unit testing
                sh "gradle clean compileJava test"
            }
        }
    }
}

Choosing Between Scripted and Declarative Syntax

综上比较,新人使用 Declarative 会更易上手和维护。Scripted 提供了更大的灵活性。 它提供了“超级用户”选项,允许用户以更少的强加结构做更多的事情。但是,无论选择使用那种风格去创建 pipeline,最好选择一种。本文全力拥抱 Declarative Pipeline。

Systems: Masters, Nodes, Agents, and Executors

无论使用哪种方式创建 pipeline,总要有一个地方去执行我们的代码。众所周知,Jenkins 分为 master 和 slave,

Master

Master 是 Jenkins 的大脑,用于任务分发,配置管理,插件权限控制管理等。同时也可在 master 上运行任务,但并不推荐。原因如下:

  1. 安全问题,在 master 运行的任务可以访问所有的配置数据信息
  2. 运行负载过高的任务会导致 Jenkins 变慢

Node

Node 是指 Jenkins jobs 可与运行的系统,也包括了 master 和 agent。这个系统可以是 VM,Docker container 等。

Agent

Agent 在早版本的时候也称为 Slave,和 Node 通常是相同的概念,但区别是 Agent 一般指除了 Master 之外的系统。

Executor

Executor 是指 Node/Agent 上运行 Job 的实例。一个 Node 可以有0个到多个执行者。

Creating Nodes

在了解上述概念之后,我们来创建一个 node。

登录 Jenkins 后,点击 Manage Jenkins,选择 Manage Nodes and Clouds。

选择 New Node 并填入相应数据。

Launch method 选择 Launch agents via SSH,在这里需要确保网络、远程端口、IP 以及证书的准确性。

Structure: Working with the Jenkins DSL

DSL(Domain-Specific Language)是一种用于根据上下文定义和配置的特定领域语言。Jenkins DSL 是以 Groovy 为基础,提供了 pipeline as code 的方法去创建和管理流水线,使得流水线的创建和维护更加灵活和可重复。

在本节会以 Declarative Pipeline 为例,简单介绍 Jenkins DSL 相关概念和结构。在后面章节会对 Declarative Pipeline 进行更详细的说明。

pipeline {
    agent any

    stages {
        stage('Hello') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

上述代码是一个简单的 Declarative Pipeline 脚本,用于在Jenkins中定义和执行一个流水线。

Declarative Pipeline强调流水线的结构和阶段,以及各个阶段中的步骤和条件。具有以下特点:

  1. 结构化语法:Declarative Pipeline使用结构化语法来定义流水线的不同部分。包括pipeline块作为最外层的容器,并可以包含多个stage块。每个stage块代表流水线的一个阶段,可以包含一个或多个步骤。
  2. 高可读性:Declarative Pipeline的语法设计旨在提高可读性,使得流水线的意图更加清晰。使用关键字和指令来描述各个阶段和步骤,并提供了清晰的结构和缩进来区分不同的部分。
  3. 集成性:Declarative Pipeline天生集成了 Jenkins 生态系统中的许多功能和插件。支持各种步骤和指令,如构建、测试、部署、通知等,可以轻松地与其他Jenkins插件和工具进行集成。
  4. 可扩展性:Declarative Pipeline 支持自定义的步骤和条件,可以通过编写自定义的 Groovy 函数或引用外部的共享库来扩展流水线的功能。

Support: Developing a Pipeline Script

Jenkins 支持创建不同类型的 Job 以满足项目的需求。下面我们以创建类型为 Pieline 的 Job 为例,让我们更好的去了解如何创建、编辑、运行和监控 pipeline。

Starting a Pipeline Project

点击 New Item,会看到以下种类的 Job,我们选择 Pipeline 并输入名字,就完成了初始化。

这时会跳转到一个表单页面,我们可以根据需求来进行配置。我们移动到 Pipeline 节点,选择 Hello World 模板,在文本编辑器内就会出现以下内容。

The Editor

Jenkins 内置编辑器有以下功能:语法检查、错误提示、自动补全等。

Syntax checking

编辑器会实时验证用户输入的流水线脚本,检查语法错误和配置问题,鼠标停留在❌会给出相应的错误提示和建议。如下所示:

Working with the Snippet Generator

使用 DSL 创建 pipeline 有很多优点,但是如何知道每个指令对应的语法,成为一个棘手的问题。

Jenkins 提供了 Snippet Generator 工具,用于帮助用户生成特定流水线步骤和指令的代码片段。它提供了一个图形界面,您可以在其中选择所需的步骤或指令,并配置其参数。配置完成后,Snippet Generator 会生成相应的代码片段,可以在 Jenkins 流水线脚本中使用。

下面我们通过一个简单的例子,了解如何使用 Snippet Generator。假设我们想使用 Git Clone 代码,

  1. 打开 Snippet Generator:在 Jenkins 界面中,导航到 Pipeline,并点击"Pipeline Syntax"链接。这将带您进入 Snippet Generator。

  1. 选择步骤或指令:在 Snippet Generator 页面的"Sample Step"下拉菜单中,选择"git: Git"。这将加载 git 步骤的相关参数。
  2. 配置参数:在 Repository URL 参数中,输入要克隆的 Git 存储库的 URL。以及在 BranchCredentials 输入对应的字段。
  3. 生成代码片段:点击 Generate Pipeline Script 按钮。Snippet Generator 将根据您的配置生成 git clone 步骤的代码片段
  4. 在流水线中使用代码片段:将生成的代码复制并粘贴到 pipeline 的适当位置。确保将其放在正确的 stage 中。
      stage('Source') {
          steps {
              git credentialsId: 'jenkins-demo', url: 'https://github.com/brentlaster/gradle-greetings.git'
          }
      }

通过上述步骤,我们完成了 git clone 的步骤。这样我们无需手动写代码,而是通过可视化工具生成代码片段并集成到流水线中。

Running a Pipeline

完成 pipeline script 开发后,我们可以准备运行 pipeline。 pipeline 由多个 stages 构成,如编译、测试、分析、部署等。现在我们接上述的步骤,以一个简单的 Pipeline 为例。

pipeline {
    agent any

    stages {
        stage('Source') {
            steps {
                git credentialsId: 'jenkins-demo', url: 'https://github.com/brentlaster/gradle-greetings.git'
            }
        }
        stage('Build') {
            // TO-DO: Execute the gradle build associated with this project
            steps {
                sh 'echo gradle build will go here'
            }
        }
    }
}

Build

把上述脚本复制到 pipeline 的编辑器中并保存,点击 Build Now ,Pipeline 则会执行。下面是运行成功的结果。每一行代表执行的实例,每一列对应着 pipeline 中的 stage。

Viewing logs

在 Jenkins 中查看日志可以了解构建过程中发生的事情、排查问题以及监控流水线的执行。以下是在 Jenkins 中查看日志的几种常用方法:

  1. Console Output:点击进入到 job,在侧边栏单击 Console Output 就可以看到所有的日志。
  2. Stage view 快捷查看日志:鼠标停留在相应的 stage 上,就会显示 Logs 。点击就会显示相关 stage 的日志。
    1. Open Bule Ocean :点击进入到 job,在侧边栏单击 Open Bule Ocean ,如下图所示:

    Replay

    Jenkins Replay 可以重新运行先前执行过的构建。通过 Replay 功能,可以在不改变源代码的情况下修改 pipeline,进行测试。

    1. 侧边栏点击 Replay
    1. 修改脚本:更改 build 步骤
      steps {
      	// sh 'echo gradle build will go here'
        sh 'echo replay build'
      }
    2. Run and check:点击 Run 则会执行#2,查看日志输出,正是我们修改的内容。但是查看配置信息,Script 还是修改前的内容。

      Summary

      本章介绍了 Jenkins 基础功能的使用以及相关的概念。从不同的维度,对比了两种语法的优缺点。之后明确了 Jenkins 环境系统相关的定义,让我们知道 pipeline 是在哪运行。然后,简单介绍 Jenkins DSL 的结构,并介绍了 Jenkins 为方便开发 Pipeline 提供的一些工具。

      这些信息为在工作中使用和探索其余内容提供坚实的基础。在接下来的章节,我们会在此基础上进行更深入的探讨。