Azure YAML Pipelines - Problemi relativi al pacchetto di processi / attività

Aug 21 2020

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

1 KrzysztofMadej Aug 21 2020 at 19:52

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 checkoutfase 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 .