使用 Gitlab-CI AutoDevOps 为每个环境构建不同的镜像

Building different images for each environment with Gitlab-CI AutoDevOps

Dockerfiles 通过 --build-args 接受 ENV 变量。这些变量对于 NextJS 是必需的,用于静态页面(调用远程 API)并且在构建的图像中是“硬编码”的。

Gitlab-CI AutoDevOps 有一个环境变量来传递这些参数 (AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS)。但这只有在您使用一个 environment/image 时才能消耗。当需要多个环境(stagingproduction)时,URL 不同(https://staging.exmpl.comhttps://www.exmpl.com)。

如何修改 Gitlab AutoDevOps 以构建两个不同的图像?

在 CI/CD 设置中,我的 AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS 设置为:

--build-arg=API_URL=https://staging.exmpl.at/backend --build-arg=NEXT_PUBLIC_API_URL=https://staging.exmpl.at/backend
# as well $NEXT_PUBLIC_API_URL is set there

目前这是我完成的gitlab-ci.yml:

include:
  - template: Auto-DevOps.gitlab-ci.yml

# added vars for build
build:
  stage: build
  variables:
    API_URL: $NEXT_PUBLIC_API_URL
    NEXT_PUBLIC_API_URL: $NEXT_PUBLIC_API_URL

如何在不“离开”AutoDevOps 的情况下构建两个映像?我假设我必须自定义构建阶段。

另一个想法 是创建第二个 Git 存储库,名为 production,生产 URL 设置为 $NEXT_PUBLIC_API_URL:

然后我有两张图片。

有人有更好的主意吗?

提前致谢

也许有几种方法可以做到这一点。如果您只关心构建工作,这很容易。

一种方法是从 build

做第二份工作 extends:
build:
  variables:
    MY_ENV: staging

build production:
  extends: build
  variables:
    MY_ENV: production

另一种方法可能是将 parallel:matrix: 键添加到 build 作业

build:
  parallel:
    matrix:
      - MY_ENV: staging
      - MY_ENV: production

但是请记住,如果 build 的任何下游作业依赖于它的工件,您也需要管理它们。

例如:

build:
  variables:
    MY_ENV: staging

build production:
  extends: build
  variables:
    MY_ENV: production

# some other job inherited from a template that depends on `build`
# we also want two of these jobs for each environment
downstream:
  variables:
    MY_ENV: staging

# extend it for production
downstream production:
  extends: downstream
  dependencies:  # make sure we get artifacts from correct upstream build job
    - build production
  variables:
    MY_ENV: production