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

如何通过C#、GitHub或非标准方式自动化部署Azure函数?

可行的自动化部署方案(非Visual Studio标准方式)

你提到的REST、Azure.ResourceManager,以及GitHub Actions都是完全可行的零交互自动化部署C#函数应用的方案,以下是具体实现方式:

1. 使用Azure.ResourceManager SDK(C#代码方式)

直接通过官方的Azure.ResourceManager.Functions NuGet包编写代码,实现函数应用的创建/更新与部署包上传,全程可自动化:

  • 首先安装NuGet包:Install-Package Azure.ResourceManager.Functions
  • 核心代码示例(使用服务主体/环境变量实现零交互认证):
using Azure;
using Azure.ResourceManager;
using Azure.ResourceManager.Functions;
using Azure.Identity;

var armClient = new ArmClient(new DefaultAzureCredential());
// 获取目标订阅与资源组
var subscription = await armClient.GetDefaultSubscriptionAsync();
var resourceGroup = await subscription.GetResourceGroupAsync(ResourceIdentifier.Parse("/subscriptions/{subId}/resourceGroups/{rgName}"));

// 获取目标函数应用(若不存在可创建)
var functionApp = await resourceGroup.GetFunctionAppAsync("your-function-app-name");

// 从本地或存储账户上传发布包(这里示例用存储SAS URL)
var deployOperation = await functionApp.DeployPackageAsync(
    WaitUntil.Completed,
    new Uri("https://your-storage.blob.core.windows.net/packages/func-publish.zip?{sasToken}"));

await deployOperation.WaitForCompletionAsync();
  • DefaultAzureCredential会自动从环境变量、服务主体凭据、托管身份等渠道获取认证信息,适合CI/CD环境的零交互部署。

2. 直接调用Azure REST API

通过Azure资源管理REST API的Zip Deploy接口实现部署,无需依赖SDK,适合灵活的脚本场景:

  • 核心API请求(PUT方法):
    路径:https://management.azure.com/subscriptions/{subId}/resourceGroups/{rgName}/providers/Microsoft.Web/sites/{funcAppName}/extensions/zipdeploy?api-version=2022-03-01
  • 认证方式:使用Azure AD生成的Bearer Token,可通过服务主体获取token实现自动化
  • C# HttpClient调用示例:
using System.Net.Http;
using System.Net.Http.Headers;
using System.IO;

var httpClient = new HttpClient();
// 替换为实际的Azure AD访问令牌
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "your-access-token");

var zipPath = "./func-publish.zip";
using var zipStream = new FileStream(zipPath, FileMode.Open);
var content = new StreamContent(zipStream);
content.Headers.ContentType = new MediaTypeHeaderValue("application/zip");

var response = await httpClient.PutAsync(
    "https://management.azure.com/subscriptions/{subId}/resourceGroups/{rgName}/providers/Microsoft.Web/sites/{funcAppName}/extensions/zipdeploy?api-version=2022-03-01",
    content);

response.EnsureSuccessStatusCode();

3. GitHub Actions零交互自动化部署

通过GitHub Actions工作流实现从代码编译到部署的全流程自动化,无需手动干预:

  1. 准备工作:
    • 在Azure中创建服务主体,赋予函数应用所在资源组的Contributor权限,导出服务主体的JSON凭据
    • 在GitHub仓库的「Settings -> Secrets and variables -> Actions」中添加名为AZURE_CREDENTIALS的机密,值为服务主体JSON内容
  2. 创建工作流文件:在仓库根目录下创建.github/workflows/deploy.yml,内容示例:
name: Auto Deploy Function App
on:
  push:
    branches: [ main ]  # 触发部署的分支,按需修改

jobs:
  build-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup .NET SDK
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: '8.0'  # 匹配你的函数应用.NET版本

      - name: Build & Publish
        run: |
          dotnet build --configuration Release
          dotnet publish --configuration Release --output ./publish

      - name: Zip publish artifacts
        run: zip -r func-package.zip ./publish

      - name: Login to Azure
        uses: azure/login@v2
        with:
          creds: ${{ secrets.AZURE_CREDENTIALS }}

      - name: Deploy to Function App
        uses: azure/functions-action@v1
        with:
          app-name: 'your-function-app-name'
          package: './func-package.zip'
          slot-name: 'production'  # 部署槽,按需修改
  • 当代码推送到指定分支时,工作流会自动触发,完成编译、打包、登录Azure、部署的全流程,完全零交互。若需部署多环境,可复制job并修改对应的应用名称与机密,或使用矩阵策略批量部署。

通用注意事项

  • 确保部署用的身份(服务主体/托管身份)拥有足够权限:至少需要函数应用所在资源组的Contributor角色,若从存储账户拉取发布包,还需存储账户的Storage Blob Data Reader权限
  • C#函数应用的发布包需正确打包:直接将dotnet publish输出目录下的所有文件打包为zip,不要包含外层文件夹,否则部署后函数无法正常运行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 00:10:45