首页 > 解决方案 > 如何使用 gitlab-ci 动态分配命名空间名称?

问题描述

一旦我在 Gitlab 中运行管道,我正在尝试创建一个新的命名空间,这个命名空间将具有我推送到它的分支的名称!

那么我如何传递一个命名空间清单文件可以读取的变量呢?有没有办法用 gitlab-ci.yml 传递它?

我在想的例子:

apiVersion: v1
kind: Namespace
metadata:
  name: $CI_COMMIT_BRANCH

标签: kubernetesnamespacesgitlabgitlab-cipipeline

解决方案


因此,这里最好的答案是推荐Helm,因为您实际上是在要求动态 yaml 模板。由于Helm 的第 3 版,它不需要像 Tiller 这样的任何服务器端组件,因此它更易于使用。

但是,如果您不想将所有文件都转换为 Helm 模板,还有两种更实用的方法


sed

通过使用sed你可以在你的(假设)中找到/替换 env 变量,namespace.yml如下所示:

script:
  - sed -i "s/\$CI_COMMIT_BRANCH/$CI_COMMIT_BRANCH/g" namespace.yml
  - kubectl apply -f namespace.yml

代表“-i就地”,如果要保存到新文件或 STDOUT,请保留它。


envsubst

如果您有多个 yaml 文件并且需要批量查找/替换,则使用envsubst(gnu gettext实用程序的一部分)是另一种选择。

它在文件中查找所有环境变量,并将它们替换为当前环境中存在的实际值。这看起来像这样(原始答案):

script:
  - envsubst < "namespace.yml" > "namespace-replaced.yml"
  - kubectl apply -f namespace-replaced.yml

请注意,如相关答案中所述:如果您想为两者使用相同的文件,则必须使用类似 moreutil's sponge:的东西envsubst < "namespace.yml" | sponge "namespace.yml" 。(因为 shell 重定向将在读取文件之前清空文件。


最后提示:

  • 请不要在您的 yaml 文件中定义命名空间(namespace.yml 除外),因为这不是最佳实践。使用 kubectl 来设置目标命名空间:kubectl apply -f deployment.yml --namespace=$CI_COMMIT_BRANCH
  • 不要使用与$CI_COMMIT_BRANCHk8s 相关的 。它是完整的分支名称,可以包含特殊字符和空格。而是$CI_COMMIT_REF_SLUG用作预定义的 CI 变量,因为这是为其构建项目的分支或标记名称,小写,缩短为 63 个字节,并且除了 0-9 和 az 以外的所有内容都替换为 -。没有前导/尾随 -。在 URL、主机名和域名中使用。

推荐阅读