Как использовать GitHub Actions для развертывания в Azure?

Завершено

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

Варианты запуска рабочего процесса CD

Существует несколько вариантов запуска рабочего процесса CD. В предыдущем модуле, посвященном CI с использованием GitHub Actions, вы узнали, как активировать рабочий процесс из push-уведомлений в репозиторий GitHub. Однако для CD может потребоваться активировать рабочий процесс развертывания в другом событии.

Один из вариантов — активировать рабочий процесс с помощью ChatOps. ChatOps использует клиенты чата, чат-боты и средства коммуникации в режиме реального времени для выполнения задач. Например, вы можете оставить определенный комментарий в запросе на вытягивание, который послужит триггером для активации бота. Этот бот может ответить на комментарий, предоставив статистические сведения, или запустить рабочий процесс.

Другой вариант, который мы используем в нашем примере, — метки в запросе на вытягивание. Разные метки могут запускать различные рабочие процессы. Например, добавьте метку этапа, чтобы начать рабочий процесс развертывания в промежуточной среде. Кроме того, добавьте метку среды для запуска рабочего процесса, создающего ресурсы Microsoft Azure для развертывания. Чтобы использовать метки, рабочий процесс выглядит следующим образом:

on:
  pull_request:
    types: [labeled]

Управление выполнением с помощью условий задания

Зачастую рабочий процесс требуется запускать только в том случае, если какое-либо условие истинно.

Рабочие процессы GitHub предоставляют условные if условия для этого сценария. Условный использует выражение , вычисляемое во время выполнения. Например, вы хотите запустить этот рабочий процесс, если метка этапа добавляется в запрос на вытягивание.

if: contains(github.event.pull_request.labels.*.name, 'stage')

Хранение учетных данных с помощью секретов GitHub

Вы никогда не хотите предоставлять конфиденциальную информацию в файле рабочего процесса. Секреты GitHub — это безопасное место для хранения конфиденциальных данных, необходимых рабочему процессу. Рассмотрим пример.

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

Чтобы хранить сведения в секретах GitHub, создайте секрет на портале.

Интерфейс портала Azure для создания секрета.

Затем используйте имя секрета, созданного в рабочем процессе, где вам нужны эти сведения. Например, используйте учетные данные Azure, хранящиеся в секретах GitHub в creds: атрибуте действия Azure login .

steps:
      - name: "Login via Azure CLI"
        uses: azure/login@v1
        with:
          creds: ${{ secrets.AZURE_CREDENTIALS }}

Развертывание в Microsoft Azure с помощью GitHub Actions

В GitHub Marketplace имеется несколько действий, которые помогут автоматизировать задачи, связанные с Azure.

Результаты поиска для Azure в GitHub Marketplace.

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

Чтобы найти действие:

  1. в репозитории перейдите к файлу рабочего процесса, который необходимо изменить;
  2. Щелкните значок "Изменить" в правом верхнем углу представления файла.
  3. с помощью боковой панели GitHub Marketplace справа от редактора просмотрите действия.

Предположим, что вы хотите развернуть веб-приложение на основе контейнера в веб-приложениях Azure. При поиске в GitHub Marketplace вы найдете следующие действия:

Если добавить эти действия в задание 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 выполняет развертывание. Оно зависит от двух предшествующих действий.

Создание и удаление ресурсов Azure с помощью GitHub Actions

Так как 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 для извлечения репозитория и входа в Azure. После этого вы создаете необходимые ресурсы и развертываете контейнер с помощью Azure CLI.