不能同时使用扩展和暂存 Azure Pipelines

can't use extends and stages together azure pipelines

提问人:Jhon Serna 提问时间:10/24/2023 最后编辑:Jhon Serna 更新时间:10/25/2023 访问量:123

问:

我正在尝试在 azure devops 中使用模板,因为它是一个使用 gradle 和 weblogic 构建 proyect 的模板,但在此之前,我需要在前面创建构建并将其移动到后面,问题是当我添加阶段时,它会抛出一个错误 意外的属性扩展 这不是因为版本,因为没有步骤它就可以正常工作

有一个正确的选项可以做到这一点,而无需更改模板?,我已经尝试了很多方法但没有用,这是我的代码

trigger:
  - none

parameters:
  - name: deliveryTrain
    type: object
    default:
      continuousIntegration:
        build:
          - with: gradle
            configure:
              javaVersion: '1.8'
              gradleExtraOptionsLabo: 'clean build'
              workingDirectory: 'Gerencia_Tecnologia/salud-mensajeria_dinamica-back'
        artifact:
          with: 'artifactory'
          configure:
            artifactName: 'dinamica.md.ear'
      continuousDelivery:
        deployment:
          - environment: 'labo'
            platform:
              with: 'weblogic'
              configure:
                serviceConnection: 'lab-Salud-wl-12.2.1.4'
      continuousTesting:
        - environment: 'labo'
          cases:
            - type: performance
              with: 'jmeter'
              configure:
                repo:
                  name: 'Gerencia_Tecnologia/salud-mensajeria_dinamica-back-ml'
                  branch: 'feature/hu_comun_1707'
                performanceTestFiles: 'jmeter/test/test.jmx'
                performanceTestPercentilTest: '99'
                performanceTestResultFiles: 'jmeter/test/result.jtl'

