Azure YAML 파이프 라인-작업 / 작업 패키지 문제

Aug 21 2020

그래서 저는 Azure DevOps Yaml Pipelines에 대해 약간의 학습을 해왔고 원인이 무엇인지 알아낼 수없는 문제를 발견했습니다.

저는 소규모 클래스 라이브러리 솔루션을위한 첫 번째 파이프 라인을 구축하고 있었는데 변경 사항이 마스터에 커밋 될 때이를 복원, 빌드, 테스트, 포장 및 게시하는 아이디어였습니다.

배포의 여러 부분을 단계 / 작업으로 분할했지만 (이를 사용하는 올바른 방법이 아닐 수 있음), 그렇게하면 "Nuget pack"단계에서 빌드 된 파일을 찾을 수 없습니다.

이 YAML은 작동하지 않으며 빌드 단계에서 생성 된 "projects.assets.json"파일을 찾을 수 없기 때문에 "NuGet (Pack)"단계에서 오류가 발생합니다.

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'
          

단계 / 작업없이 단일 작업으로 모든 것을 단순화하면 배포가 모두 정상적으로 작동합니다 (아래 참조).

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'
          

이 퍼즐 조각에 대한 문서에서 단계 / 작업으로 나눌 때 작동하지 않는 이유를 설명하는 답변을 찾을 수 없습니다. 그 이유가 무엇인지 아는 사람이 있습니까? 스테이지 / 작업은 이러한 방식으로 서로 상호 작용하지 않아야합니까?

감사

답변

1 KrzysztofMadej Aug 21 2020 at 19:52

이는 각 작업이 다른 에이전트에서 실행되기 때문입니다.

단계에는 하나 이상의 작업이 포함됩니다. 각 작업은 에이전트에서 실행됩니다. 작업은 단계 집합의 실행 경계를 나타냅니다. 모든 단계는 동일한 에이전트에서 함께 실행됩니다. 예를 들어 x86 및 x64의 두 가지 구성을 빌드 할 수 있습니다. 이 경우 하나의 빌드 단계와 두 개의 작업이 있습니다.

그리고 이것은 jon이 단계 세트의 경계이기 때문에 소스 코드가 그들 사이에서 공유되지 않습니다. 따라서 이것을 별도의 작업 및 단계로 유지해야하는 경우 각 작업 checkout단계 에서 반복해야 합니다.

      - checkout: self
        clean: true

파이프 라인에 대한 이 기본 사항을 읽으면 작동 방식에 대한 높은 수준의 그림을 얻을 수 있습니다.

작업간에 일부 유물을 공유하려면 여기를 참조 하십시오 .

당신이 단계 사이에 변수를 공유해야하는 경우 나에 대한 글 쓴 이 .