Ручное тестирование и развертывание убивают производительность.

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

В Unibuddy мы настраиваем CI на Circle, который работает с нашим текущим приложением на основе Meteor и тестами Chimp.

Предварительные условия

В этом руководстве предполагается, что у вас уже есть приложение Meteor с Chimp, которое запускает тесты Mocha / Cucumber / Jasmine. Также предполагается, что вы знакомы с Node и NPM. Мы выполняем развертывание с помощью Galaxy, но вы можете заменить здесь команды развертывания на все, что вы используете.

Шаг 1. Создайте сценарии NPM

Создайте сценарии в своем package.json для запуска вашего приложения на npm run dev, а также другой сценарий, чтобы npm run test запускал Chimp.

"scripts": {
     "dev": "meteor run --settings settings-development.json",
     "test": "chimp --ddp=http://localhost:3000 --browser=chrome"
}

Шаг 2. Создайте файл конфигурации circle.yml

Создайте файл circle.yml в корневом каталоге вашего проекта (на том же уровне, что и package.json). Этот файл представляет собой файл конфигурации, который Circle (ваш сервер CI) автоматически понимает. Здесь вы создаете сценарий того, что хотите сделать, например настраиваете среду для вашего приложения, запускаете приложение, запускаете тесты и развертываете.

Вы можете узнать больше о circle.yml и различных параметрах конфигурации здесь.

Шаг 3. Настройте кеширование и среду

Вначале вы захотите проигнорировать кеширование и просто заставить работать свой CI-поток. Однако для более быстрого конвейера вам следует подумать о кэшировании каталога node_modules,. npm и. meteor. Это то, что происходит в разделе cache_directories в приведенном ниже коде.

Затем вам нужно настроить среду, что делается в разделе «Переопределение». Для приложения Meteor это включает в себя установку Meteor (сначала мы проверяем, установлен ли Meteor, если нет, то устанавливаем - в противном случае ничего не делаем). Мы также устанавливаем Chimp и Selenium глобально. Наконец, мы выполняем npm install, который установит все наши зависимости, перечисленные в package.json.

NB: если вы обновляете package.json, вам нужно очистить кеш в Circle перед пересборкой. Кроме того, если вы используете shrinkwrap, не забудьте запустить npm shrinkwrap, если вы изменили папку node_modules после npm install установит то, что находится в вашем термоусадочном файле, а не то, что находится в package.json в Circle.

dependencies:
  cache_directories:
    - "node_modules"
    - "~/.npm"
    - "~/.meteor"
  override:
    # Cache Meteor
    - if [ -d ~/.meteor ]; then sudo ln -s ~/.meteor/meteor /usr/local/bin/meteor; fi
    - if [ ! -e $HOME/.meteor/meteor ]; then curl https://install.meteor.com | sh; fi
    - npm install -g chimp
    - npm install -g selenium-standalone
    - npm install

Шаг 4. Запустите приложение и запустите тесты

Вот хитрость, которая очень специфична для CI. Вам нужно запустить приложение Meteor, чтобы оно открывало доступ к вашему приложению localhost: 3000, к которому Chimp ожидает подключения и запуска тестов. Поэтому критически важна многопоточность, о которой вы обычно не задумываетесь при локальном запуске приложения, поскольку вам достаточно открыть несколько окон терминала.

Вот почему мы устанавливаем для свойства «background» значение true при запуске нашего приложения. Затем мы ждем (засыпаем) пару минут, пока приложение соберется и станет доступным по адресу localhost: 3000. Через две минуты в другом потоке выполнится npm run test, который заставит Chimp подключиться к приложению и запустить все наши тесты Cucumber (в нашем случае).

test:
  override:
    - npm run dev:
        background: true
    - sleep 120
    - npm run test

Шаг 4. Развертывание на стадии подготовки и производства

На основе нашего circle.yml до сих пор, когда вы фиксируете - Circle настроит вашу среду (npm install и т. Д.), Запустит ваше приложение и выполнит тесты. Если сборка обведена кружком, это означает, что ветка, в которой вы сейчас находитесь, и только что сделанный вами коммит, прошли все ваши тесты и работают нормально. Давайте сделаем еще один шаг и настроим развертывание на основе ветвей.