stages:
  - stage: MensajeriaDinamicaFrontBuild
    displayName: 'MensajeriaDinamica-Front-build'
    jobs:
      - job: BuildFrontEnd
        displayName: 'Build Front Artifact'
        pool:
          name: 'linux-generic'
        steps:
          - checkout: front
          - task: NodeTool@0
            inputs:
              versionSpec: '12.16.1'
            displayName: 'Install Node.js'
          - script: npm install -g @angular/[email protected]
            displayName: 'Install Angular CLI'
          - script: |
              npm install &&
              ng build --aot --output-hashing=all --prod
            displayName: 'Built Front Artifact'
          - task: PublishPipelineArtifact@1
            displayName: 'Publish Front Artifact to dist carpet'
            inputs:
              targetPath: '$(System.DefaultWorkingDirectory)/dist'
              artifact: 'front-artifact'
          - task: CopyFiles@2
            displayName: 'Copy files to ArtifactStagingDirectory'
            inputs:
              SourceFolder: '$(System.DefaultWorkingDirectory)/dist'
              Contents: '**'  
              TargetFolder: '$(Build.ArtifactStagingDirectory)'
          - task: PublishBuildArtifacts@1
            displayName: 'Publish front Artifact to ArtifactStagingDirectory'
            inputs:
              pathToPublish: '$(Build.ArtifactStagingDirectory)'
              artifactName: 'MensajeriaDinamicaFrontArtifact'  

      - job: CopyArtifactsToBack
        condition: succeeded('BuildFrontEnd')
        dependsOn: BuildFrontEnd
        displayName: 'Move Front Artifact to Back-End Repository'
        pool:
          name: 'linux-generic'
        steps:
            - checkout: back
            - script: |
                rm -r $(Build.SourcesDirectory)/WAR_MensajeriaDinamica/WebContent/resultadosapp/* &&
                echo "Listing the deleted folders file:"
                ls -R $(Build.SourcesDirectory)/WAR_MensajeriaDinamica/WebContent/resultadosapp
              displayName: 'cleaned back webcontent'
            - task: DownloadPipelineArtifact@2
              inputs:
                artifactName: 'MensajeriaDinamicaFrontArtifact' 
                targetPath: '$(System.DefaultWorkingDirectory)/WAR_MensajeriaDinamica/WebContent/resultadosapp/'
            - script: |
                echo "Listing the downloaded artifact:"
                ls -R $(Build.SourcesDirectory)/WAR_MensajeriaDinamica/WebContent/resultadosapp
            - template: templates/gradle-weblogic.yaml@templates
                
      - job: UsingTemplate
        displayName: 'Usar plantilla de gradle weblogic'
        steps:
          - checkout: templates
          - script: |
              ls -R $(Build.SourcesDirectory)/templates
            displayName: 'List Files in Cloned Repositories'


resources:
  repositories:
    - repository: back
      type: git
      name: Gerencia_Tecnologia/salud-mensajeria_dinamica-back-ml
      ref: feature/hu_comun_1707
    - repository: front
      type: git
      name: Gerencia_Tecnologia/salud-mensajeria_dinamica-fr
      ref: feature/hu-comun-tablas
    - repository: templates
      type: git
      name: Gerencia_Tecnologia/ti-templates_pipelines-conf
      ref: master

extends:
  template: 'templates/gradle-weblogic.yaml@templates'
  parameters:
    deliveryTrain: ${{ parameters.deliveryTrain }}

这是使用的模板

variables:
- template: ../transversal/vars/vars-global.yaml

parameters:
- name: deliveryTrain
  type: object
- name: changeOrderHistoriasId
  type: string
  default: ''
- name: changeOrderApprover
  type: string
  default: ''
- name: changeOrderItemApproverBusiness
  type: string
  default: ''
- name: changeOrderRequester
  type: string
  default: ''

stages:
  - template: ../transversal/stages/continuous-integration.yaml
    parameters:
      continuousIntegration: ${{ parameters.deliveryTrain.continuousIntegration }}
  
  - ${{ if ne(variables['Build.Reason'],'PullRequest') }}:
    - ${{ if parameters.deliveryTrain.continuousDelivery }}:
      - template: ../transversal/stages/approvals.yaml
        parameters:
          deployment: ${{ parameters.deliveryTrain.continuousDelivery.deployment }}
              
      - template: ../transversal/stages/continuous-delivery.yaml
        parameters:
          continuousDelivery: ${{ parameters.deliveryTrain.continuousDelivery }}
          artifact: ${{ parameters.deliveryTrain.continuousIntegration.artifact }}
          changeOrderHistoriasId: ${{ parameters.changeOrderHistoriasId }}
          changeOrderApprover: ${{ parameters.changeOrderApprover }}
          changeOrderItemApproverBusiness: ${{ parameters.changeOrderItemApproverBusiness }}
          changeOrderRequester: ${{ parameters.changeOrderRequester }}
    
    - template: ../transversal/stages/continuous-testing.yaml
      ${{ each environment in parameters.deliveryTrain.continuousTesting }}:
        ${{ if or( and(contains(variables['Build.SourceBranch'], 'refs/pull/' ), eq( environment.environment, 'none') ), and( eq(variables['Build.SourceBranch'], 'refs/heads/develop' ), eq( environment.environment, 'dllo') ), and( contains(variables['Build.SourceBranch'], 'refs/heads/release' ), eq( environment.environment, 'labo') ), and( eq(variables['Build.SourceBranch'], 'refs/heads/master' ), eq( environment.environment, 'pdn') ), and( contains(variables['Build.SourceBranch'], 'refs/heads/feature/' ), eq( environment.environment, 'dllo') )) }}:
          parameters:
            continuousTesting: ${{ environment.cases }}
  
    - ${{ if or(parameters.deliveryTrain.continuousDelivery, parameters.deliveryTrain.continuousTesting ) }}:
      - template: ../transversal/stages/post-delivery.yaml
        parameters:
          deliveryTrain: ${{ parameters.deliveryTrain }}
Azure YAML Azure-Pipelines 管道 扩展

评论

0赞 bryanbcook 10/25/2023
仅供参考 - 作业不能保证在同一台计算机上运行。因此,如果在 BuildFrontEnd 作业中创建项目,则不能保证在作业 CopyArtifacts 运行时它存在。

答:

0赞 Kevin Lu-MSFT 10/24/2023 #1

根据您的 YAML 示例,我可以重现相同的问题。

enter image description here

恐怕 extends 和 stages 字段无法在 YAML Pipeline 中同时定义。

为了满足您的要求,您可以将字段更改为 use - template 字段以使用 YAML 模板并同时定义阶段。

更新1:

根据 YAML 示例,可以使用以下 YAML 管道 YAML 代码:

主要 YAML:

trigger:
  - none

variables:
- template: ../transversal/vars/vars-global.yaml  

resources:
  repositories:
    - repository: back
      type: git
      name: Gerencia_Tecnologia/salud-mensajeria_dinamica-back-ml
      ref: feature/hu_comun_1707
    - repository: front
      type: git
      name: Gerencia_Tecnologia/salud-mensajeria_dinamica-fr
      ref: feature/hu-comun-tablas
    - repository: templates
      type: git
      name: Gerencia_Tecnologia/ti-templates_pipelines-conf
      ref: master

parameters:
  - name: deliveryTrain
    type: object
    default:
      continuousIntegration:
        build:
          - with: gradle
            configure:
              javaVersion: '1.8'
              gradleExtraOptionsLabo: 'clean build'
              workingDirectory: 'Gerencia_Tecnologia/salud-mensajeria_dinamica-back'
        artifact:
          with: 'artifactory'
          configure:
            artifactName: 'dinamica.md.ear'
      continuousDelivery:
        deployment:
          - environment: 'labo'
            platform:
              with: 'weblogic'
              configure:
                serviceConnection: 'lab-Salud-wl-12.2.1.4'
      continuousTesting:
        - environment: 'labo'
          cases:
            - type: performance
              with: 'jmeter'
              configure:
                repo:
                  name: 'Gerencia_Tecnologia/salud-mensajeria_dinamica-back-ml'
                  branch: 'feature/hu_comun_1707'
                performanceTestFiles: 'jmeter/test/test.jmx'
                performanceTestPercentilTest: '99'
                performanceTestResultFiles: 'jmeter/test/result.jtl'

stages:
  - stage: MensajeriaDinamicaFrontBuild
    displayName: 'MensajeriaDinamica-Front-build'
    jobs:
      - job: BuildFrontEnd
        displayName: 'Build Front Artifact'
        pool:
          name: 'linux-generic'
        steps:
          - checkout: front
          - task: NodeTool@0
            inputs:
              versionSpec: '12.16.1'
            displayName: 'Install Node.js'
          - script: npm install -g @angular/[email protected]
            displayName: 'Install Angular CLI'
          - script: |
              npm install &&
              ng build --aot --output-hashing=all --prod
            displayName: 'Built Front Artifact'
          - task: PublishPipelineArtifact@1
            displayName: 'Publish Front Artifact to dist carpet'
            inputs:
              targetPath: '$(System.DefaultWorkingDirectory)/dist'
              artifact: 'front-artifact'
          - task: CopyFiles@2
            displayName: 'Copy files to ArtifactStagingDirectory'
            inputs:
              SourceFolder: '$(System.DefaultWorkingDirectory)/dist'
              Contents: '**'  
              TargetFolder: '$(Build.ArtifactStagingDirectory)'
          - task: PublishBuildArtifacts@1
            displayName: 'Publish front Artifact to ArtifactStagingDirectory'
            inputs:
              pathToPublish: '$(Build.ArtifactStagingDirectory)'
              artifactName: 'MensajeriaDinamicaFrontArtifact'  

      - job: CopyArtifactsToBack
        condition: succeeded('BuildFrontEnd')
        dependsOn: BuildFrontEnd
        displayName: 'Move Front Artifact to Back-End Repository'
        pool:
          name: 'linux-generic'
        steps:
            - checkout: back
            - script: |
                rm -r $(Build.SourcesDirectory)/WAR_MensajeriaDinamica/WebContent/resultadosapp/* &&
                echo "Listing the deleted folders file:"
                ls -R $(Build.SourcesDirectory)/WAR_MensajeriaDinamica/WebContent/resultadosapp
              displayName: 'cleaned back webcontent'
            - task: DownloadPipelineArtifact@2
              inputs:
                artifactName: 'MensajeriaDinamicaFrontArtifact' 
                targetPath: '$(System.DefaultWorkingDirectory)/WAR_MensajeriaDinamica/WebContent/resultadosapp/'
            - script: |
                echo "Listing the downloaded artifact:"
                ls -R $(Build.SourcesDirectory)/WAR_MensajeriaDinamica/WebContent/resultadosapp
            - template: templates/gradle-weblogic.yaml@templates
                
      - job: UsingTemplate
        displayName: 'Usar plantilla de gradle weblogic'
        steps:
          - checkout: templates
          - script: |
              ls -R $(Build.SourcesDirectory)/templates
            displayName: 'List Files in Cloned Repositories'




  - template: 'templates/gradle-weblogic.yaml@templates'
    parameters:
      deliveryTrain: ${{ parameters.deliveryTrain }}

模板 YAML:

parameters:
- name: deliveryTrain
  type: object
- name: changeOrderHistoriasId
  type: string
  default: ''
- name: changeOrderApprover
  type: string
  default: ''
- name: changeOrderItemApproverBusiness
  type: string
  default: ''
- name: changeOrderRequester
  type: string
  default: ''

stages:
  - template: ../transversal/stages/continuous-integration.yaml
    parameters:
      continuousIntegration: ${{ parameters.deliveryTrain.continuousIntegration }}
  
  - ${{ if ne(variables['Build.Reason'],'PullRequest') }}:
    - ${{ if parameters.deliveryTrain.continuousDelivery }}:
      - template: ../transversal/stages/approvals.yaml
        parameters:
          deployment: ${{ parameters.deliveryTrain.continuousDelivery.deployment }}
              
      - template: ../transversal/stages/continuous-delivery.yaml
        parameters:
          continuousDelivery: ${{ parameters.deliveryTrain.continuousDelivery }}
          artifact: ${{ parameters.deliveryTrain.continuousIntegration.artifact }}
          changeOrderHistoriasId: ${{ parameters.changeOrderHistoriasId }}
          changeOrderApprover: ${{ parameters.changeOrderApprover }}
          changeOrderItemApproverBusiness: ${{ parameters.changeOrderItemApproverBusiness }}
          changeOrderRequester: ${{ parameters.changeOrderRequester }}
    
    - template: ../transversal/stages/continuous-testing.yaml
      ${{ each environment in parameters.deliveryTrain.continuousTesting }}:
        ${{ if or( and(contains(variables['Build.SourceBranch'], 'refs/pull/' ), eq( environment.environment, 'none') ), and( eq(variables['Build.SourceBranch'], 'refs/heads/develop' ), eq( environment.environment, 'dllo') ), and( contains(variables['Build.SourceBranch'], 'refs/heads/release' ), eq( environment.environment, 'labo') ), and( eq(variables['Build.SourceBranch'], 'refs/heads/master' ), eq( environment.environment, 'pdn') ), and( contains(variables['Build.SourceBranch'], 'refs/heads/feature/' ), eq( environment.environment, 'dllo') )) }}:
          parameters:
            continuousTesting: ${{ environment.cases }}
  
    - ${{ if or(parameters.deliveryTrain.continuousDelivery, parameters.deliveryTrain.continuousTesting ) }}:
      - template: ../transversal/stages/post-delivery.yaml
        parameters:
          deliveryTrain: ${{ parameters.deliveryTrain }}

有关详细信息,可以参考文档:模板使用参考

评论

0赞 Jhon Serna 10/25/2023
感谢您的回答,我尝试使用模板但不起作用,我认为我唯一的选择是与模板的创建者交谈,否则我不知道该怎么办
0赞 Kevin Lu-MSFT 10/25/2023
@JhonSerna 请检查我的答案中的更新。我已经根据您的 yaml 代码修改了 YAML 示例。无需更改 Yaml 模板中的任何代码。只需要更改主 yaml 中的代码,它就会按预期工作。
0赞 Jhon Serna 10/25/2023
已经尝试过了,但我收到错误 /templates/gradle-weblogic.yaml@templates(行:1,列:1):意外值“变量” /templates/gradle-weblogic.yaml@templates(行:20,列:1):意外值“stages”
0赞 Jhon Serna 10/25/2023
它没有模板,我已经尝试了没有阶段的扩展选项并且它可以工作
0赞 Kevin Lu-MSFT 10/25/2023
@JhonSerna 再次测试样品。由于您正在模板中定义阶段,因此无法在模板 yaml 的根级别定义变量字段。参考这张票:stackoverflow.com/questions/60912733/...您可以更改以在主 YAML 中定义变量。已更新答案中的 yaml 示例
0赞 bryanbcook 10/25/2023 #2

模板只能用于定义阶段、作业、步骤或变量。扩展功能旨在构建已定义阶段的现有管道。不幸的是,您无法同时定义阶段和扩展。

模板库的作者似乎提供了接受参数的模板。此参数是针对您的组织自定义的,并且是一个松散定义的 YAML 对象,由其模板解释。很难说模板在不访问它的情况下在做什么,但我认为它正在根据持续集成持续交付关键字定义阶段。根据你提供的内容,此模板似乎生成了一个 maven 项目,并将其推送到存储机制(artifactory)。deliveryTrain

我的建议是查看扩展的模板以了解它在做什么:

  1. 在管道编辑器中,提供使用其模板的 YAML

  2. 从省略号中选择“下载完整的 YAML”:

    enter image description here

  3. 查看模板提供的步骤,并确定自定义任务的去向。

  4. 请联系您的模板作者,以确定他们的模板是否允许您指定其他步骤。

例如

extends:
  template: /pipeline.yml@templates
  parameters:
    deliveryTrain:
       continuousIntegration:
         build:
         - with: gradle
           ...
         - with: customSteps
             steps: # custom defined steps
             - checkout: 'salud-mensajeria_dinamica-fr'
             - task: UseNode@1
                inputs:
                  version: '12.16.1'
             - script: |
                 npm install @angular/[email protected] &&
                 npm install &&
                 ng build --aot --output-hashing=all --prod &&
                 cp -r dist/. $(Build.ArtifactStagingDirectory)
               displayName: 'Built and Copied Front Artifact'
         artifact:
          with: 'artifactory'
          configure:
            artifactName: 'dinamica.md.ear'
       continuousDelivery:
         ...
       continuousTesting:
         ...

基于上述内容,支持此功能的模板示例:

jobs:
- job: continuousIntegration
  steps:

  - ${{ each item in parameters.deliveryTrain.continuousIntegration.build }}:
    - ${{ if eq(item.with, 'customSteps') }}:
      - ${{ insert }}: ${{ with.steps }}

评论

0赞 Jhon Serna 10/25/2023
嗨,谢谢你的回答
0赞 Jhon Serna 10/25/2023
我要将模板添加到问题中
0赞 Jhon Serna 10/25/2023
我认为我唯一的选择是与模板的创建者交谈,或者我不知道我是否可以创建 2 个连接的管道
0赞 bryanbcook 10/26/2023
如果答案对您有帮助,请投赞成票或接受:-)