当前位置: 首页 > 知识库问答 >
问题:

如何运行除 docker 容器中的一个步骤之外的所有 jenkins 管道步骤

秋阳荣
2023-03-14

我试图建立一个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 进程 sock 的情况下,这似乎比应该更麻烦)。

我想知道是否有什么方法可以在多个步骤中使用同一个docker映像,但在其他一些步骤中退出该docker镜像。

共有2个答案

梁丘凯定
2023-03-14

使用dockerfile作为构建代理将始终导致容器重建。如果您只想在(预构建)容器内运行一些步骤,请使用docker作为代理。当然,这也可以是在同一管道内本地构建的容器。您还可以使用绑定挂载在容器之间共享数据

如果不确定,请查看文档1和2。在您的情况下,可能还建议将全局代理设置为<code>none</code>。

裴甫
2023-03-14

想通了!

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你可以嵌套阶段

 类似资料:
  • 问题内容: 我正在尝试建立一个jenkins多分支管道以在docker容器中运行我所有的代码验证步骤,然后构建docker映像并将其推送到所述docker容器之外。 目前,我的Jenkinsfile看起来像这样(为了便于阅读而进行了缩减): 这里的问题是我使用dockerfile代理的每个阶段,jenkins都会尝试重建docker映像。这些阶段都已缓存,但是发送构建上下文并实际处理所有内容仍然比

  • 我已经使用下面的配置为我的web应用程序设置了连续部署(bitbucket-pipelines.yml)。 虽然这有效,但我想通过并行运行单元和集成测试步骤来提高构建速度。 这还有一个优点,就是可以看到比特桶中的不同步骤,包括每一步的执行时间。 这是行不通的,因为每个步骤都创建了一个干净的Docker容器,并且测试步骤上不再安装依赖项。 我知道我可以使用工件在步骤之间共享文件,但这仍然需要创建多个

  • 本文向大家介绍Docker容器运行ASP.NET Core的实现步骤,包括了Docker容器运行ASP.NET Core的实现步骤的使用技巧和注意事项,需要的朋友参考一下 最近要学习的知识太多,都不知道先学哪些了,原本计划这篇博客是写xamarin.forms中的listview用法,关于listview的用法简书上有一篇介绍的也比较详细,所以暂时先缓一缓,属于次要任务,等以后再写。本周在万能的淘

  • 所以我用这个脚本创建了一个新的管道(直接粘贴到Jenkins,而不是在SCM中): 我运行了它,什么也没有发生,工作没有收到一个新的参数,即使它收到了,我也不明白为什么我可能需要这个。谁能解释一下吗? Update1:我尝试将一个带有属性步骤的虚拟管道放入我的git repo,然后配置一个多分支作业。

  • 问题内容: 仅在构建特定分支时,如何运行构建步骤/阶段? 例如,仅在调用分支的情况下才运行部署步骤,而其他所有都保持不变。 问题答案: 在声明性管道语法中执行相同的操作,以下是一些示例: 出现更有效的方法-https: //issues.jenkins- ci.org/browse/JENKINS-41187 另请 参阅- https://jenkins.io/doc/book/pipeline/