• Jenkins 系统节点描述
  • Master 节点
  • Node
  • Agent 节点
  • 指令与步骤
  • Executor

Jenkins 系统节点描述

Master 节点

Jenkins 主节点是一个 Jenkins 实例(instance)的主要控制系统。它能够完全访问所有 Jenkins 配置选项和任务(job)列表。如果没有指定其他系统(system),它也是默认的任务执行节点。

不过并不推荐在主节点上执行高负载任务,任何需要大量处理的任务都应该在主节点之外的系统上运行。

这样做的另一个原因是,凡是在主节点上执行的任务,都有权限访问所有的数据、配置和操作,这会构成潜在的安全风险。同样值得注意的是,在主系统上不应该执行任何包含潜在阻塞的操作,因为主系统需要持续响应和管理各类操作过程。

Node

在 Jenkins2 中,节点是一个基础概念,代表了任何可以执行 Jenkins 任务的系统。节点中包含主节点和代理节点,有的时候也用于指代这些概念。

此外,节点也可以是一个容器,比如:Docker。

在任何 Jenkins 实例中主节点都会存在,但是由于上述原因,我们并不推荐在主节点上执行任务。

Agent 节点

在早先版本的 Jenkins 中,代理节点被称为从节点(slave),其代表了所有非主节点的系统。这类系统由主系统管理,按需分配或指定执行特定的任务。例如:我们可以分配不同的代理节点针对不同的操作系统构建任务,或者可以分配多个代理节点并发地运行测试任务。

为了减少系统负载,降低安全风险,通常在子系统上只会安装一个轻量级的 Jenkins 客户端应用来处理任务,这个客户端应用对资源访问是受限的。

随着代理节点和节点之间关系的演进,代理节点在节点上运行。在脚本式流水线中,“node” 特指一个运行代理节点的系统,而在声明式流水线中,其指代一个特定的代理节点来分配节点。

指令与步骤

根据节点和代理节点在声明式语法和脚本式语法中的使用方式,我们可以得出这两个概念之间的高层次的差异。

node 用于脚本式流水线,从技术层面上看它是一个步骤,代表可以用于流水线中执行活动的资源。它在一个运行代理节点的节点上面分配一个执行器,并进一步在定义的代码块上运行代码。下面的代码片段展示了一个指定 node 步骤的简单示例:

node ('worker1') {
   stage('Source') { // for display purposes
      // Get some code from our Git repository
      git 'https://github.com/brentlaster/gradle-greetings.git'
   }
}

而相对于声明式流水线中的 agent,它作为一个指令用来分配节点,除非使用了特殊用法 agent none。下面是一个简单的 agent 声明的示例:

// 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"
            }
        }
    }
}

抛开两种不同的流水线语法规格,这两个概念之间的区别并不明显,甚至可以认为它们就是一回事。只需要记住node用于脚本式流水线,而agent则用于声明式流水线就够了。

Executor

执行器同上述所有系统节点都有关系。

执行器只是节点/代理节点用于执行任务的一个插槽。一个节点可以有任意多个执行器。执行器的数量定义了该节点可以执行的并发任务数量。当主节点将任务分配给特定节点时,该节点上必须有可用的执行器插槽来立即执行该任务,否则任务会一直处于等待状态,直到一个执行器变为可用。

执行器的数量和其他参数可以在创建节点的时候进行配置。