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

в 13:35, , рубрики: bitbucket, continious integration, deployment, Git, github, php, symfony2, testing, web, разработка, Тестирование IT-систем

Codeship.io: бесплатный CI сервер для приватного репозитория Github Bitbucket
Сразу заинтригую: в результате мы получим связку бесплатного приватного 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: бесплатный CI сервер для приватного репозитория Github Bitbucket

Также приходит уведомление после того, как билд восстановлен.
Помимо этого, есть интеграция с множеством сервисов:
Codeship.io: бесплатный CI сервер для приватного репозитория Github Bitbucket
(картинка с сайта codeship.io)

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

Что понравилось в codeship.io:

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

Что не понравилось:

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

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

Автор: borNfree

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js