Azure 管道在解析管道 YAML(唯一作业名称)时遇到错误

2024-02-22

在我的 azure devops 项目中,我使用模板创建了一个管道。这是我的构建管道的主要 yaml 文件

name: Test-$(Date:yyyyMMdd)$(Rev:.r)

resources:
  repositories:
    - repository: api
      type: git
      name: porject/api
      ref: master
    - repository: front
      type: git
      name: project/front
      ref: master
    - repository: strapi
      type: git
      name: project/strapi
      ref: master

trigger:
  branches:
    include:
      - master

pool:
  vmImage: 'ubuntu-latest'
  workspace:
    clean: all

variables:
- name: workingDir
  value: project
- name: tfVersion
  value: 0.12.29
- name: backendServiceGCP
  value: test
- name: backendGCPBucketName
  value: test
- name: tfpath
  value: test
- name: env
  value: dev

stages:
- stage: Terraform  
  jobs:
  - job: Build
    displayName: Build Terraform Infra
    steps:
      # Set and Export env var for api version to deploy
      - template: templates/fetch-tag.yml
        parameters:
          repo: 'api'
          envVar: TERRAFORM_API_TAG

      # Set and Export env var for front version to deploy
      - template: templates/fetch-tag.yml
        parameters:
          repo: 'front'
          envVar: TERRAFORM_FRONT_TAG

      # Set and Export env var for strapi version to deploy
      - template: templates/fetch-tag.yml
        parameters:
          repo: 'strapi'
          envVar: TERRAFORM_STRAPI_TAG

      # Init Terraform providers
      - template: templates/tf-init.yml
        parameters:
          backendServiceGCP: '$(backendServiceGCP)'
          backendGCPBucketName: '$(backendGCPBucketName)'
          workingDir: '$(workingDir)'
          variableFilePath: $(buildSubscription)-common.tfvars

      # Plan Terraform Infra to Deploy
      - template: templates/tf-plan.yml
        parameters:
          backendServiceGCP: '$(backendServiceGCP)'
          workingDir: '$(workingDir)'
          variableFilePath: $(buildSubscription)-common.tfvars

      # Publish Public Artifact with Terraform ressources to deploy
      - template: templates/publish-artifact.yml
        parameters:
          tfpath: '$(tfpath)'

当我尝试运行管道时出现以下错误:

Encountered error(s) while parsing pipeline YAML:
Job Build: The step name version appears more than once. Step names must be unique within a job.
Job Build: The step name version appears more than once. Step names must be unique within a job.
Job Build: The step name version appears more than once. Step names must be unique within a job.
Job Build: The step name version appears more than once. Step names must be unique within a job.
Job Build: The step name version appears more than once. Step names must be unique within a job.

我真的不明白为什么。 这是我在名为的管道中使用的模板示例publish-artifact.yml:

parameters:
  tfPath: ''

