Deploy to Функции Azure by using GitHub Actions

Вы можете использовать рабочий процесс GitHub Actions для автоматического создания и развертывания вашего функционального кода в Azure, используя Azure/functions-action.

Чтобы развернуть с помощью GitHub Actions, выполните следующие три ключевых шага:

  1. Создайте управляемую личность, назначенную пользователем, в Azure с федеративным учетным данным, который доверяет вашему репозиторию GitHub, и назначьте ей роль участника сайта в вашем функциональном приложении.
  2. Добавьте идентификатор клиента, идентификатор арендатора и идентификатор подписки в качестве секретов репозитория в GitHub.
  3. Добавьте в репозиторий YAML-файл рабочего процесса, который использует azure/login OpenID Connect (OIDC) для аутентификации, а затем вызывает Azure/functions-action для развертывания.

Когда вы используете портал Azure для включения GitHub Actions, Functions автоматически выполняет эти задачи как в вашей подписке Azure, так и в репозитории GitHub.

Create a workflow configuration for Функции Azure

Вы поддерживаете YAML-файл (.yml), который определяет конфигурацию рабочего процесса в пути /.github/workflows/ в вашем репозитории. Это определение содержит действия и параметры, составляющие рабочий процесс, который зависит от языка разработки функций.

Выберите метод создания файла рабочего процесса с помощью селектора в верхней части статьи:

Метод лучше всего подходит для Поддержка OIDC
Шаблон рабочего процесса Полный контроль: скопировать шаблон, готовый к OIDC, и настроить его Требуется конфигурация
Портал Azure Самая простая настройка: портал может создать для вас идентичность, учетные данные и файл рабочего процесса Настроено для вас
Маркетплейс GitHub GitHub-первым: начните с встроенных шаблонов маркетплейса GitHub Требуется модификация конфигурации и шаблона

Обзор проверки подлинности

GitHub Actions должен пройти аутентификацию с помощью Azure для развертывания вашего кода. В этой статье используется OpenID Connect (OIDC), который является рекомендованным методом аутентификации. OIDC использует федеративные учетные данные для создания доверительных отношений между вашим репозиторием GitHub и управляемой идентичностью, назначенной пользователем в Microsoft Entra. В GitHub секреты не хранятся.

Пример аутентификации OIDC

Следующий встроенный пример показывает основной шаблон аутентификации и развертывания OIDC, используемый во всех шаблонах рабочих процессов:

permissions:
  id-token: write
  contents: read

steps:
  - name: 'Login via OIDC'
    uses: azure/login@v3
    with:
      client-id: ${{ secrets.AZURE_CLIENT_ID }}
      tenant-id: ${{ secrets.AZURE_TENANT_ID }}
      subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

  - name: 'Deploy to Azure Functions'
    uses: Azure/functions-action@v1
    with:
      app-name: ${{ env.AZURE_FUNCTIONAPP_NAME }}
      package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}

GitHub Actions OIDC аутентификации

  • OIDC использует федерацию идентификации рабочих нагрузок и поддерживает только управляемые идентификаторы, назначенные пользователями.
  • При включении развертывания на базе GitHub Actions в портале Azure по умолчанию используется аутентификация OIDC.
  • В OIDC клиентские идентификаторы, арендаторы и подписки управляемых идентификаторов хранятся в виде секретов репозитория GitHub.
  • Используйте ролевой контроль доступа Azure (Azure RBAC), чтобы ограничить доступ только ресурсами Azure, необходимыми для вашего развертывания.

Предварительные условия

  • Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно .

  • Учетная запись GitHub. Если у вас ее нет, зарегистрируйтесь бесплатно.

  • Исходный код Project в репозитории GitHub.

  • Базовое понимание рабочих процессов GitHub Actions. Если вы новичок в GitHub Actions, смотрите раздел «Понимание GitHub Actions».

  • Рабочее функциональное приложение, размещённое на Azure (только код или контейнер).

  • (Только для развертывания контейнеров) Существующий реестр контейнеров, например Реестр контейнеров Azure.

  • Azure CLI при локальной разработке. Вы также можете использовать Azure CLI в Azure Cloud Shell.

Создание управляемой идентичности для развертывания GitHub Actions

