项目作者: bmstu-iu8-intro-dev

项目描述 :
CI + CD
高级语言: JavaScript
项目地址: git://github.com/bmstu-iu8-intro-dev/sem-01.git
创建时间: 2018-04-19T19:42:22Z
项目社区:https://github.com/bmstu-iu8-intro-dev/sem-01

开源协议:GNU General Public License v3.0

下载


Занятие 1 - Continuous Integration

Цель

Цель занятия продемонстрировать базовые практики и принципы разработки, которые позволяют повысить производительность разработчика и взаимодействие команды разработчиков.

План занятия

  • IDE;
  • простой сервер;
  • работа git;
  • демонстрация unit test;
  • понятие “покрытие кода”;
  • демонстрация системы автоматической сборки travis;
  • автоматическое размертывание на heroku;
  • использование docker;
  • интеграция с coveralls.

IDE

На этом занятии будем использовать язык программирования NodeJs и кроссплатформенную среду разработки WebStorm.

Simple web server

Реализуем простой web-сервер

  1. const http = require('http');
  2. const port = 8000;
  3. function requestHandler(request, response) {
  4. console.log(request.url);
  5. response.end(request.url);
  6. }
  7. function listenCallback(err) {
  8. if (err) {
  9. return console.log('soemthing bad happened', err)
  10. }
  11. console.log(`server is listening on ${port}`)
  12. }
  13. const server = http.createServer(requestHandler);
  14. server.listen(port, listenCallback);

Не используем лямдбы для упрощения восприятия кода

Git

Создадим репозиторий на Github. Для этого выполним в командной строке следующие действия:

  1. > git init
  2. > git add *.js
  3. > git commit -m "first commit"
  4. > git remote add origin https://github.com/drewxa/demo-01.git
  5. > git push -u origin master

Исправим опечатку soemthing bad happened и выполним команду

  1. > git commit -m "typo fixed"

Изменим порт, на котором прослушивает соединения сервер.

  1. > git commit -m "changed port"
  2. > git push -u origin master

Server

Немного усложним сервер. Код смотрите тут.

Unit tests

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

Установим mocha — это javascript фреймворк для Node.js, который позволяет проводить асинхронное тестирование.

  1. > npm install --save-dev mocha

Создадим папку test, а в ней файл filename.ut.js

  1. let assert = require('assert');
  2. function test(){
  3. it('description of test', function () {
  4. assert.equal(true, true);
  5. });
  6. }
  7. describe('Test isPointInArea', function() {
  8. describe('description of group tests', test);
  9. });

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

  1. > mocha

Замечание. Если вы считаете, что модульное тестирование неприменимо к вашему коду, то наиболее вероятно вы неправильно декомпозируете код. При корректном проектировании и декомпозиции кода всегда есть возможность применить модульное тестирование.

Coverage

Под понятием “покрытие кода” можно понимать количественную меру, которая показывает на сколько “хорошо” ваши модульные тесты. Чем больше эта величина, тем лучше. Для больших проектов считается приемлемым покрытие кода около 65%.
Добробнее про “покрытие кода”, можно прочитать по ссылке.

Чтобы проверить покрытие кода в нашем приложении, установим istanbul.

  1. > npm install --save-dev istanbul

Travis

Автоматизируем сборку/запуск тестов. Для этого воспользуемся сервисом TravisCI.

Создадим файл .travis.yml в корневой директории репозитория. Содержимое файла:

  1. language: node_js
  2. node_js:
  3. - "node"

И изменим файл package.json:

  1. {
  2. "devDependencies": {
  3. "istanbul": "^0.4.5",
  4. "mocha": "~1.4.0",
  5. },
  6. "scripts": {
  7. "test": "mocha",
  8. "cover": "istanbul cover _mocha"
  9. }
  10. }

Build Status

Теперь после каждого изменения репозитория TravisCI будет запускать модульное тестирование кода.

Heroku

Heroku - это облачная система для запуска веб приложений.

Чтобы использовать Heroku выполним ряд действий:

  • зарегистрируемся на Heroku;
  • создадим приложение, назовем его demo-01;
  • изменим немного код. Строку server.listen(port, listenCallback) надо заменить на server.listen(process.env.PORT || port, listenCallback);
  • установим приложение travis для своей операционной системы;

