Введение: Зачем C# проектам CI/CD?
Разработка современных приложений на C# и платформе .NET требует не только качественного кода, но и надежного процесса его доставки до пользователя. Ручные сборки, тестирование и развертывание — это не только медленно, но и чревато ошибками. Здесь на помощь приходит CI/CD (Continuous Integration / Continuous Deployment) — практика, автоматизирующая все этапы жизненного цикла программного обеспечения.
GitHub Actions — это встроенный инструмент GitHub, который позволяет создавать мощные пайплайны прямо в репозитории. В этой статье мы разберем, как настроить полноценный CI/CD для C# проектов с помощью GitHub Actions: от простой сборки до автоматического деплоя. Вы узнаете, как писать YAML-конфигурации, оптимизировать тестирование и избегать типичных ошибок.
Основы GitHub Actions для .NET
Что такое workflow и job?
Workflow (рабочий процесс) — это автоматизированный процесс, который запускается по определенному событию (push, pull request, создание релиза). Он описывается в файле .github/workflows/*.yml. Workflow состоит из одной или нескольких job (задач), которые выполняются на раннерах (виртуальных машинах). Каждая job может содержать последовательность steps (шагов).
Для C# проектов ключевые шаги — это восстановление зависимостей (dotnet restore), сборка (dotnet build), запуск тестов (dotnet test) и публикация (dotnet publish).
Базовый шаблон workflow для .NET
Ниже представлен минимальный workflow для сборки и тестирования C# проекта. Сохраните этот код в файл .github/workflows/dotnet-ci.yml.
name: .NET CI
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'
- 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
Разбор ключевых строк:
actions/checkout@v4— клонирует репозиторий в среду выполнения.actions/setup-dotnet@v4— устанавливает указанную версию .NET SDK.dotnet restore— скачивает NuGet-пакеты.dotnet build --configuration Release— собирает проект в режиме Release.dotnet test— запускает все тесты из решения.
Расширенная настройка: кэширование и матрица сборки
Кэширование NuGet-пакетов
Каждый запуск workflow начинается с чистой среды. Чтобы ускорить процесс, можно кэшировать папку ~/.nuget/packages. Это особенно полезно для больших проектов с десятками зависимостей.
steps:
- uses: actions/cache@v4
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj') }}
restore-keys: |
${{ runner.os }}-nuget-
- run: dotnet restore
Ключ кэша строится на основе хэша файлов проектов (.csproj). Если зависимости не менялись, кэш будет восстановлен за секунды.
Матрица сборки (Matrix Strategy)
Если ваше приложение должно работать под разные версии .NET или операционные системы, используйте матрицу. GitHub Actions автоматически создаст отдельную job для каждой комбинации.
jobs:
build:
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
dotnet: ['6.0.x', '8.0.x']
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ matrix.dotnet }}
- run: dotnet build --configuration Release
Этот подход гарантирует, что ваш C# код корректен на всех целевых платформах.
Автоматический деплой с GitHub Actions
Публикация артефактов
После успешной сборки и тестирования можно опубликовать результат как артефакт или сразу развернуть на сервере. Для начала создадим артефакт:
- name: Publish
run: dotnet publish --configuration Release --output ./publish
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: my-app
path: ./publish
Артефакты можно скачать из интерфейса GitHub Actions или использовать в последующих jobs.
Деплой на Azure или собственный сервер
Для деплоя в Azure App Service существует готовое действие azure/webapps-deploy@v2. Пример:
- name: Deploy to Azure
uses: azure/webapps-deploy@v2
with:
app-name: 'my-app-service'
slot-name: 'production'
publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
package: ./publish
Если вы используете собственный сервер, можно применить SSH-действие или скопировать файлы через SCP. Не забудьте сохранить чувствительные данные (пароли, ключи) в секретах GitHub.
Лучшие практики и частые ошибки
Как избежать проблем?
- Не дублируйте код. Используйте повторно используемые workflow для общих шагов.
- Всегда указывайте версию actions. Вместо
actions/checkout@v4не пишите@main— это может привести к неожиданным изменениям. - Тестируйте на нескольких ОС. Даже если вы работаете на Windows, CI на Linux может выявить проблемы с путями или кодировкой.
- Используйте
--verbosity normal.