@@ -117,134 +117,138 @@ def pushDocChangesTask = tasks.register( 'pushDocChanges', Exec ) {
117
117
118
118
def uploadDocumentationTask = tasks. register( ' uploadDocumentation' ) {
119
119
description " Upload documentation on the website"
120
- dependsOn pushDocChangesTask
121
120
group " Release"
121
+ dependsOn pushDocChangesTask
122
122
123
123
doLast {
124
124
logger. lifecycle " Documentation published on '${ docPublishRepoUri} ' branch '${ docPublishBranch} '"
125
125
}
126
126
}
127
127
128
- def createTagTask = tasks. register( ' createTag' ) {
129
- description " Create local tag"
128
+ def releaseChecksTask = tasks. register( " releaseChecks" ) {
129
+ description ' Checks and preparation for release'
130
+ group ' Release'
130
131
131
132
doFirst {
132
- if ( ! project. hasProperty( ' releaseVersion' ) || ! project. hasProperty( ' developmentVersion' )
133
- || ! project. hasProperty( ' gitRemote' ) || ! project. hasProperty( ' gitBranch' ) ) {
133
+ logger. lifecycle(" Checking that the working tree is clean..." )
134
+ String uncommittedFiles = executeGitCommand(' status' , ' --porcelain' )
135
+ if (! uncommittedFiles. isEmpty()) {
134
136
throw new GradleException (
135
- " Task 'createTag' requires all of the following properties to be set:"
136
- + " 'releaseVersion', 'developmentVersion', 'gitRemote' and 'gitBranch'."
137
+ " Cannot release because there are uncommitted or untracked files in the working tree.\n " +
138
+ " Commit or stash your changes first.\n " +
139
+ " Uncommitted files:\n " +
140
+ uncommittedFiles
137
141
)
138
142
}
139
- }
140
143
141
- doLast {
144
+ String gitBranchLocal = project. hasProperty( ' gitBranch' ) && ! project. property( ' gitBranch' ). isEmpty()
145
+ ? project. property( ' gitBranch' )
146
+ : executeGitCommand( ' branch' , ' --show-current' ). trim()
147
+
148
+ String gitRemoteLocal
149
+ if ( project. hasProperty( ' gitRemote' ) && ! project. property( ' gitRemote' ). isEmpty() ) {
150
+ gitRemoteLocal = project. property( ' gitRemote' )
151
+ }
152
+ else {
153
+ final String remotes = executeGitCommand( ' remote' , ' show' ). trim()
154
+ final List<String > tokens = remotes. tokenize()
155
+ if ( tokens. size() != 1 ) {
156
+ throw new GradleException ( " Could not determine `gitRemote` property for `releaseChecks` tasks." )
157
+ }
158
+ gitRemoteLocal = tokens. get( 0 )
159
+ }
160
+
161
+ project. ext {
162
+ gitBranch = gitBranchLocal
163
+ gitRemote = gitRemoteLocal
164
+ }
165
+
142
166
logger. lifecycle( " Switching to branch '${ project.gitBranch} '..." )
143
- executeGitCommand( ' switch ' , project. gitBranch )
167
+ executeGitCommand( ' checkout ' , project. gitBranch )
144
168
145
169
logger. lifecycle( " Checking that all commits are pushed..." )
146
170
String diffWithUpstream = executeGitCommand( ' diff' , ' @{u}' )
147
171
if ( ! diffWithUpstream. isEmpty() ) {
148
- throw new GradleException ( " There are commits on the branch to release that haven't been pushed yet" )
172
+ throw new GradleException (
173
+ " Cannot perform `ciRelease` tasks because there are un-pushed local commits .\n " +
174
+ " Push your commits first."
175
+ )
149
176
}
177
+ }
178
+ }
150
179
151
- logger. lifecycle( " Commit version update to '${ project.releaseVersion} '..." )
152
- project. projectVersionFile. text = " projectVersion=${ project.releaseVersion} "
153
- executeGitCommand( ' add' , ' .' )
154
- executeGitCommand( ' commit' , ' -m' , project. releaseVersion )
180
+ def preVerifyReleaseTask = tasks. register( " preVerifyRelease" ) {
181
+ group ' Release'
182
+ description ' Pre-verifies a release job execution (Run locally before a CI release)'
155
183
156
- String tag = project. releaseVersion
157
- if ( tag. endsWith( " .Final" ) ) {
158
- tag = tag. replace( " .Final" , " " )
159
- }
160
- logger. lifecycle( " Tagging '${ tag} '..." )
161
- executeGitCommand( ' tag' , ' -a' , ' -m' , " Release ${ project.releaseVersion} " , tag )
162
- }
184
+ dependsOn tasks. clean
185
+ dependsOn assembleDocumentationTask
163
186
}
164
187
165
- def updateVersionsTask = tasks. register( " updateVersions" ) {
166
- description " Update the release and development version, commit the changes, and create the tag"
167
- group " Release"
168
- dependsOn createTagTask
188
+ def changeToReleaseVersionTask = tasks. register( ' changeToReleaseVersion' ) {
189
+ description ' Updates `gradle/version.properties` file to the specified release-version'
190
+ group ' Release'
191
+
192
+ dependsOn releaseChecksTask
169
193
170
194
doFirst {
171
- if ( ! project. hasProperty( ' releaseVersion' ) || ! project. hasProperty( ' developmentVersion' )
172
- || ! project. hasProperty( ' gitRemote' ) || ! project. hasProperty( ' gitBranch' ) ) {
173
- throw new GradleException (
174
- " Task 'releasePrepare' requires all of the following properties to be set:"
175
- + " 'releaseVersion', 'developmentVersion', 'gitRemote' and 'gitBranch'."
176
- )
177
- }
195
+ logger. lifecycle( " Updating version-file to release-version : `${ project.releaseVersion} `" )
196
+ updateVersionFile( " ${ project.releaseVersion} " )
178
197
}
198
+ }
179
199
180
- doLast {
181
- logger. lifecycle( " Checking that the working tree is clean..." )
182
- String uncommittedFiles = executeGitCommand( ' status' , ' --porcelain' )
183
- if ( ! uncommittedFiles. isEmpty() ) {
184
- throw new GradleException (
185
- " Cannot update the version because there are uncommitted changes in the working tree."
186
- + " \n Uncommitted files:\n " + uncommittedFiles
187
- )
188
- }
200
+ def gitPreparationForReleaseTask = tasks. register( ' gitPreparationForRelease' ) {
201
+ dependsOn releaseChecksTask
202
+ dependsOn changeLogFileTask
203
+ dependsOn changeToReleaseVersionTask
189
204
190
- logger . lifecycle( " Adding commit to update version to ' ${ project.developmentVersion } '... " )
191
- project . projectVersionFile . text = " projectVersion= ${ project.developmentVersion } "
205
+ doLast {
206
+ logger . lifecycle( " Performing pre-steps Git commit : ` ${ project.releaseVersion } ` " )
192
207
executeGitCommand( ' add' , ' .' )
193
- executeGitCommand( ' commit' , ' -m' , project. developmentVersion )
208
+ executeGitCommand( ' commit' , ' -m' , " Pre-steps for release : ` ${ project.ormVersion.fullName } ` " )
194
209
}
195
210
}
196
211
197
- def releasePrepareTask = tasks. register( " releasePrepare" ) {
198
- description " On a local checkout, performs all the changes required for the release, website updates included"
199
- group " Release"
200
- dependsOn updateVersionsTask, commitDocChangesTask
212
+ def changeToDevelopmentVersionTask = tasks. register( ' changeToDevelopmentVersion' ) {
213
+ description ' Updates `gradle/version.properties` file to the specified development-version'
214
+ group ' Release'
215
+
216
+ dependsOn releaseChecksTask
201
217
202
218
doFirst {
203
- if ( ! project. hasProperty( ' releaseVersion' ) || ! project. hasProperty( ' developmentVersion' )
204
- || ! project. hasProperty( ' gitRemote' ) || ! project. hasProperty( ' gitBranch' ) ) {
205
- throw new GradleException (
206
- " Task 'releasePrepare' requires all of the following properties to be set:"
207
- + " 'releaseVersion', 'developmentVersion', 'gitRemote' and 'gitBranch'."
208
- )
209
- }
219
+ logger. lifecycle( " Updating version-file to development-version : `${ project.developmentVersion} `" )
220
+ updateVersionFile( " ${ project.developmentVersion} " )
210
221
}
211
222
}
212
223
213
- def pushChangesTask = tasks. register( " pushChanges" ) {
214
- description " Push the changes after preparing the release"
215
- dependsOn releasePrepareTask
216
-
217
- doFirst {
218
- if ( ! project. hasProperty( ' releaseVersion' ) || ! project. hasProperty( ' developmentVersion' )
219
- || ! project. hasProperty( ' gitRemote' ) || ! project. hasProperty( ' gitBranch' ) ) {
220
- throw new GradleException (
221
- " Task 'ciRelease' requires all of the following properties to be set:"
222
- + " 'releaseVersion', 'developmentVersion', 'gitRemote' and 'gitBranch'."
223
- )
224
- }
225
- }
224
+ def releasePreparePostGitTask = tasks. register( ' gitTasksAfterRelease' ) {
225
+ dependsOn changeToDevelopmentVersionTask
226
226
227
227
doLast {
228
- logger. lifecycle( " Checking that the working tree is clean..." )
229
- String uncommittedFiles = executeGitCommand( ' status' , ' --porcelain' )
230
- if ( ! uncommittedFiles. isEmpty() ) {
231
- throw new GradleException (
232
- " Cannot release because there are uncommitted or untracked files in the working tree."
233
- + " \n Commit or stash your changes first."
234
- + " \n Uncommitted files:\n " + uncommittedFiles
235
- )
236
- }
237
- String tag = project. releaseVersion
238
- if ( tag. endsWith( " .Final" ) ) {
239
- tag = tag. replace( " .Final" , " " )
228
+ if ( project. createTag ) {
229
+ logger. lifecycle( " Tagging release : `${ project.releaseTag} `..." )
230
+ executeGitCommand( ' tag' , ' -a' , project. releaseTag, ' -m' , " Release $project . projectVersion . fullName " )
240
231
}
241
- logger. lifecycle( " Pushing branch and tag to remote '${ project.gitRemote} '..." )
242
- executeGitCommand( ' push' , ' --atomic' , project. gitRemote, project. gitBranch, tag )
243
- logger. lifecycle( " Done!" )
232
+
233
+ logger. lifecycle( " Performing post-steps Git commit : `${ project.releaseVersion} `" )
234
+ executeGitCommand( ' add' , ' .' )
235
+ executeGitCommand( ' commit' , ' -m' , " Post-steps for release : `${ project.projectVersion.fullName} `" )
244
236
}
245
237
}
246
238
239
+ void updateVersionFile (String version ) {
240
+ logger. lifecycle( " Updating `gradle/version.properties` version to `${ version} `" )
241
+ project. projectVersionFile. text = " projectVersion=${ version} "
242
+ }
243
+
244
+ def publishReleaseArtifactsTask = tasks. register( ' publishReleaseArtifacts' ) {
245
+ mustRunAfter gitPreparationForReleaseTask
246
+
247
+ dependsOn uploadDocumentationTask
248
+ }
249
+
247
250
def releasePerformPostGitTask = tasks. register( ' gitTasksAfterReleasePerform' ) {
251
+
248
252
doLast {
249
253
if ( project. createTag ) {
250
254
logger. lifecycle( " Pushing branch and tag to remote `${ project.gitRemote} `..." )
@@ -257,12 +261,21 @@ def releasePerformPostGitTask = tasks.register( 'gitTasksAfterReleasePerform' )
257
261
}
258
262
}
259
263
264
+ def releasePrepareTask = tasks. register( " releasePrepare" ) {
265
+ description " On a local checkout, performs all the changes required for the release, website updates included"
266
+ group " Release"
267
+
268
+ dependsOn assembleDocumentationTask
269
+ dependsOn commitDocChangesTask
270
+
271
+ finalizedBy releasePreparePostGitTask
272
+ }
273
+
260
274
def releasePerformTask = tasks. register( ' releasePerform' ) {
261
275
group ' Release'
262
276
description ' Performs a release on local check-out, including updating changelog and '
263
277
264
- mustRunAfter releasePrepareTask
265
- dependsOn uploadDocumentationTask
278
+ dependsOn publishReleaseArtifactsTask
266
279
267
280
finalizedBy releasePerformPostGitTask
268
281
}
@@ -273,12 +286,15 @@ def releasePerformTask = tasks.register( 'releasePerform' ) {
273
286
def releaseTask = tasks. register( ' release' ) {
274
287
description ' Performs a release on local check-out'
275
288
group ' Release'
276
- dependsOn pushChangesTask
289
+
290
+ dependsOn releasePrepareTask
291
+ dependsOn releasePerformTask
277
292
}
278
293
279
294
def ciReleaseTask = tasks. register( ' ciRelease' ) {
280
295
description " Triggers the release on CI: creates commits to change the version (release, then development), creates a tag, pushes everything. Then CI will take over and perform the release."
281
296
group " Release"
297
+
282
298
dependsOn releaseTask
283
299
}
284
300
@@ -350,12 +366,12 @@ gradle.getTaskGraph().whenReady {tg->
350
366
}
351
367
}
352
368
353
- assert releaseVersionLocal != null && developmentVersionLocal != null ;
369
+ assert releaseVersionLocal != null && developmentVersionLocal != null
354
370
355
371
// set up information for the release-related tasks
356
372
project. ext {
357
- releaseVersion = releaseVersionLocal;
358
- developmentVersion = developmentVersionLocal;
373
+ releaseVersion = releaseVersionLocal
374
+ developmentVersion = developmentVersionLocal
359
375
createTag = ! project. hasProperty(' noTag' )
360
376
releaseTag = project. createTag ? determineReleaseTag(releaseVersionLocal) : ' '
361
377
}
@@ -365,5 +381,5 @@ gradle.getTaskGraph().whenReady {tg->
365
381
static String determineReleaseTag (String releaseVersion ) {
366
382
return releaseVersion. endsWith( ' .Final' )
367
383
? releaseVersion. replace( " .Final" , " " )
368
- : releaseVersion;
384
+ : releaseVersion
369
385
}
0 commit comments