Как использовать 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, хранящиеся в секретах 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.
Вы также можете находить и просматривать действия GitHub Actions непосредственно в редакторе рабочих процессов репозитория. На боковой панели можно найти конкретное действие, просмотреть рекомендуемые действия и рекомендуемые категории.
Чтобы найти действие:
- в репозитории перейдите к файлу рабочего процесса, который необходимо изменить;
- Щелкните значок "Изменить" в правом верхнем углу представления файла.
- с помощью боковой панели GitHub Marketplace справа от редактора просмотрите действия.
Предположим, что вы хотите развернуть веб-приложение на основе контейнера в веб-приложениях Azure. При поиске в GitHub Marketplace вы найдете следующие действия:
- azure/webapps-deploy@v1
- azure/login@v1 (уже встречалось ранее)
- azure/docker-login@v1
Если добавить эти действия в задание 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.