OpenID Connect (OIDC) — рекомендуемый метод аутентификации для развертывания GitHub Actions в Функции Azure. С помощью OIDC вы настраиваете управляемую идентичность, назначенную пользователем, в Azure и создаёте доверительные отношения с вашим репозиторием GitHub. Затем рабочий процесс может аутентифицироваться с помощью Azure без сохранения учетных данных в виде секретов.

  1. Используйте команду az identity create, чтобы создать управляемое удостоверение, назначаемое пользователем:

    az identity create --name myGitHubDeployIdentity --resource-group <RESOURCE_GROUP> \
    --query "{clientId: clientId, tenantId: tenantId}" -o table
    

    Замените <RESOURCE_GROUP> именем своей группы ресурсов.

  2. На выходе обратите внимание на clientId значения и tenantId . Также получите свой идентификатор подписки:

    az account show --query "{subId: id}" -o table
    

    Эти три значения понадобятся позже, когда вы добавите учетные данные в GitHub.

  3. Используйте команду назначения роли az create, чтобы назначить Website Contributor роль управляемому идентификатору, ограниченному вашему функциональному приложению:

    IDENTITY_PRINCIPAL=$(az identity show --name myGitHubDeployIdentity --resource-group <RESOURCE_GROUP> --query 'principalId' -o tsv)
    FUNCTION_APP_ID=$(az functionapp show --name <APP_NAME> --resource-group <RESOURCE_GROUP> --query 'id' -o tsv)
    az role assignment create --assignee $IDENTITY_PRINCIPAL --role "Website Contributor" --scope $FUNCTION_APP_ID
    

    Замените <APP_NAME><RESOURCE_GROUP> и на названия вашего приложения и группы ресурсов соответственно.

  4. Используйте команду az identity federated-credential create, чтобы создать федеративный учетный код, который доверяет токенам из вашего репозитория GitHub:

    az identity federated-credential create \
        --identity-name myGitHubDeployIdentity \
        --resource-group <RESOURCE_GROUP> \
        --name github-deploy-credential \
        --issuer https://token.actions.githubusercontent.com \
        --subject repo:<GITHUB_ORG>/<REPO_NAME>:ref:refs/heads/<BRANCH_NAME> \
        --audiences api://AzureADTokenExchange
    

    Замените <RESOURCE_GROUP>, <GITHUB_ORG>, <REPO_NAME> и <BRANCH_NAME> собственными значениями. Субъект должен совпадать с веткой, которая запускает ваш рабочий процесс.

  5. (По желанию) Если вы развёртываете контейнер из Реестр контейнеров Azure, также назначьте acrpull роль управляемой идентичности:

    IDENTITY_PRINCIPAL=$(az identity show --name myGitHubDeployIdentity --resource-group <RESOURCE_GROUP> --query 'principalId' -o tsv)
    az role assignment create --assignee $IDENTITY_PRINCIPAL --role acrpull \
        --scope /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.ContainerRegistry/registries/<REGISTRY_NAME>
    

    Замените <SUBSCRIPTION_ID>, <RESOURCE_GROUP> и <REGISTRY_NAME> значениями.

Добавить учетные данные в GitHub

Используйте значения, скопированные при создании управляемой идентичности.

  1. В GitHub перейдите в репозиторий.

  2. Перейдите в раздел Настройки>Секреты и переменные>Действия.

  3. На вкладке «Секреты » выберите «Новый секрет репозитория».

  4. Создайте каждый из следующих секретов:

    Name Ценность
    AZURE_CLIENT_ID Управляемая clientId идентичность
    AZURE_TENANT_ID Управляемая tenantId идентичность
    AZURE_SUBSCRIPTION_ID Идентификатор подписки, содержащий ваше функциональное приложение

Для развертывания контейнеров из приватного реестра также нужны секреты, специфичные для реестра. Для получения дополнительной информации смотрите раздел Docker Login Action.

Создание рабочего процесса из шаблона

