Compartir a través de

使用 GitHub Actions 将自定义容器部署到应用服务

可以通过 GitHub Actions 灵活地生成自动化软件开发工作流。 借助 Azure Web 部署操作,可以使用 GitHub Actions 自动执行工作流以将自定义容器部署到应用服务

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

对于 Azure 应用服务容器工作流,文件包含三个部分:

部分 任务
身份验证 1.检索服务主体或发布配置文件。
2.创建 GitHub 机密。
生成 1.创建环境。
2.生成容器映像。
部署 1.部署容器映像。

先决条件

生成部署凭据

对于 GitHub Actions,若要通过 Azure 应用服务进行身份验证,建议使用发布配置文件。 也可以使用服务主体或 Open ID Connect 进行身份验证,但该过程需要更多步骤。

将发布配置文件凭据或服务主体另存为 GitHub 机密,以便使用 Azure 进行身份验证。 你将在工作流中访问机密。

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

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

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

    注意

    从 2020 年 10 月起,Linux Web 应用在下载文件之前,需要将应用设置 WEBSITE_WEBDEPLOY_USE_SCM 设置为 true。 未来将删除此要求。 请参阅在 Azure 门户中配置应用服务应用,了解如何配置常用 Web 应用设置。

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

配置 GitHub 机密以进行身份验证

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

若要使用应用级凭据,请将下载的发布配置文件的内容粘贴到机密的值字段中。 将机密命名为 AZURE_WEBAPP_PUBLISH_PROFILE

配置 GitHub 工作流时,在部署 Azure Web 应用操作中使用 AZURE_WEBAPP_PUBLISH_PROFILE。 例如:

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

为注册表配置 GitHub 机密

定义要用于 Docker 登录操作的机密。 本文档中的示例使用 Azure 容器注册表作为容器注册表。

  1. 在 Azure 门户或 Docker 中转到你的容器,然后复制用户名和密码。 可在 Azure 门户中的“设置”“访问密钥”下找到注册表的 Azure 容器注册表用户名和密码。

  2. 为名为 REGISTRY_USERNAME 的注册表用户名定义新机密。

  3. 为名为 REGISTRY_PASSWORD 的注册表密码定义新机密。

生成容器映像

以下示例演示生成 Node.JS Docker 映像的部分工作流。 使用 Docker 登录登录到专用容器注册表。 此示例使用 Azure 容器注册表,但相同的操作也适用于其他注册表。

name: Linux Container Node Workflow

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - uses: azure/docker-login@v1
      with:
        login-server: mycontainer.azurecr.cn
        username: ${{ secrets.REGISTRY_USERNAME }}
        password: ${{ secrets.REGISTRY_PASSWORD }}
    - run: |
        docker build . -t mycontainer.azurecr.cn/myapp:${{ github.sha }}
        docker push mycontainer.azurecr.cn/myapp:${{ github.sha }}     

还可使用 Docker 登录同时登录多个容器注册表。 此示例包括两个新的 GitHub 机密,用于向 docker.io 进行身份验证。 此示例假设注册表的根级别处有一个 Dockerfile。

name: Linux Container Node Workflow

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - uses: azure/docker-login@v1
      with:
        login-server: mycontainer.azurecr.cn
        username: ${{ secrets.REGISTRY_USERNAME }}
        password: ${{ secrets.REGISTRY_PASSWORD }}
    - uses: azure/docker-login@v1
      with:
        login-server: index.docker.io
        username: ${{ secrets.DOCKERIO_USERNAME }}
        password: ${{ secrets.DOCKERIO_PASSWORD }}
    - run: |
        docker build . -t mycontainer.azurecr.cn/myapp:${{ github.sha }}
        docker push mycontainer.azurecr.cn/myapp:${{ github.sha }}     

部署到应用服务容器

若要将映像部署到应用服务中的自定义容器,请使用 azure/webapps-deploy@v2 操作。 此操作有七个参数:

参数 解释
app-name (必需)应用服务应用的名称
publish-profile (可选)适用于 Web 应用(Windows 和 Linux)和 Web 应用容器 (linux)。 多容器场景不受支持。 具有 Web 部署机密的发布配置文件 (*.publishsettings) 内容
slot-name (可选)输入生产槽以外的现有槽
package (可选)仅适用于 Web 应用:包或文件夹的路径。 *.zip、*.war、*.jar 或要部署的文件夹
images (必需)仅适用于 Web 应用容器:指定完全限定的容器映像名称。 例如“myregistry.azurecr.cn/nginx:latest”或“python:3.7.2-alpine/”。 对于多容器应用,可提供多个容器映像名称(多行分隔)
configuration-file (可选)仅适用于 Web 应用容器:Docker-Compose 文件的路径。 应为完全限定的路径或相对于默认工作目录的路径。 对于多容器应用是必需的。
startup-command (可选)输入启动命令。 例如,dotnet run 或 dotnet filename.dll
name: Linux Container Node Workflow

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2

    - uses: azure/docker-login@v1
      with:
        login-server: mycontainer.azurecr.cn
        username: ${{ secrets.REGISTRY_USERNAME }}
        password: ${{ secrets.REGISTRY_PASSWORD }}

    - run: |
        docker build . -t mycontainer.azurecr.cn/myapp:${{ github.sha }}
        docker push mycontainer.azurecr.cn/myapp:${{ github.sha }}     

    - uses: azure/webapps-deploy@v2
      with:
        app-name: 'myapp'
        publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
        images: 'mycontainer.azurecr.cn/myapp:${{ github.sha }}'

后续步骤

可在 GitHub 上找到分组到不同存储库中的操作集,其中每一个都包含文档和示例,帮助你将 GitHub 用于 CI/CD 并将应用部署到 Azure。