1414 * limitations under the License.
1515 */
1616
17+ import org.gradle.util.VersionNumber
18+
1719plugins {
1820 // https://docs.gradle.org/current/userguide/java_library_plugin.html
1921 id ' java-library'
@@ -26,6 +28,9 @@ plugins {
2628
2729 // https://docs.gradle.org/current/userguide/idea_plugin.html
2830 id ' idea'
31+
32+ // https://ajoberstar.org/grgit/grgit-gradle.html
33+ id ' org.ajoberstar.grgit' version ' 3.1.1'
2934}
3035
3136repositories {
@@ -140,3 +145,107 @@ jar {
140145 )
141146 }
142147}
148+
149+ task releaseCommitsAndTag () {
150+ description ' Make release commits and the tag necessary for release'
151+ group ' GitHub release'
152+
153+ doFirst {
154+ checkReleasePrerequisites()
155+ }
156+
157+ outputs. upToDateWhen {
158+ def tag = releaseTag()
159+ def tagExists = grgit. tag. list(). stream(). anyMatch { it. getName() == tag }
160+ if (tagExists) {
161+ logger. quiet(" Tag $tag exists" )
162+ }
163+ return tagExists
164+ }
165+
166+ doLast {
167+ def releaseMessage = " Release version $releaseVersion "
168+ def tag = releaseTag()
169+
170+ setVersionInGradleProperties(releaseVersion)
171+
172+ logger. quiet(' Committing' )
173+ grgit. add(patterns : [' gradle.properties' ])
174+ grgit. commit(message : releaseMessage)
175+
176+ logger. quiet(' Tagging with tag {}' , tag)
177+ grgit. tag. add(name : tag, annotate : true , message : releaseMessage)
178+
179+ setVersionInGradleProperties(nextSnapshotVersion)
180+
181+ logger. quiet(' Committing' )
182+ grgit. add(patterns : [' gradle.properties' ])
183+ grgit. commit(message : " Bump version to $nextSnapshotVersion " )
184+ }
185+ }
186+
187+ def checkReleasePrerequisites () {
188+ if (! project. hasProperty(' releaseVersion' )) {
189+ throw new GradleException (' releaseVersion property is not set' )
190+ }
191+
192+ if (! (releaseVersion ==~ / \d +\.\d +\.\d +/ )) {
193+ throw new GradleException (" Invalid releaseVersion format, must be 'x.y.z'" )
194+ }
195+
196+ if (! project. hasProperty(' nextSnapshotVersion' )) {
197+ throw new GradleException (' nextSnapshotVersion property is not set' )
198+ }
199+
200+ if (! (nextSnapshotVersion ==~ / \d +\.\d +\.\d +-SNAPSHOT/ )) {
201+ throw new GradleException (" Invalid nextSnapshotVersion format, must be 'x.y.z-SNAPSHOT'" )
202+ }
203+
204+ def releaseVersionParsed = VersionNumber . parse(releaseVersion)
205+ def nextSnapshotVersionParsed = VersionNumber . parse(nextSnapshotVersion)
206+ if (nextSnapshotVersionParsed. getBaseVersion() <= releaseVersionParsed. getBaseVersion()) {
207+ throw new GradleException (' Next snapshot version must be higher than release version' )
208+ }
209+
210+ if (grgit. branch. current(). getName() != ' master' ) {
211+ throw new GradleException (" Repository must be on branch 'master'" )
212+ }
213+ }
214+
215+ def setVersionInGradleProperties (ver ) {
216+ logger. quiet(' Changing version in gradle.properties to {}' , ver)
217+ file(' gradle.properties.new' ). withWriter { writer ->
218+ file(' gradle.properties' ). eachLine { line ->
219+ if (line ==~ / version=.*/ ) {
220+ writer. writeLine(" version=${ ver} " )
221+ } else {
222+ writer. writeLine(line)
223+ }
224+ }
225+ }
226+ file(' gradle.properties.new' ). renameTo(' gradle.properties' )
227+ }
228+
229+ task releasePush () {
230+ description ' Push commits and release tag'
231+ group ' GitHub release'
232+
233+ dependsOn releaseCommitsAndTag
234+
235+ outputs. upToDateWhen {
236+ return false
237+ }
238+
239+ doLast {
240+ def githubRepo = ' https://github.com/aiven/aiven-kafka-connect-transforms'
241+
242+ grgit. push(tags : false , dryRun : false )
243+ grgit. push(tags : true , dryRun : false )
244+ logger. warn(' Please visit {}/releases/tag/{} and add the distribution files and changelog' , githubRepo, releaseTag())
245+ }
246+
247+ }
248+
249+ def releaseTag () {
250+ return ' v' + releaseVersion
251+ }
0 commit comments