Статьи

Easy TeamCity Установка с непрерывной интеграцией с Docker

TeamCity от JetBrains — это простая в использовании и мощная система непрерывной интеграции . Это коммерческий продукт, но есть специальная лицензия с нулевой стоимостью для небольших проектов и приложений FOSS. Хотя установка TeamCity относительно проста, его настройка еще более упрощается благодаря использованию Docker .

logo_teamcityКак и многие другие современные системы непрерывной интеграции, TeamCity использует концепцию сервера сборки и агента сборки. Сервер отвечает за администрирование и сборку конфигураций. Сама фактическая сборка (компиляция, упаковка, развертывание и т. Д.) Выполняется одним или несколькими агентами сборки. При таком подходе также легко автоматически подготовить агента, так что для всей установки требуется очень мало ручных настроек.

TeamCity Server требует только Java. Установка довольно проста. С докером это еще проще. Я подготовил специальный контейнер для этого, ariya / centos6-teamcity-server . Базовой системой для контейнера является ariya / centos6-oracle-jre7 , система CentOS 6.5, работающая на официальной Oracle Java 7 (точнее, JRE 1.7.0_65-b17 на момент написания этой статьи).

Предполагая, что у вас есть система (VPS, такая как Linode или DigitalOcean, экземпляр Amazon EC2, виртуальная машина, реальная коробка), на которой уже установлен Docker, настроить сервер TeamCity так же просто, как выполнить следующие команды. Обратите внимание, что если вы работаете в OS X, используйте boot2docker, если вы просто хотите поэкспериментировать с этой настройкой (см. Мой предыдущий пост в блоге Docker для OS X для более подробной информации).

docker run -dt -name teamcity_server -p 8111:8111 ariya/centos6-teamcity-server

Подождите несколько минут, затем откройте адрес ящика на порту 8111, чтобы запустить веб-конфигурацию TeamCity Server ( для получения более подробной информации ознакомьтесь с официальной документацией TeamCity ), как показано на следующем снимке экрана. Если ваша хост-система использует iptables, обязательно примите соединения через порт 8111. Обратите внимание, что данные TeamCity будут храниться в специальном месте /data/teamcity. Это стандартный том Docker , он полезен для упрощения монтажа, резервного копирования или обновления в будущем.

TeamCity

Как только сервер настроен, настало время назначить агент сборки этому серверу (в противном случае ничего нельзя будет построить). Опять же, мы легко создадим агент сборки, используя Docker, запустив контейнер с именем ariya / centos6-teamcity-agent . Чтобы агент работал, нам нужно указать сервер. Вот как вы бы это запустили:

docker run -e TEAMCITY_SERVER=http://buildserver:8111 \
    -dt -p 9090:9090 ariya/centos6-teamcity-agent

Если вы запустите это на том же хосте, на котором запущен контейнер сервера, вам нужно связать их вместе:

docker run -e TEAMCITY_SERVER=http://teamcity_server:8111 \
    --link teamcity_server:teamcity_server -dt ariya/centos6-teamcity-agent

Переменная среды TEAMCITY_SERVERявляется обязательной, она должна указывать на местоположение экземпляра сервера TeamCity, который вы запустили на предыдущем шаге. После запуска контейнера он свяжется с указанным сервером, загрузит ZIP-файл агента и настроит его. Подождите несколько минут, так как агент сборки обычно обновляется после первого контакта с сервером. Если все работает правильно, вы должны увидеть нового агента на вкладке Агенты в веб-интерфейсе вашего сервера TeamCity. Авторизуйте агента, и теперь он должен быть готов принять любую работу по сборке!

Если при запуске агента ( docker ps) проблема не отображается, контейнер работает, попробуйте запустить его снова, но на этот раз с опцией -it(интерактивный терминал) вместо -dt. Это выведет некоторые дополнительные сообщения отладки, которые могут быть полезны для устранения неполадок.

Обратите внимание, что этот контейнер агента также основан на CentOS 6 с Java 7. Обычно этого недостаточно, поскольку вам могут потребоваться другие зависимости (разные SDK, компиляторы, библиотеки и т. Д.). В идеале эти зависимости должны разрешаться автоматически, либо основывая контейнер на другой системе, либо устанавливая правильное автоматическое предоставление. Обратитесь к моему предыдущему сообщению в блоге Агент по сборке: Шаблон против Предоставления для более подробного обзора.

Все еще есть оправдание, чтобы не делать непрерывную интеграцию? Я так не думаю!