Как правило, ваша ветка dev в Git должна синхронизироваться с промежуточным сервером, а ваша главная ветка - с производственной. Для коммитов, сделанных в любую другую ветку, вы, вероятно, не захотите развертывать.

deployment:
  staging:
    branch: "dev"
    commands:
      - echo $DEPLOYMENT_TOKEN > deployment_token.json
      - METEOR_SESSION_FILE=deployment_token.json DEPLOY_HOSTNAME=eu-west-1.galaxy-deploy.meteor.com meteor deploy www.YOUR_STAGING_APP.com --settings settings-development.json
production:
    branch: "master"
    commands:
      - echo $PROD_SETTINGS > settings-production.json
      - echo $DEPLOYMENT_TOKEN > deployment_token.json
      - METEOR_SESSION_FILE=deployment_token.json DEPLOY_HOSTNAME=eu-west-1.galaxy-deploy.meteor.com meteor deploy www.YOUR_PROUDCTION_APP.com --settings settings-production.json

Выше у нас есть раздел развертывания нашей конфигурации, который состоит из двух разделов - постановки и развертывания. Мы указываем ветку dev для постановки и master для производства. Далее в разделе «команды» мы выдаем команды развертывания.

Шаг 5. Добавление переменных окружения Circle

Если вы используете Galaxy, вам нужно будет настроить две переменные среды в Circle.

Во-первых, вам необходимо иметь доступ к авторизованной учетной записи Meteor (как настроено в Galaxy). Чтобы создать токен развертывания, в вашем терминале на вашем локальном компьютере разработчика:

METEOR_SESSION_FILE=deployment_token.json meteor login

Следуйте инструкциям (если есть), и результатом будет файл deployment_token.json, который является вашим текущим рабочим каталогом. Теперь вернитесь в Circle - затем Project Settings и, наконец, нажмите «Environment Variables» (ссылка находится под настройками сборки) на левой боковой панели. Нажмите кнопку «Добавить переменную», установите имя как DEPLOYMENT_TOKEN, а затем скопируйте и вставьте содержимое только что созданного deployment_token.json. Команда «echo» в нашем circle.yml извлечет эту переменную среды и воссоздает deployment_token.json на сервере Circle, который считывается последней командой развертывания (как METEOR_SESSTION_FILE).

Наконец, у вас не должно быть вашего settings-production.json в вашем репозитории (в целях безопасности). Вот почему вы могли заметить, что при развертывании в производственной среде есть несколько дополнительных команд. Найдите свой settings-production.json, скопируйте и вставьте весь объект JSON как переменную среды в Circle (как значение) и дайте ему имя PROD_SETTINGS. Точно так же, что касается токена развертывания, команда «echo» извлекает переменную env и повторно создает settings-production.json, который считывает команда окончательного производственного развертывания.

Последний файл конфигурации circle.yml:

dependencies:
  cache_directories:
    - "node_modules"
    - "~/.npm"
    - "~/.meteor"
  override:
    # Cache Meteor
    - if [ -d ~/.meteor ]; then sudo ln -s ~/.meteor/meteor /usr/local/bin/meteor; fi
    - if [ ! -e $HOME/.meteor/meteor ]; then curl https://install.meteor.com | sh; fi
    - npm install -g chimp
    - npm install -g selenium-standalone
    - npm install
test:
  override:
    - npm run dev:
        background: true
    - sleep 360
    - npm run test
deployment:
  staging:
    branch: "dev"
    commands:
      - echo $DEPLOYMENT_TOKEN > deployment_token.json
      - METEOR_SESSION_FILE=deployment_token.json DEPLOY_HOSTNAME=eu-west-1.galaxy-deploy.meteor.com meteor deploy www.YOUR_STAGING_APP.com --settings settings-development.json
production:
    branch: "master"
    commands:
      - echo $PROD_SETTINGS > settings-production.json
      - echo $DEPLOYMENT_TOKEN > deployment_token.json
      - METEOR_SESSION_FILE=deployment_token.json DEPLOY_HOSTNAME=eu-west-1.galaxy-deploy.meteor.com meteor deploy www.YOUR_PRODUCTION_APP.com --settings settings-production.json

Установка может быть неприятной, но как только она заработает, вы больше никогда не вернетесь к развертыванию вручную!

Код. Совершить. Устройтесь поудобнее и посмотрите, как ваш CI-сервер сделает все остальное.