在 Azure devops (angular+api) 中交换插槽,如何更改目标插槽的 Angular 配置?

Swap slots in Azure devops (angular+api), how to change Angular configuration for the target slot?

Angular 应用程序的配置是具有挑战性的部分。 在 Azure Yaml 管道中发布作业期间,我们执行“令牌”替换以匹配令牌化工件上此配置的目标环境。

稍后我们将此标记化工件(标记已被替换)部署到特定环境:

    - task: AzureWebApp@1
      inputs:
        azureSubscription: 'xxxx'
        appType: 'webApp'
        appName: [depends on $(environment)]
        package: '$(Pipeline.Workspace)/xxx'

这样,我们就可以对 DEV、TEST 和 STAGING 进行特定配置(staging 是一个 Production 插槽)。

在某些时候,我们需要将 STAGING 换成 PROD。 结果,我们在 PROD 中有 Angular 应用程序,但其值仍然用于 STAGING,这是不正确的,在这里我们无法确定要做什么。 我想获得有关继续的好方法的建议。

一些想法:

编辑:感谢@prawin 的建议,我再补充一个:

经过一些阅读、尝试和错误,我还有一些:

还有什么要考虑的吗?执行此操作的“标准”方法是什么?

编辑(17/05/2022):我保留原始提案作为参考(如下),但我必须警告,如果要替换文件,它将静默失败正在使用中。大多数时候都可能发生这种情况。

由于这个问题,我们改变了策略:

  1. 我们使用 STAGING 变量部署 STAGING 以进行适当的测试(自动化 E2E)。
  2. 对结果满意后,我们再次部署 STAGING,但使用 PROD 变量。我们称此作业步骤为:“PRE-PROD”。
  3. 当 PRE-PROD 准备就绪时,我们将 STAGING 切换为 PROD。
- stage: STAGING
  jobs:
    - template: release-to.yml
      parameters:
        environment: staging
        variables: staging

- stage: Release_PRE_PROD
  dependsOn: Release_STAGING
  jobs:
    - template: release-to.yml
      parameters:
        environment: staging
        variables: production

- stage: Swap_PROD
  dependsOn: Release_PRE_PROD
  #Your swap steps

在 release-to.yml 中,我们执行适当的变量加载和替换。

希望对您有所帮助!

17/05/2022之前仅供参考 经过测试不同的方法,我们发现了以下方法:

  1. 在构建阶段生成一个 PROD 特定文件。该文件将作为单独的工件放置。这个想法是拥有“构建”和“PROD angular 配置”工件,例如:
      - publish: $(Build.artifactstagingdirectory)/Config
        displayName: 'Publish config'
        artifact: ConfigPROD

      - publish: $(Build.artifactstagingdirectory)/Build
        displayName: 'Publish build'
        artifact: BUILD
  1. 在 STAGING 中部署 BUILD 工件后,使用 FTP 下载 ConfigPROD 工件到 STAGING。这将覆盖现有的 (STAGING) 配置。
    - task: DownloadPipelineArtifact@2
      displayName: 'Download config artifact'
      inputs:
        buildType: 'specific'
        project: [your devops project name]
        definition: [your build definition name]
        artifactName: 'ConfigPROD'
        path: '$(Pipeline.Workspace)/config'

    - task: FtpUpload@2
      displayName: 'Deploy configPROD'
      inputs:
        credentialsOption: 'inputs'
        serverUrl: [your ftp server url]
        username: [your ftp username]
        password: [your ftp password]
        rootDirectory: '$(Pipeline.Workspace)/config'
        filePatterns: '**' 
        remoteDirectory: [your remote directory] 
        clean: false 
        cleanContents: false
  1. 将 STAGING 换成 PROD
    - task: AzureAppServiceManage@0
      displayName: 'Swap STAGING and PROD'
      inputs:
        azureSubscription: [your azure subscription]
        Action: 'Swap Slots'
        WebAppName: [your app name]
        ResourceGroupName: [your rg name]
        SourceSlot: 'staging'
  • 如果您想知道如何在 Azure 中找到您的 ftp 凭据,路径如下: [AzurePortal]/[AppServicePage]/部署 Center/Deployment 凭据

  • [你的远程目录] 可以使用 Kudu 或“高级工具”中的控制台进行检查。在这种情况下,Angular wwwroot 位于 site/wwwroot 内,因此我的远程目录是 ' /site/wwwroot/wwwroot'

不是灵丹妙药,但 100% 工作并且绝对没有额外的停机时间。

感谢您的建议