【问题标题】:Jenkins declarative pipeline with Docker/Dockerfile agent from SCMJenkins 声明式管道与来自 SCM 的 Docker/Dockerfile 代理
【发布时间】:2018-05-08 00:18:13
【问题描述】:

对于使用 Declarative Pipeline Syntax 的 Jenkins,我如何从 SCM (Git) 获取 Dockerfile(在此示例中为 Dockerfile.ci),因为 agent 块在所有阶段之前执行?

pipeline {
    agent {
        dockerfile {
            filename 'Dockerfile.ci'
        }
    }
    stage ('Checkout') {
        steps {
            git(
                url: 'https://www.github.com/...',
                credentialsId: 'CREDENTIALS',
                branch: "develop"
            )
        }
    }
    [...]
}

在我见过的所有示例中,Dockerfile 似乎已经存在于工作区中。

【问题讨论】:

    标签: docker jenkins dockerfile jenkins-pipeline


    【解决方案1】:

    您可以尝试为每个阶段分别声明代理,对于结帐阶段,您可以使用一些默认代理和 docker 代理。

    pipeline {
        agent none
        stage ('Checkout') {
            agent any
            steps {
                git(
                    url: 'https://www.github.com/...',
                    credentialsId: 'CREDENTIALS',
                    branch: "develop"
                )
            }
        }
        stage ('Build') {
            agent {
                dockerfile {
                filename 'Dockerfile.ci'
            }
            steps {
                [...]
            }
    }
        }
        [...]
    }
    

    【讨论】:

    • 这种方法的问题是工作空间不同,路径末尾会出现@2@3等。那你怎么办,再检查一下文件?
    【解决方案2】:

    如果您使用的是多分支管道,它会在评估代理之前自动检查您的 SCM。因此,在这种情况下,您可以从 SCM 中的文件中指定代理。

    【讨论】:

    • @Martin 请在审阅时更加小心。这确实为这个问题提供了答案,尽管它可以通过一些文档和链接来改进(并且可能会在其中添加更多文本:))见stackoverflow.com/help/how-to-answer
    • 我认为他确实提供了一个简短的问题答案。
    【解决方案3】:

    答案在Jenkins documentation on the Dockerfile parameter

    为了使用这个选项,Jenkinsfile 必须从 多分支管道或来自 SCM 的管道。

    只需向下滚动到 Dockerfile 部分,它就会记录在那里。

    这种方法的明显问题是它会损害管道开发。现在,不必在服务器上的管道字段中测试代码,而是必须针对每个可测试的更改将其提交到源存储库。 注意另外,Jenkinsfile 签出不能是稀疏或轻量级的,因为这只会获取脚本——而不是任何要构建的随附 Dockerfile。

    我可以想出几种方法来解决这个问题。

    1. 使用reuseNode true 指令针对节点中的代理进行开发。然后当代码稳定时,可以在 Jenkinsfile 的顶部将单独的代理块组合在一起,然后必须从 SCM 加载。
    2. 使用指定确切工作区目录的dir() 解决方案进行开发,或者使用this solution 中的其他示例之一。

    【讨论】:

      猜你喜欢
      • 2020-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多