Привет, Хабр! Меня зовут Рустем, являюсь Senior DevOps Engineer в IBM и сегодня я хотел бы показать вам один из способов билда C# приложения. Для этого нам понадобятся Cake+TeamCity для CI-процесса.
Сегодня мы настроим CI-процесс, то есть сборку нашего кода.
Теоретическое вступление: что нам нужно знать о нашем инструментарии.
Cake — это бесплатная кроссплатформенная система автоматизации сборки с открытым исходным кодом и C# DSL для таких задач, как компиляция кода, копирование файлов и папок, выполнение юнит-тестов, сжатие файлов и сборка пакетов NuGet.
TeamCity
TeamCity — это CI-сервер, который позволяет настраивать автоматическую сборку и тестирование нашего продукта
Основные понятия, которые нам необходимо знать в TC:
Build agent — часть программного обеспечения, которая фактически выполняет процесс сборки. Он устанавливается и настраивается отдельно от сервера TeamCity, то есть агент может быть установлен на отдельной машине (физической или виртуальной) и может работать под управлением той же операционной системы (ОС), что и сервер, или другой ОС. Также стоит отметить, что агент сборки не предоставляет сам механизмы сборки кода, а ищет эти самые механизмы из окружения сервера, на который он установлен, и затем задействует их в сборке.
TeamCity Server — сам сервер не выполняет ни сборки, ни тесты: задача сервера состоит в том, чтобы отслеживать все подключенные агенты сборки, распределять сборки в очереди на агенты на основе требований совместимости и сообщать о результатах.
Project — проект TeamCity соответствует программному проекту или конкретной версии/релизу программного проекта. Проект представляет собой набор конфигураций для сборки кода.
Build configuration — комбинация параметров, определяющая процедуру сборки. Настройки включают в себя VCS-root, этапы сборки, триггеры сборки.
VCS root — набор параметров управления версиями (пути к источникам, имя пользователя, пароль, режим чекаута и другие параметры), которые определяют, как TeamCity взаимодействует с системой управления версиями (SCM) для отслеживания изменений и получения исходников для сборки.
Build step — задача, которую нужно выполнить. Каждый шаг сборки представлен ранером сборки, обеспечивающим интеграцию с определенным инструментом сборки (например, Ant, Gradle, MSBuild и т. д.), средой тестирования (например, NUnit) или механизмом анализа кода. Таким образом, в одной сборке вы можете иметь несколько шагов и последовательно вызывать инструменты тестирования, покрытие кода и, например, компилировать свой проект.
Build — задание CI/CD, выполняемое на агенте. Состоит из одного или нескольких шагов сборки, которые могут выполнять любую задачу обслуживания: компилировать, тестировать, развертывать, писать логи и т. д.
Build artifacts — файлы, создаваемые процессом сборки, например установщики, бинарные файлы, файлы WAR, отчеты, файлы журналов, доступные для загрузки.
Практика
Начнем со сборки.
Вот команда разработчиков передала на свой код и теперь нужно настроить его автоматическую сборку.
Приложение у нас C#, значит, собирать будем с файла проекта с расширения .csproj
Запомним его расположение.
Приступаем к написанию скриптов сборки. Для этого нам понадобится официальный скрипт, который будет отвечать за установку и проверку Cake, а также запуску скриптов сборки.
Скачать скрипт можно из https://github.com/cake-build/cake/blob/develop/build.ps1
Далее нам нужно создать папку в репозитории с основным кодом приложения и туда перенесем наши скрипты Cake.
Т.е. теперь у нас есть папка с основным скриптом и папка, где будут лежать скрипты сборки.
Сначала создаем файл paths.cake, где мы прописываем путь до нашего csproj файла.
Далее создаем скрипт с названием prepare.cake, где мы опишем шаги предподготовки к сборке: очистка директории и восстановление пакетов Nuget.
Следующим в очереди будет скрипт сборки build.cake.
Тут мы описываем наш Task, т.е. задание сборки и процесс и процесс пакинга наших артефактов в формат nupkg для доставки его в хранилище артефактов в Octopus.
Далее создадим файл targets.cake, который будет хранить в себе глобальные таски с содержанием всех тасков, которые мы писали и определением зависимостей между ними. Т.е. зависимый таск не запустится, пока выполнение таска от которого он зависит не завершится успехом.
И последний файл load.cake, который и будет вызывать все наши скрипты в порядке описанной очереди.
Отлично, теперь у нас все скрипты написаны и наша папка src содержит следующие файлы:
Осталось сконфигурировать CI-процесс в TeamCity. Для этого создадим проект в TC.
Переходим в Administration -> Project -> Create Project
Указываем наш репозиторий, а также логин и пароль нашего пользователя(в данный момент паролем является Personal Access Token, который можно получить в github -> Settings -> Developer Settings -> Personal Access Token)
Далее нам нужно создать конфигурацию сборки в нашем проекте.
Далее создаем шаги сборки.
Далее даем имя нашему шагу, раннером выбираем Powershell, в поле скрипт выбираем “File” и указываем путь до нашего build.ps1, также прописываем дополнительные аргументы к скрипту(запуск основного билд таска из нашего targets.cake файла).
Теперь можно протестировать наш CI — нажимаем ран и смотрим.
И… Сборка прошла успешно. Вы великолепны! Забираем артефакт.
Скоро в OTUS состоится открытое занятие «Docker образы. Микросервисы». На нем мы разберемся, как правильно писать Dockerfile; поговорим о том, что такое микросервисы и как они взаимодействуют между собой. Зарегистрироваться на занятие могут все желающие по ссылке.
AfterDark66
Можешь дать телеграм или что-то другое, где можно с тобой связаться? хотелось бы поговорить с тобой