使用 GitHub Actions 部署Fabric应用

使用GitHub Actions工作流自动将Fabric应用从GitHub存储库部署到Fabric工作区。 工作流使用服务主体登录Fabric,安装 Rayfin CLI,并运行 rayfin up,将代码、数据库架构和静态内容应用到目标工作区。 本文将向您介绍如何操作:

  • 为自动部署准备服务主体和Fabric工作区。
  • 配置工作流所需的 GitHub 仓库密钥。
  • 将部署工作流文件添加到存储库。
  • main 上自动触发部署,也可手动触发,并可选择支持破坏性变更。
  • 对功能分支和针对特定环境的部署复用相同的工作流。

先决条件

  • GitHub存储库中的Fabric应用项目。 如果还没有项目,请参阅 创建第一个Fabric应用项目并将应用程序代码推送到存储库。
  • 服务主体可以部署到的Microsoft Fabric工作区。 有关环境分离,请参阅 管理开发和生产环境
  • 具有客户端密钥的 Microsoft Entra ID 服务主体(应用注册)。
  • secrets 添加到GitHub存储库的权限。

步骤 1:为部署创建服务主体

工作流以非交互方式登录,因此它使用服务主体而不是交互式用户帐户。

  1. Azure 门户中,在 Microsoft Entra ID>应用注册 下注册新应用程序。
  2. 记录 应用程序(客户端)ID目录(租户)ID
  3. “证书和机密”下,创建新的 客户端密码 并复制该值。 安全地存储它:以后无法再次查看它。
  4. 向服务主体授予目标 Fabric 工作区上的 参与者 或更高级别权限,以便其可以创建和更新 Fabric 应用项。

Important

服务主体部署要求在 Fabric 租户设置中允许服务主体使用 Fabric API。 请与Fabric管理员确认已启用此功能。

步骤 2:添加存储库机密

在 GitHub 仓库中,前往 Settings>机密和变量>Actions,然后添加以下仓库机密:

机密名称 价值
CLIENT_ID 服务主体的应用程序(客户端)ID。
TENANT_ID 目录(租户)ID。
CLIENT_SECRET 客户端密码值。
FABRIC_WORKSPACE_NAME 目标Fabric工作区的名称(例如,my-app-prod)。

步骤 3:添加工作流文件

在存储库中,创建包含以下内容的文件 .github/workflows/deploy-to-fabric.yml

name: Deploy to Fabric

on:
  push:
    branches: [main]
  workflow_dispatch:
    inputs:
      force:
        description: 'Allow destructive schema changes that may result in data loss'
        required: false
        default: false
        type: boolean

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

permissions:
  contents: read

jobs:
  deploy:
    name: Deploy to Fabric
    runs-on: ubuntu-latest
    env:
      CLIENT_ID: ${{ secrets.CLIENT_ID }}
      TENANT_ID: ${{ secrets.TENANT_ID }}
      CLIENT_SECRET: ${{ secrets.CLIENT_SECRET }}
      FABRIC_WORKSPACE_NAME: ${{ secrets.FABRIC_WORKSPACE_NAME }}

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

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install Rayfin CLI
        run: npm install -g @microsoft/rayfin-cli

      - name: Login to Rayfin with service principal
        run: |
          rayfin login \
            --service-principal \
            -t $TENANT_ID
            -u $CLIENT_ID
            -p CLIENT_SECRET

      - name: Deploy to Fabric
        run: |
          EXTRA_ARGS=""

          if [[ "${{ inputs.force }}" == "true" ]]; then
            EXTRA_ARGS="$EXTRA_ARGS --force"
          fi

          rayfin up \
            --workspace "$FABRIC_WORKSPACE_NAME" \
            --yes \
            $EXTRA_ARGS

每个部分的作用

  • on.push:在每次推送到 main 时自动运行工作流。
  • on.workflow_dispatch:使用 force 复选框在GitHub Actions UI 中添加运行工作流按钮。 启用force会将--force传递给rayfin up,从而允许进行破坏性架构更改(例如删除列或表)。 为安全、非破坏性的部署将其保留为未选中状态。
  • concurrency:确保每个分支在同一时间只执行一个部署。 如果在之前的部署仍在运行时有新的推送到达,则会取消较早的运行,并以较新的提交为准。 此设置可防止两个 rayfin up 作业在同一工作区中发生竞争。
  • env:将服务主体凭据和目标工作区名称传递到作业中。
  • Install Rayfin CLI:全局安装 CLI,因此 rayfin 位于 PATH 上。
  • Login to Fabric with service principal:使用 * 环境变量进行身份验证。
  • Deploy to Fabric:针对已配置的租户和工作区运行 rayfin up--yes 接受非破坏性提示;--force 仅在手动运行提出请求时才会添加。

步骤 4:启动部署

可以通过两种方式触发工作流:

  • 自动:向 main 分支推送提交或合并提交。
  • 手动:在 GitHub 中,转到 Actions>部署到 Fabric>运行工作流。 选择要部署的分支,并根据需要检查 “允许破坏性架构更改”,这些更改可能会导致 数据丢失,然后再启动运行。

工作流完成后,运行日志中的 Deploy 到 Fabric 步骤将输出Fabric应用 URL 和部署 ID。

注意事项和限制

  • 并发按分支计算。 concurrency.group包含github.ref,因此向不同分支的部署不会相互取消。 将分支映射到不同的工作区时,此行为是有意的。
  • 默认情况下会阻止破坏性更改。 rayfin up 拒绝可能会丢失数据的架构操作,除非 --force 传递。 仅在你已审查计划执行的操作后,才为手动运行启用 强制
  • 工作区必须存在。 工作流不会创建Fabric工作区。 在Fabric门户中创建它们,并首先授予服务主体访问权限。