Pull to refresh

Codeship.io: бесплатный CI сервер для приватного репозитория Github/Bitbucket

Reading time 3 min
Views 28K

Сразу заинтригую: в результате мы получим связку бесплатного приватного git репозитория на Bitbucket и бесплатный* Continious Integration сервер (SAAS), который будет собирать проект и прогонять все тесты после каждого пуша.
* — бесплатная подписка дает возможность тестировать 5 приватных репозиториев и максимум 100 билдов в месяц.

Мне этого для личного проекта достаточно.

Приведу пример для PHP, проект на Symfony2, но данный сервис поддерживает ещё и Ruby, Node.js, Python.


Задача



  • Установить Symfony2 и зависимости через composer
  • Запустить PHPUnit тесты
  • Запустить Behat тесты


Реализация



После регистрации создаем новый проект, синхронизируем с Bitbucket и в настройках проекта будем писать команды, необходимые для сборки.
Есть предустановленные шаблоны, после выбора PHP наш набор команд становится таким:

# Set php version through phpenv. 5.3, 5.4 and 5.5 available
phpenv local 5.5
# Install extensions through Pecl
# pecl install memcache
# Install dependencies through Composer
composer install --prefer-source --no-interaction


Мне еще понадобился GeoIP extension, после недолгого обсуждения с техподдержкой всё отлично установилось, теперь список команд стал выглядеть так:

Setup Commands
# Set php version through phpenv. 5.3, 5.4 and 5.5 available
phpenv local 5.5

# Install extensions through Pecl
pecl install -f geoip
wget -N http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
gunzip GeoLiteCity.dat.gz
cp ./GeoLiteCity.dat ./GeoIPCity.dat
# меняем путь, так как стандартный недоступен в целях безопасности
echo "geoip.custom_directory=/home/rof/clone" >> /home/rof/.phpenv/versions/5.5/etc/php.ini

# Install dependencies through Composer
composer install --prefer-source --no-interaction



Техподдержка, стоит отметить, очень хорошая. Помогли со всеми проблемами и ответили на все вопросы.

База данных



Для Behat тестов необходимо развернуть БД, импортировать тестовые данные через Fixtures, и запустить непосредственно сами тесты.
Codeship.io поддерживает MySQL, MongoDB, PostgreSQL, SQLite (приятно удивило наличие Elasticsearch из коробки). В нашем случае работаем с MySQL, автоматиески уже созданы 2 базы данных — development и test.
Пароль и пользователь хранятся в переменных окружения MYSQL_PASSWORD, MYSQL_USER соответственно.

В Symfony2 переменные окружения можно использовать в качестве параметров в файлах конфигурации, но используя некоторые правила, а именно должен быть префикс SYMFONY__ у каждой переменной.

Изменим config_test.yml так, чтобы использовать переменные окружения в качестве пользователя, пароля, и имени базы данных:

// app/config/config_test.yml
...
doctrine:
    dbal:
        dbname: "%test.database.name%"
        driver: pdo_mysql
        user: "%test.database.user%"
        password: "%test.database.password%"
...


И определим эти самые переменные в «Setup Commands» в настройках нашего проекта:
export SYMFONY__TEST__DATABASE__USER=$MYSQL_USER
export SYMFONY__TEST__DATABASE__PASSWORD=$MYSQL_PASSWORD
export SYMFONY__TEST__DATABASE__NAME=test


Вот и всё, конфигурация MySQL на этом закончена. Теперь создадим схему и запустим fixtures для импорта тестовых данных:

php app/console doctrine:schema:update --force --env=test
php app/console doctrine:fixtures:load --no-interaction --env=test


Ну и запускаем встроенный веб-сервер, пример запуска взят из документации и добавлен только параметр для изменения document root'a (в Symfony2 это папка web):
nohup bash -c "php -S 127.0.0.1:8000 -t web/ 2>&1 &" && sleep 1; cat nohup.out


Тесты



Теперь можно запускать все наши тесты. Для этого есть специальный блок «Modify your Test Commands», вписываем туда команды:
phpunit -c app
./bin/behat "@AppApiBundle/api.feature" --profile=api --no-paths
./bin/behat "@AppCoreBundle/core.feature" --profile=core  --no-paths


При запуске тестов у меня возникла проблема из-за xDebug: «Fatal error: Maximum function nesting level of ‘100’ reached»
Увеличим данный параметр, изменив php.ini в «Setup Commands»:

echo "xdebug.max_nesting_level=200" >> /home/rof/.phpenv/versions/5.5/etc/php.ini


В случае, если ваш билд выполнился с ошибкой, автоматически приходит email уведомление, которое выглядит так:


Также приходит уведомление после того, как билд восстановлен.
Помимо этого, есть интеграция с множеством сервисов:

(картинка с сайта codeship.io)

Данный сервис имеет еще кучу фишек, например можно сразу деплоить успешный билд.

Что понравилось в codeship.io:
  • Возможность тестировать бесплатно приватный репозиторий. Киллер фича
  • Отличная техподдержка
  • Подробная документация
  • Поддержка ElasticSearch и легкая настройка в билдах.


Что не понравилось:
  • Дизайн. Тот, который в аккаунте после логина. На мой взгляд он ужасен.
  • Ограничение в 100 билдов в месяц, хотя для бесплатной подписки спасибо и за это.


Если вы знаете ещё какие-нибудь SaaS сервисы, где можно бесплатно тестировать приватные репозитории, пожалуйста, поделитесь в комментариях.
Tags:
Hubs:
+16
Comments 19
Comments Comments 19

Articles