192
Is It possible? Gradle in Enterprise

Gradle in Enterprise, Is it possible?

  • Upload
    -

  • View
    141

  • Download
    0

Embed Size (px)

Citation preview

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