【把玩Azure DevOps】Day13 Pipeline与Artifacts应用:Build nuget package上传到Private nuget

前一篇内容设定了C#专案里的Generate NuGet package on build,让专案编译的时候自动产生nupkg档案,接着手动使用cli工具将nupkg档案push到Azure DevOps Artifacts,这篇就来看看如何将这些动作设计在Pipeline里面吧!

这边直接借用前面文章「CI/CD从这里:第2个Pipeline,建立共用的Build Pipeline」里的yaml内容开始,同样建立新的Pipeline,选择Starter范本,然後用前面文章的Yaml内容复制过来修改,前面文章的Yaml内容如下:

# 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:
- none

pool:
  vmImage: ubuntu-latest

steps:
- task: DotNetCoreCLI@2
  inputs:
    command: 'build'
    projects: '$(ProjectName)/*.csproj'
    arguments: '-o $(Build.BinariesDirectory)'
- task: ArchiveFiles@2
  inputs:
    rootFolderOrFile: '$(Build.BinariesDirectory)'
    includeRootFolder: false
    archiveType: 'zip'
    archiveFile: '$(Build.ArtifactStagingDirectory)/$(ProjectName)-$(Build.BuildId).zip'
    replaceExistingArchive: true
- task: PublishPipelineArtifact@1
  inputs:
    targetPath: '$(Build.ArtifactStagingDirectory)'
    artifact: 'BuildOutputFiles'
    publishLocation: 'pipeline'

在Yaml内容最下面空白的地方,同样选择.NET Core task,Command的选项则改为选择nuget push,第二个Path to NuGet package(s) to publish的设定预设是从$(Build.ArtifactStagingDirectory)资料夹内去寻找nupkg档案(如下图中的预设值),下面的Target feed location如果是有push到其它地方选择第二个,但是我们是要push到自己的Artifact feed,所以可以直接从下面的选单下拉选择即可:

https://ithelp.ithome.com.tw/upload/images/20210925/20033961rPsKW290QQ.png

不过因为我们第一个task已经设定build的时候输出的位置是在$(Build.BinariesDirectory),所以nupkg档案也会在那里,所以设定的内容要改一下,改成$(Build.BinariesDirectory)/*.nupkg,最後完成的全部Yaml内容如下:

# 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:
- none

pool:
  vmImage: ubuntu-latest

steps:
- task: DotNetCoreCLI@2
  displayName: Build C# Project
  inputs:
    command: 'build'
    projects: '$(ProjectName)/*.csproj'
    arguments: '-o $(Build.BinariesDirectory)'
- task: ArchiveFiles@2
  displayName: Zip output files
  inputs:
    rootFolderOrFile: '$(Build.BinariesDirectory)'
    includeRootFolder: false
    archiveType: 'zip'
    archiveFile: '$(Build.ArtifactStagingDirectory)/$(ProjectName)-$(Build.BuildId).zip'
    replaceExistingArchive: true
- task: PublishPipelineArtifact@1
  displayName: Publish files to pipeline artifacts
  inputs:
    targetPath: '$(Build.ArtifactStagingDirectory)'
    artifact: 'BuildOutputFiles'
    publishLocation: 'pipeline'
- task: DotNetCoreCLI@2
  displayName: Push Nuget package
  inputs:
    command: 'push'
    packagesToPush: '$(Build.BinariesDirectory)/*.nupkg'
    nuGetFeedType: 'internal'
    publishVstsFeed: '15523482-96ea-4d9f-83bf-a57fc10e79ce'

因为Task变多了,所以我也在每个Task加上了displayName属性,这个在前面的文章有提过,如果忘了可以往前面翻阅先前的文章内容喔!

另外,新建立的Pipeline也别忘了设定Variables,Yaml中的ProjectName需要设定,也是前面的文章有提过,其它的像是更改Pipeline名称与Pipeline yaml档名的这些动作就不再耗费篇幅重述了唷!

接着在执行Pipeline的时候会碰到下面两个问题,其中一个是Organization层级的Artifacts feed权限设定的问题,从Push的Task log中会看到下图红框中的讯息,代号403:

https://ithelp.ithome.com.tw/upload/images/20210925/20033961xi2h694iCU.png

这时候就需要去Artifact feed的Permissions设定中点选Allow project-scoped builds,将Project的Build Service加入(忘了从哪进入的请参考前面的文章):

https://ithelp.ithome.com.tw/upload/images/20210925/20033961YsIEbTR1tf.png

加入之後再重新执行一次Pipeline,这时候就会碰到下面的这个问题,同样是Push的Task log中所列出红框中代号409的错误讯息:

https://ithelp.ithome.com.tw/upload/images/20210925/20033961wdR2Q63TdB.png

这个问题是因为Artifact feed中对於ModuleBase这个Package已经存在了相同的版本(此例为1.0.1),相同的版本号并不会使用最新的去覆盖先前的版本,因为这样子没有意义,虽然Package内容可能有更新了,但是相同的版本号对於使用者来说是没有更新的。

可是…难不成每一次要执行Pipeline之前,都需要先将C#专案中的版本号手动更新之後Commit到Git Repo里面再来执行这个Pipeline让它去Push nuget package吗?都要手动改版本号了,那我顺便利用cli再把新的package push上去不就得了?

没错,要弄这个Pipeline就是不要这麽麻烦,所以这篇文章的错误只是为了引导後面的文章内容,接下来的文章将会说明如何在Pipeline中修改版本号。


<<:  Day 25-Unit Test 应用於 Async Code-1 (情境及应用-5)

>>:  [Day10] ASI - 自动插入分号

Day6:最邻近点规则(k-Nearest Neighbor,KNN

  最邻近点规则(以下简称为KNN,因为每个人对此的中文称呼不一样)是在一个地方上有很多个点,将所有...

Auto ML简介

前面提到的两个范例, 一个是MNiST手写辨识, 一个是心血管疾病的应用, 处理这两个范例的过程中大...

【Day 06】C 的资料型态(下)

今天,我们来介绍一下常见的基本型别吧~ 基本型别 - 整数型别 - int int 型态是有正负号的...

Day 26 Singleton Pattern、UML

Singleton Pattern: 单例模式是程序设计中常见的一种方法,其顾名思义,就是只有一个人...

Windows Server 2022 整合 Azure Arc 简易教学示范

Azure Arc on Server功能列表 升级适用於云端的 Microsoft Defende...