Лучший способ вручную создать конфигурацию рабочего процесса — начать с официально поддерживаемого шаблона.

  1. Выберите Windows или Linux, чтобы убедиться, что вы получите шаблон для правильной операционной системы.

    Развертывания для Windows используют runs-on: windows-latest. Контейнерные развертывания требуют Linux.

  2. Используйте языкоспецифичный шаблон OIDC workflow из репозитория действий Функции Azure. Скопируйте полное содержимое файла в новый файл с именем .github/workflows/deploy-function-app.yml в вашем репозитории:

    name: Build and deploy .NET project to Azure Function App using OIDC
    
    on:
      push:
        branches: [ main ]
      workflow_dispatch:
    
    env:
      AZURE_FUNCTIONAPP_NAME: 'APP_NAME'         # Set this to your function app name on Azure 
      AZURE_FUNCTIONAPP_PROJECT_PATH: '.'        # Set this to the path to your function app project, defaults to the repository root. The deploy action will package the contents of this path.
      DOTNET_VERSION: '10.0.x'                   # Set this to the .NET version of your project
      BUILD_ARTIFACT_NAME: 'released-package'    # Set this according to your team's naming convention
      
    jobs:
      build:
        runs-on: windows-latest # Assumes your target function app is Windows-based
        permissions:
          id-token: write  # Required for OIDC
          contents: read   # Required for actions/checkout
        defaults:
          run:
            shell: bash
            working-directory: ${{ env.AZURE_FUNCTIONAPP_PROJECT_PATH }}
        steps:
          - name: 'Checkout repository'
            uses: actions/checkout@v6
    
          - name: 'Set up .NET version: ${{ env.DOTNET_VERSION }}'
            uses: actions/setup-dotnet@v5
            with:
              dotnet-version: ${{ env.DOTNET_VERSION }}
    
          # Perform additional steps such as running tests, if needed
    
          - name: 'Build and prepare .NET project for deployment'
            run: dotnet publish --configuration Release --output ./output
    
          - name: Upload artifact for the deployment job
            uses: actions/upload-artifact@v7
            with:
              name: ${{ env.BUILD_ARTIFACT_NAME }}
              path: ${{ env.AZURE_FUNCTIONAPP_PROJECT_PATH }}/output
              include-hidden-files: true  # Required for .NET projects
      
      deploy:
        runs-on: windows-latest # Assumes your target function app is Windows-based
        needs: build
        permissions:
          id-token: write  # Required for OIDC
        steps:
          - name: 'Download artifact from build job'
            uses: actions/download-artifact@v8
            with:
              name: ${{ env.BUILD_ARTIFACT_NAME }}
              path: '${{ env.AZURE_FUNCTIONAPP_PROJECT_PATH }}/downloaded-artifact'
         
          - name: 'Log in to Azure with AZ CLI'
            uses: azure/login@v3
            with:
              client-id: ${{ vars.AZURE_CLIENT_ID }}
              tenant-id: ${{ vars.AZURE_TENANT_ID }}
              subscription-id: ${{ vars.AZURE_SUBSCRIPTION_ID }}
            
          - name: 'Run the Azure Functions action'
            uses: Azure/functions-action@v1
            id: deploy-to-function-app
            with:
              app-name: ${{ env.AZURE_FUNCTIONAPP_NAME }}
              package: '${{ env.AZURE_FUNCTIONAPP_PROJECT_PATH }}/downloaded-artifact'
    
  3. В шаблоне обновите env: переменные для вашего проекта. Для каждого шаблона требуется AZURE_FUNCTIONAPP_NAME. Остальные переменные зависят от вашего языка:

    Переменная Required Description
    AZURE_FUNCTIONAPP_NAME Yes Your function app name in Azure
    DOTNET_VERSION Yes Версия вашего проекта в .NET (например, 10.0.x)
    AZURE_FUNCTIONAPP_PROJECT_PATH нет Путь к папке проекта. По умолчанию: . (корень репозитория)
  4. Шаблоны OIDC уже включают шаг azure/login с аутентификацией OIDC. Проверьте, что secrets.AZURE_CLIENT_ID, secrets.AZURE_TENANT_IDи secrets.AZURE_SUBSCRIPTION_ID ссылки совпадают с созданными вами секретами репозитория.

  5. Добавьте этот новый файл YAML в /.github/workflows/ путь в репозитории.

Создание конфигурации рабочего процесса на портале

Когда вы используете портал для включения GitHub Actions, Functions автоматически выполняет всю настройку. Вам не нужно вручную создавать управляемую личность, настраивать учетные данные или писать файл рабочего процесса. Функции выполняют следующие задачи за вас:

В вашей подписке Azure:

  • Создаёт управляемую личность, назначенную пользователем, и назначает ей роль участника сайта в вашем функциональном приложении.
  • Добавляет федеративный учетный код к управляемой идентичности для аутентификации OIDC GitHub.

