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

Terraform创建azurerm_app_service_source_control生成过时GitHub Action问题

问题描述

我使用Terraform在Azure部署包含函数应用的资源,函数源码托管在私有GitHub仓库。通过azurerm_app_service_source_control配置源码控制时,自动生成的GitHub Action工作流文件工具版本过旧(如actions/checkout@master、actions/setup-python@v1),必须手动更新版本才能正常构建部署。由于需要频繁部署销毁资源,不想每次都手动修改工作流文件,希望找到以下两种解决方案之一:

  1. 让过时的自动生成工作流文件生效的办法
  2. 用Terraform配置自定义GitHub Action工作流的模板

解决方案

一、临时让过时工作流生效的调整方案

自动生成的旧版本Action存在兼容性问题(比如actions/setup-python@v1不支持Python 3.10,actions/checkout@master是不稳定分支引用),可做最小调整使其兼容当前环境:

  • 将actions/checkout@master改为actions/checkout@v2(稳定版本,满足基础代码检出需求)
  • 将actions/setup-python@v1改为actions/setup-python@v2(v2版本开始支持Python 3.10)
  • 保留azure/appservice-build@v2和azure/webapps-deploy@v2(这两个版本对Python 3.10的基础构建部署仍兼容)

调整后的临时工作流示例:

name: Azure App Service - Build and Deploy Python App

on:
  push:
    branches:
      - dev

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
    - name: 'Checkout Github Action'
      uses: actions/checkout@v2

    - name: Set up Python version
      uses: actions/setup-python@v2
      with:
        python-version: '3.10'

    - name: Build using AppService-Build
      uses: azure/appservice-build@v2
      with:
        platform: python
        platform-version: '3.10'

    - name: Run Azure webapp deploy action using publish profile credentials
      uses: azure/webapps-deploy@v2
      with:
        app-name: func-dev
        slot-name: Production
        publish-profile: ${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE_<REDACTED> }}

注:此方案仅为临时 workaround,长期建议使用自定义工作流。

二、用Terraform配置自定义GitHub Action工作流的模板

通过Terraform的github_repository_file资源直接管理GitHub仓库中的工作流文件,彻底替代Azure自动生成的旧版本工作流。每次执行terraform apply时,会自动将最新工作流同步到GitHub仓库,无需手动修改。

步骤1:添加GitHub Provider配置

在Terraform代码中添加GitHub Provider,用于操作GitHub仓库:

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 4.0"
    }
    github = {
      source  = "integrations/github"
      version = "~> 5.0"
    }
  }
  required_version = ">= 1.1.0"
}

provider "github" {
  token        = var.github_token # 拥有仓库写入权限的GitHub Token
  owner        = var.github_owner # GitHub仓库所属组织/用户名
}

# 保留原有的Azure Provider配置
provider "azurerm" {
  subscription_id = terraform.workspace == "prod" ? var.prod_subscription_id : var.dev_subscription_id
  tenant_id       = var.tenant_id
  client_id       = terraform.workspace == "prod" ? var.prod_client_id : var.dev_client_id
  client_secret   = terraform.workspace == "prod" ? var.prod_client_secret : var.dev_client_secret
  features {}
}

步骤2:定义自定义工作流文件资源

使用github_repository_file资源将自定义工作流部署到GitHub仓库的.github/workflows目录:

resource "github_repository_file" "func_app_deploy_workflow" {
  repository = var.github_repo_name # 你的私有GitHub仓库名称
  file       = ".github/workflows/azure-func-deploy.yml"
  content    = <<EOF
name: Azure App Service - Build and Deploy Python App

on:
  push:
    branches:
      - ${terraform.workspace == "prod" ? "main" : "dev"}

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - name: Set up Python version
      uses: actions/setup-python@v5
      with:
        python-version: '3.10'

    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt --target .python_packages/lib/site-packages

    - name: Build using AppService-Build
      uses: azure/appservice-build@v3
      with:
        platform: python
        platform-version: '3.10'
        source-directory: '.'

    - name: Deploy to Azure Web App
      uses: azure/webapps-deploy@v2
      with:
        app-name: func-${terraform.workspace}
        slot-name: Production
        publish-profile: \${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE_<REDACTED> }}
EOF
  commit_message = "Update deployment workflow via Terraform"
}

步骤3:调整Azure源码控制配置

修改azurerm_app_service_source_control,禁用自动生成GitHub Action,改用自定义工作流:

resource "azurerm_app_service_source_control" "source_control" {
  app_id   = azurerm_linux_function_app.func_app.id
  repo_url = local.github_repo
  branch   = terraform.workspace == "prod" ? "main" : "dev"

  depends_on = [azurerm_linux_function_app.func_app]

  # 禁用自动生成工作流,使用自定义文件
  github_action_configuration {
    generate_workflow = false
  }
}

说明

  • 自定义工作流可根据需求调整Action版本、添加额外步骤(如依赖安装、单元测试等)
  • terraform.workspace变量会自动适配dev/prod环境,切换分支和应用名称
  • 需确保GitHub Token拥有仓库写入权限,且Azure发布配置文件已正确添加到GitHub Secrets中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 13:27:15