当前位置: 首页 > 知识库问答 >
问题:

如何使用Jenkins声明性管道在远程Docker服务器上构建?

翟英达
2023-03-14

我在詹金斯内部写了一个声明性管道。此管道应在远程Docker服务器上的Docker容器中运行。

我阅读了自定义执行环境:

自定义执行环境

Pipeline的设计可以轻松地将Docker映像用作单个阶段或整个管道的执行环境。这意味着用户可以定义其管道所需的工具,而无需手动配置代理。实际上,任何可以打包在Docker容器中的工具。只需对Jenkins文件进行少量编辑即可轻松使用。

pipeline {
    agent {
        docker { image 'node:7-alpine' }
    }
    stages {
        stage('Test') {
            steps {
                sh 'node --version'
            }
        }
    }
}

它工作,但它使用詹金斯服务器作为Docker服务器。

我使用远程Docker服务器阅读:

使用远程Docker服务器

默认情况下,Docker管道插件将与本地Docker守护进程通信,通常通过/var/run/Docker访问。短袜

要选择非默认Docker服务器,例如使用Docker Swarm,应使用withServer()方法。

通过将URI和在Jenkins中预先配置的Docker服务器证书身份验证的凭据ID(可选)传递给具有以下内容的方法:

node {
    checkout scm

    docker.withServer('tcp://swarm.example.com:2376', 'swarm-certs') {
        docker.image('mysql:5').withRun('-p 3306:3306') {
            /* do things */
        }
    }
}

这是可行的,但它使用脚本化管道。

我还阅读了指定Docker标签:

指定Docker标签

默认情况下,管道假定任何配置的代理都能够运行基于Docker的管道。对于具有macOS、Windows或其他无法运行Docker守护程序的代理的Jenkins环境,此默认设置可能有问题。管道在Manage Jenkins页面和文件夹级别提供了一个全局选项,用于指定运行基于Docker的管道所使用的代理(按标签)。

但是使用一个标签需要一个完整的Jenkins从机和一个安装了sshd的Jenkins用户,一直在线,Jenkins的主机将安装从机库。仅仅使用声明性管道而不是脚本化管道听起来有点沉重。

如何在具有声明性管道的远程Docker服务器上构建?

共有2个答案

韦锦程
2023-03-14

您不需要“完整的Jenkins从机”——您只需要一台运行Docker并通过TCP/TLS和x509客户端身份验证为Docker套接字提供服务的机器;不要提供未经验证和未加密的服务,否则您将在您的安全外围打开一个星球大小的漏洞(这是学习openssl的机会!)

对于声明性,您可以在代理标记内使用“节点”,并使用标签关联的docker容器(包含Jenkins需要的所有内容)配置模板。

pipeline {
    agent {
        node {
            label 'docker-agent'
        }
    }
    ...

您需要挂载docker套接字(以及您的代理工作区),否则您将无法从代理容器中执行很多操作。

越健
2023-03-14

我想你在这里混的东西很少。关于代理的文档部分,代理部分用于标识阶段应该运行的节点,以及特殊配置和信息。

Docker标记依次提供了应该从图像内部运行的信息。

这不会给您留下任何连接到外部docker服务器的空间,除非您将其设置为带有一些特殊标签的Jenkins节点,例如“docker special”。然后你可以做一些简单的事情

agent {
    docker {
        image 'maven:3-alpine'
        label 'docker-special'
    }
}

Docker标签上的文档部分

码头工人

使用给定容器执行管道或阶段,该容器将在预先配置为接受基于Docker的管道的节点上或在与可选定义的label参数匹配的节点上动态配置。

至于您的特定用例。

詹金斯留档的这一部分提到了侧车模式/高级用法,他们立即切换到脚本。

所以是的,正如我提到的,这在声明性中是不可用的。声明式的唯一出路是将外部服务器标记为带有特定标签的詹金斯节点。

 类似资料:
  • 我有几个不同repo的Jenkins声明性管道,它们触发数据库刷新,以及依赖于数据库的单元测试。这些Jenkins作业是从GitHub中的pull请求触发的。 为了避免资源冲突,我需要防止这些作业同时运行——无论是在每个项目内还是在各个项目之间。 “油门并发构建”插件似乎就是为此而构建的。 我已经安装了插件,并配置了如下类别: 我在Jenkins文件中添加了“throttle”选项,其中一个存储库

  • 我刚开始使用Jenkins声明性管道。在我支持一些类似的项目时,我考虑将类似的管道步骤(甚至阶段)放入可重用的构建块中。这些区块应保持在一个中心点,然后由单独的管道包括在内(例如:干燥)。 我将共享库视为脚本化管道的一个选项,但我不确定它是否也适用于声明性管道。 你知道在Jenkins声明性管道中使用像构建块这样的东西的方法吗? 举例说明: 如果您有一个用于Maven项目的标准管道(例如Sprin

  • 问题内容: 我的Jenkins 2.19.4使用管道:声明式代理程序API 1.0.1。如果您无法定义变量来分配读取的属性,那么如何使用readProperties? 例如,要捕获SVN版本号,我目前以脚本样式使用以下代码捕获它: 然后我可以使用: 由于以声明式定义svnProp是不合法的,因此如何使用readProperties? 问题答案: 您可以使用标记内的步骤来运行任意管道代码。 所以符合

  • 我在尝试做一些我觉得应该很简单的事情,但是我不知道怎么做。 基本上,我有一个Jenkins主(在Linux上运行)和两个从,一个在Windows上,另一个在macOS上。 我想在所有3个平台上构建我的项目,并在所有3个平台上运行GTest测试。 我可以构建并运行测试,但是junit步骤似乎没有收集任何测试结果。 我试图把< code>post块放在任何地方,但是它就是不工作。如果我尝试将< cod

  • 我的存储库中有一个带有Jenkinsfile的多分支管道,我能够拥有我的CI工作流程(构建 为了设置我的夜间构建,我添加了 但是现在,如果我们只是在晚上构建由cron表达式触发的作业,如何执行分析步骤呢? 我的简化构建阶段如下所示:

  • 问题内容: 我正在尝试将旧样式的基于项目的工作流转换为基于Jenkins的管道。在浏览文档时,我发现有两种不同的语法分别命名为和。例如最近(2016年底)发布的Jenkins网络语法。尽管有一个新的语法版本,Jenkins仍然也支持脚本语法。 现在,我不确定这两种类型的哪种情况最合适。语法将很快被弃用吗?詹金斯管道的未来会是这样吗? 任何可以分享有关这两种语法类型的想法的人。 问题答案: 最初创建