steps:
- task: CopyFiles@2
  inputs:
    sourceFolder: ${{ parameters.tfpath }}
    contents: |
      tfplan
      **/*.tf
      **/*.tfvars
      **/*.json
      !**/.terraform
      **/*.sh
    targetFolder: $(Build.ArtifactStagingDirectory)
- task: PublishBuildArtifacts@1
  inputs:
    pathtoPublish: $(Build.ArtifactStagingDirectory)
    artifactName: tf

我的工作名称做错了什么?


Azure Devops 支持将一个步骤的输出变量作为下一步的输入传递。看这张票 https://stackoverflow.com/a/62693182/10910450:

我们可以这样命名一个步骤:

  steps:
  - script: echo test
    name: ScriptName

  - task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: |
      Write-Host '##vso[task.setvariable variable=xxx;isOutput=true;]xxx'
  name: PSName

The name必须是唯一的,以便我们可以使用格式$(referencename.variablename)访问特定步骤的输出变量。

该错误表明模板中的某些步骤具有相同的名称version!并且这是不支持的。关于出现此问题的原因:

1.您多次调用同一个模板,这是您问题的主要原因。

DevOps 在以下情况下首先扩展模板处理管道 https://learn.microsoft.com/en-us/azure/devops/pipelines/process/runs?view=azure-devops#process-the-pipeline,所以如果你的fetch-tag模板有一个名为version,最终消耗的 azure-pipeline.yml 将是:

stages:
- stage: Terraform  
  jobs:
  - job: Build
    displayName: Build Terraform Infra
      steps:
      - task: PowerShell@2
        inputs:
          targetType: 'inline'
          script: |
            Write-Host "Hello World"
        name: version
      ...
      - task: PowerShell@2
        inputs:
          targetType: 'inline'
          script: |
            Write-Host "Hello World"
        name: version
      ...
      - task: PowerShell@2
        inputs:
          targetType: 'inline'
          script: |
            Write-Host "Hello World"
        name: version
      ...

2.您可能还需要检查不同模板中是否存在同名步骤。

我们可以在一个管道中多次调用相同的模板,但是我们不能调用其中存在的相同模板命名步骤。因为管道将多次扩展模板,并且最终管道将包含许多具有相同名称的步骤。并且不支持这一点,因为名称应该是唯一的。

解决方案:

1.删​​除name如果您不需要使用上面提到的输出变量,请使用步骤的元素。

2.或者您可以复印几份fetch-tag.yml并将它们命名为 fetch-tag-api.yml、fetch-tag-front.yml 和 fetch-tag-strapi.yml。重命名参考名称version在这三个文件中改为version1、version2或者什么。然后您可以使用以下命令运行管道:

    steps:
      # Set and Export env var for api version to deploy
      - template: templates/fetch-tag-api.yml
        parameters:
          repo: 'api'
          envVar: TERRAFORM_API_TAG

      # Set and Export env var for front version to deploy
      - template: templates/fetch-tag-front.yml
        parameters:
          repo: 'front'
          envVar: TERRAFORM_FRONT_TAG

      # Set and Export env var for strapi version to deploy
      - template: templates/fetch-tag-strapi.yml
        parameters:
          repo: 'strapi'
          envVar: TERRAFORM_STRAPI_TAG
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Azure 管道在解析管道 YAML(唯一作业名称)时遇到错误 的相关文章

随机推荐

  • 在 flutter 应用程序中,目标 S+(版本 31 及更高版本)要求在创建 PendingIntent 时指定 FLAG_IMMUTABLE 或 FLAG_MUTABLE 之一

    Please help me to sort out the problem I give a link to the git https github com Vasajj radio tysa fm git https github c
  • 如何在 Bokeh 中添加文本注释?

    我正在寻找 Matplotlib 类型1 http matplotlib org 1 4 0 users annotations intro htmlBokeh 中的文本注释 但我在他们的用户指南中找不到它2 http bokeh pyda
  • 分析 DNA 序列中的串联重复基序

    嘿 伙计们 由于我是编码世界和 Python 的新手 因此我没有太多编码经验 因此我们将不胜感激 我正在处理 DNA 序列中的短串联重复 我希望有一个代码可以根据指定位点的串联基序读取和计算重复的核苷酸 这是我需要的一个例子 串联图案 AG
  • 如何在 Streamlit 中设置按钮样式

    我的应用程序中有一个按钮 我想在用户单击它时对其进行样式设置 问题是 因为 Streamlit 不允许我们向我们创建的对象发出类 所以我需要找到一种方法来以稳健且与版本无关的方式指定确切的按钮 这是按钮在 Streamlit 中的样子 di
  • 如何使用 vscode 终端打开文件?

    我想打开一个新选项卡并使用打开一个文件vscode终端 like open somefile js命令 所以我可以使用ls并快速打开文件 Use code r
  • Flask 不提供图片

    我创建了一个小型 Flask 应用程序 用于处理和呈现本地计算机上本地使用的数据 我的 Flask 应用程序处理子文件夹中的数据 然后打开网页来显示处理后的数据 除了没有提供图像之外 一切看起来都很棒 例如 生成的 HTMl 源将具有以下内
  • Java中布尔表达式求值顺序?

    假设我有以下表达式 String myString getStringFromSomeExternalSource if myString null myString trim length 0 Eclipse 警告我myString布尔表
  • 如何使用windows cmd查看用户权限?

    我正在尝试使用 Windows 中的命令提示符查看用户权限 用户帐户和用户权限 例如 SeBatchLogonRight SeDenyBatchLogonRight SeInteractiveLogonRight SeDenyInterac
  • 登录到控制台而不是减速器操作内的代理对象时如何查看状态?

    使用时console log 在减速器操作内 状态打印为代理对象 而不是我实际想要查看的对象 我怎样才能看到实际的物体 我正在使用 redux starter kit createSlice 我不确定这是否与之有关 import creat
  • 区块链可以存储在 SQL 甚至 noSQL 数据库中吗?

    我读过 区块链数据库不存储在任何单一位置 这意味着它保存的记录是真正公开的并且易于验证 此信息不存在可供黑客破坏的集中版本 它的数据由数百万台计算机同时托管 互联网上的任何人都可以访问 所以我的问题是我们可以将区块链存储在例如 sql 中吗
  • 如何将ScrollView滚动到文本中的特定位置[重复]

    这个问题在这里已经有答案了 我有一个 ScrollView 里面有一个 TextView 我想将它滚动到某个段落 就像 HTML 中的锚点一样 例如 page html paragraph id 有人知道怎么做吗 Thanks 尝试使用sc
  • 在 CDI 中指定不同的子类实现

    我有两个类 A 和 B 需要使用服务 有两个服务 S1 和 S2 S2 扩展了 S1 我希望将 S1 注入 A 类 将 S2 注入 B 类 我如何在 CDI 中完成此操作 public class S1 public class S2 ex
  • 如何将多首歌曲/曲目加载到pygame中?

    有没有办法将多首歌曲加载到 Pygame 中 我说的不是这样的音效 crash sound pygame mixer Sound crash ogg and pygame mixer Sound play crash 因为我知道显然你可以有
  • Restlet 获取 HTTP 状态代码 204 而不是 200

    对于第一个请求 我收到 JSON 响应 从下一个请求开始 我开始获取此日志和 HTTP 状态代码 204 即使 ServerResource 已成功返回表示 org restlet engine adapter ServerAdapter
  • PHP MySQL 自动完成

    我有一个自动完成搜索字段 当用户输入名称时 结果会显示在下拉列表中 这一切都工作正常 并按应有的方式显示数据 然而 我正在等待将每个结果设为链接 因此当显示结果时 用户可以单击正确的名称 然后将他们带到他们的个人资料 请参阅下面的脚本
  • XML 检测调试模式

    我知道我可以通过编程方式使用 if BuildConfig DEBUG do something for a debug build 但是 我想做的是在调试模式下显示水印 有没有办法在 XML 文件中执行类似的操作 现在可以用数据绑定库 h
  • matplotlib 极坐标二维直方图

    我试图在极轴上绘制一些直方图数据 但它似乎无法正常工作 下面是一个例子 我使用找到的自定义投影如何使 matplotlib 极坐标图中的角度顺时针旋转 顶部为 0 https stackoverflow com questions 2417
  • Xcode 6:Fabric Crashlytics 更新后找不到“Answers.h”文件

    我正在 Xcode 6 3 2 中的 Objective C 项目中编写故事板 突然 当我尝试构建时出现错误 Developer ProjectName Crashlytics framework Headers Crashlytics h
  • 用于托管 MySQL 数据库的 Cloud SQL 或虚拟机实例

    我有一个网站 但我很困惑在哪里托管其数据库 Google Cloud SQL D1 层具有 0 5 GB RAM 其费用为每天 1 46 美元 GCE n1 standard 2 有 7 5 GB RAM 其成本为每天 1 68 我将当前的
  • Azure 管道在解析管道 YAML(唯一作业名称)时遇到错误

    在我的 azure devops 项目中 我使用模板创建了一个管道 这是我的构建管道的主要 yaml 文件 name Test Date yyyyMMdd Rev r resources repositories repository ap