GitHub Actions в Azure
Воспроизведите рабочий процесс CI/CD с помощью GitHub Actions и действия azure/webapps-deploy, а также разберитесь, когда стоит выбирать GitHub Actions вместо Azure Pipelines.
«GitHub Actions в Azure» — бесплатный урок Cloud & IT Cert Prep на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Cloud & IT Cert Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Cloud & IT Cert Prep содержит 4 уроков всего.
Что такое GitHub Actions
GitHub Actions — встроенная в GitHub платформа CI/CD и автоматизации. Рабочие процессы определяются в файлах YAML, хранящихся в каталоге .github/workflows/ Вашего репозитория, и запускаются событиями GitHub — отправкой изменений, запросами на слияние, выпусками и другими событиями. GitHub Actions тесно интегрирована с экосистемой GitHub (задачами, запросами на слияние, пакетами и проверкой безопасности) и предоставляет обширный каталог действий сообщества для таких задач, как сборка, тестирование и развертывание в Azure.
Структура рабочего процесса GitHub Actions
Файл рабочего процесса GitHub Actions содержит три раздела верхнего уровня. on определяет события запуска. env задает глобальные переменные окружения. jobs определяет одно или несколько заданий, каждое из которых выполняется на runner (предоставленном GitHub или размещенном самостоятельно). Каждое задание состоит из шагов — либо run (скрипт оболочки), либо uses (готовое действие). По умолчанию задания выполняются параллельно; используйте needs, чтобы создавать последовательные зависимости.
# .github/workflows/ci.yml
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
env:
NODE_VERSION: '18.x'
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- run: npm ci
- run: npm testАутентификация в Azure из GitHub Actions
Рекомендуемый способ аутентификации GitHub Actions в Azure — OpenID Connect (OIDC): он выдает краткоживущие токены без хранения долгоживущих секретов в GitHub. Настройте учетные данные федеративного удостоверения для регистрации приложения Azure или управляемого удостоверения, предоставив ему доверие к Вашему репозиторию и ветви GitHub. Используйте действие azure/login@v2, чтобы обменять токен GitHub OIDC на токен доступа Azure — клиентские секреты в секретах GitHub не требуются.
# Configure OIDC federated credential in Azure
az ad app federated-credential create \
--id <AppRegistrationObjectId> \
--parameters '{
"name": "github-oidc",
"issuer": "https://token.actions.githubusercontent.com",
"subject": "repo:myorg/myrepo:ref:refs/heads/main",
"audiences": ["api://AzureADTokenExchange"]
}'
# In the workflow: login via OIDC
# permissions:
# id-token: write
# contents: read
# - uses: azure/login@v2
# with:
# client-id: ${{ vars.AZURE_CLIENT_ID }}
# tenant-id: ${{ vars.AZURE_TENANT_ID }}
# subscription-id: ${{ vars.AZURE_SUBSCRIPTION_ID }}Развертывание в Azure App Service
Действие azure/webapps-deploy@v3 развертывает код или образ контейнера в Azure App Service. Оно поддерживает развертывание в слот, развертывание пакета и развертывание образа Docker. Используйте его вместе с azure/login@v2 для аутентификации. Можно выбрать промежуточный слот, запустить дымовые тесты, а затем выполнить обмен слотов с помощью действия azure/CLI@v2, запускающего команду обмена слотами, — полностью воспроизведя модель развертывания blue-green из Azure Pipelines в GitHub Actions.
# .github/workflows/deploy.yml
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v4
- uses: azure/login@v2
with:
client-id: ${{ vars.AZURE_CLIENT_ID }}
tenant-id: ${{ vars.AZURE_TENANT_ID }}
subscription-id: ${{ vars.AZURE_SUBSCRIPTION_ID }}
- name: Build and zip app
run: npm ci && npm run build && zip -r app.zip dist/
- uses: azure/webapps-deploy@v3
with:
app-name: myUniqueWebApp
slot-name: staging
package: app.zipРазвертывание в Azure Kubernetes Service
Развертывайте в AKS из GitHub Actions с помощью действия azure/k8s-deploy@v5. Это действие использует kubectl apply для развертывания манифестов, выполняет замену образа (заменяет тег образа тегом текущей сборки) и отслеживает работоспособность развертывания. Действие azure/aks-set-context@v4 настраивает учетные данные kubectl, получая kubeconfig кластера с помощью аутентифицированного сеанса Azure.
jobs:
deploy-aks:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v4
- uses: azure/login@v2
with:
client-id: ${{ vars.AZURE_CLIENT_ID }}
tenant-id: ${{ vars.AZURE_TENANT_ID }}
subscription-id: ${{ vars.AZURE_SUBSCRIPTION_ID }}
- uses: azure/aks-set-context@v4
with:
resource-group: MyRG
cluster-name: myAKSCluster
- uses: azure/k8s-deploy@v5
with:
namespace: production
manifests: k8s/
images: 'mycontainerregistry.azurecr.io/myapp:${{ github.sha }}'Секреты и переменные GitHub
Храните конфиденциальные значения в секретах GitHub — зашифрованных значениях, доступных в рабочих процессах как ${{ secrets.SECRET_NAME }}. Неконфиденциальную конфигурацию размещайте в переменных GitHub — они доступны как ${{ vars.VARIABLE_NAME }}. И секреты, и переменные можно ограничить репозиторием, окружением или организацией. Используйте окружения в GitHub Actions, чтобы добавлять правила защиты (обязательных проверяющих и ветви развертывания), аналогичные окружениям Azure DevOps.
# Reference secrets and variables in a workflow
steps:
- name: Configure app settings
uses: azure/CLI@v2
with:
inlineScript: |
az webapp config appsettings set \
--name myUniqueWebApp \
--resource-group MyRG \
--settings \
DATABASE_URL='${{ secrets.DATABASE_URL }}' \
API_VERSION='${{ vars.API_VERSION }}'Правила защиты окружений
Окружения GitHub Actions (настраиваются в разделе Settings → Environments репозитория) добавляют этапы развертывания, аналогичные окружениям Azure DevOps. Можно требовать обязательного согласования проверяющих, которые должны одобрить запуск задания для этого окружения, ограничить развертывания определенными ветвями (только main может выполнять развертывание в Production) и добавить таймеры ожидания для задержки развертываний. Задания для защищенного окружения приостанавливаются, пока не будут выполнены все правила защиты.
# Workflow job targeting a protected GitHub environment
jobs:
deploy-production:
runs-on: ubuntu-latest
environment:
name: Production # Must have 2 approvers in GitHub settings
url: https://myapp.contoso.com
needs: deploy-staging
steps:
- uses: azure/login@v2
with:
client-id: ${{ vars.AZURE_CLIENT_ID }}
tenant-id: ${{ vars.AZURE_TENANT_ID }}
subscription-id: ${{ vars.AZURE_SUBSCRIPTION_ID }}
- uses: azure/webapps-deploy@v3
with:
app-name: myUniqueWebApp
package: app.zipПовторно используемые рабочие процессы и составные действия
Избегайте дублирования логики CI/CD между репозиториями, используя две возможности GitHub Actions. Повторно используемые рабочие процессы позволяют определить рабочий процесс в одном репозитории и вызывать его из рабочих процессов других репозиториев с помощью uses: myorg/shared-workflows/.github/workflows/deploy.yml@main. Составные действия объединяют несколько шагов в одно действие, хранящееся в репозитории и доступное для повторного использования с помощью uses: myorg/my-actions/deploy@v1. Оба подхода поддерживают принципы DRY в конвейерах CI/CD Вашей организации.
# Call a reusable workflow from another workflow
jobs:
deploy:
uses: myorg/shared-workflows/.github/workflows/deploy-appservice.yml@main
with:
app-name: myUniqueWebApp
slot-name: staging
package-path: dist/
secrets:
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}GitHub Actions и Azure Pipelines: что выбрать
Выбирайте GitHub Actions, если Ваш код размещен на GitHub, команда предпочитает интерфейс GitHub, Вам нужна тесная интеграция с проверками запросов на слияние и сканированием кода GitHub или Вы создаете проекты с открытым исходным кодом (с большим количеством бесплатных минут). Выбирайте Azure Pipelines, если Вам нужна интеграция с Azure Boards, расширенное тестирование с Azure Test Plans, управление каналами Azure Artifacts, код находится в Azure Repos или требуется сложное многоэтапное управление выпусками с этапами согласования в многочисленных окружениях. Обе платформы одинаково хорошо поддерживают развертывание в Azure.
Каталог GitHub Actions
В каталоге GitHub Actions размещены тысячи действий сообщества и официальных действий для распространенных задач. Microsoft публикует официальные действия Azure: azure/login, azure/webapps-deploy, azure/aks-set-context, azure/k8s-deploy, azure/CLI, azure/arm-deploy и многие другие. Всегда закрепляйте действия за определенным тегом версии (например, @v3) или SHA фиксации, чтобы предотвратить атаки на цепочку поставок, при которых скомпрометированное действие обновляется вредоносным кодом.
# Pin actions to specific version (recommended)
- uses: actions/checkout@v4 # Pinned to v4 tag
- uses: azure/login@v2 # Pinned to v2
- uses: azure/webapps-deploy@v3 # Pinned to v3
# Extra security: pin to commit SHA
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
# Avoid unpinned 'latest' or branch references
# - uses: some-action@main # UNSAFE - could change at any timeСамостоятельно размещенные исполнители для частных сетей
Исполнители, размещенные GitHub, имеют доступ только к общедоступному Интернету — они не могут обращаться к частным ресурсам Azure (базам данных SQL, внутренним API), если не сделать эти ресурсы общедоступными. Для развертывания частных ресурсов используйте самостоятельно размещенные исполнители на виртуальных машинах Azure внутри Вашей виртуальной сети. Зарегистрируйте исполнителя, скачав агент исполнителя GitHub Actions, настроив его с URL-адресом репозитория и токеном регистрации, а затем запустив его как службу. Масштабируйте самостоятельно размещенные исполнители с помощью Azure Container Apps, чтобы создавать эластичные пулы исполнителей.
# Register a self-hosted runner on an Azure VM
# 1. Download runner (run on the VM)
curl -O -L https://github.com/actions/runner/releases/download/v2.317.0/actions-runner-linux-x64-2.317.0.tar.gz
mkdir actions-runner && tar xzf ./actions-runner-linux-x64-2.317.0.tar.gz -C actions-runner
cd actions-runner
# 2. Configure (use token from GitHub Settings > Actions > Runners)
./config.sh --url https://github.com/myorg/myrepo --token <REGISTRATION_TOKEN>
# 3. Run as a service
sudo ./svc.sh install && sudo ./svc.sh start
# Use in workflow
# runs-on: self-hostedБыстрая проверка
Проверьте свое понимание концепций Microsoft Azure Fundamentals (AZ-900) из этого урока.
Итоги урока
В этом уроке Вы узнали, что рабочие процессы GitHub Actions — это файлы YAML в .github/workflows/, запускаемые событиями GitHub и выполняемые на исполнителях; федеративные учетные данные OIDC обеспечивают аутентификацию GitHub Actions в Azure без секретов; а окружения GitHub с правилами защиты добавляют этапы согласования для развертываний в рабочую среду. На этом курс Azure DevOps завершается — далее мы рассмотрим Azure Monitor и Log Analytics.
Часто задаваемые вопросы
Урок «GitHub Actions в Azure» бесплатный?
Да — полный текст урока «GitHub Actions в Azure» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Cloud & IT Cert Prep, подпишись на CoddyKit PRO. Курс Cloud & IT Cert Prep содержит 4 уроков всего.
Чему я научусь в уроке «GitHub Actions в Azure»?
Воспроизведите рабочий процесс CI/CD с помощью GitHub Actions и действия azure/webapps-deploy, а также разберитесь, когда стоит выбирать GitHub Actions вместо Azure Pipelines. Ты практикуешь Cloud & IT Cert Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Cloud & IT Cert Prep?
Предыдущий опыт не требуется. Cloud & IT Cert Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «GitHub Actions в Azure»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Cloud & IT Cert Prep?
Да. Каждый урок Cloud & IT Cert Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Обзор Azure DevOps Services
- Создание конвейера непрерывной интеграции с Azure Pipelines
- Непрерывное развертывание в Azure
- GitHub Actions в Azure