Инструкция для ubuntu. Если у вас другая система, читайте официальную документацию по установке клиента travis

  1. > sudo apt-get install ruby ruby-dev
  2. > sudo gem install travis
  • выполним команду.
    1. cd ПУТЬ_ДО_РЕПОЗИТРИЯ
    2. travis setup heroku
    3. travis encrypt $(heroku auth:token) --add deploy.api_key
    4. git add .travis.yml
    5. git commit
    6. git push

Если все прошло успешно, то, после каждого изменения в репозитории на Github’е, сервис TravisCI будет запускать юнит-тестирование и развертывание приложения на платформе Heroku.
Если тестирование завершилось ошибкой, то обновление приложения в Heroku не произойдет.

Docker

Docker — программное обеспечение для автоматизации развёртывания и управления приложениями в среде виртуализации на уровне операционной системы. Позволяет «упаковать» приложение со всем его окружением и зависимостями в контейнер, а также предоставляет среду по управлению контейнерами.

Локальная сборка

  1. > sudo apt-get install docker.io

Создадим файл Dockerfile в репозитории:

  1. FROM node:9.11-alpine
  2. COPY package.json /src/package.json
  3. COPY info.js /src/info.js
  4. COPY server.js /src/server.js
  5. RUN cd /src/ && npm install
  6. CMD cd /src/ && node server.js

Проверим корректность:

  1. > sudo docker build -t demo-01 .
  2. > sudo docker run -p 5000:80 --rm -it demo-01

В консоли появится надпись server is listening on 80. Для проверки работоспособности перейдем в браузере по ссылке http://localhost:5000/

Опубликуем образ на сервисе Docker. Для этого надо зарегистрироваться там. А затем выполнить команды:

  1. > sudo docker build -t $USERNAME/demo-01 .
  2. > sudo docker login -u $USERNAME -p $PASSWORD
  3. > sudo docker push $USERNAME/demo-01
  • $USERNAME - это ваш логин на docker.com
  • $PASSWORD - это ваш пароль на docker.com

Теперь ваш образ опубликован в репозитории docker.com. Его можно скачивать и запускать на любой машине поддерживающей docker.

  1. > sudo docker pull $USERNAME/demo-01
  2. > sudo docker run $USERNAME/demo-01

Автоматическая сборка

Чтобы в репозитории был всегда свежий образ докера, настроим атоматическую выкладку средствами TravisCI.
Для этого в файл .travi.yml добавим следующие строки:

  1. after_success:
  2. - docker build -f Dockerfile -t $USERNAME/demo-01 .
  3. - docker login -u $USERNAME -p $DOCKER_PASSWORD
  4. - docker push $USERNAME/demo-01

$DOCKER_PASSWORD - это пароль от Docker.com, его надо настроить через переменные окружения в Travis

Coveralls

Установим необходимые пакеты

  1. > npm install --save-dev mocha-lcov-reporter coveralls

Изменим файл .travis.yml, добавив в него:

  1. after_success:
  2. - npm run coveralls

Изменим файл package.json:

  1. {
  2. "devDependencies": {
  3. "coveralls": "^3.0.0",
  4. "istanbul": "^0.4.5",
  5. "mocha": "~1.4.0",
  6. "mocha-lcov-reporter": "^1.3.0"
  7. },
  8. "scripts": {
  9. "test": "mocha",
  10. "cover": "istanbul cover _mocha",
  11. "coveralls": "npm run cover -- --report lcovonly && cat ./coverage/lcov.info | coveralls"
  12. }
  13. }

Зарегистрируемся в Coveralls.io и активируем репозиторий с кодом.

Coverage Status

С этого момента TravisCI запускает тестирование кода, считает покрытие кода тестами и публикует результат в Coveralls и разворачивает приложение на Heroku.

Заключение

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

Самостоятельное задание

Для закрепления пройденного материала:

  • разработайте сервис, который ;
  • обеспечте покрытие тестами кода не менее 80%;
  • настройте TravisCI для автоматической проверки тестов;
  • настройте автоматическую сборку докерного образа вашего сервиса из ветки master на github’е;
  • настройте автоматическую выкладку вашего сервиса на Heroku из ветки release.

Полезные ссылки