You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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审批规则

  1. 进入仓库「Settings」→「Environments」→「New environment」,创建prod环境。
  2. 在「Deployment protection rules」中勾选「Required reviewers」,添加需要审批的团队成员或用户。
  3. 此后,deploy-release工作流触发后,必须经过指定人员手动批准,才会执行Prod部署,确保UAT验证完成后再发布。

关键说明

  • 禁止从Test环境导出ARM模板:Test环境无Git关联,导出的模板会将全局参数硬编码,无法进行参数覆盖,必须复用Dev环境生成的参数化模板。
  • 版本关联:通过Commit SHA将GitHub Release与Dev构建产物绑定,确保Prod部署的是经过Test验证的同一版本代码。
  • 审批机制:严格遵循CI/CD最佳实践,避免自动发布未经过UAT验证的版本。

内容的提问来源于stack exchange,提问作者tendaitakas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 19:55:58