如何使用 GitHub Actions 部署到 Azure?
本单元介绍如何使用 GitHub 操作将基于容器的 Web 应用部署到 Microsoft Azure Web 应用。 其中介绍了一些用于触发工作流的选项。 然后,本文介绍如何在工作流中使用条件。 最后,本文介绍如何使用 GitHub Actions 来创建和删除 Azure 资源。
用于触发 CD 工作流的选项
有几个可用于启动 CD 工作流的选项。 在关于使用 GitHub Actions 实现 CI 的前一个模块中,你已了解了如何通过向 GitHub 存储库推送来触发工作流。 但对于 CD,你可能希望在某个其他事件上触发部署工作流。
一个选项是使用 ChatOps 触发工作流。 ChatOps 使用聊天客户端、聊天机器人和实时通信工具来运行任务。 例如,你可能会在可以启动机器人的拉取请求中留下特定注释。 该机器人可能会对某些统计信息进行注释,还可能会运行工作流。
另一个选项,也就是我们在示例中使用的选项是在拉取请求中使用标签。 不同标签可以启动不同的工作流。 例如,添加“过渡”标签以开始过渡环境的部署工作流。 或者,添加“运转环境”标签,以运行创建 Microsoft Azure 资源以供部署的工作流。 要使用标签,工作流应如下所示:
on:
pull_request:
types: [labeled]
使用作业条件控制执行
通常,应仅在某个条件为 true 时运行工作流。
GitHub 工作流为此方案提供 if
条件。 该条件使用在运行时进行计算的表达式。 例如,你希望在将“过渡”标签添加到拉取请求时运行此工作流。
if: contains(github.event.pull_request.labels.*.name, 'stage')
使用 GitHub 机密存储凭据
你绝对不希望在工作流文件中公开敏感信息。 GitHub 机密是一个安全位置,用于存储工作流所需的敏感信息。 下面是一个示例。
为了部署到 Azure 资源,GitHub 操作必须具有该资源的访问权限。 不应在工作流文件中以纯文本方式存储 Azure 凭据。 可以改将凭据存储在 GitHub 机密中。
若要将信息存储在 GitHub 机密中,请在门户中创建机密。
之后,无论何时需要此信息,都可使用在工作流中创建的机密名称。 例如,在下方的 Azure login
操作的 creds:
属性中,使用存储在 GitHub 机密中的 Azure 凭据。
steps:
- name: "Login via Azure CLI"
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
使用 GitHub Actions 部署到 Microsoft Azure
GitHub 市场提供了多项可帮助自动执行 Azure 相关任务的操作。
还可以直接在存储库的工作流编辑器中搜索和浏览 GitHub Actions。 从边栏中,可以搜索特定操作、查看特别推荐的操作以及浏览特别推荐的类别。
若要查找操作,请执行以下操作:
- 在存储库中,浏览到要编辑的工作流文件。
- 选择文件视图右上角的“编辑”图标。
- 使用编辑器右侧的“GitHub 市场”边栏来浏览操作。
假设你希望将基于容器的 Web 应用部署到 Azure Web 应用。 如果在 GitHub 市场中搜索,可找到以下操作:
如果将这些操作添加到 Deploy-to-Azure
作业,则工作流如下所示:
Deploy-to-Azure:
runs-on: ubuntu-latest
needs: Build-Docker-Image
name: Deploy app container to Azure
steps:
- name: "Login via Azure CLI"
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
- uses: azure/docker-login@v1
with:
login-server: ${{env.IMAGE_REGISTRY_URL}}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Deploy web app container
uses: azure/webapps-deploy@v1
with:
app-name: ${{env.AZURE_WEBAPP_NAME}}
images: ${{env.IMAGE_REGISTRY_URL}}/${{ github.repository }}/${{env.DOCKER_IMAGE_NAME}}:${{ github.sha }}
- name: Azure logout
run: |
az logout
请注意,此作业依赖于上一个作业,Build-Docker-Image
。 上一个作业创建已部署的项目。
azure/login@v1 操作需要凭据才能登录到 Azure 帐户,以便它可以访问你想要向其进行部署的 Azure 资源。 此处,使用存储在 GitHub 机密中的凭据。
对于 azure/docker-login@v1 操作也是如此。 由于要部署容器映像,因此需要登录到专用容器注册表。
azure/webapps-deploy@v1 操作执行部署。 这取决于前面提到的两个操作。
使用 GitHub Actions 创建和删除 Azure 资源
由于 CD 是自动执行的过程,因此你决定使用基础结构即代码来创建和关闭部署到的环境。 GitHub Actions 可在 Azure 上自动执行这些任务,你可以将这些操作包括在工作流中。
注意
请记住,务必尽快销毁不再使用的资源,以免产生不必要的费用。
一种选项是创建具有两个作业的新工作流,一个用于加速资源,另一个用于删除资源。 然后,使用条件仅运行所需的作业。 在此示例中,条件会在拉取请求中查找标签,然后运行 set-up-azure-resources
作业(如果标签是“加速环境”)或 destroy-azure-resources
作业(如果标签是“销毁环境”)。
jobs:
set-up-azure-resources:
runs-on: ubuntu-latest
if: contains(github.event.pull_request.labels.*.name, 'spin up environment')
...
destroy-azure-resources:
runs-on: ubuntu-latest
if: contains(github.event.pull_request.labels.*.name, 'destroy environment')
...
该作业使用 Azure CLI 来创建和销毁 Azure 资源。 有关 Azure CLI 的详细信息,请参阅 Azure CLI 概述。
下面是 set-up-azure-resources
作业中的步骤示例:
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Azure login
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: Create Azure resource group
if: success()
run: |
az group create --location ${{env.AZURE_LOCATION}} --name ${{env.AZURE_RESOURCE_GROUP}} --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
- name: Create Azure app service plan
if: success()
run: |
az appservice plan create --resource-group ${{env.AZURE_RESOURCE_GROUP}} --name ${{env.AZURE_APP_PLAN}} --is-linux --sku F1 --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
- name: Create webapp resource
if: success()
run: |
az webapp create --resource-group ${{ env.AZURE_RESOURCE_GROUP }} --plan ${{ env.AZURE_APP_PLAN }} --name ${{ env.AZURE_WEBAPP_NAME }} --deployment-container-image-name nginx --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
- name: Configure webapp to use GitHub Packages
if: success()
run: |
az webapp config container set --docker-custom-image-name nginx --docker-registry-server-password ${{secrets.GITHUB_TOKEN}} --docker-registry-server-url https://docker.pkg.github.com --docker-registry-server-user ${{github.actor}} --name ${{ env.AZURE_WEBAPP_NAME }} --resource-group ${{ env.AZURE_RESOURCE_GROUP }} --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
请注意,需使用 GitHub Actions 签出存储库并登录到 Azure。 然后,使用 Azure CLI 创建所需的资源并部署容器。