release management -...

192
WITH GRADLE RELEASE MANAGEMENT

Upload: vuthien

Post on 12-Apr-2018

236 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

WITH GRADLE

RELEASE MANAGEMENT

Page 2: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

@tolkv

2

@lavcraft

Page 3: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Чего не будет

3

Page 4: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Чего не будет● Релизь чаще — будет счастье!

4

Page 5: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● Релизь чаще — будет счастье!● Каждый коммит — релиз

5

Чего не будет

Page 6: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● Релизь чаще — будет счастье!● Каждый коммит — релиз● Автоматизируй все

6

Чего не будет

Page 7: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● Релизь чаще — будет счастье!● Каждый коммит — релиз● Автоматизируй все● Сделано — значит зарелижено

7

Чего не будет

Page 8: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

8

Что будет

Page 9: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● Жизненный цикл скриптов сборки

9

Что будет

Page 10: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Что будет● Жизненный цикл скриптов сборки● Основные проблемы

10

Page 11: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● Жизненный цикл скриптов сборки● Основные проблемы● Инструменты для решения

11

Что будет

Page 12: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● Жизненный цикл скриптов сборки● Основные проблемы● Инструменты для решения● Императивный vs декларативный Gradle

12

Что будет

Page 13: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● Жизненный цикл скриптов сборки● Основные проблемы● Инструменты для решения● Императивный vs декларативный Gradle● Можно ли превратиться из Зерга в Протосса

13

Что будет

Page 14: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Где мы

Bin

GIT CI Dev

Prod14

Page 15: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Bin

GIT CI Dev

Prod15

Где мы

Page 16: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Bin

GIT CI Dev

Prod16

Где мы

Page 17: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Плохой код

17

Page 18: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Плохой билдскрипт

18

Page 19: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Стратегия успеха

19

Page 20: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Что нужно сделать

20

Page 21: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Что нужно сделать● Добыть ресурсов

21

Page 22: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Что нужно сделать● Добыть ресурсов● Подготовить базу

22

Page 23: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Что нужно сделать● Добыть ресурсов● Подготовить базу● Создать армию

23

Page 24: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Что нужно сделать● Добыть ресурсов● Подготовить базу● Создать армию● Укрепить позиции

24

Page 25: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Что нужно сделать● Добыть ресурсов● Подготовить базу● Создать армию● Укрепить позиции● Захватить мир

25

Page 26: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● Кто писал “скрипты сборки”?

26

Все еще собираете?

Page 27: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● Кто писал “скрипты сборки” с нуля?

27

Все еще собираете?

Page 28: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● Кто писал “скрипты сборки” с нуля?● А кто правил существующие?

28

Все еще собираете?

Page 29: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● Кто писал “скрипты сборки” с нуля?● А кто правил существующие?● По какому принципу пишут логику сборки?

29

Все еще собираете?

Page 30: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● Кто писал “скрипты сборки” с нуля?● А кто правил существующие?● По какому принципу пишут логику сборки?● Правильно - по остаточному принципу

30

Все еще собираете?

Page 31: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● build.gradle

31

Готовимся собирать

Page 32: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● build.gradle● settings.gradle

32

Готовимся собирать

Page 33: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● build.gradle● settings.gradle● ./gradlew

33

Готовимся собирать

Page 34: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Добываем инструменты

$ gradle wrapper --gradle-version 3.1

34

Page 35: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

$ gradle wrapper --gradle-version 3.1

:wrapperBUILD SUCCESSFUL

Total time: 1.835 secs

35

Добываем инструменты

Page 36: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

$ ./gradlew init

36

Добываем инструменты

Page 37: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

$ ./gradlew init:wrapper:init

BUILD SUCCESSFUL

Total time: 0.772 secs

37

Добываем инструменты

Page 38: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Добыли

$ lsbuild.gradlegradlegradlewgradlew.batsettings.gradle

38

Page 39: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

$ lsbuild.gradlegradle/gradlewgradlew.batsettings.gradle

39

Добыли

Page 40: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

$ lsbuild.gradlegradle/gradlewgradlew.batsettings.gradle

40

Добыли

Page 41: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

$ lsbuild.gradlegradle/gradlewgradlew.batsettings.gradle

41

Добыли

Page 42: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

$ lsbuild.gradlegradle/gradlewgradlew.batsettings.gradle

42

Добыли

Page 43: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Добываем ресурсы

● Соберем./gradlew build

43

Page 44: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● Соберем./gradlew build

● Получилиls ./build/libs/project_name.jar

44

Добываем ресурсы

Page 45: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● Соберем./gradlew build

● Получилиls ./build/libs/project_name.jar

Где версия?45

Добываем ресурсы

Page 46: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Где моя версия, чувак?

$ cat build.gradle | grep version

46

Page 47: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Где моя версия, чувак?

$ cat build.gradle | grep version

Ничего!

47

Page 48: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Где моя версия, чувак?

$ cat build.gradle | grep version

Ничего!

$ echo "version = '1.0.1'" >> build.gradle

48

Page 49: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Где моя версия, чувак?

$ cat build.gradle | grep version

Ничего!

$ echo "version = '1.0.1'" >> build.gradle

$ ./gradlew clean build$ ls build/libs/

project_name-1.0.1.jar

49

Page 50: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Добываем ресурсы

● Указывать вручную./gradlew -Pversion=1.3.4-SNAPSHOT./gradlew -Pversion=1.3.4-Ы

50

Page 51: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● Брать из файлаversion = file("version.prop").text

51

Добываем ресурсы

Page 52: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Версия?

● Git/Metadataversion = new CustomVersion()

.loadFrom(file("version.prop"))

.appVersion()

52

Page 53: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

53

- Версия хранится в файле в git

Версия?

Page 54: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

54

- Версия хранится в файле в git- Синхронизировали версию - коммит

Версия?

Page 55: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

- Версия хранится в файле в git- Синхронизировали версию - коммит- Осложняется поиск по нужной версии

55

Версия?

Page 56: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Будь как зерг

● Zerg Rush?

56

Page 57: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● Zerg Rush?● google.com: gradle problem_name solution

57

Будь как зерг

Page 58: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● Zerg Rush?● google.com: gradle problem_name solution● Copy/Pastе into build.gradle

58

Будь как зерг

Page 59: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● Zerg Rush?● google.com: gradle problem_name solution● Copy/Paste into build.gradle

59

Будь как зерг

Page 60: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● GrGitversion = GrGit.open(file("."))

.head()

.abbreviatedId

60

Будь как зерг

Page 61: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● GrGitversion = GrGit.open(file("."))

.head()

.abbreviatedId● Не закоммитил – нет новой версии

61

Будь как зерг

Page 62: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

1: task release {2: doFirst {3: grgit.tag.add {4: name = version5: message = "Release of ${version}"6: }7: }8: }

Что делать с Git?

62

Page 63: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Порядок запуска

63

1. Task definition

Page 64: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Порядок запуска

64

1. Task definition

1: task release(type: Copy) {2: from(file('srcDir'))3: into(buildDir)4: }

Page 65: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Порядок запуска

65

1. Task definition

Task doFirstTask doFirst2. Task doFirst

1: task release(type: Copy) {2: from(file('srcDir'))3: into(buildDir)4: doFirst {//doing sth #1}5: doFirst {//doing sth #2}

Page 66: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Порядок запуска

66

1. Task definition

Task doFirstTask doFirst2. Task doFirst

Task doFirstTask doFirst3. Task doLast

1: task release(type: Copy) {2: from(file('srcDir'))3: into(buildDir)4: doFirst {//doing sth #1}5: doFirst {//doing sth #2}7: doLast {//doing sth #3}8: doLast {//doing sth #4}9: }

Page 67: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Порядок запуска

67

1. Task definition

Task doFirstTask doFirst2. Task doFirst

Task doFirstTask doFirst3. Task doLast

1: task release(type: Copy) {2: from(file('srcDir'))3: into(buildDir)4: doFirst {//doing sth #1}5: doFirst {//doing sth #2}7: doLast {//doing sth #3}8: doLast {//doing sth #4}9: }9: release.doLast {//do...#5}

Page 68: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Порядок запуска

68

1. Task definition

Task doFirstTask doFirst2. Task doFirst

Task doFirstTask doFirst3. Task doLast

1: task release(type: Copy) {2: from(file('srcDir'))3: into(buildDir)4: doFirst {//doing sth #1}5: doFirst {//doing sth #2}7: doLast {//doing sth #3}8: doLast {//doing sth #4}9: }9: release.doLast {//do...#5}10:release << {//do...#6}

Page 69: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

1: task preRelease {2: ...

Или с Gradle

69

Page 70: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

1: task preRelease {2: doFirst {4: def br = file(".git/HEAD").text - "ref: refs/head/"

70

Или с Gradle

Page 71: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

1: println "ref: refs/head/master" - "ref: refs/head/"

71

Groovy...

Page 72: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

1: println "ref: refs/head/master" - "ref: refs/head/" > "master "

72

Groovy...

Page 73: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

1: task preRelease {2: doFirst {4: def br = file(".git/HEAD").text - "ref: refs/head/"

73

Или с Gradle

Page 74: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

1: task preRelease {2: doFirst {4: def br = file(".git/HEAD").text - "ref: refs/head/" 5: def cid = file(".git/refs/heads/$br").text"

74

Или с Gradle

Page 75: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

1: task preRelease {2: doFirst {4: def br = file(".git/HEAD").text - "ref: refs/head/" 5: def cid = file(".git/refs/heads/$br").text" 6: def tag = grgit.tag.list()7: .first()8: .getName()

75

Или с Gradle

Page 76: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

1: task preRelease {2: doFirst {4: def br = file(".git/HEAD").text - "ref: refs/head/" 5: def cid = file(".git/refs/heads/$br").text" 6: def tag = grgit.tag.list()7: .first()8: .getName()9: version = tag + br && cid ? "-$br-$cid":"" 10:}11:tasks.release.dependsOn preRelease

76

Или с Gradle

Page 77: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Итогоv1.0.1-master-a6f5ac0677421f486bd273ba4016e51b7634afa9

77

Page 78: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

v1.0.1-master-a6f5ac0677421f486bd273ba4016e51b7634afa9

● uncommitted

78

Итого

Page 79: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

v1.0.1-master-a6f5ac0677421f486bd273ba4016e51b7634afa9

● uncommitted● release

79

Итого

Page 80: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

v1.0.1-master-a6f5ac0677421f486bd273ba4016e51b7634afa9

● uncommitted● release● dependencies

80

Итого

Page 81: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Метаданныеjar {

manifest { attributes(

"Manifest-Version" : "1.0","Implementation-Version": version,

) }

}

81

Page 82: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

jar { manifest {

attributes(["Manifest-Version" :"1.0", "Implementation-Version":version,] << System.getenv()

) }

}

82

Метаданные

Page 83: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Manifest-Version: 1.0Implementation-Title: ru.joker.demo#app;0.3.0-rc.2Module-Origin: ssh://git@git/joker/demo-app.gitBuild-Date: 2016-08-11_07:09:52Build-Id: LOCALImplementation-Version: 0.3.0-rc.2Build-Number: LOCALBuilt-By: tolkvChange: 18d2261Module-Source: /appBranch: masterSpring-Boot-Version: 1.3.6.RELEASEBuilt-Status: integrationGradle-Version: 2.13Build-Job: LOCALBuilt-OS: Mac OS XX-Compile-Target-JDK: 1.8Build-Host: tolkv-workStart-Class: ru.sense.user.UserApplicationX-Compile-Source-JDK: 1.8Created-By: 1.8.0_60-b27 (Oracle Corporation)Build-Java-Version: 1.8.0_60

Manifest.mf

83

Page 84: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Manifest-Version: 1.0Implementation-Title: ru.joker.demo#app;0.3.0-rc.2Module-Origin: ssh://git@git/joker/demo-app.gitBuild-Date: 2016-08-11_07:09:52Build-Id: LOCALImplementation-Version: 0.3.0-rc.2Build-Number: LOCALBuilt-By: tolkvChange: 18d2261Module-Source: /appBranch: masterSpring-Boot-Version: 1.3.6.RELEASEBuilt-Status: integrationGradle-Version: 2.13Build-Job: LOCALBuilt-OS: Mac OS XX-Compile-Target-JDK: 1.8Build-Host: tolkv-workStart-Class: ru.sense.user.UserApplicationX-Compile-Source-JDK: 1.8Created-By: 1.8.0_60-b27 (Oracle Corporation)Build-Java-Version: 1.8.0_60

Manifest.mf

84

Page 85: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Еще полезные ресурсы

85

● информация об окружении сборки +X LOC

Page 86: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● информация об окружении сборки +X LOC● автор +Y LOC

86

Еще полезные ресурсы

Page 87: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● информация об окружении сборки +X LOC● автор +Y LOC● git окружение в manifest +Z LOC● publish* +M LOC

87

Еще полезные ресурсы

Page 88: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● информация об окружении сборки +X LOC● автор +Y LOC● git окружение в manifest +Z LOC● publish* +M LOC

Все это в build.gradle88

Еще полезные ресурсы

Page 89: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● от 3х строчек

build.gradle

89

Page 90: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● от 3х строчек● до 2000

90

build.gradle

Page 91: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● от 3х строчек● до 2000● за 30 минут

91

build.gradle

Page 92: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● от 3х строчек● до 2000● за 30 минут● типичная история

92

build.gradle

Page 93: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Как повторить это все?

93

Page 94: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

94

● в другой команде

Как повторить это все?

Page 95: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

95

● в другой команде● на другом проекте

Как повторить это все?

Page 96: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Думай как зерг!

96

Page 97: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

build.gradle:apply from: "http://someorg.com/version.gradle"

Copy apply подход

97

Page 98: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

build.gradle:apply from: "http://someorg.com/version.gradle"apply from: "http://someorg.com/maven.gradle"

98

Copy apply подход

Page 99: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

build.gradle:apply from: "http://someorg.com/version.gradle"apply from: "http://someorg.com/maven.gradle"apply from: "http://someorg.com/check.gradle"

99

Copy apply подход

Page 100: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

build.gradle:apply from: "http://someorg.com/version.gradle"apply from: "http://someorg.com/maven.gradle"apply from: "http://someorg.com/check.gradle"apply from: "http://someorg.com/findbugs.gradle"apply from: "http://someorg.com/verify.gradle"apply from: "http://someorg.com/publish.gradle"apply from: "http://someorg.com/awesome!.gradle"

100

Copy apply подход

Page 101: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

build.gradle:apply from: "http://someorg.com/version.gradle"apply from: "http://someorg.com/maven.gradle"apply from: "http://someorg.com/check.gradle"apply from: "http://someorg.com/findbugs.gradle"apply from: "http://someorg.com/verify.gradle"apply from: "http://someorg.com/publish.gradle"apply from: "http://someorg.com/awesome!.gradle"apply from: "http://someorg.com/v1/awesome!.gradle"

101

Copy apply подход

Page 102: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Проблема актуальна● Статичные зависимости для Сборки

102

Page 103: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● Статичные зависимости для Сборки● Что если сломался или недоступен

http://someorg.com/awesome.gradle?

103

Проблема актуальна

Page 104: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● Статичные зависимости для Сборки● Что если сломался или недоступен

http://someorg.com/awesome.gradle?● Нужен принципиально новый подход

104

Проблема актуальна

Page 105: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Новый подходИмперативность vs декларативность

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

105

Page 106: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Императивность vs декларативность

● Статус проекта● Сложность проекта

106

Новый подходИмперативность vs декларативность

Page 107: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Императивность vs декларативность

● Статус проекта● Сложность проекта● Поддержка

107

Новый подходИмперативность vs декларативность

Page 108: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Императивность vs декларативность

● Статус проекта● Сложность проекта● Поддержка● Перспективы

108

Новый подходИмперативность vs декларативность

Page 109: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Декларативность● Безопасно

109

Page 110: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● Безопасно● Легко поддерживаемо

110

Декларативность

Page 111: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● Безопасно● Легко поддерживаемо● Понятно

111

Декларативность

Page 112: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

apply from: .../version.gradle"apply from: .../maven.gradle"apply from: .../check.gradle"apply from: .../findbugs.gradle"apply from: .../verfify.gradle"apply from: .../publish.gradle"apply from: .../awesome!.gradle"

Декларативный подход

apply plugin: "yourplugin"

112

Page 113: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

build.gradle:apply plugin: "version.plugin"apply plugin: "maven.plugin"apply plugin: "check.plugin"apply plugin: "findbugs.plugin"apply plugin: "verfify.plugin"apply plugin: "publish.plugin"apply plugin: "awesome.plugin"

113

Декларативный подход

Page 114: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Настраиваем каждый плагин:● информация об окружении сборки +X LOC● автор +Y LOC● git окружение в manifest +Z LOC● publish* +M LOC

Все это в build.gradle

Опять на те же грабли

114

Page 115: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Композиция плагинов

115

Page 116: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Сила в композицииapply plugin: "your.plugin.all" //2.1.+

116

Page 117: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

●class MyPlugin implements Plugin<Project> { void apply(Project project) { project.plugins.apply( ResolveProjectVersoinPlugin) }}

117

Сила в композиции

Page 118: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

●class MyPlugin implements Plugin<Project> { void apply(Project project) { project.plugins.apply( ResolveProjectVersoinPlugin) project.plugins.apply( AddGitTagPlugin) }}

118

Сила в композиции

Page 119: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

●class MyPlugin implements Plugin<Project> { void apply(Project project) { project.plugins.apply( ResolveProjectVersoinPlugin) project.plugins.apply( AddGitTagPlugin) project.plugins.apply( UserInfoPlugin) }}

119

Сила в композиции

Page 120: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

●class MyPlugin implements Plugin<Project> { void apply(Project project) { project.plugins.apply( ResolveProjectVersoinPlugin) project.plugins.apply( AddGitTagPlugin) project.plugins.apply( UserInfoPlugin) project.plugins.apply( DependencyLockPlugin)

}}

120

Сила в композиции

Page 121: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

●class MyPlugin implements Plugin<Project> { void apply(Project project) { project.plugins.apply( ResolveProjectVersoinPlugin) project.plugins.apply( AddGitTagPlugin) project.plugins.apply( UserInfoPlugin) project.plugins.apply( DependencyLockPlugin) project.tasks.withType(Test) { Test testTask -> testTask.minHeapSize = '32m' testTask.maxHeapSize = '256m' testTask.jvmArgs "-XX:MaxPermSize=512m" testTask.jacocoTestReport.executionData += files(...) testTask.testLogging.exceptionFormat = 'full' } }}

121

Сила в композиции

Page 122: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

apply plugin: "nebula.nebula-release"

● управление Git● управление номером версии● контроль за состоянием

репозитория

122

Сила в композиции

Page 123: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

$ ./gradlew snapshot / devSnapshot$ ./gradlew candidate$ ./gradlew final

Inferred project: ws, version: 0.18.0-dev.0.uncommitted+3791c32

Что получили

123

Page 124: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Inferred project: joker-demo-project, version: 0.18.0-dev.0.uncommitted+3791c32

124

Что получили

Page 125: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Inferred project: joker-demo-project, version: 0.18.0-dev.0.uncommitted+3791c32

Легко найти негодяя

125

Что получили

Page 126: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Inferred project: joker-demo-project, version: 0.18.0-dev.0.uncommitted+3791c32

Легко найти негодяя Если есть метаинформация

126

Что получили

Page 127: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

$ ./gradlew final* What went wrong:An exception occurred applying plugin request [id: 'nebula.nebula-release', version: '4.0.1']> Failed to apply plugin [id 'nebula.nebula-release'] > Final and candidate builds require all changes to be committed into Git.

127

Что получили

Page 128: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

$ git tagv0.8.3v0.9.0v0.9.1v0.10.0-rc.1v0.10.0-rc.2v0.10.0v0.14.0v0.15.0v0.16.0v0.17.0

128

Что получили

Page 129: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

$ ./gradlew final…BUILD SUCCESSFUL

$ git tag … v0.16.0v0.17.0v0.18.0 # <--- new version

129

Что получили

Page 130: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

$ gw final -Prelease.scope=patch…BUILD SUCCESSFUL

$ git tag … v0.16.0v0.17.0v0.18.0v0.18.1 # <--- new version

130

Что получили

Page 131: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● commit all for release check

Что еще

131

Page 132: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● commit all for release check● push to origin check

132

Что еще

Page 133: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● commit all for release check● push to origin check● add tags

133

Что еще

Page 134: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● commit all for release check● push to origin check● add tags● resolve version from tags and env

134

Что еще

Page 135: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● commit all for release check● push to origin check● add tags● resolve version from tags● tag in CI● tag in local● tag push

135

Что еще

Page 136: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Доставляемif [ "$TRAVIS_PULL_REQUEST" != "false" ]; then

./gradlew build

136

Page 137: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then

./gradlew build

elif [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_TAG" == "" ]; then

./gradlew -Prelease.travisci=true snapshot

137

Доставляем

Page 138: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then

./gradlew build

elif [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_TAG" == "" ]; then

./gradlew -Prelease.travisci=true snapshot

elif [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_TAG" != "" ]; then

case "$TRAVIS_TAG" in

*-rc\.*)

./gradlew -Prelease.travisci=true -Prelease.useLastTag=true candidate ;;

*)

./gradlew -Prelease.travisci=true -Prelease.useLastTag=true final

publishPlugins ;;

esac ... 138

Доставляем

Page 139: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then

./gradlew build

elif [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_TAG" == "" ]; then

./gradlew -Prelease.travisci=true snapshot

elif [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_TAG" != "" ]; then

case "$TRAVIS_TAG" in

*-rc\.*)

./gradlew -Prelease.travisci=true -Prelease.useLastTag=true candidate ;;

*)

./gradlew -Prelease.travisci=true -Prelease.useLastTag=true final

publishPlugins ;;

esac ... 139

Доставляем

Page 140: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Императивный подход● Классика Gradle

140

Page 141: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● Классика Gradle● Опасное ружье

141

Императивный подход

Page 142: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● Классика Gradle● Опасное ружье● Сложно контролировать

142

Императивный подход

Page 143: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Контроль● CheckStyle

143

Page 144: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● CheckStyle● PMD

144

Контроль

Page 145: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● CheckStyle● PMD● Codenarc

145

Контроль

Page 146: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● CheckStyle● PMD● Codenarc● Nebula Lint Plugin

146

Контроль

Page 147: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Gradle Linter

147

dependencies { compile 'org.slf4j:slf4j-api:1.7.21' compile group:'junit', name:'junit', version:'+'}

Page 148: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

148

plugins { id 'nebula.lint' version '5.1.0'}

gradleLint.rules = ['all-dependency']

dependencies { compile 'org.slf4j:slf4j-api:1.7.21' compile group:'junit', name:'junit', version:'+'}

Gradle Linter

Page 149: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

149

$ ./gradlew build…

this dependency is unused and can be removedwarning unused-dependency build.gradle:13compile 'org.slf4j:slf4j-api:1.7.21'

✖ build.gradle: 2 problems (0 errors, 2 warnings)

To apply fixes automatically, run fixGradleLint, review, and commit the changes.

Gradle Linter

Page 150: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

150

$ ./gradlew build…

this dependency is unused and can be removedwarning unused-dependency build.gradle:13compile 'org.slf4j:slf4j-api:1.7.21'

✖ build.gradle: 2 problems (0 errors, 2 warnings)

To apply fixes automatically, run fixGradleLint, review, and commit the changes.

Gradle Linter

Page 151: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

151

$ ./gradlew build fixGradleLint…

Corrected 2 lint problems

BUILD SUCCESSFUL

Total time: 0.714 secs

Gradle Linter

Page 152: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Сделать приятно всем?

152

Page 153: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

153

● приятно

Сделать приятно всем?

Page 154: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

154

● приятно● потому что можем

Сделать приятно всем?

Page 155: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

155

● приятно● потому что можем● gradle позволяет

Сделать приятно всем?

Page 156: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

156

Кто нам поможет?

Сделать приятно всем!

Page 157: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

157

Кто нам поможет?$HOME_DIR/.gradle/init.gradle

Сделать приятно всем!

Page 158: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

158

~/.gradle/init.gradle:

allprojects { apply plugin: GradleLintPlugin gradleLint.rules = [ 'all-dependency', 'dependency-parentheses', 'dependency-tuple']}

Сделать приятно всем!

Page 159: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

159

dependencies { compile 'org.slf4j:slf4j-api:1.7.21' compile group:'junit', name:'junit', version:'+'}

Сделать приятно всем!

Page 160: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

160

$ ./gradlew build…

use the shortcut form of the dependencywarning dependency-tuple build.gradle:

compile group:'junit', name:'junit', version:'+'

✖ build.gradle: 1 problems (0 errors, 2 warnings)

To apply fixes automatically, run fixGradleLint, review, and commit the changes.

Сделать приятно всем!

Page 161: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

161

$ ./gradlew build…

use the shortcut form of the dependencywarning dependency-tuple build.gradle:

compile group:'junit', name:'junit', version:'+'

✖ build.gradle: 1 problems (0 errors, 2 warnings)

To apply fixes automatically, run fixGradleLint, review, and commit the changes.

Сделать приятно всем!

Page 162: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

162

$ ./gradlew build…

use the shortcut form of the dependencywarning dependency-tuple build.gradle:

compile group:'junit', name:'junit', version:'+'

✖ build.gradle: 1 problems (0 errors, 2 warnings)

To apply fixes automatically, run fixGradleLint, review, and commit the changes.

Сделать приятно всем!

Page 163: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

163

dependencies { compile 'org.slf4j:slf4j-api:1.7.21' compile 'junit:junit:latest.release'}

:fixGradleLint

Page 164: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

164

dependencies { compile 'org.slf4j:slf4j-api:1.7.21' compile 'junit:junit:latest.release'}

:fixGradleLint

Page 165: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

version: 'latest.release'● Много зависимостей● У каждой своя версия● Придумали Bom

165

Page 166: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Альтернативы● Использовать всегда

последнюю версию● не все готовы● отнимает время в самый

неподходящий момент

166

Page 167: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Lock Dependencies● Создали проблему - решили проблему● Lock перед каждым релизом● Апдейт → Тесты → Update Lock

167

Page 168: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

compile 'joker.org:demo-lib1: latest.release'...compile 'joker.org:demo-libN: latest.release'

$ ./gradlew generateLock saveLock$ ./gradlew test$ ./gradlew commitLock

168

Lock Dependencies

Page 169: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

$ cat dependencies.lock{ "compile": { "com.google.guava:guava": { "locked": "14.0.1", "requested": "14.+" } }, "default": { "com.google.guava:guava": { "locked": "14.0.1", "requested": "14.+" } }, "runtime": { "com.google.guava:guava": { "locked": "14.0.1", ...

169

Lock Dependencies

Page 170: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Release больших кусков● Релиз менеджмент платформы● Много зависимостей● Инструмент для контроля

170

Page 171: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

● Релиз менеджмент платформы● Много зависимостей● Инструмент для контроля (не для зергов)

171

Release больших кусков

Page 172: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Dependency Controlapply plugin: 'nebula.dependency-recommender'

dependencyRecommendations { mavenBom module: 'netflix:platform: latest.release' propertiesFile uri: ' http://yourorg/extlib-bundle.properties ', name: 'prop'}

dependencyRecommendations { map recommendations: [ 'commons-logging:commons-logging': '1.1']}

dependencies { compile 'commons-logging:commons-logging' // version 1.1 is selected}

172

Page 173: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

dependencyRecommendations { mavenBom module: 'netflix:platform: latest.release' propertiesFile uri: ' http://yourorg/extlib-bundle.properties ', name: 'prop'}

dependencyRecommendations { map recommendations: [' commons-logging:commons-logging': '1.1']}

dependencies { compile 'commons-logging:commons-logging:1.0' // version 1.0 is selected}

173

Dependency Control

Page 174: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Сила в композиции●Plugin<Project> { void apply(Project project) { project.plugins.apply( GradleLintPlugin)

gradleLint.rules = ['dependency-parentheses' , 'dependency-tuple'

]

project.plugins.apply( JavadocJarPlugin) project.plugins.apply( SourceJarPlugin) project.plugins.apply( DependencyLockPlugin) project.tasks.withType(Test) { Test testTask -> testTask.testLogging.exceptionFormat = 'full' } }}

174

Page 175: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Итоги1. Zerg Rush - в нужный момент2. Императивный → Декларативный3. init.gradle + CI = ❤4. C Gradle можно и в enterprise

175

Page 176: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

176

Можно ли перестать быть зергом?

Page 177: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

GrGit - https://github.com/ajoberstar/grgit

Nebula Release Plugin -

Nebula Lint Plugin - https://github.com/nebula-plugins/gradle-lint-plugin

Nebula Dependency Lock Plugin

Nebula Dependency Recommender Plugin

177

Page 178: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

QA

178

Page 179: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

179

Page 180: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

180

Page 181: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

181

Page 182: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

QA

182

Page 183: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Нельзя просто так взять и зарелизить

183

Page 184: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Что будет● Source → Binary с помощью Gradle● Подводные камни● Хорошие практики● Поддержка скриптов сборки

184

Page 185: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

История проблемы

185

Page 186: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Нельзя просто так взять и зарелизить

?

186

Page 187: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Нельзя просто так взять и зарелизить

VCS

187

Page 188: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Нельзя просто так взять и зарелизить

ConflictsVCS

188

Page 189: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Нельзя просто так взять и зарелизить

Conflicts

Tools

VCS

189

Page 190: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Нельзя просто так взять и зарелизить

Conflicts

Tools Delivery

VCS

190

Page 191: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

Тяжеловато● Статичные зависимости для Сборки● Как передавать команде все это?● Что если сломался или недоступен

http://ext.ru/awesome.gradle?● Нужен принципиально новый подход● Нужен инструмент для валидации● Самое главное - зависимости

191

Page 192: RELEASE MANAGEMENT - assets.contentful.comassets.contentful.com/.../release-management-with-gradle.pdf · Релизь чаще — будет счастье! Каждый коммит

192

ДоставляемPR?./gradew build

./gradlew -Prelease.travisci=true snapshot

не PR инет тега

не PR иесть тег

./gradlew -Prelease.travisci=true -Prelease.useLastTag=true final