【问题标题】:Using ARM Templates from external repository使用来自外部存储库的 ARM 模板
【发布时间】:2019-12-27 15:55:02
【问题描述】:

我正在使用 azure 多级管道,在单独的存储库中使用带有模板的部署作业。我目前开始在我的部署过程中使用 ARM 模板,并且还想运行位于不同存储库中的 ARM 模板。这是我有点卡住的地方,感谢任何帮助/建议。

为了说明我的设置:

  • Repo A -> 必须构建并部署到 azure 的源代码
  • Repo B -> Azure 管道模板(仅包含 yml 文件)
  • Repo C -> ARM 模板

所以我想要完成的是:A 使用 B 使用 C

REPO A: 文档构建和发布 yml

resources:
  repositories:
    - repository: templates
      type: git
      name: <ACCOUNT>/Azure.Pipelines.Templates
      ref: refs/tags/2.2.40

stages:
  - stage: Build
    jobs:
      - template: src/jobs/doc-build.yml@templates

  - stage: DEV
    jobs:
      - template: src/deployment-jobs/doc.yml@templates
    ....

REPO B: 文档部署

parameters:
  webAppName: ''
  connectedServiceName: 'DEV'

jobs:
  - deployment: doc_deploy
    pool:
      name: 'DOC'
    environment: 'doc'
    strategy:
      runOnce:
        deploy:
          steps:
            - template: ../deployment/arm-template.yml
              parameters:
                connectedServiceName: ${{ parameters.connectedServiceName }}
                resourceGroupName: 'documentation'
                templateFile: $(Build.SourcesDirectory)/Azure.ARM.Templates/src/web-app/documentation.jsonc
                paramFile: $(Build.SourcesDirectory)/Azure.ARM.Templates/src/web-app/documentation-params.json
                parameters: -name ${{ parameters.webAppName }}
            ...

REPO C: 包含 arm 模板 + 参数文件

我面临的问题是我似乎无法访问 repo c 的文件。我尝试在多个级别上添加另一个 repository 条目,但它似乎根本没有克隆依赖 repo。

我目前的解决方法/解决方案:

使用powershell脚本手动克隆repo C,直接引用磁盘上的文件。

相关github问题:https://github.com/microsoft/azure-pipelines-yaml/issues/103

【问题讨论】:

  • 我不认为你可以使用多级管道来完成这项工作,但我会使用版本,你可以指定一个 repo 作为工件并获取该工件
  • @4c74356b41 我怕有人这么说。我也有同样的想法。我知道使用版本是可能的,并且由于支持 yml 模板设置,我希望能够为 arm 模板做同样的事情。
  • 我不是 100% 相信事情就是这样,但我相当有信心。您可以将模板上传到某个地方并从 url 调用它们,或者将它们与模板代码放在一起,例如
  • @4c74356b41 ARM 模板文档包含使用 Blob 存储的链接模板的示例。我已经考虑过这个设置,但决定手动编写一个 git clone 任务来获取 repo。我希望能够坚持使用特定版本的模板,并认为 Blob 存储可能难以保持清洁。
  • 我一直在使用 build sha 将模板存储在 blob 中,使用 sha 作为路径的一部分,这样我总是可以从 blob 存储中调用正确版本的模板并且它们不会发生冲突

标签: azure-devops yaml azure-resource-manager multistage-pipeline


【解决方案1】:

我也偶然发现了这个问题,不得不将另一个 repo 中的 arm 模板加载到当前版本中。我所做的是在包含 arm-template 的 repo 上设置构建,生成具有以下 azure-pipelines.yml 的构建工件:(这将是您的 repo c)

trigger:
- master

steps:
- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(System.DefaultWorkingDirectory)/templates'
    ArtifactName: 'templates'
    publishLocation: 'Container'

之后我可以在实际管道中添加以下步骤:

- task: DownloadPipelineArtifact@2
            displayName: 'Get ARM Templates'
            inputs:
              buildType: 'specific'
              project: <YOUR-PROJECT-ID>'
              definition: '<ARM-BUILD-DEFINITION-ID>'
              buildVersionToDownload: 'latest'
              artifactName: 'scripts'
              targetPath: '$(Pipeline.Workspace)/templates'

并且我能够按如下方式访问文件:

- task: AzureResourceGroupDeployment@2
            displayName: 'Create Queues $(ResourceGroup.Name) '
            inputs:
              azureSubscription: '<YOUR-SUBSCRIPTION>'
              resourceGroupName: '$(ResourceGroup.Name)'
              location: '$(ResourceGroup.Location)'
              csmFile: '$(Pipeline.Workspace)/templates/servicebus.json'

有关下载管道工件任务的更多信息,请查看以下链接: Download Pipeline Artifact task

【讨论】:

  • 谢谢 我也考虑过走这条路,但决定不走。我做了一个 git clone 以便能够坚持我的手臂模板的特定标签。
猜你喜欢
  • 2016-01-19
  • 2019-12-10
  • 1970-01-01
  • 2011-07-06
  • 2020-09-28
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
相关资源
最近更新 更多