首页 > 解决方案 > 我如何运行所有 jenkins 管道步骤,除了 docker 容器中的一个

问题描述

我正在尝试设置 jenkins 多分支管道以在 docker 容器中运行我的所有代码验证步骤,然后构建 docker 映像并将其推送到所述 docker 容器之外。

目前,我的 Jenkinsfile 看起来有点像这样(为了便于阅读而进行了精简):

pipeline {
    agent {
        label 'AWS'
    }
    stages {
        stage('stuff in docker') {
            agent {
                dockerfile {
                    filename 'Dockerfile.jenkins'
                    reuseNode true
                }
            }
            steps {
                stuff
            }
        }
        stage('more stuff in docker') {
            agent {
                dockerfile {
                    filename 'Dockerfile.jenkins'
                    reuseNode true
                }
            }
            steps {
                stuff
            }
        }
        stage('stuff not in docker') {
            steps {
                stuff
            }
        }
        stage('more stuff not in docker') {
            steps {
                stuff
            }
        }
    }
    post {
        always {
            cleanWs()
        }
    }
}

这里的问题是,我使用 dockerfile 代理的每个阶段,jenkins 都会尝试重建 docker 映像。这些阶段都被缓存了,但是发送构建上下文和实际处理所有内容仍然需要比我想要的更多的时间。如果我使用 dockerfile 作为根代理,我可以在同一个 docker 容器中运行所有内容,但是我失去了执行 git 内容和构建 docker 映像的能力(至少没有连接到外部 docker process sock,这看起来像比不必要的麻烦)。

我想知道是否有某种方法可以在多个步骤中使用相同的docker 映像,然后在其他步骤中退出该 docker 映像。

标签: dockerjenkinsjenkins-pipeline

解决方案


弄清楚了!

pipeline {
    agent {
        label 'AWS'
    }
    stages {
        stage('do everything in docker') {
            agent {
                dockerfile {
                    filename 'Dockerfile.jenkins'
                    reuseNode true
                }
            }
            stages {
                stage('stuff in docker') {
                    steps {
                        stuff
                    }
                stage('more stuff in docker') {
                    steps {
                         stuff
                    }
                }
            }
        }
        stage('stuff not in docker') {
            steps {
                stuff
            }
        }
        stage('more stuff not in docker') {
            steps {
                stuff
            }
        }
    }
    post {
        always {
            cleanWs()
        }
    }
}

tl;博士你可以嵌套阶段


推荐阅读