我正在使用NX工具来管理具有多个应用程序的monorepo,而我正努力了解如何使用Azure进行部署和发布管道。
免责声明:我对Azure和devop来说很陌生。
我的理解是: 我创建了一个管道(不是发行管道,如果有意义的话,只是一个“常规管道”),并在其中插入一个yml。此外,管道还链接到Azure仓库上的一个仓库,这意味着每次我推送到该仓库时,它将触发管道并运行yaml命令。 在此命令上,我运行lint,测试并构建。
这是我能做并且可以理解的,以下内容变得更加晦涩:
如果我在可以调节的master上进行合并/合并,则构建作业应该会创建工件。 现在,我可以创建一个释放管道,该管道将在回购链接时触发,从而链接到一个工件。然后,此发布管道可以将此工件发送到应用程序服务,该服务是应用程序所在的插槽。
好的,但是我使用的是monorepo,这意味着该版本将产生多个应用程序,并且每个应用程序都应部署到正确的应用程序服务中。
经过研究,I found that的总体思路是为每个应用创建一个发布管道。这些发布管道都链接到相同的monorepo,但是它们具有一个作为构建标记的过滤器。使用yml文件构建应用程序时会添加build标签。
这些基本上就是我对所有这些的理解。现在是问题:
压缩和发布工件的正确方法是什么?
这是我正在使用的Yaml:
jobs:
- job: Lint
steps:
- task: NodeTool@0
inputs:
versionSpec: '12.x'
displayName: 'Install Node.js'
- task: Npm@1
displayName: 'Npm install'
- pwsh: 'npm run nx affected -- --target=lint --parallel --base=origin/master --maxParallel=4'
displayName: 'Running lint'
- job: Test
steps:
- task: NodeTool@0
inputs:
versionSpec: '12.x'
displayName: 'Install Node.js'
- task: Npm@1
displayName: 'npm install'
- pwsh: 'npm run nx affected -- --target=test --parallel --code-coverage --base=origin/master --maxParallel=4'
displayName: 'Running tests'
- job: Build
steps:
- task: NodeTool@0
inputs:
versionSpec: '12.x'
displayName: 'Install Node.js'
- task: Npm@1
displayName: 'npm install'
- pwsh: 'npm run nx affected -- --target=build --parallel --base=origin/master --prod'
displayName: 'Running build'
- pwsh: |
npm run nx affected:apps -- --base=HEAD~1 --head=HEAD | grep -E '( - )(\w|-|\d|_)+' | sed -E 's/ - /##vso[build.addbuildtag]/g'
displayName: 'Adding build tags'
运行此代码时,测试,皮棉和构建都可以正常工作,但是我不认为它会添加构建标签,这是日志:
似乎什么也没发生...如何正确添加标签并使发布管道被触发?
我还找到了用于压缩和发布工件的代码段,但是我不知道是否可以使用它,因为在monorepo中,我们应该-创建多个工件。
5)所以最后一个问题是:如何创建多个工件,这甚至是一件好事吗?
非常感谢您的帮助,我知道这是一个很无聊的帖子,并且帮助菜鸟会很无聊,但是我坚持使用它会很长一段时间...
答案 0 :(得分:1)
1,您可以从UI页面(构建摘要页面,见下文)或使用Rest api添加构建标记。它可用于在构建之间进行过滤。如果您的构建管道生成了多个工件,则构建标记将无法过滤在一个构建中生成的工件。
2,因此,您可以考虑如何为管道中的每个应用分离构建构件。
您可以使用Archive files task压缩构建工件并使用publish build artifacts task进行发布。
请参见下面的yaml示例:我使用了两个归档文件任务来分别打包app1和app2的构建工件。并将压缩后的工件保存在文件夹$(Build.ArtifactStagingDirectory)
中。
然后,发布构建工件任务将把工件发布到天蓝色的devops云。 (发布管道将下载工件以部署到您的应用服务器)
- task: ArchiveFiles@2
inputs:
rootFolderOrFile: $(system.defaultworkingdirectory)/app1/dist
archiveType: 'zip'
archiveFile: '$(Build.ArtifactStagingDirectory)/app1/dist1.zip'
includeRootFolder: false
enabled: true
- task: ArchiveFiles@2
inputs:
rootFolderOrFile: $(system.defaultworkingdirectory)/app2/dist
archiveType: 'zip'
archiveFile: '$(Build.ArtifactStagingDirectory)/app2/dist2.zip'
includeRootFolder: false
enabled: true
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: $(Build.ArtifactStagingDirectory)/
artifactName: build
3,然后您可以在发布管道中使用多个阶段,并使用Azure App Service Deploy task。例如:
在第一阶段,添加Azure App Service Deploy task
并将程序包设置为$(System.DefaultWorkingDirectory)/**/app1/dist1.zip
以部署app1。然后在第二阶段将其设置为$(System.DefaultWorkingDirectory)/ ** / app2 / dist2.zip来部署app2。
在monorepo中部署多个应用程序的另一种解决方法是创建多个构建/发布管道,每个应用程序一个。并在构建管道中使用path filter让构建管道仅在其对应的应用程序更新时才触发。
trigger:
paths:
include:
- root/app1/*
希望上面有帮助!