forked from pact-foundation/pact-reference
-
Notifications
You must be signed in to change notification settings - Fork 0
/
release.groovy
executable file
·128 lines (110 loc) · 4.02 KB
/
release.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
124
125
126
127
128
#!/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 processBuilder = new ProcessBuilder(['sh', '-c', command])
.directory(workingDir)
if (closure) {
processBuilder.redirectErrorStream(true)
} else {
processBuilder.inheritIO()
}
def process = processBuilder.start()
if (closure) {
process.inputStream.eachLine closure
}
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'
ask('Execute Build?: [Y]') {
executeOnShell 'cargo clean'
executeOnShell 'mkdir -p ../release_artifacts'
executeOnShell 'cargo build'
executeOnShell 'cargo test'
}
ask('Execute CMake Build?: [Y]') {
executeOnShell 'mkdir -p build'
executeOnShell 'cd build && cmake ..'
executeOnShell 'cd build && cmake --build .'
}
def projectProps = new File('Cargo.toml').text
def versionMatch = projectProps =~ /(?m)version\s*=\s*"(.*)"/
def version = versionMatch[0][1]
def prevTag = 'git describe --abbrev=0 --tags --match=libpact_ffi-*'.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 commit -m 'update changelog for release $releaseVer'")
executeOnShell("git status")
executeOnShell("git diff HEAD^..HEAD")
}
ask('Tag and Push commits?: [Y]') {
executeOnShell 'git push'
executeOnShell("git tag libpact_ffi-v${releaseVer}")
executeOnShell 'git push --tags'
}
ask('Publish library to crates.io?: [Y]') {
executeOnShell 'rm -rf build'
executeOnShell 'cargo package'
executeOnShell 'cargo publish'
}
ask('Publish Conan packages?: [Y]') {
executeOnShell "cd conan/lib && conan create . pact/beta && CONAN_REVISIONS_ENABLED=1 conan upload pact_ffi/${releaseVer}@pact/beta -r=pact-foundation"
executeOnShell "cd conan/dll && conan create . pact/beta && CONAN_REVISIONS_ENABLED=1 conan upload pact_ffi_dll/${releaseVer}@pact/beta -r=pact-foundation"
}
def nextVer = Version.valueOf(releaseVer).incrementPatchVersion()
ask("Bump version to $nextVer?: [Y]") {
executeOnShell "sed -i -e 's/^version = \"${releaseVer}\"/version = \"${nextVer}\"/' Cargo.toml"
executeOnShell "sed -i -e 's/version = \"${releaseVer}\"/version = \"${nextVer}\"/' conan/lib/conanfile.py"
executeOnShell "sed -i -e 's/version = \"${releaseVer}\"/version = \"${nextVer}\"/' conan/dll/conanfile.py"
executeOnShell("cargo update")
executeOnShell("git add Cargo.toml README.md conan/lib/conanfile.py conan/dll/conanfile.py")
executeOnShell("git add ../Cargo.lock")
executeOnShell("git diff --cached")
ask("Commit and push this change?: [Y]") {
executeOnShell("git commit -m 'bump version to $nextVer'")
executeOnShell("git push")
}
}