forked from pact-foundation/pact-jvm
-
Notifications
You must be signed in to change notification settings - Fork 0
/
releasePrep.groovy
executable file
·123 lines (105 loc) · 3.57 KB
/
releasePrep.groovy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#!/usr/bin/env groovy
@Grab(group = 'com.github.zafarkhaja', module = 'java-semver', version = '0.9.0')
import com.github.zafarkhaja.semver.Version
def executeOnShell(String command, Closure closure = null) {
executeOnShell(command, new File(System.properties.'user.dir'), closure)
}
def executeOnShell(String command, File workingDir, Closure closure = null) {
println "==>: $command"
def process = new ProcessBuilder(['sh', '-c', command])
.directory(workingDir)
.redirectErrorStream(true)
.start()
def cl = closure
if (cl == null) {
cl = { println it }
}
process.inputStream.eachLine cl
process.waitFor()
if (process.exitValue() > 0) {
System.exit(process.exitValue())
}
}
void ask(String prompt, String defaultValue = 'Y', Closure cl) {
def promptValue = System.console().readLine(prompt + ' ').trim()
if (promptValue.empty) {
promptValue = defaultValue
}
if (promptValue.toUpperCase() == 'Y') {
cl.call()
}
}
executeOnShell 'git pull'
def javaVersion
executeOnShell("./gradlew --version 2>/dev/null | awk '/^JVM:/ { print \$2 }'") {
javaVersion = Version.valueOf(it.trim().replace('_', '+b'))
}
if (!javaVersion?.satisfies('>=1.8.0')) {
ask("You are building against Java $javaVersion. Do you want to exit?: [Y]") {
System.exit(1)
}
}
ask('Execute Build?: [Y]') {
executeOnShell './gradlew clean check install'
}
def projectProps = './gradlew :pact-jvm-consumer_2.11:properties'.execute().text.split('\n').inject([:]) { acc, v ->
if (v ==~ /\w+: .*/) {
def kv = v.split(':')
acc[kv[0].trim()] = kv[1].trim()
}
acc
}
def version = projectProps.version
def prevTag = 'git describe --abbrev=0 --tags'.execute().text.trim()
def changelog = []
executeOnShell("git log --pretty='* %h - %s (%an, %ad)' ${prevTag}..HEAD".toString()) {
println it
changelog << it
}
def releaseDesc = System.console().readLine('Describe this release: [Bugfix Release]').trim()
if (releaseDesc.empty) {
releaseDesc = 'Bugfix Release'
}
def releaseVer = System.console().readLine("What is the version for this release?: [$version]").trim()
if (releaseVer.empty) {
releaseVer = version
}
ask('Update Changelog?: [Y]') {
def changeLogFile = new File('CHANGELOG.md')
def changeLogFileLines = changeLogFile.readLines()
changeLogFile.withPrintWriter() { p ->
p.println(changeLogFileLines[0])
p.println()
p.println("# $releaseVer - $releaseDesc")
p.println()
changelog.each {
p.println(it)
}
changeLogFileLines[1..-1].each {
p.println(it)
}
}
executeOnShell("git add CHANGELOG.md")
executeOnShell("git diff --cached")
executeOnShell("git commit -m 'update changelog for release $releaseVer'")
executeOnShell("git status")
}
ask('Tag and Push commits?: [Y]') {
executeOnShell 'git push'
executeOnShell("git tag ${releaseVer.replaceAll('\\.', '_')}")
executeOnShell 'git push --tags'
}
ask('Publish artifacts to maven central?: [Y]') {
executeOnShell './gradlew clean uploadArchives :pact-jvm-provider-gradle_2.11:publishPlugins -S'
}
def nextVer = Version.valueOf(releaseVer).incrementPatchVersion()
ask("Bump version to $nextVer?: [Y]") {
executeOnShell "sed -i -e \"s/version = '${releaseVer}'/version = '${nextVer}'/\" build.gradle"
executeOnShell "sed -i -e \"s/def version = \\\"${releaseVer}\\\"/def version = \\\"${nextVer}\\\"/\" project/Build.scala"
executeOnShell("git add build.gradle project/Build.scala")
executeOnShell("git diff --cached")
ask("Commit and push this change?: [Y]") {
executeOnShell("git commit -m 'bump version to $nextVer'")
executeOnShell("git push")
}
}