Промышленное приложение

это не только приложение


Наговицин Максим / mnagovitsin@naumen.ru

Лекция 2

План

  • VCS (Version Control System/Система контроля версий)
  • Системы сборки приложений. Maven. Gradle.
  • CI (Continuous Integration/Система непрерывной интеграции) Jenkins
  • VCS-Хостинги. Github
  • Система развертывания и управления контейнерами Openshift

Version Control Systems

git

Version Control Systems

Основные понятия:

  • Репозиторий
  • Коммит
  • Версия/Состояние/Ревизия

Version Control Systems

Зачем?

  • Чтобы видеть историю изменений
  • Переключаться между состояниями документов
  • Удобно вести совместную работу
  • Увидеть автора и дату создания версии

Два типа VCS

  • Централизованные VCS: CVS, Subversion(SVN)
  • Распределенные VSC: Git, Mercurial(Hg), BitKeeper, Bazaar

Централизованные VCS

Достоинства

  • Всё хранится на сервере
  • Централизованная блокировка изменений

Недостатки

  • Невозможно работать без доступа к серверу
  • Один сервер - уникальная точка отказа

Распределенные VCS

Достоинства

  • Практически невозможно потерять репозиторий
  • Работа с версиями не зависит от доступности сервера

Недостатки

  • Невозможны централизованные блокировки файлов

Git: появление

  • Linux
  • BitKeeper
  • Линус Торвальдс и сообщество

Подробнее тут: https://git-scm.com/book/ru/v2

Ветки / branch

Ветки / branch

Ветки / branch

Ветки / branch

Git: cheat sheet

  • git clone ${url}
  • git checkout -b ${branchName}
  • Do work
  • git add .
  • git commit -m '${messageAboutCommit}'
  • git push origin ${branchName}

Системы сборки

Нет системы сборки


class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}
                        

$ javac HelloWorld.java
$ java HelloWorld
                        

Больше кода


class HelloWorld {
    public static void main(String[] args) {
        Printer.print("Hello World!");
    }
}

class Printer {
    public static void print(String text) {
        System.out.println(text);
    }
}
                        

$ javac Printer.java HelloWorld.java
$ java HelloWorld
                        

Система сборки. Требования

  • Сборка вне IDE
  • Запуск тестов
  • Особая структура файлов
  • Зависимости

Системы сборки для Java

  • Maven
  • Gradle
  • Ant

Maven

Одна из самых популярных систем сборки
https://maven.apache.org

  • описание проекта в файле pom.xml
  • сделан для сборки в Java
  • всегда один выход: Jar, war, ear...
  • много plugin-ов
  • у цикла жизни много фаз

Структура проекта

Maven артефакт

  • groupId ru.naumen
  • artifactId cti
  • version 4.8.0
  • excludes

Структура pom.xml



    ru.urfu.matmex
    simple
    jar
    1.0
    Simple Project
...

                        

Зависимости



    
        
            junit
            junit
            4.12
            test
        
        
     
    ...

                        

Объявление переменных



     
        1.8.3 
    
    ...

                        

Зависимость



     
        1.8.3 
    
    
        
            commons-beanutils
            beanutils
            ${beanutils.version}
            
                
                    commons-logging
                    commons-logging
                
            
        
    

                        

Транзитивные зависимости

Gradle

Еще одна популярная система сборки

https://gradle.org

  • Описание проекта на языке Groovy или Kotlin (DSL)
  • Стандартный способ конфигурации сборки при разработке на Android

Структура проекта

Описание проекта

                        
apply plugin:'java'
apply plugin:'checkstyle'
apply plugin:'findbugs'
apply plugin:'pmd'
version = '1.0'
repositories {
    mavenCentral()
}
dependencies {
    testCompile group:'junit', name:'junit', version:'4.11'
}
                        
                    

Система непрерывной интеграции

Jenkins

Система непрерывной интеграции

  • Рутина
  • Плохой код в репозитории
  • Проблемы окружения
  • История сборок
  • Много-много тестов

Рутина


mvn clean install
cp target/artifact.war ../tomcat/webapps
../tomcat/bin/startup.sh
mvn test
...
git checkout develop
git merge ${branchName}
git push origin develop
                    

Плохой код

"Плохой" разработчик "Хороший" разработчик

# Завтра в отпуск
git checkout master
# Надо срочно доделать задачу
git commit -am 'Killer feature'
git push origin master
# Наконец-то отпуск!
                                

git checkout master
git pull
mvn clean install
...
BUILD FAILED
                                

Проблемы окружения

Твой компьютер Не твой компьютер

История сборок

Много тестов

over 9000 тестов, 24 дочерних узла

Цикл разработки

CI Jenkins

  • Быстро находит ошибки
  • Тестирует весь код
  • Обеспечивает наличие стабильной версии кода
  • Повышает качество

Jenkins. Общий вид

Наш цикл интеграции

  • Триггер (расписание, git)
  • Сборка
  • Статический анализ
  • Unit тестирование
  • DB-тестирование
  • Interface-тесты (Selenium)
  • Сохранение
  • Отчет

Github

Весь код интернета

Аналоги

  • BitBucket
  • GitLab
  • Google code
  • Microsoft Codeplex

Github flow

  • Fork репозитория
  • Создание ветки
  • Коммит
  • Pull request
  • Merge

GitHub. Инструменты

  • CodeShip
  • Codacy / Codeclimate
  • JitPack

Развертывание

  • Запуск на железе
  • Запуск на виртуальной машине
  • Запуск в контейнере

Запуск на железе

Плюсы

  • Простота
  • Доступность

Минусы

  • Что если сгорит?
  • Что если не хватит мощности?

Запуск в VM

Полная эмуляция железа

Плюсы

  • Надежность
  • Переносимость

Минусы

  • Накладные расходы

Запуск в контейнере (Docker)

Псевдо эмуляция железа - изоляция приложений

Плюсы

  • Надежность
  • Переносимость

Минусы

  • Меньшие, но все же накладные расходы

Лучшего варианта нет

Cloud провайдеры

  • Openshift
  • MS Azure / AWS
  • Heroku
  • Яндекс.Облако

Ссылки