在多阶段管道中使用 DevOps 部署 Azure 静态 Web 应用

时间:2021-06-24 03:02:07

标签: yaml devops azure-static-web-app cicd

我目前正在开发将部署在 Azure 静态 Web 应用上的 Blazor WebAssembly 应用程序。现在我需要创建我的 CI/CD 管道,并且有一种非常简单的方法可以使用 AzureStaticWebApp 任务来构建和发布应用程序,如下所示:

  - task: AzureStaticWebApp@0
    inputs:
      app_location: 'App.Web'
      app_build_command: 'dotnet build'
      api_location: 'App.Api'
      output_location: 'wwwroot'
      azure_static_web_apps_api_token: $(deployment_token)

然而,此任务同时构建和发布应用程序。在我的管道中,我想构建我的 Blazor 应用程序并将其存储为工件。在我的管道的一个阶段,这个工件将发布到测试环境,如果所有测试都通过,那么另一个阶段将把这个工件发布到生产环境。目标是发布在生产环境中测试过的完全相同的工件。

有没有办法使用 AzureStaticWebApp 任务来完成此任务,或者有其他替代方法吗?

1 个答案:

答案 0 :(得分:0)

我认为您可以在这样的一份工作中构建工件:

  jobs:
- job: BuildWebsite
  displayName: Build website
  pool:
    name: $(azdoPool)
  steps:
  - checkout: self

             
  - task: Npm@1
    displayName: npm install
    inputs:
      verbose: false

  - powershell: |
      npx gatsby build    
    displayName: build

  - task: ArchiveFiles@2
    displayName: package artifacts
    inputs:
      rootFolderOrFile: '$(System.DefaultWorkingDirectory)/public/'
      includeRootFolder: false
      archiveType: 'zip'
      archiveFile: '$(Build.ArtifactStagingDirectory)/$(webPackageFile)'

  - task: PublishPipelineArtifact@1
    displayName: publish website artifact
    inputs:
      targetPath: '$(Build.ArtifactStagingDirectory)/$(webPackageFile)'
      ArtifactName: $(artifactName)

(注意上一个任务中的发布到工件)

然后在另一个工作中测试/部署:

parameters:
  application: ''

jobs:  
- job: DeployStaticWebsite
  displayName: deploy 
  pool:
    name: $(azdoPool)
  steps:  
  - task: DownloadPipelineArtifact@2
    displayName: Download $(webPackageFile)
    inputs:
      artifactName: $(artifactName)
      targetPath: $(artifactExtractPath)
      itemPattern: '**/$(webPackageFile)'

  - task: ExtractFiles@1
    inputs:
      archiveFilePatterns: $(artifactExtractPath)/$(webPackageFile)
      destinationFolder: $(artifactExtractPath)/extracted
    displayName: extract website

  - task: AzureStaticWebApp@0
    displayName: Deploy App
    inputs:
      output_location: $(extractedZipPath)
      azure_static_web_apps_api_token: $(deployTokenMercleCom)
      skip_app_build: true      

注意第一个任务如何从上一个任务下载工件/zip。

这两个作业应该由不同模板文件中的一个或多个阶段引用。像这样:

阶段:

  • 阶段:构建 显示名称:构建 工作:

    • 模板:templates/build.yml 参数: 应用程序:${{variables.environment}}
  • 阶段:app1 显示名称:app1 变量: 应用程序:app1 部署令牌:$(deployTokenApp1) 工作:

    • 模板:templates/deploy.yml 参数: 应用程序:${{variables.environment}}
  • 阶段:app2 显示名称:app2 变量: 应用程序:app2 部署令牌:$(deployTokenApp2) 工作:

    • 模板:templates/deploy.yml 参数: 应用程序:${{variables.environment}}

然后,您可以根据需要继续为 app3、app 4 添加阶段。他们都可以部署最初构建的相同工件。如果您想为每个阶段添加环境批准(以便您可以预先批准每个阶段部署),您可能还需要使用部署作业。

注意,这个 yaml 中的一些变量需要在这些模板示例运行之前定义