Jenkins工具和docker代理的区别

sem*_*ral 3 jenkins jenkins-pipeline

抱歉,这可能是一个简单的问题,但是使用工具和 docker agent 之间有什么区别。我认为使用 docker agent 比使用工具更灵活。我什么时候应该使用 docker 代理或工具?

工具

pipeline {
    agent any
    tools {
        maven 'Maven 3.3.9'
        jdk 'jdk8'
    }
    stages {
        stage ('Initialize') {
            steps {
                sh '''
                    echo "PATH = ${PATH}"
                    echo "M2_HOME = ${M2_HOME}"
                '''
            }
        }

        stage ('Build') {
            steps {
                sh 'mvn -Dmaven.test.failure.ignore=true install' 
            }
Run Code Online (Sandbox Code Playgroud)

Docker代理

pipeline {
agent none
stages {
    stage('Back-end') {
        agent {
            docker { image 'maven:3-alpine' }
        }
        steps {
            sh 'mvn --version'
        }
    }
Run Code Online (Sandbox Code Playgroud)

Szy*_*iak 5

这两个选项的目的略有不同。该tools允许您在.​​ 您不能使用任何版本 - 您只能使用在全局工具配置Jenkins 页面中配置的版本:PATH

在此输入图像描述

如果您的 Jenkins 配置仅包含单个 Maven 版本,例如Maven 3.6.3,则只能使用此版本。指定未在全局工具配置中配置的版本将导致管道失败。

pipeline {
    agent any
    tools {
        maven 'Maven 3.6.3' 
    }
    stages {
        stage('Example') {
            steps {
                sh 'mvn --version'
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

tools如果您的 Jenkins 服务器不支持运行 docker 容器,则使用块来指定受支持工具的不同版本将是一个不错的选择。

docker另一方面,代理在指定工具及其版本方面给予您完全的自由。它不限制您使用mavenjdkgradle,并且不需要在 Jenkins 服务器中进行任何预配置。您需要的唯一工具是 docker,您可以自由使用 Jenkins 管道中所需的任何工具。

pipeline {
    agent {
        docker {
            image "maven:3.6.3-jdk-11-slim"
        }
    }
    stages {
        stage('Example') {
            steps {
                sh 'mvn --version'
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

何时使用其中一种而不是另一种?

这个问题没有单一的正确答案。这取决于上下文。该tools块非常有限,但它使您可以控制 Jenkins 中使用的工具。在某些情况下,人们决定不在 Jenkins 环境中使用 docker,并且他们更愿意控制用户可以使用哪些工具。我们可以同意也可以不同意。在使用docker代理时,您可以完全访问可作为 Docker 容器提供的任何工具。在某些情况下,当使用特定版本的工具时,这是最佳选择 - 您的操作系统可能不允许您安装所需的版本。当然,您需要记住,这种功能和灵活性是有代价的。您失去了对 Jenkins 管道中使用哪些工具的控制。此外,如果拉取大量不同的 docker 映像,则会增加磁盘空间消耗。更不用说docker代理允许您使用可能消耗大量 CPU 和内存的工具来运行管道。(我见过 Jenkins 管道在未准备好负载的节点上启动 Elasticsearch、Logstash、Zookeeper 和其他服务。)