前一篇内容设定了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,所以可以直接从下面的选单下拉选择即可:
不过因为我们第一个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:
这时候就需要去Artifact feed的Permissions设定中点选Allow project-scoped builds,将Project的Build Service加入(忘了从哪进入的请参考前面的文章):
加入之後再重新执行一次Pipeline,这时候就会碰到下面的这个问题,同样是Push的Task log中所列出红框中代号409的错误讯息:
这个问题是因为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)
最邻近点规则(以下简称为KNN,因为每个人对此的中文称呼不一样)是在一个地方上有很多个点,将所有...
前面提到的两个范例, 一个是MNiST手写辨识, 一个是心血管疾病的应用, 处理这两个范例的过程中大...
今天,我们来介绍一下常见的基本型别吧~ 基本型别 - 整数型别 - int int 型态是有正负号的...
Singleton Pattern: 单例模式是程序设计中常见的一种方法,其顾名思义,就是只有一个人...
Azure Arc on Server功能列表 升级适用於云端的 Microsoft Defende...