Reputation: 27
I am trying to use a template in azure devops, because it is a template to make the build of a proyect with gradle and weblogic
Upvotes: 0
Views: 2747
Reputation: 35504
Based on your YAML sample, I can reproduce the same issue.
I am afraid that the extends and the stages fields are not able to be defined at the same time in YAML Pipeline.
To meet your requirement, you can change to use - template field to use the YAML template and define the stages at the same time.
Update1:
Based on your YAML sample, you can use the following YAML Pipeline YAML code:
Main 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 }}
Template 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 }}
For more detailed info, you can refer to the doc: Template usage reference
Upvotes: 1
Reputation: 18328
Templates can only be used to define stages, jobs, steps or variables. The extends feature is intended to build off an existing pipeline that already defines stages. You unfortunately can't define stages and extends at the same time.
It would appear that the author of your templates library has provided a template that accepts a deliveryTrain
parameter. This parameter is custom to your organization and is a loosely defined YAML object that is interpreted by their template. Hard to say what the template is doing without access to it, but I'd assume that it's defining the stages based on the continuous integration, continuous delivery keywords. Based on what you've provided, it looks like this template generates a maven artifact and pushes it to a storage mechanism (artifactory).
My suggestion would be to view the expanded template to understand what it's doing:
In the Pipeline Editor, provide the YAML that uses their template
Choose 'Download Full YAML' from the ellipsis:
Review the steps provided by the template and determine where your custom tasks should go.
Reach out to your template authors to determine if their template allows you to specify your additional steps.
For example,
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:
...
An example of a template that would support this, based on the above:
jobs:
- job: continuousIntegration
steps:
- ${{ each item in parameters.deliveryTrain.continuousIntegration.build }}:
- ${{ if eq(item.with, 'customSteps') }}:
- ${{ insert }}: ${{ with.steps }}
Upvotes: 1