![](https://habrastorage.org/getpro/habr/upload_files/de3/2c7/038/de32c7038952da6c9f59bf4badb89f59.png)
Привет, Хабр! Меня зовут Рустем, являюсь 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
![](https://habrastorage.org/getpro/habr/upload_files/58b/c0c/76c/58bc0c76ca90193862c28627e266d15a.png)
Запомним его расположение.
Приступаем к написанию скриптов сборки. Для этого нам понадобится официальный скрипт, который будет отвечать за установку и проверку Cake, а также запуску скриптов сборки.
Скачать скрипт можно из https://github.com/cake-build/cake/blob/develop/build.ps1
Далее нам нужно создать папку в репозитории с основным кодом приложения и туда перенесем наши скрипты Cake.
![](https://habrastorage.org/getpro/habr/upload_files/428/731/8c1/4287318c1965eed7a64bcb9f35031d2b.png)
Т.е. теперь у нас есть папка с основным скриптом и папка, где будут лежать скрипты сборки.
Сначала создаем файл paths.cake, где мы прописываем путь до нашего csproj файла.
![](https://habrastorage.org/getpro/habr/upload_files/ed9/971/0be/ed99710beb63ed9d055d4180f0a2b021.png)
Далее создаем скрипт с названием prepare.cake, где мы опишем шаги предподготовки к сборке: очистка директории и восстановление пакетов Nuget.
![](https://habrastorage.org/getpro/habr/upload_files/457/27f/eb8/45727feb8db6c1ee3867ac2f7bcc00b7.png)
Следующим в очереди будет скрипт сборки build.cake.
Тут мы описываем наш Task, т.е. задание сборки и процесс и процесс пакинга наших артефактов в формат nupkg для доставки его в хранилище артефактов в Octopus.
![](https://habrastorage.org/getpro/habr/upload_files/3db/652/13b/3db65213b0656e2379cb984d5371ea89.png)
Далее создадим файл targets.cake, который будет хранить в себе глобальные таски с содержанием всех тасков, которые мы писали и определением зависимостей между ними. Т.е. зависимый таск не запустится, пока выполнение таска от которого он зависит не завершится успехом.
![](https://habrastorage.org/getpro/habr/upload_files/e21/ee9/cc2/e21ee9cc21a9671e059372696b68d3a0.png)
И последний файл load.cake, который и будет вызывать все наши скрипты в порядке описанной очереди.
![](https://habrastorage.org/getpro/habr/upload_files/fec/4fa/140/fec4fa140783df2ddec83e2257089cf8.png)
Отлично, теперь у нас все скрипты написаны и наша папка src содержит следующие файлы:
![](https://habrastorage.org/getpro/habr/upload_files/06e/395/c16/06e395c1644d3133e8007eaa11437058.png)
Осталось сконфигурировать CI-процесс в TeamCity. Для этого создадим проект в TC.
Переходим в Administration -> Project -> Create Project
![](https://habrastorage.org/getpro/habr/upload_files/42f/83d/5f2/42f83d5f20389709ecdeafeab96596be.png)
Указываем наш репозиторий, а также логин и пароль нашего пользователя(в данный момент паролем является Personal Access Token, который можно получить в github -> Settings -> Developer Settings -> Personal Access Token)
![](https://habrastorage.org/getpro/habr/upload_files/6a3/059/f1d/6a3059f1d5144195c9bc77ee730ff73a.png)
Далее нам нужно создать конфигурацию сборки в нашем проекте.
![](https://habrastorage.org/getpro/habr/upload_files/a28/4f4/ea3/a284f4ea3cba7eb2bd14f156b9fdaa0c.png)
Далее создаем шаги сборки.
![](https://habrastorage.org/getpro/habr/upload_files/63b/aca/3a5/63baca3a562b71f4495530ab53160ea3.png)
Далее даем имя нашему шагу, раннером выбираем Powershell, в поле скрипт выбираем “File” и указываем путь до нашего build.ps1, также прописываем дополнительные аргументы к скрипту(запуск основного билд таска из нашего targets.cake файла).
![](https://habrastorage.org/getpro/habr/upload_files/153/ae7/1c4/153ae71c487517e85dd21d61c9956b0e.png)
Теперь можно протестировать наш CI — нажимаем ран и смотрим.
![](https://habrastorage.org/getpro/habr/upload_files/5bf/d5e/eaf/5bfd5eeafb58cb401c2744113a5c9425.png)
И… Сборка прошла успешно. Вы великолепны! Забираем артефакт.
![](https://habrastorage.org/getpro/habr/upload_files/bfb/a09/e3c/bfba09e3c4c9405d9aa5106adf7977ff.png)
Скоро в OTUS состоится открытое занятие «Docker образы. Микросервисы». На нем мы разберемся, как правильно писать Dockerfile; поговорим о том, что такое микросервисы и как они взаимодействуют между собой. Зарегистрироваться на занятие могут все желающие по ссылке.
AfterDark66
Можешь дать телеграм или что-то другое, где можно с тобой связаться? хотелось бы поговорить с тобой