GitLab中的Concat变量名

时间:2017-01-18 15:19:25

标签: yaml gitlab-ci

我们在团队中使用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!"

[...]

因此,在开始时,我们使用USERNAME前缀来引用重要信息。这很有效,但是有问题,因为我们需要在来自另一个用户的每个拉取请求之后纠正它们。

因此,我们寻找一种方法来保持gitlab-ci文件对每个开发人员都一样,同时仍然引用每个开发人员不同的一些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}

2 个答案:

答案 0 :(得分:4)

我们找到了使用间接扩展(bash功能)的解决方案:

before_script:
 - variableName=${GITLAB_USER_ID}_CI_K8S_PROJECT
 - export wantedValue=${!variableName}

但我们也认识到,我们的设置在某种程度上是愚蠢的:为每个用户设置多个分支并使用前缀变量是没有意义的,因为这会导致上述问题和安全问题,因为所有变量都是可访问的给所有用户。

如果每个用户分叉根项目并且只是为新功能创建合并请求,则会更容易。这样就不需要对变量或分支进行重命名/加前缀。

答案 1 :(得分:2)

@nik的解决方案仅适用于bash。对于sh可以使用:

before_script:
  - variableName=...
  - export wantedValue=$( eval echo \$$variableName )