配置(Config)

DevStream使用 YAML 文件来声明 DevOps 工具链的配置。

1 配置内容概览

正如概述中所提到的,配置包含了以下几个部分:

  • config
  • tools
  • apps
  • pipelineTemplates
  • vars

其中,config 必选,toolsapps 至少有一个不为空,其余部分可选。

2 组织方式

DevStream 支持两种组织配置的方式:

  • 单文件:你可以把这些部分写到一个 YAML 文件中
  • 目录:也可以把它们分开放到同一个文件夹下的多个 YAML 文件中,只要这些文件的名字以 .yaml.yml 结尾,且内容拼接后包含了 DevStream 所需的各个部分即可。

然后在执行 init 等命令时,加上 -f--config-file 参数指定配置文件/目录的路径。

如:

  • 单文件:dtm init -f config.yaml
  • 目录:dtm init -f dirname

3 配置内容详解

3.1 主配置

指 DevStream 本身的配置,即 config 部分,比如状态存储的方式等。详见 这里

3.2 工具的配置

tools 部分声明了工具链中的工具,详见 这里

3.2 应用与流水线模板的配置

apps 部分声明了 应用 的配置,pipelineTemplates 声明了 流水线模板,详见 这里

3.3 变量

DevStream 提供了变量语法。使用 vars 用来定义变量的值,而后可以在 toolsappspipelineTemplates 中使用,语法是 [[ varName ]]

示例:

YAML

  1. vars:
  2. githubUsername: daniel-hutao # 定义变量
  3. repoName: dtm-test-go
  4. defaultBranch: main
  5. tools:
  6. - name: repo-scaffolding
  7. instanceID: default
  8. options:
  9. destinationRepo:
  10. owner: [[ githubUsername ]] # 使用变量
  11. name: [[ repoName ]]
  12. branch: [[ defaultBranch ]]
  13. scmType: github
  14. # <后面略...>

4 拓展语法

4.1 环境变量

类似于”变量”,你可以使用 [[env "env_key"]] 的方式来引用环境变量。

4.2 输出(Output)

介绍

在 DevStream 的配置文件中,我们在配置 工具 的 Options 时,可以使用其他 工具 的 输出 来填充。

例如,如果 工具 A 有一个输出,我们可以将这个输出值作为 工具 B 的 Options。

注意:

  • 当前,若 B 使用了 A 的输出,并不意味着 B “依赖于” A
  • 如果 B 确实需要 “依赖于” A,即,我们想要保证在 B 运行之前行运行 A,我们仍然需要使用 dependsOn 关键字(详见上一节 “核心概念“)。

语法

我们可以通过以下格式来使用插件输出:

Text Only

  1. ${{ TOOL_NAME.TOOL_INSTANCE_ID.outputs.OUTPUT_KEY }}

例如,对于下面给定的配置:

YAML

  1. tools:
  2. - name: trello
  3. instanceID: default
  4. options:
  5. board:
  6. name: golang-demo-board
  7. apikey: xxx
  8. token: xxx
  9. scm:
  10. owner: IronCore864
  11. repo: golang-demo
  12. scmType: github
  • TOOL_NAME 是 “trello”
  • TOOL_INSTANCE_ID 是 “default”

如果 “trello” 这个 工具 有一个键为 “boardId” 的输出项,那么我们就能通过以下语法来引用对应的输出的值:

Text Only

  1. ${{ trello.default.outputs.boardId }}

例子——真实使用场景

配置如下:

YAML

  1. tools:
  2. - name: repo-scaffolding
  3. instanceID: golang-github
  4. options:
  5. destinationRepo:
  6. owner: IronCore864
  7. name: golang-demo
  8. branch: main
  9. scmType: github
  10. vars:
  11. imageRepo: "ironcore864/golang-demo"
  12. sourceRepo:
  13. org: devstream-io
  14. name: dtm-scaffolding-golang
  15. scmType: github
  16. - name: helm-installer
  17. instanceID: argocd
  18. - name: argocdapp
  19. instanceID: default
  20. dependsOn: [ "helm-installer.argocd", "repo-scaffolding.golang-github" ]
  21. options:
  22. app:
  23. name: golang-demo
  24. namespace: argocd
  25. destination:
  26. server: https://kubernetes.default.svc
  27. namespace: default
  28. source:
  29. valuefile: values.yaml
  30. path: helm/golang-demo
  31. repoURL: ${{ repo-scaffolding.golang-github.outputs.repoURL }}

在这个例子中,

  • argocdapp 的 “default” 实例依赖于 repo-scaffolding 的 “golang-github” 实例
  • argocdapp 的 “default” 实例中有一个 options 是 “options.source.repoURL”,它引用了 repo-scaffolding 的 “golang-github” 实例的 “repoURL” 输出(${{ repo-scaffolding.golang-github.outputs.repoURL }})。