将 Azure Web 应用部署操作与 Azure Stack Hub 结合使用

可以设置 GitHub Actions 以将 Web 应用部署到 Azure Stack Hub 实例。 这允许你为应用设置持续集成和部署。 本文将帮助你使用 GitHub Actions 和 Azure Stack Hub 启动并运行自动化部署。 你将创建一个 Web 应用,并使用发布配置文件创建用于托管应用的 Web 应用。

GitHub Actions 是由代码存储库中用于实现自动化的操作组成的工作流。 在 GitHub 开发过程中,你可以使用事件来触发工作流。 你可以设置常见的 DevOps 自动化任务,例如测试、部署和持续集成。

此示例工作流包括针对以下操作的说明:

  • 创建和验证服务主体
  • 创建 Web 应用发布配置文件
  • 添加特定于运行时的工作流
  • 使用 Web 应用部署添加匹配的工作流

创建服务主体

服务主体可使用基于角色的访问控制来连接资源并与之交互。 你将需要一个具有参与者访问权限的服务主体,并需要这些说明中指定的与 GitHub Actions 一起使用的属性。

重要

如果你是 Azure Stack Hub 的开发人员或用户,则无权创建服务主体。 你需要拥有云操作员特权,或者使用本部分中的说明向云操作员请求此原则。

下面的代码片段是面向将 PowerShell 提示符与 Azure CLI 配合使用的 Windows 计算机编写的。 如果你在 Linux 计算机和 bash 上使用 CLI,请删除行扩展或将其替换为 \

  1. 准备用于创建服务主体的以下参数的值:

    参数 示例 说明
    endpoint-resource-manager "https://management.orlando.azurestack.corp.microsoft.com" 资源管理终结点。
    suffix-storage-endpoint "orlando.azurestack.corp.microsoft.com" 存储帐户的终结点后缀。
    suffix-keyvault-dns ".vault.orlando.azurestack.corp.microsoft.com" Key Vault 服务 DNS 后缀。
    endpoint-active-directory-graph-resource-id "https://graph.windows.net/" Active Directory 资源 ID。
    endpoint-sql-management https://notsupported SQL Server 管理终结点。 将其设置为 https://notsupported
    个人资料 2020-09-01-hybrid 要用于此云的配置文件。
  2. 打开你的命令行工具(例如 Windows PowerShell 或 Bash)。 使用以下命令登录 Azure CLI:

    az login
    
  3. 对于新环境,请使用 register 命令;对于现有环境,请使用 update 命令。 使用以下命令。

    az cloud register `
        -n "AzureStackUser" `
        --endpoint-resource-manager "https://management.<local>.<FQDN>" `
        --suffix-storage-endpoint ".<local>.<FQDN>" `
        --suffix-keyvault-dns ".vault.<local>.<FQDN>" `
        --endpoint-active-directory-graph-resource-id "https://graph.windows.net/" `
        --endpoint-sql-management https://notsupported  `
        --profile 2020-09-01-hybrid
    
  4. 获取要用于服务主体的订阅 ID 和资源组。

  5. 使用以下命令,通过订阅 ID 和资源组创建服务主体:

    az ad sp create-for-rbac --name "myApp" --role contributor `
        --scopes /subscriptions/{subscription-id}/resourceGroups/{resource-group} `
        --sdk-auth
    
  6. 复制生成的 JSON 对象。 你将使用此 JSON 对象在包含你的操作的 GitHub 存储库中创建机密。 JSON 对象应具有以下属性:

    {
      "clientId": <Application ID for the service principal>,
      "clientSecret": <Client secret for the service principal>,
      "subscriptionId": <Subscription ID for the service principal>,
      "tenantId": <Tenant ID for the service principal>,
      "activeDirectoryEndpointUrl": "https://login.microsoftonline.com/",
      "resourceManagerEndpointUrl": "https://management.<FQDN>",
      "activeDirectoryGraphResourceId": "https://graph.windows.net/",
      "sqlManagementEndpointUrl": "https://notsupported",
      "galleryEndpointUrl": "https://providers.<FQDN>:30016/",
      "managementEndpointUrl": "https://management.<FQDN>"
    }
    

创建 Web 应用发布配置文件

打开“创建 Web 应用”边栏选项卡

  1. 登录到 Azure Stack Hub 门户。
  2. 选择“创建资源”>“Web + 移动”>“Web 应用”。 Create a web app in Azure Stack Hub

创建 Web 应用

  1. 选择订阅
  2. 创建或选择资源组。
  3. 键入应用的名称。 应用的名称将显示在应用的 URL 中,例如 yourappname.appservice.<region>.<FQDN>
  4. 为应用选择运行时堆栈。 运行时必须与用于面向发布配置文件的工作流匹配。
  5. 选择将托管运行时和应用的操作系统 (OS)。
  6. 为 Azure Stack Hub 实例选择或键入区域。
  7. 根据 Azure Stack Hub 实例、区域和应用 OS 选择计划。
  8. 选择“查看 + 创建” 。
  9. 查看 Web 应用。 选择“创建”。 Review web app in Azure Stack Hub
  10. 选择“转到资源”。 Get publish profile in Azure Stack Hub
  11. 选择“获取发布配置文件”。 发布配置文件将下载并命名为 <yourappname>.PublishSettings。 该文件包含一个 XML,其中包含 Web 应用的目标值。
  12. 存储发布配置文件,以便在为存储库创建机密时访问。

