GitLab 中的 Concat 变量名

Posted

技术标签:

【中文标题】GitLab 中的 Concat 变量名【英文标题】:Concat variable names in GitLab 【发布时间】:2017-06-03 01:07:04 【问题描述】:

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

【问题讨论】:

该图像未使用 bash shell。 由于 YAML 文件是结构化的,因此处理和组合它们非常简单。只需在结帐后由您的 vcs 自动执行该步骤即可。 【参考方案1】:

@nik 的解决方案仅适用于 bash。对于sh 将起作用:

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

【讨论】:

【参考方案2】:

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

before_script:
 - variableName=$GITLAB_USER_ID_CI_K8S_PROJECT
 - export wantedValue=$!variableName

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

如果每个用户都分叉根项目并简单地为新功能创建一个合并请求,那就更容易了。这种方式根本不需要重命名/为变量或分支添加前缀。

【讨论】:

以上是关于GitLab 中的 Concat 变量名的主要内容,如果未能解决你的问题,请参考以下文章

oracle 字段名为变量

plpgsql 中的动态变量名(字符串到变量名)

C语言中变量名有啥要求

PHP中的变量

Freemarker 模板语言中的变量名

Matlab中的变量名