Azure YAML Pipelines - Problemi relativi al pacchetto di processi / attività
Quindi ho imparato a conoscere Azure DevOps Yaml Pipelines e ho riscontrato un problema che non riesco a capire quale sarebbe la causa.
Stavo costruendo la mia prima pipeline per una piccola soluzione di libreria di classi, l'idea era di ripristinarla, costruirla, testarla, comprimerla e pubblicarla quando le modifiche vengono inserite nel master.
Ho diviso le diverse parti della distribuzione in fasi / lavori (che potrebbe non essere il modo corretto di usarli), ma quando lo faccio, il passaggio "Nuget pack" non riesce mai a trovare nessuno dei file compilati.
Questo YAML non funziona e genera errori nel passaggio "NuGet (Pack)" perché non riesce a trovare il file "projects.assets.json", che ho confermato che il passaggio di compilazione produce.
trigger:
- master
pool:
vmImage: 'windows-latest'
name: 'Set dynamically'
variables:
buildConfiguration: 'Release'
version.Major: 1
version.Minor: $[counter(variables['version.Major'], 0)] version.Patch: 0 version.Revision: $[counter(variables['version.Minor'], 0)]
version.Number: '$(version.Major).$(version.Minor).$(version.Patch).$(version.Revision)'
stages:
- stage: Prepare
jobs:
- job: Prepare_Sources
steps:
- checkout: self
clean: true
- job: Prepare_BuildAndVersionNumbers
steps:
- task: PowerShell@2
displayName: Set the name of the build
inputs:
targetType: 'inline'
script: |
[string] $dateTime = (Get-Date -Format 'yyyyMMdd') [string] $buildName = "$(Build.DefinitionName)_$(Build.SourceBranchName)_$($dateTime)_$(version.Number)" Write-Host "Setting the name of the build to '$buildName'."
Write-Host "##vso[build.updatebuildnumber]$buildName" - stage: Build jobs: - job: BuildRestore steps: - task: NuGetCommand@2 displayName: 'Restore (NuGet)' inputs: command: restore restoreSolution: '**\*.sln'fs feedsToUse: select includeNuGetOrg: true vstsFeed: 'internalfeed1' arguments: '--configuration $(buildConfiguration) /p:Version=$(version.Number)' - task: DotNetCoreCLI@2 displayName: 'Restore (.NET Core)' inputs: command: restore includeNuGetOrg: true nobuild: true vstsFeed: 'internalfeed1' nuGetFeedType: internal projects: '**/*.csproj' arguments: '--configuration $(buildConfiguration) /p:Version=$(version.Number)' - task: DotNetCoreCLI@2 displayName: 'Build all projects in solution' inputs: command: build projects: '**/*.csproj' arguments: '--configuration $(buildConfiguration) /p:Version=$(version.Number)' - stage: Test jobs: - job: Test_UnitTests steps: - task: DotNetCoreCLI@2 displayName: 'Run & Analyse UnitTests' inputs: command: test projects: '**/*Tests/*UnitTests.csproj' arguments: '--configuration $(buildConfiguration) --collect "Code coverage"'
- stage: Package
jobs:
- job: Package_Nuget
steps:
- task: NuGetAuthenticate@0
displayName: "Nuget (Authenticate)"
- task: DotNetCoreCLI@2
displayName: 'NuGet (Package)'
inputs:
nobuild: true
command: pack
packagesToPack: '**/*.csproj'
versioningScheme: byBuildNumber
arguments: '--configuration $(buildConfiguration)' - task: DotNetCoreCLI@2 displayName: 'NuGet (Publish)' inputs: command: push searchPatternPush: '$(Build.ArtifactStagingDirectory)/*.nupkg;'
feedPublish: 'internalfeed1'
Se semplifico tutto in un unico lavoro senza fasi / lavori, la distribuzione funziona bene (come di seguito)
trigger:
- master
pool:
vmImage: 'windows-latest'
name: 'Set dynamically'
variables:
buildConfiguration: 'Release'
version.Major: 1
version.Minor: $[counter(variables['version.Major'], 0)] version.Patch: 0 version.Revision: $[counter(variables['version.Minor'], 0)]
version.Number: '$(version.Major).$(version.Minor).$(version.Patch).$(version.Revision)'
steps:
- checkout: self
clean: true
- task: PowerShell@2
displayName: Set the name of the build
inputs:
targetType: 'inline'
script: |
[string] $dateTime = (Get-Date -Format 'yyyyMMdd') [string] $buildName = "$(Build.DefinitionName)_$(Build.SourceBranchName)_$($dateTime)_$(version.Number)" Write-Host "Setting the name of the build to '$buildName'."
Write-Host "##vso[build.updatebuildnumber]$buildName" - task: NuGetCommand@2 displayName: 'Restore (NuGet)' inputs: command: restore restoreSolution: '**\*.sln'fs feedsToUse: select includeNuGetOrg: true vstsFeed: 'internalfeed1' arguments: '--configuration $(buildConfiguration) /p:Version=$(version.Number)' - task: DotNetCoreCLI@2 displayName: 'Restore (.NET Core)' inputs: command: restore includeNuGetOrg: true nobuild: true vstsFeed: 'internalfeed1' nuGetFeedType: internal projects: '**/*.csproj' arguments: '--configuration $(buildConfiguration) /p:Version=$(version.Number)' - task: DotNetCoreCLI@2 displayName: 'Build all projects in solution' inputs: command: build projects: '**/*.csproj' arguments: '--configuration $(buildConfiguration) /p:Version=$(version.Number)' - task: DotNetCoreCLI@2 displayName: 'Run & Analyse UnitTests' inputs: command: test projects: '**/*Tests/*UnitTests.csproj' arguments: '--configuration $(buildConfiguration) --collect "Code coverage"'
- task: DotNetCoreCLI@2
displayName: 'NuGet (Package)'
inputs:
nobuild: true
command: pack
packagesToPack: '**/*.csproj'
versioningScheme: byBuildNumber
arguments: '--configuration $(buildConfiguration)' - task: DotNetCoreCLI@2 displayName: 'NuGet (Publish)' inputs: command: push searchPatternPush: '$(Build.ArtifactStagingDirectory)/*.nupkg;'
feedPublish: 'internalfeed1'
Non riesco a trovare una risposta sulla documentazione di questi pezzi del puzzle che spiegherebbe perché non funzionerebbe se suddivisa in fasi / lavori, qualcuno sa qual è il ragionamento? Fasi / lavori non dovrebbero interagire tra loro in questo modo?
Grazie
Risposte
Questo perché ogni lavoro viene eseguito su un agente diverso
Una fase contiene uno o più lavori. Ogni lavoro viene eseguito su un agente. Un lavoro rappresenta un limite di esecuzione di una serie di passaggi. Tutti i passaggi vengono eseguiti insieme sullo stesso agente. Ad esempio, potresti creare due configurazioni: x86 e x64. In questo caso, hai una fase di costruzione e due lavori.
E questo poiché jon è un limite per un insieme di passaggi, il codice sorgente non è condiviso tra di loro. Quindi, se hai bisogno di mantenerlo come lavori e fasi separati, dovresti ripetere in ogni checkout
fase del lavoro
- checkout: self
clean: true
Si prega di leggere queste nozioni di base sulla pipeline, ti daranno un'immagine di alto livello come funziona.
E se vuoi condividere alcuni artefatti tra i lavori, dai un'occhiata qui .
E se hai bisogno di condividere alcune variabili tra le fasi, ho scritto un articolo su questo .