Jenkins使用SCM中的Docker / Dockerfile代理声明管道

时间:2018-05-08 00:18:13

标签: docker jenkins dockerfile jenkins-pipeline

Jenkins使用Declarative Pipeline Syntax如何从SCM(Git)获取Dockerfile(本例中为Dockerfile.ci),因为agent块在所有阶段之前执行?< / p>

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

在我看过的所有例子中,Dockerfile似乎已经存在于工作空间中。

3 个答案:

答案 0 :(得分:2)

您可以尝试单独为每个阶段声明代理,对于结帐阶段,您可以使用其他默认代理和泊坞代理。

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 {
            [...]
        }
}
    }
    [...]
}

答案 1 :(得分:1)

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

答案 2 :(得分:0)

答案在Jenkins documentation on the Dockerfile parameter中:

要使用此选项,必须从以下位置加载Jenkinsfile : 多分支管道或SCM管道。

只需向下滚动至Dockerfile部分,并在此处进行记录。

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

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

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