В вашем репозитории GitHub:

  • Добавляет значения клиента, подписки и арендатора как секреты GitHub Actions.
  • Создаёт файл рабочего процесса на основе стека приложений и коммитирует его в .github/workflows.

Во время создания приложения-функции

Вы можете быстро приступить к работе с GitHub Actions с помощью вкладки развертывания при создании функции на портале Azure. Чтобы добавить рабочий процесс GitHub Actions при создании нового приложения-функции:

  1. На портале Azure выберите Deployment в потоке Create Function App.

  2. Включите Континетное развертывание если требуется, чтобы каждое обновление кода активировало отправку кода на портал Azure.

  3. В настройках GitHub выберите «Авторизировать» для подключения аккаунта GitHub. Войдите в аккаунт GitHub, который имеет доступ к записи в ваш репозиторий.

  4. Введите организацию, репозиторий и ветку GitHub.

  5. По желанию выберите «Предварительный просмотр файла », чтобы увидеть, как выглядит файл рабочего процесса до его генерации и добавления в ваш репозиторий.

  6. Завершите настройку функционального приложения. Теперь репозиторий GitHub включает новый файл рабочего процесса в /.github/workflows/.

Для существующего функционального приложения

Чтобы добавить рабочий процесс GitHub Actions в существующее функциональное приложение:

  1. Перейдите в своё функциональное приложение в портале Azure и выберите Deployment>Deployment Center.

  2. Выберите непрерывное развертывание (CI/CD). Для источника выберите GitHub. Если вы не видите сообщение по умолчанию Building with GitHub Actions, выберите Change provider, выберите GitHub Actions и OK.

  3. Если вы ещё не авторизовали доступ к GitHub, выберите «Авторизировать». Укажите учетные данные GitHub и выберите Sign in. Чтобы авторизовать другую учетную запись GitHub, выберите Change Account и войдите с помощью другой учетной записи.

  4. Выберите GitHub Organization, Repository и Branch. Чтобы развернуть с помощью GitHub Actions, необходимо иметь доступ к записи в этот репозиторий.

  5. Для опции «Рабочий процесс» выберите « Добавить рабочий процесс». Эта опция создаёт новый файл рабочего процесса в /.github/workflows/. Чтобы использовать существующий рабочий процесс, выберите «Использовать доступный рабочий процесс » и выберите файл рабочего процесса.

  6. В настройках аутентификации выберите User-assigned identity, чтобы использовать OpenID Connect (OIDC), что рекомендуется, так как он не требует хранения секретов в GitHub. Выберите свою подписку и (новое) рекомендуемое имя личности. Создаётся новая управляемая личность, назначенная пользователем, которая предоставляет доступ к роли участника сайта . Если вы используете существующую личность, сначала необходимо предоставить ей доступ к роли участника сайта .

    Внимание

    При выборе Basic аутентификации ваш профиль публикации, содержащий общие секреты, хранится в GitHub Secrets. Также необходимо включить базовую аутентификацию SCM, что снижает безопасность вашего приложения.

  7. Выберите файл Preview, чтобы просмотреть файл рабочего процесса, который добавляется в репозиторий GitHub в .github/workflows/.

  8. Нажмите кнопку "Сохранить", чтобы добавить файл рабочего процесса в репозиторий. Выберите вкладку «Журналы », чтобы просмотреть статус текущих и предыдущих развертываний.

Создание файла конфигурации рабочего процесса

