使用 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 时才能消耗。当需要多个环境(staging
和 production
)时,URL 不同(https://staging.exmpl.com
和 https://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
:
- 暂存获取构建并运行测试。
- 如果成功就会发布
- 临时存储库内容将被复制到生产存储库
- 生产回购得到构建(生产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
Dockerfiles 通过 --build-args
接受 ENV 变量。这些变量对于 NextJS 是必需的,用于静态页面(调用远程 API)并且在构建的图像中是“硬编码”的。
Gitlab-CI AutoDevOps 有一个环境变量来传递这些参数 (AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS
)。但这只有在您使用一个 environment/image 时才能消耗。当需要多个环境(staging
和 production
)时,URL 不同(https://staging.exmpl.com
和 https://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
:
- 暂存获取构建并运行测试。
- 如果成功就会发布
- 临时存储库内容将被复制到生产存储库
- 生产回购得到构建(生产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