Bitbucket管道-如何将同一个Docker容器用于多个步骤?

时间:2018-07-10 10:12:34

标签: docker continuous-integration bitbucket bitbucket-pipelines

我已使用以下配置( bitbucket-pipelines.yml )为我的Web应用程序设置了持续部署。

pipelines:
  branches:
    master:
        - step:
            name: Deploy to production
            trigger: manual
            deployment: production
            caches:
              - node
            script:
              # Install dependencies
              - yarn install
              - yarn global add gulp-cli

              # Run tests
              - yarn test:unit
              - yarn test:integration

              # Build app
              - yarn run build

              # Deploy to production
              - yarn run deploy

尽管这可行,但我想通过并行运行单元和集成测试步骤来提高构建速度。

我尝试过的

pipelines:
  branches:
    master:
        - step:
            name: Install dependencies
            script:
              - yarn install
              - yarn global add gulp-cli

        - parallel:
            - step:
                name: Run unit tests
                script:
                  - yarn test:unit
            - step:
                name: Run unit tests
                script:
                  - yarn test:integration

        - step:
            name: Build app
            script:
              - yarn run build

        - step:
            name: Deploy to production
            trigger: manual
            deployment: production
            script:
              - yarn run deploy

这还具有查看Bitbucket中不同步骤的优势,包括每个步骤的执行时间。

问题

这不起作用,因为对于每个步骤,都会创建一个干净的Docker容器,并且不再在测试步骤中安装依赖项。

我知道我可以使用工件在步骤之间共享文件,但是仍然需要创建多个容器,这会增加总执行时间。

所以我的问题是...

如何在多个步骤之间共享同一个Docker容器?

3 个答案:

答案 0 :(得分:2)

每个步骤都在自己的Docker容器和自己的卷中运行。因此,您不能在同一构建容器上运行两个步骤。

深入研究问题

您是要优化耗时还是耗时多长时间?

如果要优化构建时间,请坚持使用现在的内容。由于使用多个步骤和工件的开销会增加一些构建时间。但是,您将失去这些功能所提供的灵活性。此外,您可以尝试确保在构建环境中使用小的Docker映像,因为这样可以更快地拉取该映像。

如果您正在优化管道完成时间,建议您使用工件和并行步骤的想法。虽然预计总执行时间会更长,但是您将等待更少的时间来查看管道的结果。

答案 1 :(得分:2)

前一段时间,我遇到了同样的问题,并且找到了解决方法,现在我正在成功地使用它。

您可以使用Docker的saveload以及BitBucket的工件来进行此操作。您只需要确保图像不会太大,因为BitBucket的工件限制为1GB,并且可以使用多阶段构建和其他技巧轻松地确保这一点。

- step: name: Build app script: - yarn run build - docker save --output <backup-file-name>.tar <images-you-want-to-export> artifacts: - <backup-file-name>.tar - step: name: Deploy to production trigger: manual deployment: production script: - docker load --input <backup-file-name>.tar - yarn run deploy

您可能还想使用BitBucket的缓存,这可以更快地构建Docker映像。例如,您可以这样做,以便仅在package.jsonyarn.lock文件更改时才安装NPM软件包。

进一步阅读

答案 2 :(得分:-1)

我建议的可能解决方案:

  - step:
        name: Install dependencies
        script:
          - yarn install
          - yarn global add gulp-cli

您的第一步应该位于预构建的Docker容器中,该容器位于Docker Hub上,并用于通过image: username/deployment-docker:latest进行部署。

然后,两个步骤都可以使用此容器进行测试。