我如何运行所有 jenkins 管道步骤,除了 docker 容器中的一个步骤

Chi*_*ing 5 jenkins docker jenkins-pipeline

我正在尝试设置 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()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Chi*_*ing 6

弄清楚了!

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()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

tl;dr 你可以嵌套阶段

  • 这解决了我的问题 - 谢谢!另外,这是官方的[Jenkins博客文章](https://www.jenkins.io/blog/2018/07/02/whats-new-declarative-piepline-13x-sequential-stages/#running-multiple-stages -with-the-same-agent-or-environment-or-options)其中深入解释了此功能。在 /sf/answers/5326639321/ 找到链接。 (2认同)