|
1 | 1 | apply plugin: 'release' |
2 | 2 |
|
3 | | -// Ignore release plugin's task because it calls out via GradleBuild. This is a good place to put an email to send out |
4 | | -task release(overwrite: true, dependsOn: commitNewVersion) << { |
5 | | - // This is a good place to put an email to send out |
6 | | -} |
7 | | -commitNewVersion.dependsOn updateVersion |
8 | | -updateVersion.dependsOn createReleaseTag |
9 | | -createReleaseTag.dependsOn preTagCommit |
10 | | -def buildTasks = tasks.matching { it.name =~ /:build/ } |
11 | | -preTagCommit.dependsOn buildTasks |
12 | | -preTagCommit.dependsOn checkSnapshotDependencies |
13 | | -//checkSnapshotDependencies.dependsOn confirmReleaseVersion // Introduced in 1.0, forces readLine |
14 | | -//confirmReleaseVersion.dependsOn unSnapshotVersion |
15 | | -checkSnapshotDependencies.dependsOn unSnapshotVersion // Remove once above is fixed |
16 | | -unSnapshotVersion.dependsOn checkUpdateNeeded |
17 | | -checkUpdateNeeded.dependsOn checkCommitNeeded |
18 | | -checkCommitNeeded.dependsOn initScmPlugin |
19 | | - |
20 | | -[ |
21 | | - uploadIvyLocal: 'uploadLocal', |
22 | | - uploadArtifactory: 'artifactoryPublish', // Call out to compile against internal repository |
23 | | - buildWithArtifactory: 'build' // Build against internal repository |
24 | | -].each { key, value -> |
| 3 | +[ uploadIvyLocal: 'uploadLocal', uploadArtifactory: 'artifactoryPublish', buildWithArtifactory: 'build' ].each { key, value -> |
25 | 4 | // Call out to compile against internal repository |
26 | 5 | task "${key}"(type: GradleBuild) { |
27 | 6 | startParameter = project.gradle.startParameter.newInstance() |
| 7 | + doFirst { |
| 8 | + startParameter.projectProperties = [status: project.status, preferredStatus: project.status] |
| 9 | + } |
28 | 10 | startParameter.addInitScript( file('gradle/netflix-oss.gradle') ) |
29 | 11 | startParameter.getExcludedTaskNames().add('check') |
30 | 12 | tasks = [ 'build', value ] |
31 | 13 | } |
32 | 14 | } |
33 | | -task releaseArtifactory(dependsOn: [checkSnapshotDependencies, uploadArtifactory]) |
34 | 15 |
|
35 | | -// Ensure upload happens before taggging but after all pre-checks |
36 | | -releaseArtifactory.dependsOn checkSnapshotDependencies |
37 | | -createReleaseTag.dependsOn releaseArtifactory |
38 | | -gradle.taskGraph.whenReady { taskGraph -> |
39 | | - if ( taskGraph.hasTask(uploadArtifactory) && rootProject.status == 'release' && !taskGraph.hasTask(':release') ) { |
40 | | - throw new GradleException('"release" task has to be run before uploading a release to Artifactory') |
| 16 | +// Marker task for following code to key in on |
| 17 | +task releaseCandidate(dependsOn: release) |
| 18 | +task forceCandidate { |
| 19 | + onlyIf { gradle.taskGraph.hasTask(releaseCandidate) } |
| 20 | + doFirst { project.status = 'candidate' } |
| 21 | +} |
| 22 | +task forceRelease { |
| 23 | + onlyIf { !gradle.taskGraph.hasTask(releaseCandidate) } |
| 24 | + doFirst { project.status = 'release' } |
| 25 | +} |
| 26 | +release.dependsOn([forceCandidate, forceRelease]) |
| 27 | + |
| 28 | +task uploadMavenCentral(dependsOn: subprojects.tasks.uploadMavenCentral) |
| 29 | +task releaseSnapshot(dependsOn: [uploadArtifactory, uploadMavenCentral]) |
| 30 | + |
| 31 | +// Ensure our versions look like the project status before publishing |
| 32 | +task verifyStatus << { |
| 33 | + def hasSnapshot = version.contains('-SNAPSHOT') |
| 34 | + if (project.status == 'snapshot' && !hasSnapshot) { |
| 35 | + throw new GradleException("Version (${version}) needs -SNAPSHOT if publishing snapshot") |
41 | 36 | } |
42 | 37 | } |
43 | | -subprojects.each { project -> |
44 | | - project.uploadMavenCentral.dependsOn rootProject.checkSnapshotDependencies |
45 | | - rootProject.createReleaseTag.dependsOn project.uploadMavenCentral |
| 38 | +uploadArtifactory.dependsOn(verifyStatus) |
| 39 | +uploadMavenCentral.dependsOn(verifyStatus) |
46 | 40 |
|
47 | | - gradle.taskGraph.whenReady { taskGraph -> |
48 | | - if ( taskGraph.hasTask(project.uploadMavenCentral) && !taskGraph.hasTask(':release') ) { |
49 | | - throw new GradleException('"release" task has to be run before uploading to Maven Central') |
50 | | - } |
| 41 | +// Ensure upload happens before taggging, hence upload failures will leave repo in a revertable state |
| 42 | +preTagCommit.dependsOn([uploadArtifactory, uploadMavenCentral]) |
| 43 | + |
| 44 | + |
| 45 | +gradle.taskGraph.whenReady { taskGraph -> |
| 46 | + def hasRelease = taskGraph.hasTask('commitNewVersion') |
| 47 | + def indexOf = { return taskGraph.allTasks.indexOf(it) } |
| 48 | + |
| 49 | + if (hasRelease) { |
| 50 | + assert indexOf(build) < indexOf(unSnapshotVersion), 'build target has to be after unSnapshotVersion' |
| 51 | + assert indexOf(uploadMavenCentral) < indexOf(preTagCommit), 'preTagCommit has to be after uploadMavenCentral' |
| 52 | + assert indexOf(uploadArtifactory) < indexOf(preTagCommit), 'preTagCommit has to be after uploadArtifactory' |
51 | 53 | } |
52 | 54 | } |
53 | 55 |
|
54 | 56 | // Prevent plugin from asking for a version number interactively |
55 | 57 | ext.'gradle.release.useAutomaticVersion' = "true" |
56 | 58 |
|
57 | 59 | release { |
58 | | - // http://tellurianring.com/wiki/gradle/release |
59 | | - failOnCommitNeeded=true |
60 | | - failOnPublishNeeded=true |
61 | | - failOnUnversionedFiles=true |
62 | | - failOnUpdateNeeded=true |
63 | | - includeProjectNameInTag=true |
64 | | - requireBranch = null |
| 60 | + git.requireBranch = null |
65 | 61 | } |
0 commit comments