Azure Data Factory集成DevOps的CI/CD改进实现咨询
Azure Data Factory 新版CI/CD流程问题解答
1. 流程参考YAML示例
以下是基于Azure DevOps Pipeline编写的可直接复用的YAML配置,全程不依赖adf_publish分支,基于npm包完成ADF ARM模板构建与多环境部署:
# 触发分支为ADF协作开发主分支,无需监听adf_publish分支 trigger: - main pool: vmImage: ubuntu-latest variables: - name: adfSourceRoot value: $(Build.SourcesDirectory)/adf-resources # 替换为代码库中ADF资源的根目录 - name: armOutputDir value: $(Build.ArtifactStagingDirectory)/adf-arm-templates - name: adfSubscriptionId value: <开发环境ADF所在订阅ID> - name: adfName value: <开发环境ADF实例名> - name: adfResourceGroup value: <开发环境ADF所在资源组> stages: - stage: Build displayName: 校验并构建ADF ARM模板 jobs: - job: BuildJob steps: # 安装Node.js运行环境 - task: NodeTool@0 inputs: versionSpec: '16.x' displayName: '安装Node.js 16.x' # 全局安装ADF官方构建npm包 - script: | npm install -g @microsoft/azure-data-factory-utilities displayName: '安装ADF构建工具' # 校验ADF资源配置合法性 - script: | adf validate $(adfSourceRoot) $(adfSubscriptionId) $(adfName) $(adfResourceGroup) displayName: '校验ADF资源配置' # 导出通用ARM模板 - script: | adf export $(adfSourceRoot) $(armOutputDir) $(adfSubscriptionId) $(adfName) $(adfResourceGroup) displayName: '生成跨环境部署ARM模板' # 发布ARM模板为流水线制品,供后续部署阶段调用 - task: PublishBuildArtifacts@1 inputs: PathtoPublish: '$(armOutputDir)' ArtifactName: 'adf-arm-artifact' publishLocation: 'Container' displayName: '发布ARM模板制品' # UAT环境部署,可在阶段配置中加审批规则 - stage: DeployUAT displayName: 部署到UAT环境 dependsOn: Build jobs: - deployment: UATDeploy environment: UAT strategy: runOnce: deploy: steps: - task: DownloadBuildArtifacts@0 inputs: buildType: 'current' downloadType: 'single' artifactName: 'adf-arm-artifact' downloadPath: '$(System.ArtifactsDirectory)' # 执行ARM模板部署,指定UAT环境参数文件 - task: AzureResourceManagerTemplateDeployment@3 inputs: deploymentScope: 'Resource Group' azureResourceManagerConnection: '<UAT环境Azure服务连接名>' subscriptionId: '<UAT环境订阅ID>' action: 'Create Or Update Resource Group' resourceGroupName: '<UAT环境ADF所在资源组>' location: '<UAT资源所在区域>' templateLocation: 'Linked artifact' csmFile: '$(System.ArtifactsDirectory)/adf-arm-artifact/ARMTemplateForFactory.json' csmParametersFile: '$(Build.SourcesDirectory)/env-params/uat.parameters.json' deploymentMode: 'Incremental' displayName: '部署ADF到UAT环境' # 生产环境部署,配置强制审批 - stage: DeployProd displayName: 部署到生产环境 dependsOn: DeployUAT jobs: - deployment: ProdDeploy environment: Prod strategy: runOnce: deploy: steps: - task: DownloadBuildArtifacts@0 inputs: buildType: 'current' downloadType: 'single' artifactName: 'adf-arm-artifact' downloadPath: '$(System.ArtifactsDirectory)' - task: AzureResourceManagerTemplateDeployment@3 inputs: deploymentScope: 'Resource Group' azureResourceManagerConnection: '<生产环境Azure服务连接名>' subscriptionId: '<生产环境订阅ID>' action: 'Create Or Update Resource Group' resourceGroupName: '<生产环境ADF所在资源组>' location: '<生产资源所在区域>' templateLocation: 'Linked artifact' csmFile: '$(System.ArtifactsDirectory)/adf-arm-artifact/ARMTemplateForFactory.json' csmParametersFile: '$(Build.SourcesDirectory)/env-params/prod.parameters.json' deploymentMode: 'Incremental' displayName: '部署ADF到生产环境'
2. 跨环境参数覆盖实现方案
不需要修改npm构建生成的原始模板和默认参数文件,按以下步骤操作即可实现不同环境的配置切换:
- 第一步:在代码库中单独创建环境参数目录,比如
env-params,为每个环境维护独立的参数文件,不需要全量复制默认生成的参数配置,只需要填写需要覆盖的参数项即可。 - 第二步:第一次构建完成后,打开生成的
ARMTemplateParametersForFactory.json,找到需要替换的配置对应的参数名:比如Key Vault链接服务的KV地址参数,命名规则一般为<KeyVault链接服务名称>_properties_typeProperties_baseUrl,ADF实例名、存储账户链接、计算资源关联配置都会被自动抽为独立参数。 - 第三步:在对应环境的参数文件中给目标参数赋值即可,以下是UAT环境参数文件的最简示例:
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "factoryName": { "value": "uat-data-factory" }, "Dev-KV_properties_typeProperties_baseUrl": { "value": "https://uat-kv.vault.azure.net/" } } }
按照相同规则编写生产环境参数文件,将对应Key Vault参数值替换为Prod-KV的访问地址即可。
- 可选补充:如果有不想硬编码在参数文件里的敏感值,可以直接在ARM部署任务的
overrideParameters字段中传入,直接覆盖参数文件中的值,不需要修改代码库中的文件。
注意:不要手动修改npm导出的ARM模板结构,所有可配置项都会被自动抽为顶层参数,直接赋值即可,避免后续ADF资源更新后模板结构变化导致的部署失败。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

