繁体   English   中英

带有来自 SCM 的 Docker/Dockerfile 代理的 Jenkins 声明式管道

[英]Jenkins declarative pipeline with Docker/Dockerfile agent from SCM

对于使用詹金斯的Declarative Pipeline Syntax我如何得到Dockerfile( Dockerfile.ci在这个例子中)从SCM(GIT),因为agent块之前的所有阶段执行?

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

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

您可以尝试分别为每个阶段声明代理,对于结帐阶段,您可以为其他阶段使用一些默认代理和 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 {
            [...]
        }
}
    }
    [...]
}

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

答案在关于 Dockerfile 参数Jenkins 文档中

为了使用这个选项,Jenkinsfile必须从 Multibranch Pipeline 或来自 SCM 的 Pipeline 加载。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM