使用 GitHub Actions 部署到 Azure 应用服务

使用 GitHub Actions 自动执行工作流,并从 GitHub 部署到 Azure 应用服务

先决条件

  • 具有活动订阅的 Azure 帐户。 创建帐户
  • 一个 GitHub 帐户。 如果你没有帐户,可免费注册一个。

创建应用时设置 GitHub Actions 部署

GitHub Actions 部署已集成到默认的创建 Web 应用程序流程中。 在“部署”选项卡中将“持续部署”设置为“启用”,并配置所选的组织、存储库和分支。

显示如何在“应用服务部署”选项卡中启用 GitHub Actions 部署的屏幕截图。

启用持续部署时, 创建 Web 应用 过程会根据基本身份验证选择自动选取身份验证方法,并相应地配置应用和 GitHub 存储库:

基本身份验证选择 身份验证方法
禁用 用户分配的标识 (OpenID Connect)(推荐)
启用 基本身份验证

注意

创建应用时,可能会收到一条错误,指出 Azure 帐户没有特定权限。 你的帐户可能需要创建和配置用户分配的标识所需的权限。 有关替代方法,请参阅以下部分。

从部署中心设置 GitHub Actions 部署

对于现有应用,可以在应用服务中使用 部署中心 快速开始使用 GitHub Actions。 此交钥匙方法基于应用程序堆栈生成 GitHub Actions 工作流文件,并将其提交到 GitHub 存储库。

通过使用 部署中心,还可以使用 用户分配的标识轻松配置更安全的 OpenID Connect 身份验证。 有关详细信息,请参阅用户分配的标识选项

如果你的 Azure 帐户具有所需的权限,则你可以创建用户分配的标识。 否则,可以在“标识”下拉菜单中选择现有的用户分配的托管标识。 可以与 Azure 管理员协作,使用网站参与者角色创建用户分配的托管标识。

有关详细信息,请参阅持续部署到 Azure 应用服务

手动设置 GitHub Actions 工作流

无需使用 部署中心即可部署工作流。 执行以下三个步骤:

  1. 生成部署凭据
  2. 配置 GitHub 机密
  3. 将工作流文件添加到 GitHub 存储库

生成部署凭据

建议使用 OpenID Connect 通过适用于 GitHub Actions 的 Azure 应用服务进行身份验证。 此身份验证方法使用生存期较短的令牌。 使用 GitHub Actions 设置 OpenID Connect 更为复杂,但提供更强的安全性。

也可以使用用户分配的托管标识、服务主体或发布配置文件进行身份验证。

注意

必须启用基本身份验证才能使用发布配置文件。

发布配置文件是应用级凭据。 将发布配置文件设置为 GitHub 机密。

  1. 转到 Azure 门户中的应用服务。

  2. 在“概述”页上,选择“下载发布配置文件”。

  3. 保存下载的文件。 使用该文件的内容来创建 GitHub 机密。

注意

从 2020 年 10 月起,Linux Web 应用在下载发布配置文件之前,需要将应用设置 WEBSITE_WEBDEPLOY_USE_SCM 设置为 true

配置 GitHub 机密

GitHub 中,浏览到存储库。 选择“设置”>“安全性”>“机密和变量”>“操作”>“新建存储库机密”。

若要使用在上一部分中创建的应用级凭据。请将下载的发布配置文件的内容粘贴到密钥值字段中。 将机密命名为 AZURE_WEBAPP_PUBLISH_PROFILE

稍后配置 GitHub 工作流文件时,请在AZURE_WEBAPP_PUBLISH_PROFILE操作中使用。 例如:

- uses: azure/webapps-deploy@v2
  with:
    publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}

将工作流文件添加到 GitHub 存储库

GitHub 存储库中 /.github/workflows/ 路径中的 YAML (.yml) 文件定义工作流。 此定义包含组成工作流的各种步骤和参数。

工作流文件至少具有以下不同的步骤:

  1. 使用创建的 GitHub 机密对应用服务进行身份验证。
  2. 构建 Web 应用。
  3. 部署 Web 应用。

若要将代码部署到 App Service 应用,请使用 azure/webapps-deploy@v3 操作。 该操作需要在app-name中输入 Web 应用的名称,并根据语言堆栈,在*.zip中部署*.war*.jarpackage或文件夹的路径。 有关 azure/webapps-deploy@v3 操作的可能输入的完整列表,请参阅 action.yml

