Azure Data Factory基于Github Actions的CI/CD:全局参数覆盖难题
如何用GitHub Actions实现ADF的CI/CD(遵循UAT后部署Prod的最佳实践)
问题背景
我在尝试用GitHub Actions复刻Azure DevOps中ADF的CI/CD流程时遇到了卡点:
- Dev环境ADF配置Git后,推送main分支可成功生成参数化ARM模板,部署到Test环境时也能通过
additionalParameters覆盖全局参数。 - 但从Test环境发布到Prod时,由于Test环境未配置Git,导出的ARM模板不包含可参数化的全局参数,导致无法在Prod部署阶段覆盖这些参数。
- 我需要严格遵循CI/CD最佳实践:必须在UAT完成后再手动触发Prod部署,而非PR批准时同时部署Test和Prod。
解决方案:复用Dev环境的参数化ARM模板 + 手动审批机制
Test环境作为UAT环境无需配置Git,因此Prod部署应直接复用Dev环境构建生成的参数化ARM模板,同时利用GitHub Environments的手动审批功能,确保UAT通过后再执行Prod部署。
步骤1:优化Dev→Test工作流,保留可复用的ARM模板资产
修改deploy-main工作流,在生成ARM模板后,用Commit SHA标记并长期保留该资产,确保后续Prod部署能精准关联对应版本:
name: deploy-main on: push: branches: - main permissions: id-token: write contents: read jobs: build-dev: runs-on: ubuntu-latest environment: dev steps: - uses: actions/checkout@v3 - name: Setup Node.js environment uses: actions/setup-node@v3.4.1 with: node-version: 14.x - name: Install ADF Utilities package run: npm install working-directory: ./ - name: Validate and Generate ARM template run: npm run build export ${{github.workspace}}/ /subscriptions/${{ secrets.AZURE_SUBSCRIPTION_ID }}/resourceGroups/${{ secrets.AZURE_RESOURCE_GROUP }}/providers/Microsoft.DataFactory/factories/${{ secrets.ADF_NAME }} "ExportedArmTemplate" working-directory: ./ # 用Commit SHA标记模板,确保版本唯一且可追溯 - name: Upload ARM template artifact uses: actions/upload-artifact@v3 with: name: ExportedArmTemplate-${{ github.sha }} path: ./ExportedArmTemplate retention-days: 30 # 根据团队需求设置保留天数 deploy-test: needs: build-dev runs-on: ubuntu-latest environment: test steps: - name: Download ARM template artifact uses: actions/download-artifact@v3.0.2 with: name: ExportedArmTemplate-${{ github.sha }} path: ./ExportedArmTemplate - name: Login via Az module uses: azure/login@v1 with: creds: '{"clientId":"${{ secrets.AZURE_CLIENT_ID }}","clientSecret":"${{ secrets.AZURE_CLIENT_SECRET }}","subscriptionId":"${{ secrets.AZURE_SUBSCRIPTION_ID }}","tenantId":"${{ secrets.AZURE_TENANT_ID }}"}' enable-AzPSSession: true - name: Deploy to Test ADF uses: Azure/data-factory-deploy-action@v1.2.0 with: resourceGroupName: ${{ secrets.AZURE_TEST_RESOURCE_GROUP }} dataFactoryName: ${{ secrets.AZURE_TEST_ADF_NAME }} armTemplateFile: ./ExportedArmTemplate/ARMTemplateForFactory.json armTemplateParametersFile: ./ExportedArmTemplate/ARMTemplateParametersForFactory.json additionalParameters: > default_properties_environment_value=tst default_properties_DZSPID_value=${{ secrets.TEST_DZSPID }} default_properties_PubSPID_value=${{ secrets.TEST_PUBSPID }}
步骤2:重构Prod发布工作流,复用Dev模板+配置手动审批
删除原deploy-release中从Test环境导出模板的步骤,直接下载Dev环境生成的参数化模板,同时给Prod环境添加手动审批规则:
name: deploy-release on: release: types: [published] permissions: id-token: write contents: read jobs: release-prod: runs-on: ubuntu-latest # 配置Prod环境的手动审批规则 environment: name: prod reviewers: - your-team-leader-1 - your-team-leader-2 # 指定需要审批的人员/团队 steps: # 下载对应版本的Dev构建模板(通过Release关联的Commit SHA匹配) - name: Download Dev-built ARM Template uses: actions/download-artifact@v3.0.2 with: name: ExportedArmTemplate-${{ github.event.release.target_commitish }} path: ./ExportedArmTemplate - name: Login via Az module uses: azure/login@v1 with: creds: '{"clientId":"${{ secrets.AZURE_CLIENT_ID }}","clientSecret":"${{ secrets.AZURE_CLIENT_SECRET }}","subscriptionId":"${{ secrets.AZURE_PROD_SUBSCRIPTION_ID }}","tenantId":"${{ secrets.AZURE_TENANT_ID }}"}' enable-AzPSSession: true - name: Deploy to Production ADF uses: Azure/data-factory-deploy-action@v1.2.0 with: resourceGroupName: ${{ secrets.AZURE_PROD_RESOURCE_GROUP }} dataFactoryName: ${{ secrets.AZURE_PROD_ADF_NAME }} armTemplateFile: ./ExportedArmTemplate/ARMTemplateForFactory.json armTemplateParametersFile: ./ExportedArmTemplate/ARMTemplateParametersForFactory.json additionalParameters: > default_properties_environment_value=prd default_properties_DZSPID_value=${{ secrets.PROD_DZSPID }} default_properties_PubSPID_value=${{ secrets.PROD_PUBSPID }}
步骤3:配置GitHub Environments的Prod审批规则
- 进入仓库「Settings」→「Environments」→「New environment」,创建
prod环境。 - 在「Deployment protection rules」中勾选「Required reviewers」,添加需要审批的团队成员或用户。
- 此后,
deploy-release工作流触发后,必须经过指定人员手动批准,才会执行Prod部署,确保UAT验证完成后再发布。
关键说明
- 禁止从Test环境导出ARM模板:Test环境无Git关联,导出的模板会将全局参数硬编码,无法进行参数覆盖,必须复用Dev环境生成的参数化模板。
- 版本关联:通过Commit SHA将GitHub Release与Dev构建产物绑定,确保Prod部署的是经过Test验证的同一版本代码。
- 审批机制:严格遵循CI/CD最佳实践,避免自动发布未经过UAT验证的版本。
内容的提问来源于stack exchange,提问作者tendaitakas
相关产品推荐
相关产品推荐