将机密添加到存储库

你可以使用 GitHub 机密对要在操作中使用的敏感信息进行加密。 你将创建一个包含服务主体的机密,以及另一个包含 Web 应用发布配置文件的机密。 该操作使用它们登录你的 Azure Stack Hub 实例,并针对 Web 应用目标生成应用。

  1. 打开或创建 GitHub 存储库。 如果你需要有关在 GitHub 中创建存储库的指南,可以查找 GitHub 文档中的说明
  2. 选择“设置”。
  3. 选择“机密”。
  4. 选择“新建存储库机密”。 Add your GitHub Actions secret
  5. 将你的机密命名为 AZURE_CREDENTIALS
  6. 粘贴表示你的服务主体的 JSON 对象。
  7. 选择“添加机密”。
  8. 选择“新建存储库机密”。
  9. 将你的机密命名为 AZURE_WEBAPP_PUBLISH_PROFILE
  10. 在文本编辑器中打开 <yourappname>.PublishSettings,然后将 XML 复制并粘贴到存储库密钥中。
  11. 选择“添加机密”。

添加运行时工作流

  1. 从表中为 Web 应用运行时选择一个模板。

    运行时 模板
    DotNet dotnet.yml
    NodeJS node.yml
    Java java_jar.yml
    Java java_war.yml
    Python python.yml
    PHP php.yml
    Docker docker.yml
  2. 将模板 GitHub 操作工作流目录放在项目存储库中:.github/workflows/<runtime.yml> 工作流目录将包含两个工作流。

添加 Web 应用部署操作

使用本部分中的 yaml 创建第二个工作流。 在此示例中,你将部署一个 Python Web 应用。 需要根据你的工作流选择设置操作。 在用于创建操作的步骤之后,可以在针对不同运行时的设置操作表中找到为各种运行时设置操作的参考。

GitHub 操作工作流示例

  1. 打开你的 GitHub 存储库。 如果尚未添加 Web 应用资源,请立即添加。 本例使用 Python Flask Hello World 示例,并添加了 Python .gitignoreapp.pyrequirements.txt 文件。

    Exmaple of the repo using Python Flask with Azure Stack Hub

  2. 选择“操作”。

  3. 选择“新建工作流”。

    • 如果这是你的第一个工作流,请在“选择工作流模板”下选择“自己设置工作流” 。
    • 如果你已有工作流,请选择“新建工作流”>“自己设置工作流”。
  4. 在路径中,将文件命名为 workflow.yml

  5. 复制并粘贴工作流 yml。

    # .github/workflows/worfklow.yml
    on: push
    
    jobs:
      build-and-deploy:
        runs-on: ubuntu-latest
        steps:
        # checkout the repo
        - name: 'Checkout Github Action' 
          uses: actions/checkout@main
    
        - name: Setup Python 3.6
          uses: actions/setup-node@v1
          with:
            python-version: '3.6'
        - name: 'create a virtual environment and install dependencies'
          run: |
            python3 -m venv .venv
            source .venv/bin/activate
            pip install -r requirements.txt
    
        - name: 'Run Azure webapp deploy action using publish profile credentials'
          uses: azure/webapps-deploy@v2
          with:
            app-name: <YOURAPPNAME>
            publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
    
  6. 在workflow.yaml 中使用你的应用名称更新 <YOURAPPNAME>

  7. 选择“开始提交”。

  8. 添加提交标题和可选的详细信息,然后选择“提交新文件”。

针对不同运行时的设置操作

要在基于特定语言的环境中生成应用代码,请使用设置操作:

运行时 设置操作
DotNet 设置 DotNet
NodeJS 设置 Node
Java 设置 Java
Python 设置 Python
Docker docker 登录

登录操作完成后,工作流中的下一组操作可以执行生成、标记和推送容器等任务。 有关详细信息,请参阅 Azure Webapp 操作的文档。

触发部署

当操作运行时,验证它是否已成功运行。

  1. 打开你的 GitHub 存储库。 可以通过推送到存储库来触发工作流。
  2. 选择“操作”。
  3. 在“所有工作流”下选择提交的名称。 这两个工作流都记录了其状态。 Review the status of your GitHub action
  4. 选择部署作业的名称,.github/workflows/workflow.yml
  5. 展开各个部分以查看工作流操作的返回值。 查找已部署的 Web 应用的 URL。 Find your Azure Stack Hub web app URL
  6. 打开 Web 浏览器并加载 URL。

后续步骤