繁体   English   中英

可以安Azure YAML管道<deployment job>使用变量环境?</deployment>

[英]Can an Azure YAML Pipelines <deployment job> use variable environments?

我在这里阅读了环境文档以及在环境资源下打开的问题,但是我发现无法实现我的目标:

我想使用参数化的 yaml 模板来部署到多个环境,如下所示:

parameters:
  pool_name: ''
  aks_namespace: ''
  environment: ''

jobs:
  - job: preDeploy
    displayName: preDeploy
    pool:
      name: $(pool_name)
    steps:
      - template: cd_step_prerequisites.yml


  - deployment: Deploy
    displayName: Deploy
    dependsOn: preDeploy
    condition: succeeded()
    variables:
      secret_name: acrecret
    pool:
      name: dockerAgents
    **environment: '$(environment).$(aks_namespace)'**
    strategy:
      runOnce:
        deploy:
          steps:
          - template: cd_step_aks_deploy.yml


  - job: postDeploy
    displayName: postDeploy
    dependsOn: Deploy
    condition: succeeded()
    pool:
      name: $(pool_name)
    steps:
      - template: cd_step_postrequisites.yml

我想使用这种方法,以便我只在我的代码旁边托管一个最小的 pipeline.yml,然后我将所有模板放在不同的 repo 中,并从主管道调用它们,如下所示:

resources:
  repositories:
    - repository: self
    - repository: devops
      type: git
      name: devops

  - stage: CD1
    displayName: Deploy to Alpha
    jobs:
      **- template: pipeline/cd_job_api.yml@devops**
        parameters:
          pool_name: $(pool_name)
          aks_namespace: $(aks_namespace)
          app_name: $(app_name)
          app_image_full_name: $(app_image_full_name)
          environment: alpha

然后我将能够传递 $environment 变量,以便从一个模板操作多个部署目标(AKS 集群/命名空间组)。 目前这似乎是不可能的,因为当我尝试运行我的管道时默认的 AzureDevOps 解析器失败,消息“$(environment) environment does not contain x namespace”告诉我变量没有得到扩展。

这个计划是否会很快实施? 如果没有,是否有任何替代方法可以仅使用一个参数化作业模板来部署到多个环境?

我认为您需要解析文件并用脚本替换令牌,或者应该有相应的步骤。

您的主要选择是helm 它允许创建模板并传入变量以呈现这些模板。

也许我参加聚会有点晚了,但我也在为这个问题而苦苦挣扎,并找到了这个开放线程。

我在 github 上发现了这个“已关闭” 问题。这个问题对我来说的关键点是这个带有部分解决方案的评论和另一个指向为什么不起作用的解释的评论。 引用微软的文章

它还回答了另一个常见问题:为什么我不能使用变量来解析服务连接/环境名称? 资源在阶段开始运行之前获得授权,因此阶段和作业级别的变量不可用。 可以使用管道级变量,但只能使用那些明确包含在管道中的变量。 变量组本身就是一个需要授权的资源,所以在检查资源授权的时候同样看不到他们的数据。

关于解决方案,根据我引用的第一条评论,我最终创建了一个新的变量组,其中包含具有以下命名约定的变量: product.environment.varname 然后我将这个组添加到管道的开头(全局范围),然后使用宏语法引用变量:$(var)

快速示例:

variables:
  - group: Product.Pipelines.Environments

jobs:
  - job: preDeploy
    displayName: preDeploy
    pool:
      name: $(pool_name)
    steps:
      - template: cd_step_prerequisites.yml

  - deployment: Deploy
    displayName: Deploy
    dependsOn: preDeploy
    condition: succeeded()
    variables:
      secret_name: acrecret
    pool:
      name: dockerAgents
    environment: $(product.dev.environmentname) #this is the variable within the variable group
    strategy:
      runOnce:
        deploy:
          steps:
          - template: cd_step_aks_deploy.yml

变量组将包含其他变量:

  • product.dev.environmentname:开发
  • product.stg.environmentname:暂存
  • product.prd.environmentname:生产

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM