Top Banner
Is It possible? Gradle in Enterprise
192

Gradle in Enterprise, Is it possible?

Jan 28, 2018

Download

Technology

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Gradle in Enterprise, Is it possible?

Is It possible?

Gradle in Enterprise

Page 2: Gradle in Enterprise, Is it possible?

@tolkv

@lavcraft

Page 3: Gradle in Enterprise, Is it possible?

Чего не будет

3

Page 4: Gradle in Enterprise, Is it possible?

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

4

Page 5: Gradle in Enterprise, Is it possible?

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

5

Чего не будет

Page 6: Gradle in Enterprise, Is it possible?

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

6

Чего не будет

Page 7: Gradle in Enterprise, Is it possible?

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

7

Чего не будет

Page 8: Gradle in Enterprise, Is it possible?

8

Что будет

Page 9: Gradle in Enterprise, Is it possible?

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

9

Что будет

Page 10: Gradle in Enterprise, Is it possible?

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

10

Page 11: Gradle in Enterprise, Is it possible?

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

11

Что будет

Page 12: Gradle in Enterprise, Is it possible?

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

12

Что будет

Page 13: Gradle in Enterprise, Is it possible?

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

13

Что будет

Page 14: Gradle in Enterprise, Is it possible?

Где мы

Bin

GIT CI Dev

Prod14

Page 15: Gradle in Enterprise, Is it possible?

Bin

GIT CI Dev

Prod15

Где мы

Page 16: Gradle in Enterprise, Is it possible?

Bin

GIT CI Dev

Prod16

Где мы

Page 17: Gradle in Enterprise, Is it possible?

Мотивация

17

Page 18: Gradle in Enterprise, Is it possible?

Мотивация

18

Page 19: Gradle in Enterprise, Is it possible?

Мотивация

19

Page 20: Gradle in Enterprise, Is it possible?

Плохой код

20

Page 21: Gradle in Enterprise, Is it possible?

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

21

Page 22: Gradle in Enterprise, Is it possible?

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

22

Page 23: Gradle in Enterprise, Is it possible?

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

23

Page 24: Gradle in Enterprise, Is it possible?

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

24

Page 25: Gradle in Enterprise, Is it possible?

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

25

Page 26: Gradle in Enterprise, Is it possible?

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

26

Page 27: Gradle in Enterprise, Is it possible?

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

27

Page 28: Gradle in Enterprise, Is it possible?

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

28

Page 29: Gradle in Enterprise, Is it possible?

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

29

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

Page 30: Gradle in Enterprise, Is it possible?

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

30

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

Page 31: Gradle in Enterprise, Is it possible?

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

31

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

Page 32: Gradle in Enterprise, Is it possible?

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

32

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

Page 33: Gradle in Enterprise, Is it possible?

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

33

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

Page 34: Gradle in Enterprise, Is it possible?

● build.gradle

34

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

Page 35: Gradle in Enterprise, Is it possible?

● build.gradle● settings.gradle

35

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

Page 36: Gradle in Enterprise, Is it possible?

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

36

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

Page 37: Gradle in Enterprise, Is it possible?

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

$ gradle wrapper --gradle-version 3.5

37

Page 38: Gradle in Enterprise, Is it possible?

$ gradle wrapper --gradle-version 3.5

:wrapperBUILD SUCCESSFUL

Total time: 1.835 secs

38

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

Page 39: Gradle in Enterprise, Is it possible?

$ ./gradlew init

39

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

Page 40: Gradle in Enterprise, Is it possible?

$ ./gradlew init:wrapper:init

BUILD SUCCESSFUL

Total time: 0.772 secs

40

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

Page 41: Gradle in Enterprise, Is it possible?

Добыли

$ lsbuild.gradlegradle/gradlewgradlew.batsettings.gradle

41

Page 42: Gradle in Enterprise, Is it possible?

$ lsbuild.gradlegradle/gradlewgradlew.batsettings.gradle

42

Добыли

Page 43: Gradle in Enterprise, Is it possible?

$ lsbuild.gradlegradle/gradlewgradlew.batsettings.gradle

43

Добыли

Page 44: Gradle in Enterprise, Is it possible?

$ lsbuild.gradlegradle/gradlewgradlew.batsettings.gradle

44

Добыли

Page 45: Gradle in Enterprise, Is it possible?

$ lsbuild.gradlegradle/gradlewgradlew.batsettings.gradle

45

Добыли

Page 46: Gradle in Enterprise, Is it possible?

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

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

46

Page 47: Gradle in Enterprise, Is it possible?

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

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

47

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

Page 48: Gradle in Enterprise, Is it possible?

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

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

Где версия?48

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

Page 49: Gradle in Enterprise, Is it possible?

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

$ cat build.gradle | grep version

49

Page 50: Gradle in Enterprise, Is it possible?

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

$ cat build.gradle | grep version

Ничего!

50

Page 51: Gradle in Enterprise, Is it possible?

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

$ cat build.gradle | grep version

Ничего!

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

51

Page 52: Gradle in Enterprise, Is it possible?

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

$ cat build.gradle | grep version

Ничего!

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

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

project_name-1.0.1.jar

52

Page 53: Gradle in Enterprise, Is it possible?

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

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

53

Page 54: Gradle in Enterprise, Is it possible?

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

54

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

Page 55: Gradle in Enterprise, Is it possible?

Версия?

● Git/Metadataversion = new CustomVersion()

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

.appVersion()

55

Page 56: Gradle in Enterprise, Is it possible?

56

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

Версия?

Page 57: Gradle in Enterprise, Is it possible?

57

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

Версия?

Page 58: Gradle in Enterprise, Is it possible?

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

58

Версия?

Page 59: Gradle in Enterprise, Is it possible?

Будь как зерг

● Zerg Rush?

59

Page 60: Gradle in Enterprise, Is it possible?

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

60

Будь как зерг

Page 61: Gradle in Enterprise, Is it possible?

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

61

Будь как зерг

Page 62: Gradle in Enterprise, Is it possible?

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

62

Будь как зерг

Page 63: Gradle in Enterprise, Is it possible?

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

.head()

.abbreviatedId

63

Будь как зерг

Page 64: Gradle in Enterprise, Is it possible?

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

.head()

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

64

Будь как зерг

Page 65: Gradle in Enterprise, Is it possible?

● Перезаписали существующую версию● Необходима защита от такого!

65

Проблемы

Page 66: Gradle in Enterprise, Is it possible?

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

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

66

Page 67: Gradle in Enterprise, Is it possible?

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

67

1. Task definition

Page 68: Gradle in Enterprise, Is it possible?

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

68

1. Task definition

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

Page 69: Gradle in Enterprise, Is it possible?

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

69

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 70: Gradle in Enterprise, Is it possible?

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

70

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 71: Gradle in Enterprise, Is it possible?

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

71

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 72: Gradle in Enterprise, Is it possible?

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

72

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 73: Gradle in Enterprise, Is it possible?

1: task preRelease {2: ...

Или с Gradle

73

Page 74: Gradle in Enterprise, Is it possible?

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

74

Или с Gradle

Page 75: Gradle in Enterprise, Is it possible?

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

75

Groovy...

Page 76: Gradle in Enterprise, Is it possible?

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

76

Groovy...

Page 77: Gradle in Enterprise, Is it possible?

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

77

Или с Gradle

Page 78: Gradle in Enterprise, Is it possible?

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

78

Или с Gradle

Page 79: Gradle in Enterprise, Is it possible?

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()

79

Или с Gradle

Page 80: Gradle in Enterprise, Is it possible?

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

80

Или с Gradle

Page 81: Gradle in Enterprise, Is it possible?

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

81

Page 82: Gradle in Enterprise, Is it possible?

v1.0.1-master-a6f5ac0677421f486bd273ba4016e51b7634afa9

● uncommitted

82

Итого

Page 83: Gradle in Enterprise, Is it possible?

v1.0.1-master-a6f5ac0677421f486bd273ba4016e51b7634afa9

● uncommitted● release

83

Итого

Page 84: Gradle in Enterprise, Is it possible?

v1.0.1-master-a6f5ac0677421f486bd273ba4016e51b7634afa9

● uncommitted● release● dependencies

84

Итого

Page 85: Gradle in Enterprise, Is it possible?

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

manifest { attributes(

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

) }

}

85

Page 86: Gradle in Enterprise, Is it possible?

jar { manifest {

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

) }

}

86

Метаданные

Page 87: Gradle in Enterprise, Is it possible?

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

87

Page 88: Gradle in Enterprise, Is it possible?

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

88

Page 89: Gradle in Enterprise, Is it possible?

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

89

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

Page 90: Gradle in Enterprise, Is it possible?

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

90

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

Page 91: Gradle in Enterprise, Is it possible?

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

91

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

Page 92: Gradle in Enterprise, Is it possible?

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

Все это в build.gradle92

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

Page 93: Gradle in Enterprise, Is it possible?

93

Важную проблему решали?

Page 94: Gradle in Enterprise, Is it possible?

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

build.gradle

94

Page 95: Gradle in Enterprise, Is it possible?

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

95

build.gradle

Page 96: Gradle in Enterprise, Is it possible?

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

96

build.gradle

Page 97: Gradle in Enterprise, Is it possible?

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

97

build.gradle

Page 98: Gradle in Enterprise, Is it possible?

Проблема №1

98

Page 99: Gradle in Enterprise, Is it possible?

99

Нахуа?!

Page 100: Gradle in Enterprise, Is it possible?

Проблема №2

100

Page 101: Gradle in Enterprise, Is it possible?

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

101

Page 102: Gradle in Enterprise, Is it possible?

102

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

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

Page 103: Gradle in Enterprise, Is it possible?

103

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

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

Page 104: Gradle in Enterprise, Is it possible?

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

104

Page 105: Gradle in Enterprise, Is it possible?

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

Copy apply подход

105

Page 106: Gradle in Enterprise, Is it possible?

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

106

Copy apply подход

Page 107: Gradle in Enterprise, Is it possible?

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

107

Copy apply подход

Page 108: Gradle in Enterprise, Is it possible?

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"

108

Copy apply подход

Page 109: Gradle in Enterprise, Is it possible?

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"

109

Copy apply подход

Page 110: Gradle in Enterprise, Is it possible?

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

110

Page 111: Gradle in Enterprise, Is it possible?

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

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

111

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

Page 112: Gradle in Enterprise, Is it possible?

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

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

112

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

Page 113: Gradle in Enterprise, Is it possible?

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

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

113

Page 114: Gradle in Enterprise, Is it possible?

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

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

114

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

Page 115: Gradle in Enterprise, Is it possible?

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

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

115

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

Page 116: Gradle in Enterprise, Is it possible?

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

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

116

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

Page 117: Gradle in Enterprise, Is it possible?

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

117

Page 118: Gradle in Enterprise, Is it possible?

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

118

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

Page 119: Gradle in Enterprise, Is it possible?

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

119

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

Page 120: Gradle in Enterprise, Is it possible?

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"

120

Page 121: Gradle in Enterprise, Is it possible?

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"

121

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

Page 122: Gradle in Enterprise, Is it possible?

maven {...

}publish {

...}verify {

...}...

122

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

Page 123: Gradle in Enterprise, Is it possible?

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

Все это в build.gradle

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

123

Page 124: Gradle in Enterprise, Is it possible?

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

124

Page 125: Gradle in Enterprise, Is it possible?

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

125

Page 126: Gradle in Enterprise, Is it possible?

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

126

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

Page 127: Gradle in Enterprise, Is it possible?

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

127

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

Page 128: Gradle in Enterprise, Is it possible?

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

128

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

Page 129: Gradle in Enterprise, Is it possible?

●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)

}}

129

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

Page 130: Gradle in Enterprise, Is it possible?

●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' } }}

130

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

Page 131: Gradle in Enterprise, Is it possible?

apply plugin: "nebula.nebula-release"

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

репозитория

131

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

Page 132: Gradle in Enterprise, Is it possible?

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

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

Что получили

132

Page 133: Gradle in Enterprise, Is it possible?

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

133

Что получили

Page 134: Gradle in Enterprise, Is it possible?

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

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

134

Что получили

Page 135: Gradle in Enterprise, Is it possible?

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

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

135

Что получили

Page 136: Gradle in Enterprise, Is it possible?

$ ./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.

136

Что получили

Page 137: Gradle in Enterprise, Is it possible?

$ 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

137

Что получили

Page 138: Gradle in Enterprise, Is it possible?

$ ./gradlew final…BUILD SUCCESSFUL

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

138

Что получили

Page 139: Gradle in Enterprise, Is it possible?

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

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

139

Что получили

Page 140: Gradle in Enterprise, Is it possible?

● commit all for release check

Что еще

140

Page 141: Gradle in Enterprise, Is it possible?

● commit all for release check● push to origin check

141

Что еще

Page 142: Gradle in Enterprise, Is it possible?

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

142

Что еще

Page 143: Gradle in Enterprise, Is it possible?

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

143

Что еще

Page 144: Gradle in Enterprise, Is it possible?

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

144

Что еще

Page 145: Gradle in Enterprise, Is it possible?

apply plugin: "nebula.maven-publish"

145

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

Page 146: Gradle in Enterprise, Is it possible?

apply plugin: "nebula.maven-publish"

apply plugin: 'maven-publish'

publishing {

publications {

nebula(MavenPublication) {

}

}

}146

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

Page 147: Gradle in Enterprise, Is it possible?

apply plugin: "nebula.maven-publish"

publishing {

publications {

nebula(MavenPublication) {

from components.web //or java

}

}

}147

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

