如何使用Azure和NX部署多个应用程序(monorepo)

时间:2020-05-29 13:29:05

标签: azure-devops monorepo

我正在使用NX工具来管理具有多个应用程序的monorepo,而我正努力了解如何使用Azure进行部署和发布管道。

免责声明:我对Azure和devop来说很陌生。

我的理解是: 我创建了一个管道(不是发行管道,如果有意义的话,只是一个“常规管道”),并在其中插入一个yml。此外,管道还链接到Azure仓库上的一个仓库,这意味着每次我推送到该仓库时,它将触发管道并运行yaml命令。 在此命令上,我运行lint,测试并构建。

这是我能做并且可以理解的,以下内容变得更加晦涩

如果我在可以调节的master上进行合并/合并,则构建作业应该会创建工件。 现在,我可以创建一个释放管道,该管道将在回购链接时触发,从而链接到一个工件。然后,此发布管道可以将此工件发送到应用程序服务,该服务是应用程序所在的插槽。

好的,但是我使用的是monorepo,这意味着该版本将产生多个应用程序,并且每个应用程序都应部署到正确的应用程序服务中。

经过研究,I found that的总体思路是为每个应用创建一个发布管道。这些发布管道都链接到相同的monorepo,但是它们具有一个作为构建标记的过滤器。使用yml文件构建应用程序时会添加build标签。

这些基本上就是我对所有这些的理解。现在是问题:

  1. 构建标记到底是什么?它在哪里存在?它以某种方式链接到工件吗?
  2. 这个想法是为每个工件创建一个构建标签,对吗?
  3. 我无法创建构建标签,该怎么办?
  4. 压缩和发布工件的正确方法是什么?

    这是我正在使用的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'

运行此代码时,测试,皮棉和构建都可以正常工作,但是我不认为它会添加构建标签,这是日志:

enter image description here

似乎什么也没发生...如何正确添加标签并使发布管道被触发?

我还找到了用于压缩和发布工件的代码段,但是我不知道是否可以使用它,因为在monorepo中,我们应该-创建多个工件。

5)所以最后一个问题是:如何创建多个工件,这甚至是一件好事吗?

非常感谢您的帮助,我知道这是一个很无聊的帖子,并且帮助菜鸟会很无聊,但是我坚持使用它会很长一段时间...

1 个答案:

答案 0 :(得分:1)

1,您可以从UI页面(构建摘要页面,见下文)或使用Rest api添加构建标记。它可用于在构建之间进行过滤。如果您的构建管道生成了多个工件,则构建标记将无法过滤在一个构建中生成的工件。

enter image description here

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。 enter image description here

在monorepo中部署多个应用程序的另一种解决方法是创建多个构建/发布管道,每个应用程序一个。并在构建管道中使用path filter让构建管道仅在其对应的应用程序更新时才触发。

trigger:
  paths:
    include:
    - root/app1/*

希望上面有帮助!