【问题标题】:GitLab CD workflow to deploy Docker app into staging and productionGitLab CD 工作流将 Docker 应用程序部署到登台和生产中
【发布时间】:2021-01-29 00:36:29
【问题描述】:

我最近设置了 GitLab (13.4.3-ee) CI/CD 来构建和部署 Docker 容器投入生产。这很好用,但我想添加一个分期 一步,尽管阅读了一堆,我似乎无法找到一个可行的 这样做的方法。

我认为我遇到的一个问题是遵循教程,我依赖于 docker-compose 文件部署到生产环境中。

如果我添加了部署到不同(暂存)运行器的步骤,那么 image: 我在生产中使用的语句没有用,因为它安装了latest 图片。我真的不想在 docker 映像上使用 latest 标签,除非我是 即将将该映像部署到生产环境中。

我考虑将部署阶段的 docker-compose 命令替换为 重现撰写文件的一系列手动步骤,但这看起来很混乱, 尤其是当应用依赖于其他容器时。

关于我应该如何处理这个问题有什么建议吗?

.gitlab-ci.yml

stages:
  - build
  - deploy

# Build and tag :master and :latest images if on master branch
build-master:
  # Official docker image.
  image: docker:19.03.12-dind
  stage: build
  services:
    - docker:19.03.12-dind
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script:
    - echo $CI_REGISTRY_IMAGE
    - docker build --pull -t $CI_REGISTRY_IMAGE:latest .
    - docker push $CI_REGISTRY_IMAGE
  # Only run this job on the master branch.
  only:
    - master

build-test:
  # Official docker image.
  image: docker:19.03.12-dind
  stage: build
  services:
    - docker:19.03.12-dind
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script:
    - echo $CI_REGISTRY_IMAGE
    - docker build --pull -t $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME
  # Do not run job on master branch
  except:
    - master

deploy_prod:
  stage: deploy
  # Specify runner
  tags:
    - prod
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script:
    # In production, pull the latest image.
    - docker pull $CI_REGISTRY_IMAGE:latest
    - docker-compose down
    - docker-compose up -d
  when: manual
  only:
    - master

docker-compose.yml

请注意,这是实际 docker-compose 文件的精简版。

---
version: '3'

services:
    buildit:
        image: my-gitlab-registry.local:5050/app/docker-build-test:latest
        container_name: docker-build-test
        ports:
            - 500:80

【问题讨论】:

  • 您可能根本不想使用latest 标签。为每个构建创建一个唯一的版本标签,并将其(可能通过环境变量)注入docker-compose.yml 文件。这避免了系统认为它是最新的问题,因为它正在运行一些“最新”构建,即使它是昨天的“最新”。

标签: docker docker-compose gitlab gitlab-ci


【解决方案1】:

您可以使用环境变量来选择您的图像标签。在您的 docker-compose 中,您可以这样做

---
version: '3'

services:
    buildit:
        image: my-gitlab-registry.local:5050/app/docker-build-test:${IMAGE_TAG:-latest} #latest is a default value
        container_name: docker-build-test
        ports:
            - 500:80

在 gitlab-ci 中

  • build_master 期间可以推送多个标签
  • deploy_prod 期间,您可以设置 IMAGE_TAG=master
  • deploy_staging 期间,您可以设置 IMAGE_TAG=staging
....
build-master:
  # Official docker image.
  image: docker:19.03.12-dind
  stage: build
  services:
    - docker:19.03.12-dind
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script:
    - echo $CI_REGISTRY_IMAGE
    - docker build --pull -t $CI_REGISTRY_IMAGE:latest .
    - docker push $CI_REGISTRY_IMAGE
    - docker push $CI_REGISTRY_IMAGE:master    # tag master
    - docker push $CI_REGISTRY_IMAGE:staging   # tag staging

  # Only run this job on the master branch.
  only:
    - master

deploy_prod:
  stage: deploy
  # Specify runner
  tags:
    - prod
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script:
    # In production, pull the latest image.
    - export IMAGE_TAG=master  
    - docker pull $CI_REGISTRY_IMAGE:latest
    - docker-compose down
    - docker-compose up -d
  when: manual
  only:
    - master

deploy_staging:
  stage: deploy
  # Specify runner
  tags:
    - prod
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script:
    # In production, pull the latest image.
    - export IMAGE_TAG=staging  
    - docker pull $CI_REGISTRY_IMAGE:latest
    - docker-compose down
    - docker-compose up -d
  when: manual
  only:
    - master

这样可以避免拉取latest的图片,并且可以拉取特定标签上的最新图片

【讨论】:

  • 谢谢,这给了我一些思考。虽然我不确定如果您打算设置环境变量是否打算使用 environment 关键字,因为这似乎是不同的东西(docs.gitlab.com/ee/ci/environments)我认为它的语法如下,尽管 environment 关键字确实似乎适合我正在尝试做的事情,我真的不知道如何在我的情况下应用它。 yaml variables: IMAGE_TAG: staging
  • 对不起,我犯了一个错误。 environvent 在 gitlab-ci 中无效。无论如何,您可以通过在脚本中设置环境变量来使用相同的方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 2020-07-14
  • 1970-01-01
  • 2022-01-01
  • 2022-08-10
  • 2018-10-30
  • 1970-01-01
相关资源
最近更新 更多