GitLab 中的 Concat 变量名称
Concat variable names in GitLab
我们在团队中使用 Gitlab 项目。每个开发人员在云端都有自己的 Kubernetes 集群,在 GitLab 中也有自己的分支。我们使用 GitLab-CI 自动构建新容器并将它们部署到我们的 Kubernetes 集群。
目前我们 .gitlab-ci.yml
看起来像这样:
variables:
USERNAME: USERNAME
CI_K8S_PROJECT: ${USERNAME_CI_K8S_PROJECT}
REGISTRY_JSON_KEY_FILE: ${USERNAME_REGISTRY_JSON_KEY_FILE}
[...]
stages:
- build
- deploy
- remove
build-zeppelin:
stage: build
image: docker:latest
variables:
image_name: "zeppelin"
only:
- ${USERNAME}@Gitlab-Repo
tags:
- cloudrunner
script:
- docker login -u _json_key -p "${REGISTRY_JSON_KEY_FILE?}" https://eu.gcr.io
- image_name_fqdn="eu.gcr.io/${CI_K8S_PROJECT?}/${image_name?}:latest"
- docker build -t ${image_name_fqdn?} .
- docker push ${image_name_fqdn?}
- echo "Your new image is '${image_name_fqdn?}'. Have fun!"
[...]
所以一开始我们通过使用用户名前缀来引用重要信息。这工作得很好,但有问题,因为我们需要在来自另一个用户的每个拉取请求后更正它们。
所以我们寻找一种方法来保持 gitlab-ci 文件对每个开发人员都相同,同时仍然引用cing 一些对每个开发人员不同的 gitlab 变量。
我们考虑过的事情似乎行不通:
使用多个yml文件并相互导入=> not supported。
尝试结合Gitlab环境变量作为前缀:
CI_K8S_PROJECT: ${${GITLAB_USER_ID}_CI_K8S_PROJECT}
或
INDIVIDUAL_CI_K8S_PROJECT: ${GITLAB_USER_ID}_CI_K8S_PROJECT
CI_K8S_PROJECT: ${INDIVIDUAL_CI_K8S_PROJECT}
我们找到了使用间接扩展(bash 功能)的解决方案:
before_script:
- variableName=${GITLAB_USER_ID}_CI_K8S_PROJECT
- export wantedValue=${!variableName}
但我们也认识到,我们的设置有些愚蠢:为每个用户设置多个分支并使用前缀变量是没有意义的,因为这会导致上述问题和安全问题,因为所有变量所有用户都可以访问。
如果每个用户都分叉根项目并简单地为新功能创建合并请求,那就容易多了。这样就根本不需要 renaming/prefixing 个变量或分支。
@nik 的解决方案仅适用于 bash
。对于 sh
将起作用:
before_script:
- variableName=...
- export wantedValue=$( eval echo $$variableName )
我们在团队中使用 Gitlab 项目。每个开发人员在云端都有自己的 Kubernetes 集群,在 GitLab 中也有自己的分支。我们使用 GitLab-CI 自动构建新容器并将它们部署到我们的 Kubernetes 集群。
目前我们 .gitlab-ci.yml
看起来像这样:
variables:
USERNAME: USERNAME
CI_K8S_PROJECT: ${USERNAME_CI_K8S_PROJECT}
REGISTRY_JSON_KEY_FILE: ${USERNAME_REGISTRY_JSON_KEY_FILE}
[...]
stages:
- build
- deploy
- remove
build-zeppelin:
stage: build
image: docker:latest
variables:
image_name: "zeppelin"
only:
- ${USERNAME}@Gitlab-Repo
tags:
- cloudrunner
script:
- docker login -u _json_key -p "${REGISTRY_JSON_KEY_FILE?}" https://eu.gcr.io
- image_name_fqdn="eu.gcr.io/${CI_K8S_PROJECT?}/${image_name?}:latest"
- docker build -t ${image_name_fqdn?} .
- docker push ${image_name_fqdn?}
- echo "Your new image is '${image_name_fqdn?}'. Have fun!"
[...]
所以一开始我们通过使用用户名前缀来引用重要信息。这工作得很好,但有问题,因为我们需要在来自另一个用户的每个拉取请求后更正它们。
所以我们寻找一种方法来保持 gitlab-ci 文件对每个开发人员都相同,同时仍然引用cing 一些对每个开发人员不同的 gitlab 变量。
我们考虑过的事情似乎行不通:
使用多个yml文件并相互导入=> not supported。
尝试结合Gitlab环境变量作为前缀:
CI_K8S_PROJECT: ${${GITLAB_USER_ID}_CI_K8S_PROJECT}
或
INDIVIDUAL_CI_K8S_PROJECT: ${GITLAB_USER_ID}_CI_K8S_PROJECT
CI_K8S_PROJECT: ${INDIVIDUAL_CI_K8S_PROJECT}
我们找到了使用间接扩展(bash 功能)的解决方案:
before_script:
- variableName=${GITLAB_USER_ID}_CI_K8S_PROJECT
- export wantedValue=${!variableName}
但我们也认识到,我们的设置有些愚蠢:为每个用户设置多个分支并使用前缀变量是没有意义的,因为这会导致上述问题和安全问题,因为所有变量所有用户都可以访问。
如果每个用户都分叉根项目并简单地为新功能创建合并请求,那就容易多了。这样就根本不需要 renaming/prefixing 个变量或分支。
@nik 的解决方案仅适用于 bash
。对于 sh
将起作用:
before_script:
- variableName=...
- export wantedValue=$( eval echo $$variableName )