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),必须手动更新版本才能正常构建部署。由于需要频繁部署销毁资源,不想每次都手动修改工作流文件,希望找到以下两种解决方案之一:
- 让过时的自动生成工作流文件生效的办法
- 用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