Вы можете создать файл конфигурации рабочего процесса GitHub Actions из шаблонов Функции Azure непосредственно из репозитория GitHub.

  1. В GitHub перейдите в репозиторий.

  2. Выберите действия и новый рабочий процесс.

  3. Поиск функций.

    Скриншот результата поиска шаблонов функций GitHub Actions.

  4. В функциональных рабочих процессах приложения, созданных Microsoft Azure, найдите тот, который соответствует языку вашего кода, и выберите Настроить.

  5. В созданном файле YAML обновите параметр env.AZURE_FUNCTIONAPP_NAME с именем ресурса приложения-функции в Azure. Возможно, вам также потребуется обновить параметр, который задаёт версию языка, используемую вашим приложением, напримерDOTNET_VERSION, для C# или PYTHON_VERSION для приложений на Python.

  6. Шаблоны по умолчанию могут использовать аутентификацию профиля публикации вместо рекомендованной OIDC. Чтобы перейти на OIDC и согласовать поведение портала, внесите следующие изменения:

    • Удалите параметры publish-profile, scm-do-build-during-deployment, и из .enable-oryx-buildAzure/functions-action

    • Уберите environment эту настройку из задания (если она присутствует), так как субъект федеративного подтверждения должен совпадать с триггером ветки.

    • Добавьте azure/login шаг перед шагом Azure/functions-action :

      - name: 'Login via OIDC'
        uses: azure/login@v3
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
      
      - name: 'Run Azure Functions Action'
        uses: Azure/functions-action@v1
        with:
          app-name: ${{ env.AZURE_FUNCTIONAPP_NAME }}
          package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}
      
    • Добавьте следующие права на задание:

      permissions:
        id-token: write
        contents: read
      
  7. Убедитесь, что новый файл рабочего процесса сохранён с соответствующим именем в , /.github/workflows/ и выберите Commit changes.

действие Функции Azure

Действие Функции Azure (Azure/functions-action) определяет способ публикации кода в существующем приложении-функции в Azure или в определенный слот в приложении.

Параметры

В следующей таблице описываются входные параметры, поддерживаемые Azure/functions-action:

Параметр Description
app-name (Обязательно) Название вашего функционального приложения в Azure.
package (Обязательно) Путь к вашему проекту для публикации. По умолчанию: . (все файлы в репозитории).
Удалённое строительство Настроено на true включение действия сборки из Kudu при развертывании в приложении Flex Consumption. Билд Орикс выполняется всегда; Не устанавливайте также SCM-do-build-во время развертывания или enable-oryx-build. По умолчанию: false.
SCM-сделать-собирать-во время-развертывания Разрешить сайту Kudu выполнять операции предварительного развертывания, такие как удалённые сборки. Настройте Kudu true на создание вашего проекта во время развертывания. По умолчанию: false. Дополнительные сведения см. в разделе SCM_DO_BUILD_DURING_DEPLOYMENT.
enable-oryx-build Позвольте Kudu разрешать зависимости проектов с помощью Oryx. Настройте и это, и scm-do-build-during-deployment так true , чтобы использовать Oryx вместо рабочего процесса. По умолчанию: false. Только для Linux.
slot-name Слот для развертывания. По умолчанию: слот для продакшена.
publish-profile Имя секретного параметра GitHub, содержащего профиль публикации. Не требуется при использовании рекомендованной аутентификации OIDC.
SKU Настройте режим flexconsumption при аутентификации с помощью publish-profile на плане Flex Consumption. Для аутентификации OIDC или других хостинговых планов это не нужно.
respect-pom-xml (Java только) Установлен на true получение артефакта развертывания из pom.xml. Когда true, установите пакет на .. По умолчанию: false.
respect-funcignore Настройте на true сохранение вашего файла .funcignore и исключение перечисленных путей. По умолчанию: false.

Следующая таблица показывает, какие параметры поддерживаются для каждого плана хостинга:

Параметр Flex Consumption Эластик Премиум Dedicated Потребление
app-name Required Required Required Required
package Required Required Required Required
Удалённое строительство Optional
SCM-сделать-собирать-во время-развертывания Optional Optional Optional
enable-oryx-build Опционально (Linux) Опционально (Linux) Опционально (Linux)
slot-name Не поддерживаются Optional Optional Optional
publish-profile Не рекомендуется Не рекомендуется Не рекомендуется Не рекомендуется
SKU Только publysh-профиль
respect-pom-xml Optional (Java) Optional (Java) Optional (Java) Optional (Java)
respect-funcignore Optional Optional Optional Optional

Методы развертывания

При использовании GitHub Actions метод развертывания зависит от вашего плана хостинга:

План размещения Метод развертывания
Использование Flex Одно развертывание
Elastic Premium Развертывание ZIP-файла
Выделенный (Служба приложений) Развертывание ZIP-файла
Потребление Windows: развертывание из ZIP-архива
Linux: URL-адрес внешнего пакета*

* Возможность запуска приложений в Linux в плане потребления планируется для выхода на пенсию. Дополнительные сведения см. в разделе Функции Azure размещение плана потребления.

Для получения дополнительной информации см. раздел Технологии развертывания в Функции Azure.

Следующие шаги