一尘不染

如何在Docker容器中运行除詹金斯管道之外的所有步骤

jenkins

我正在尝试建立一个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映像中提取其他步骤。


阅读 269

收藏
2020-07-25

共1个答案

一尘不染

弄清楚了!

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; dr,您可以嵌套阶段

2020-07-25