Page 148: Gradle in Enterprise, Is it possible?

apply plugin: "nebula.maven-publish"

pom.withXml { configurations.compile.resolvedConfiguration .firstLevelModuleDependencies.each { dep -> asNode().dependencies[0].dependency.find { it.artifactId[0].text() == dep.moduleName && it.groupId[0].text() == dep.moduleGroup }?.scope[0]?.value = 'compile' } }}

148

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

Page 149: Gradle in Enterprise, Is it possible?

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

./gradlew build

149

Page 150: Gradle in Enterprise, Is it possible?

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

./gradlew build

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

./gradlew -Prelease.travisci=true snapshot

150

Доставляем

Page 151: Gradle in Enterprise, Is it possible?

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 ... 151

Доставляем

Page 152: Gradle in Enterprise, Is it possible?

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 ... 152

Доставляем

Page 153: Gradle in Enterprise, Is it possible?

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

153

Page 154: Gradle in Enterprise, Is it possible?

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

154

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

Page 155: Gradle in Enterprise, Is it possible?

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

155

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

Page 156: Gradle in Enterprise, Is it possible?

Контроль● CheckStyle

156

Page 157: Gradle in Enterprise, Is it possible?

● CheckStyle● PMD

157

Контроль

Page 158: Gradle in Enterprise, Is it possible?

● CheckStyle● PMD● Codenarc

158

Контроль

Page 159: Gradle in Enterprise, Is it possible?

159

Защита ног

Page 160: Gradle in Enterprise, Is it possible?

160

Защита ног

Page 161: Gradle in Enterprise, Is it possible?

● CheckStyle● PMD● Codenarc● Nebula Lint Plugin

161

Контроль

Page 162: Gradle in Enterprise, Is it possible?

Gradle Linter

162

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

Page 163: Gradle in Enterprise, Is it possible?

163

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 164: Gradle in Enterprise, Is it possible?

164

$ ./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 165: Gradle in Enterprise, Is it possible?

165

$ ./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 166: Gradle in Enterprise, Is it possible?

166

$ ./gradlew build fixGradleLint…

Corrected 2 lint problems

BUILD SUCCESSFUL

Total time: 0.714 secs

Gradle Linter

Page 167: Gradle in Enterprise, Is it possible?

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

167

Page 168: Gradle in Enterprise, Is it possible?

168

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

Page 169: Gradle in Enterprise, Is it possible?

169

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

Page 170: Gradle in Enterprise, Is it possible?

170

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

Page 171: Gradle in Enterprise, Is it possible?

171

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

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

Page 172: Gradle in Enterprise, Is it possible?

172

$ cat ~/.gradle/init.gradle:

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

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

Page 173: Gradle in Enterprise, Is it possible?

173

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

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

Page 174: Gradle in Enterprise, Is it possible?

174

$ ./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 175: Gradle in Enterprise, Is it possible?

175

$ ./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 176: Gradle in Enterprise, Is it possible?

176

$ ./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 177: Gradle in Enterprise, Is it possible?

177

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

:fixGradleLint

Page 178: Gradle in Enterprise, Is it possible?

178

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

:fixGradleLint

Page 179: Gradle in Enterprise, Is it possible?

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

179

Page 180: Gradle in Enterprise, Is it possible?

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

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

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

180

Page 181: Gradle in Enterprise, Is it possible?

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

181

Page 182: Gradle in Enterprise, Is it possible?

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

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

182

Lock Dependencies

Page 183: Gradle in Enterprise, Is it possible?

$ 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", ...

183

Lock Dependencies

Page 184: Gradle in Enterprise, Is it possible?

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

184

Page 185: Gradle in Enterprise, Is it possible?

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

185

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

Page 186: Gradle in Enterprise, Is it possible?

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}

186

Page 187: Gradle in Enterprise, Is it possible?

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}

187

Dependency Control

Page 188: Gradle in Enterprise, Is it possible?

Сила в композиции●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' } }}

188

Page 189: Gradle in Enterprise, Is it possible?

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

только осторожно189

Page 190: Gradle in Enterprise, Is it possible?

190

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

Page 191: Gradle in Enterprise, Is it possible?

Ссылки

GrGithttps://github.com/ajoberstar/grgit

Nebula Release Pluginhttps://github.com/nebula-plugins/nebula-release-plugin

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

Nebula Dependency Lock Plugin https://github.com/nebula-plugins/gradle-dependency-lock-plugin

Nebula Dependency Recommender Plugin https://github.com/nebula-plugins/nebula-dependency-recommender-plugin

191

Page 192: Gradle in Enterprise, Is it possible?

QA

192