微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将变量组移动到代码存储库并从 YAML 管道中引用它

如何解决将变量组移动到代码存储库并从 YAML 管道中引用它

我们正在寻找如何将非秘密变量从变量组移动到代码存储库中的解决方案。 我们希望有这样的可能性:

  • 跟踪代码存储库中所有设置的更改
  • 变量的版本值连同源代码、管道代码版本

问题: 我们定义了 100 多个变量组,这些变量组被 100 多个 YAML 管道引用。 它们在不同的管道/阶段/作业级别注入取决于它们运行的​​环境/组件/阶段。

示例问题:

  • 某些变量可以更改其名称,某些变量可以删除,并且在面向 PROD 环境的管道中仍被引用,而在部署在 DEV 上的管道中则不存在
  • 特定管道运行使用了过去某个日期的变量版本,很高兴知道它过去部署了哪些设置

可能的解决方

  1. 应该可以使用简单的 yaml 模板变量文件来模拟变量组,并使用以下方法将带有变量组的 yaml 模板包含到主 yaml 中:Variable reuse
# File: variable-group-component.yml
variables:
  myComponentvariable: 'SomeVal'

# File: variable-group-environment.yml
variables:
  myEnvVariable: 'DEV'

# File: azure-pipelines.yml

variables:
- template: variable-group-component.yml    # Template reference
- template: variable-group-environment.yml  # Template reference

#some stages/jobs/steps:

理论上,将变量组转换为 YAML 模板文件并从 YAML 中引用它们应该很容易,而不是使用对变量组的引用。

# Current reference we use
variables:
- group: "Current classical variable group"

然而,即使没有实施这种方法,我们的管道也达到了以下限制:“不能(直接或间接)包含超过 100 个单独的 YAML 文件

YAML templates limits

考虑到我们希望变量组在逻辑上进行粒度化和分离,而不是存储在一个大的 yml 文件中(为了不达到工作代理中变量数量的另一个限制),我们不能去这样。

  1. 第二种方法添加一个简单的脚本(PowerShell?),它将使用一些带有变量(variableName/variableValue)记录的键/值元数据文件,然后使用命令执行作业步骤
##vso[task.setvariable variable=one]secondValue.

但它只能在初始作业级别完成,作为第一步,它看起来像是 Azure DevOps 中原生提供的重新设计的变量组机制。

当当前使用变量时,我们不确定这种方法是否适用于 YAML 管道中的任何地方。在某处,它们作为参数传递给任务。等

  1. 将所有变量移到 Key Vault Secret 中?我们一开始就放弃了这个选项,因为密钥保管库是存储敏感数据的地方,而不是任何人都可以看到的设置。此外,将其存储在秘密中会导致管道日志使用 * 而不是真实的配置设置并混淆管道运行日志信息。

问题

第一季度。关于如何在 Azure DevOps YAML 管道中实现变量版本控制/更改跟踪,您还有其他建议/替代方案吗?

第 2 季度。 2. 可能的解决方案中是否有任何问题,或者有更好的想法?

解决方法

您可以将其视为替代方案:

  1. 将您的非机密变量存储在存储库中的 json 文件中
  2. 创建管道以将变量推送到 App Configuration(而不是 Vault)
  3. 然后,如果您在应用中需要此设置,请确保您从应用中引用应用配置,而不是在 Azure Devops 中运行替换任务。或者,如果您需要直接通过管道进行此设置 Pull them from App Configuration

缺点:

  • 与您在 Powershell 案例中提到的相同。你需要做到工作级别

你得到了什么:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?