[Azure Pipeline] .NET Project File 에서 버전참조

Azure Pipeline을 사용해서 .NET 라이브러리를 빌드하여 Azure DevOps의 Artifact에 있는 Private Nuget Feed에 올리고자 합니다.

이 과정에서 일반적으로 Azure Pipeline에서 제공하는 변수들이 아닌 프로젝트 파일에서 패키지 버전을 읽어와서 nuget pack 때 버전으로 적용하고 싶습니다. 예를 들면 프로젝트 파일에 패키지 버전이 1.0.0이 라면, 제가 패키지 버전을 수정하지 않은 채로 pipeline이 동작했을 때 계속 패키지 버전이 유지되는 것입니다. 제가 1.0.1 같은 번호로 수정했을 때만 패키지 버전이 1.0.1로 변경되었으면 합니다.

조금 찾아보니 Azure DevOps 확장을 찾긴 했는데 이걸 이용하면 가능해 보이지만 어떤식으로 적용하는지 잘 감이 안 옵니다.

혹시 이 확장을 이용해서 본 프로젝트 파일의 버전을 가져와서 패키지 해본 분이 계실까요?

관련해서 제가 찾아본 것들입니다.

Assembly Info 위키
빌드 번호를 동적으로 생성하기
Assembly Info를 사용하는 영상 // 이 영상은 regacy 형태로 구성되어 있어서 yaml 파일에서 참고하기가 어려웠습니다.

좋아요 1

그냥 *.csproj 파일에서 빌드 후 패키지 생성하도록 하는 것은 어떤가요?
GeneratePackageOnBuildTrue로 주면 됩니다.
자세한 내용은 여기에 있습니다.

이 방식이면 *.csproj 파일에서 version만 수정하면 패키지 버전도 같이 반영됩니다.
이때 주의해야 할 점이 업로드 할 때 충돌 허용하는 옵션이 있는데 그 옵션도 true로 설정해두시면 private feed에 업로드할 때 이미 같은 버전이 있다면 스킵합니다.

생성된 *.nupkg를 private feed로 옮기는 것은 이미 파이프라인 스탭에 있을 테니 생략하겠습니다 :slight_smile:

좋아요 4

하…어제 하루를 부었는데…이런 쉬운게 있었다니…정말 감사합니다…

image

혹 별건 아니지만 yaml 파일 올려둡니다.
.NET 클래스 라이브러리를 빌드하여 Azure DevOps의 Artifact Private Feed로 배포하는 파이프라인입니다.
피드 Guid만 가리겠습니다…

# Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml

trigger:
  branches:
    include:
      - main
variables:
  BuildConfiguration: Release
  ProjectName: TestNugetPackagePush

stages:
  - stage: Build
    jobs:
      - job: buildapp
        pool:
          vmImage: ubuntu-20.04
        steps:
          - task: NuGetToolInstaller@1
            inputs:
              versionSpec: 
          - task: UseDotNet@2
            displayName: Use .NET 5 SDK
            inputs:
              packageType: 'sdk'
              version: '5.0.x'
              includePreviewVersions: true
              performMultiLevelLookup: true
          - task: DotNetCoreCLI@2
            displayName: dotnet restore
            inputs:
              command: 'restore'
              projects: '$(System.DefaultWorkingDirectory)/TestNugetPackagePush/$(ProjectName).csproj'
              feedsToUse: 'select'
              vstsFeed: '00000000-0000-0000-0000-000000000000'
          - task: DotNetCoreCLI@2
            displayName: dotnet build $(BuildConfiguration)
            inputs:
              command: 'build'
              arguments: '--configuration $(BuildConfiguration)'
              projects: '$(System.DefaultWorkingDirectory)/TestNugetPackagePush/$(ProjectName).csproj'
          - task: NuGetCommand@2
            displayName: nuget restore
            inputs:
              command: 'restore'
              restoreSolution: '$(System.DefaultWorkingDirectory)/TestNugetPackagePush/$(ProjectName).csproj'
              feedsToUse: 'select'
              vstsFeed: '00000000-0000-0000-0000-000000000000'
          - task: NuGetCommand@2
            displayName: nuget pack
            inputs:
              command: 'pack'
              packagesToPack: '$(System.DefaultWorkingDirectory)/TestNugetPackagePush/$(ProjectName).csproj'
              versioningScheme: 'off'
          - task: NuGetCommand@2
            displayName: nuget push
            inputs:
              command: 'push'
              packagesToPush: '$(Build.ArtifactStagingDirectory)/$(ProjectName)*.nupkg'
              nuGetFeedType: 'internal'
              vstsFeed: '00000000-0000-0000-0000-000000000000'
              allowPackageConflicts: true
          
좋아요 3

추가적으로… .NET Library 프로젝트가 .NET 5 이던, .NET Standard 2.0 이던 두 프로젝트의 형식을 가리지 않고 위의 yml 파일로 빌드되는 것을 확인했습니다.

.NET Standard 에 대한 SDK를 개발하시는 분들도 위의 YAML에서 수정해서 사용하시면 될 것 같습니다.

좋아요 2