我已使用以下配置( 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容器?
答案 0 :(得分:2)
每个步骤都在自己的Docker容器和自己的卷中运行。因此,您不能在同一构建容器上运行两个步骤。
您是要优化耗时还是耗时多长时间?
如果要优化构建时间,请坚持使用现在的内容。由于使用多个步骤和工件的开销会增加一些构建时间。但是,您将失去这些功能所提供的灵活性。此外,您可以尝试确保在构建环境中使用小的Docker映像,因为这样可以更快地拉取该映像。
如果您正在优化管道完成时间,建议您使用工件和并行步骤的想法。虽然预计总执行时间会更长,但是您将等待更少的时间来查看管道的结果。
答案 1 :(得分:2)
前一段时间,我遇到了同样的问题,并且找到了解决方法,现在我正在成功地使用它。
您可以使用Docker的save
和load
以及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.json
和yarn.lock
文件更改时才安装NPM软件包。
docker save
(Docker 17):https://devdocs.io/docker~17/engine/reference/commandline/save/index docker load
(Docker 17):https://devdocs.io/docker~17/engine/reference/commandline/load/index 答案 2 :(得分:-1)
我建议的可能解决方案:
- step:
name: Install dependencies
script:
- yarn install
- yarn global add gulp-cli
您的第一步应该位于预构建的Docker容器中,该容器位于Docker Hub上,并用于通过image: username/deployment-docker:latest
进行部署。
然后,两个步骤都可以使用此容器进行测试。