Введение: Почему CI/CD критически важен для C# (.NET) проектов
Современная разработка программного обеспечения невозможна без автоматизации. Ручные процессы сборки, тестирования и развертывания — это не только медленно, но и чревато ошибками. Для C# разработчиков, работающих с экосистемой .NET, внедрение практик CI/CD (Continuous Integration / Continuous Deployment) становится стандартом индустрии.
GitHub Actions — это мощный и гибкий инструмент для автоматизации рабочих процессов, встроенный прямо в GitHub. Он позволяет создавать пайплайны (workflows), которые реагируют на события в репозитории: пуши, создание Pull Request'ов, релизы и многое другое. В этой статье мы разберем, как настроить полноценный CI/CD пайплайн для C# проекта на базе .NET, используя GitHub Actions.
Вы узнаете, как:
- Настроить автоматическую сборку проекта.
- Запускать unit-тесты (например, xUnit или NUnit).
- Публиковать артефакты сборки.
- Автоматически деплоить приложение (например, на Azure, Docker Hub или сервер).
1. Основы GitHub Actions: Workflow, Jobs и Steps
Прежде чем писать код, давайте разберемся с базовыми концепциями GitHub Actions.
- Workflow (Рабочий процесс): Это автоматизированный процесс, который вы определяете в YAML-файле в папке
.github/workflows. Workflow запускается по триггеру (например, push в ветку main). - Job (Задача): Набор шагов (steps), которые выполняются на одном раннере (виртуальной машине). Jobs могут выполняться последовательно или параллельно.
- Step (Шаг): Отдельная команда или действие (action). Это может быть запуск скрипта, установка зависимостей или использование готового action из маркетплейса.
- Runner (Раннер): Сервер, который выполняет ваш workflow. GitHub предоставляет бесплатные раннеры (Ubuntu, Windows, macOS), или вы можете запустить свой собственный.
Для .NET проектов мы будем использовать готовые actions, такие как actions/checkout (для клонирования репозитория) и actions/setup-dotnet (для установки .NET SDK).
2. Настройка базового CI пайплайна: Сборка и тестирование
Создадим наш первый workflow. Для этого в корне репозитория создайте папку .github/workflows и внутри нее файл dotnet-build.yml.
Вот минимальный YAML-файл для сборки и тестирования C# проекта:
name: .NET Build and Test
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x' # Укажите вашу версию .NET
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore --configuration Release
- name: Run tests
run: dotnet test --no-build --configuration Release --verbosity normal
Разберем код:
- name: Имя workflow, которое будет отображаться в GitHub.
- on: Определяет триггеры. В нашем случае — push и pull request в ветки main и develop.
- jobs: Содержит одну задачу
build-and-test, которая выполняется наubuntu-latest. - steps: Последовательность действий: клонирование кода, установка .NET 8.0, восстановление пакетов NuGet, сборка в конфигурации Release и запуск тестов.
После пуша этого файла в репозиторий, GitHub Actions автоматически запустит workflow. Вы увидите зеленую галочку или красный крест рядом с коммитом.
Добавление Code Coverage (покрытие кода)
Чтобы следить за качеством кода, можно добавить генерацию отчета о покрытии тестами. Для этого используйте пакет coverlet.collector и action codecov/codecov-action.
- name: Run tests with coverage
run: dotnet test --no-build --configuration Release /p:CollectCoverage=true /p:CoverletOutputFormat=opencover
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
with:
files: ./**/coverage.opencover.xml
flags: unittests
fail_ci_if_error: true
3. Продвинутый CD: Публикация и деплой артефактов
После успешной сборки и тестирования, следующий шаг — автоматическая публикация (деплой) приложения. Рассмотрим два популярных сценария: публикация в GitHub Packages (NuGet) и деплой на Docker Hub.
3.1. Публикация NuGet пакета в GitHub Packages
Если вы разрабатываете библиотеку, вы можете автоматически публиковать ее в GitHub Packages при создании релиза.
name: Publish NuGet Package
on:
release:
types: [published]
jobs:
publish:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'
- name: Build
run: dotnet build --configuration Release
- name: Pack
run: dotnet pack --configuration Release --no-build --output ./nupkg
- name: Push to GitHub Packages
run: dotnet nuget push ./nupkg/*.nupkg --source "https://nuget.pkg.github.com/${{ github.repository_owner }}" --api-key ${{ secrets.GITHUB_TOKEN }} --skip-duplicate
Важно: Мы используем секрет secrets.GITHUB_TOKEN, который автоматически создается GitHub для каждого workflow. Он дает права на запись в Packages.
3.2. Деплой .NET приложения в Docker Hub
Для веб-приложений (ASP.NET Core) часто используется контейнеризация. Создадим workflow, который собирает Docker образ и пушит его в Docker Hub.
Сначала добавьте в корень проекта файл Dockerfile: