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

  • Tutorial

Сразу заинтригую: в результате мы получим связку бесплатного приватного 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 сервисы, где можно бесплатно тестировать приватные репозитории, пожалуйста, поделитесь в комментариях.
Поделиться публикацией
Комментарии 19
    +1
    Мы сейчас тестируем drone.io (github), который можно развернуть на своем железе (зато никаких ограничений по количеству билдов).
      0
      Тоже присматриваюсь к этому проекту, не подскажете материалы по теме?
        +1
        Документации по версии 0.3 сейчас почти нет, но про версию 0.2.1 можно почитать тут — github.com/drone/drone/blob/v0.2.1/README.md

        Главные отличия 0.2 от 0.3 — миграция с jQuery на Angular в интерфейсе и привязка к oauth авторизации GitHub (и, что для нас главное — GitHub Enterprise).

        Разворачивается просто, работает с Docker образами — за сим изолированность окружения из коробки.
        +1
        А для платформы .NET ничего подобного не знаете?
          0
          TeamCity
          CruiseControl

          На своем-то железе много вариантов…
            +3
            Для Windows можно использовать AppVeyor.
              0
              Выглядит интересно, спасибо!
          0
          wercker — поддерживает вообще все что можно поставить на ubuntu 12, бесплатный пока в бете
            +1
            Общался с ними, потом будет 100% платным.
            Ответ CEO на мой вопрос о ценах:
            Hi,

            First off, we're still exploring pricing and are very keen on determining this *with* our customers.

            Our goal is to keep pricing affordable especially for single developers and small teams.

            In terms of pricing amounts we like GitHub's pricing tiers, apart from that:

            We're gravitating towards an activity-based pricing (makes a lot of sense for a CD environment as well) model (number of builds/deploys) and will likely couple it in a sensible manner to the number of team-members, as the the team-size is probably highly correlated with the activity.

            With regards to open source projects, our goal is to keep wercker free for them as we're a big supporter of open source and of course leverage open source projects ourselves.

            Hope this gives some insight and let me know if you any more questions or if we can help with your projects (that's what we're here for).

            cheers and all the best,

            mies

            wercker — CEO

            +1
            Добавлю ещё в список RoboCI github.com/Codegyre/RoboCI
            Это увы не полноценный CI сервер, но в связке с дженкинсом позволяет делать то, что делает Travis-CI
            Вы сможете на основе travis-конфига создать среду для тестов внутри контейнера и запустить билд.
              –1
              Есть вариант только для PHP, много чего нету пока что. Но вот.
              www.phptesting.org/
                +1
                Это самое последнее, что я бы советовал. Попробую объяснить:
                1. SaaS стоит денег, если только на свой сервер ставить
                2. Когда я смотрел PHPCI в последний раз, то там невозможно было запустить, например, версию PHPUnit ту, которая установлена у вас в vendor папке через composer. То есть тесты можно было запустить только через глобальный PHPUnit установленный на сервере, что совершенно, на мой взгляд, неприемлемо. Даже создавал issue в их репозитории, но разработчики дали понять что ничего с этим делать не будут.
                3. github.com/Block8/PHPCI/graphs/contributors посмотрите на график, мне кажется проект «затухает». Хотя здесь gitter.im/Block8/PHPCI какие-то энтузиасты пытаются/будут пытаться его поддерживать.
                0
                У них есть существенный минус — тесты прогоняют для каждого коммита в каждой ветке. Бесплатных 100 билдов хватает на несколько дней
                  0
                  позвольте уточнить: коммита или пуша?
                    0
                    Пуша, но рояля это особо не играет.
                    Хотя если веток/разработчиков/пушей немного, то в бесплатный лимит можно уложиться.
                  0
                  > Если вы знаете ещё какие-нибудь SaaS сервисы, где можно бесплатно
                  > тестировать приватные репозитории, пожалуйста, поделитесь в комментариях.

                  есть список CI сервисов, некоторые из них поддерживают бесплатный режим
                    +2
                    Никто не вспомнил про www.shippable.com/, который бесплатный для приватных репозиториев (и смешная цена за дополнительные фичи), хорошая тех. поддержка. Интерфейс имхо не самый очевидный.
                      0
                      Интерфейс действительно совсем не очевидный.
                      Я правильно понял, что версию и все настройки надо сохранять в shippable.yml и закомитить в проект? А то после старта сразу разные (три) версии PHP, начали билдиться.

                      На счет цен согласен, $12 в год — это смешно.
                        +1
                        да, shippable.yml в корне проекта может конкретно указывать требуемые версии PHP (включая HHVM).

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                    Самое читаемое