以下示例显示了以不同受支持的语言生成 Web 应用的工作流部分。

publish-profile 输入应引用之前创建的 AZURE_WEBAPP_PUBLISH_PROFILE GitHub 机密。

name: .NET Core CI

on: [push]

env:
  AZURE_WEBAPP_NAME: my-app-name    # Set this to your application's name
  AZURE_WEBAPP_PACKAGE_PATH: '.'      # Set this to the path to your web app project, defaults to the repository root
  DOTNET_VERSION: '6.0.x'           # Set this to the dot net version to use

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      # Check out the repo
      - uses: actions/checkout@main
      
      # Setup .NET Core SDK
      - name: Setup .NET Core
        uses: actions/setup-dotnet@v3
        with:
          dotnet-version: ${{ env.DOTNET_VERSION }} 
      
      # Run dotnet build and publish
      - name: dotnet build and publish
        run: |
          dotnet restore
          dotnet build --configuration Release
          dotnet publish -c Release --property:PublishDir='${{ env.AZURE_WEBAPP_PACKAGE_PATH }}/myapp' 
          
      # Deploy to Azure Web apps
      - name: 'Run Azure webapp deploy action using publish profile credentials'
        uses: azure/webapps-deploy@v3
        with: 
          app-name: ${{ env.AZURE_WEBAPP_NAME }} # Replace with your app name
          publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE  }} # Define secret variable in repository settings as per action documentation
          package: '${{ env.AZURE_WEBAPP_PACKAGE_PATH }}/myapp'

常见问题

如何通过 Maven 插件部署 WAR 文件?

如果使用 Maven 插件配置了 Java Tomcat 项目,则还可以通过此插件部署到 Azure 应用服务。 如果使用 Azure CLI GitHub 操作,它将使用你的 Azure 凭据。

    - name: Azure CLI script file
      uses: azure/cli@v2
      with:
        inlineScript: |
          mvn package azure-webapp:deploy

有关如何使用和配置 Maven 插件的详细信息,请参阅 适用于 Azure 应用服务的 Maven 插件 Wiki

如何通过 Azure CLI 部署 WAR 文件?

如果首选使用 Azure CLI 部署到应用服务,可以使用适用于 Azure CLI 的 GitHub Action。

- name: Azure CLI script
  uses: azure/cli@v2
  with:
    inlineScript: |
      az webapp deploy --src-path '${{ github.workspace }}/target/yourpackage.war' --name ${{ env.AZURE_WEBAPP_NAME }} --resource-group ${{ env.RESOURCE_GROUP }}  --async true --type war

有关如何使用和配置 Azure CLI 的 GitHub 操作的详细信息,请参阅 Azure CLI GitHub 操作

有关命令的详细信息 az webapp deploy ,包括如何使用命令和参数详细信息,请参阅 az webapp deploy 文档

如何部署启动文件?

使用适用于 Azure CLI 的 GitHub Action。 例如:

- name: Deploy startup script
  uses: azure/cli@v2
  with:
    inlineScript: |
      az webapp deploy --src-path ${{ github.workspace }}/src/main/azure/createPasswordlessDataSource.sh --name ${{ env.AZURE_WEBAPP_NAME }} --resource-group ${{ env.RESOURCE_GROUP }} --type startup --track-status false

如何将应用部署到容器环境?

使用 Azure Web 部署 作,可以自动化工作流,使用 GitHub Actions 将自定义容器部署到应用服务。 有关详细信息,请参阅 “部署到容器”。

部署后如何更新 Tomcat 配置?

如果要在部署后更新任何 Web 应用设置,可以使用 应用服务设置 作。

    - uses: azure/appservice-settings@v1
      with:
        app-name: 'my-app'
        slot-name: 'staging'  # Optional and needed only if the settings have to be configured on the specific deployment slot
        app-settings-json: '[{ "name": "CATALINA_OPTS", "value": "-Dfoo=bar" }]' 
        connection-strings-json: '${{ secrets.CONNECTION_STRINGS }}'
        general-settings-json: '{"alwaysOn": "false", "webSocketsEnabled": "true"}' #'General configuration settings as Key Value pairs'
      id: settings

有关如何使用和配置此作的详细信息,请参阅 应用服务设置 存储库。

查看有关 Azure GitHub Actions 和工作流的以下参考: