【把玩Azure DevOps】Day10 CI/CD从这里:第2个Pipeline,建立共用的Build Pipeline

从前面的几篇文章应该已经知道建立新的Pipeline可以从哪里开始,所以废话不多说,第二个Pipeline就直接从Starter范本再度开始。

首先,这个共用的Build Pipeline是纯粹用来手动输入C#的Project名称来让Pipeline执行Build csproj的动作,所以先把Yaml中的trigger设定改为none:

trigger:
- none

接下来在Save and run的按钮旁边有个Variables按钮,按下去之後就会出现Variables对话框,如果没设定过任何变数会像下图左边的样子,点选New variable之後就会出现新增变数的对话框:

https://ithelp.ithome.com.tw/upload/images/20210922/20033961XnS4q34Ft4.png

这里我设定一个ProjectName变数,预设值设定为** ,并且将下面的Let users override this value when running this pipeline打勾,这麽做是为了让执行Pipeline的使用者可以在执行Pipeline的时候设定这个变数的值,以达成这个共用的Pipeline设计目的。

https://ithelp.ithome.com.tw/upload/images/20210922/20033961Ot53sWKvwk.png

设定完成之後按下OK,这时候会看到下图的Variables对话框,按下Save之後如果重新再从Save and run旁边的Variables点进来也是同样的画面:

https://ithelp.ithome.com.tw/upload/images/20210922/20033961icqpVnoo7u.png

这时候会发现,怎麽好像Yaml的内容并没有变化?前面的文章看到.NET Desktop范本里面不是有variables的设定区段吗?

没错!Pipeline设定变数的方式有好几种,在Yaml中的variables设定是其中的一种,透过上图UI的设定是另外一种方式。透过UI设定的方式可以让使用者在执行Pipeline的时候选择是否填入他需要的值,并且有些机密的内容可以勾选Keep this value secret(如上图),像是金钥值或是密码之类的,在Yaml中透过变数取得内容,又不会将机密的值曝露在Yaml档案内容中。

更多设定变数的方式,可以点击对话框左下的Learn about variables官方的文件有更详细的说明。

接着同样将steps底下不需要的script部份删除,然後从右边的Task清单加入.NET Core task,在Path to project(s)属性中填入$(ProjectName)/*.csproj。这里我们假设C#专案档会放在同名称的资料夹内,所以在前面使用$(ProjectName),後面的 *.csproj也可以改成$(ProjectName).csproj。

Arguments的部份则是输入-o $(Build.BinariesDirectory),代表要将Build产生的档案放到$(Build.BinariesDirectory)所代表的位置。

https://ithelp.ithome.com.tw/upload/images/20210922/20033961Tyl7zQweFZ.png

Task的Yaml内容如下:

- task: DotNetCoreCLI@2
  inputs:
    command: 'build'
    projects: '$(ProjectName)/*.csproj'
    arguments: '-o $(Build.BinariesDirectory)'

接着为了节省篇幅,可以参考前一篇文章的内容,将压缩为zip档案的ArchiveFiles task和上传Artifact的PublishPipelineArtifact task陆续加入Yaml中。其中压缩zip的task内容在zip档名的部份加入了$(ProjectName)这个变数,让档案更具有识别性,详细内容可以参考下面的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'

最後别忘了修改一下Pipeline的Yaml档名,此例我将档名设为CommonBuildPipeline.yml,按下Save(不Run)之後,在Pipeline清单中将刚才建立的Pipeline改名为BuildSpecifiedProject。

上面按Save而不是Save and run的原因是Save and run会直接使用变数的预设值执行Pipeline,虽然在前面我们设定变数的预设值是**,搭配Task中设定的是$(ProjectName)/.csproj,使用预设值的情况下就会变成**/.csproj,其实也就是将Repo中的所有csproj档案都拿来Build的意思。

这里再复习一下Git Repo中先前放入的C#专案如下:

https://ithelp.ithome.com.tw/upload/images/20210922/20033961KYSjYyqyKZ.png

进入刚才建立的BuildSpecifiedProject Pipeline,按下右上角的Run pipeline,在Variables选项中选择ProjectName变数将Value更新为ModuleA之後按下对话框下面的Update,回到上一层之後按下左上角的箭头回到Run pipeline对话框之後就可以按下右下角的Run按钮执行Pipeline了。

https://ithelp.ithome.com.tw/upload/images/20210922/20033961V9IrGmiOg5.png

Pipeline执行成功之後,进入成品库(Artifacts)中就可以看到ModuleA的zip档案,档案内容就是ModuleA相关的dll等档案。同样的方式可以再试试将变数值换成ConsoleApp或ModuleBase。

https://ithelp.ithome.com.tw/upload/images/20210922/20033961A15xU4KeiE.png

透过这样的设计就可以让使用者手动执行这个Pipeline并指定要编译哪一个专案,在切分很多专案或是Module开发的情况,又需要在後续的Release中设计多个不同的成品来源时,可以不需要设计多个不同的Pipeline。


<<:  Day07 建造APP(1)

>>:  D-8. Rails 用Postman测试自己的WEB API && Valid Parentheses

Day11-"一维阵列练习"

利用scanf将各年级的每班人数存进阵列里,并印出结果。总共3个年级每个年级有10个班。 . . ....

电子书阅读器上的浏览器 [Day10] 支援画面点击翻页

既然是电子书阅读器,一般人最常拿来用的功能应该就是看电子书吧。看电子书时如果要翻页的话,通常会点击画...

Rails基本介绍(二)

听音乐先~ Rails操作实体 接续前一篇文章,做出一个实体後。 专案中 project_name/...

Golang 学习笔记-- 快速上手/重点整理 - 3 - Array, Slice

宣告方式 var array_name = [length]datatype{values} var...

中央处理单元 (CPU) 的立即寻址(Immediate addressing)模式中,指令本身指定了的运算元

-计算机架构 CPU 指令将值加载到寄存器中进行计算是很常见的。CPU 的寻址模式意味着 CPU ...