@@ -21,6 +21,7 @@ configurations {
21
21
}
22
22
23
23
dependencies {
24
+ // `javadocSources` is a special Configuration which is used as a basis for the aggregated-javadocs we produce
24
25
javadocSources sourceSets. main. allJava
25
26
}
26
27
@@ -29,6 +30,8 @@ dependencies {
29
30
// Publishing
30
31
31
32
java {
33
+ // Configure the Java "software component" to include javadoc and sources jars in addition to the classes jar.
34
+ // Ultimately, this component is what makes up the publication for this project.
32
35
withJavadocJar()
33
36
withSourcesJar()
34
37
}
@@ -98,130 +101,90 @@ publishing {
98
101
}
99
102
100
103
101
- var signingKey = resolveSigningKey()
102
- var signingPassword = findSigningProperty( " signingPassword" )
103
104
104
- signing {
105
- useInMemoryPgpKeys( signingKey, signingPassword )
106
105
107
- sign publishing. publications. publishedArtifacts
108
- }
109
106
110
- String resolveSigningKey () {
111
- var key = findSigningProperty( " signingKey" )
112
- if ( key != null ) {
113
- return key
114
- }
115
107
116
- var keyFile = findSigningProperty( " signingKeyFile" )
117
- if ( keyFile != null ) {
118
- return new File ( keyFile ). text
119
- }
108
+ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
109
+ // Signing
110
+
111
+ def signPublicationsTask = tasks. register(' signPublications' ) {
112
+ description " Grouping task which executes all Sign tasks"
120
113
121
- return null
114
+ dependsOn tasks . withType( Sign )
122
115
}
123
116
124
- String findSigningProperty (String propName ) {
125
- if ( System . getProperty( propName ) != null ) {
126
- logger. debug " Found `{}` as a system property" , propName
127
- return System . getProperty(propName )
128
- }
129
- else if ( System . getenv(). get( propName ) != null ) {
130
- logger. debug " Found `{}` as an env-var property" , propName
131
- return System . getenv(). get( propName )
132
- }
133
- else if ( project. hasProperty( propName ) ) {
134
- logger. debug " Found `{}` as a project property" , propName
135
- return project. hasProperty( propName )
136
- }
137
- else {
138
- logger. debug " Did not find `{}`" , propName
139
- return null
140
- }
117
+ tasks. named( " publishPublishedArtifactsPublicationToSonatypeRepository" ) {
118
+ // publishing depends on signing
119
+ dependsOn signPublicationsTask
141
120
}
142
121
122
+ tasks. register(' sign' ) {
123
+ description " Pseudonym for :signPublications"
124
+ dependsOn signPublicationsTask
125
+ }
143
126
144
- var signingTask = project. tasks. getByName( " signPublishedArtifactsPublication" ) as Sign
145
127
var signingExtension = project. getExtensions(). getByType(SigningExtension ) as SigningExtension
146
128
147
- task sign {
148
- dependsOn " signPublications"
149
- }
129
+ gradle. taskGraph. whenReady { TaskExecutionGraph graph ->
130
+ boolean wasSigningRequested = false
131
+ boolean wasPublishingRequested = false
132
+
133
+ graph. allTasks. each {task ->
134
+ if ( task instanceof Sign ) {
135
+ wasSigningRequested = true
136
+ }
137
+ else if ( task instanceof PublishToMavenRepository ) {
138
+ wasPublishingRequested = true
139
+ }
140
+ }
150
141
151
- task signPublications { t ->
152
- tasks. withType( Sign ). all { s ->
153
- t. dependsOn s
142
+ if ( wasPublishingRequested ) {
143
+ def ossrhUser = System . getenv(). get( " ORG_GRADLE_PROJECT_sonatypeUsername" )
144
+ def ossrhPass = System . getenv(). get( " ORG_GRADLE_PROJECT_sonatypePassword" )
145
+ if ( ossrhUser == null || ossrhPass == null ) {
146
+ throw new RuntimeException ( " Cannot perform publishing to OSSRH without credentials." )
147
+ }
148
+ logger. lifecycle " Publishing groupId: '" + project. group + " ', version: '" + project. version + " '"
154
149
}
155
- }
156
150
157
- signingTask. doFirst {
158
- if ( signingKey == null || signingPassword == null ) {
159
- throw new GradleException (
160
- " Cannot perform signing without GPG details. Please set the `signingKey` and `signingKeyFile` properties"
161
- )
151
+ if ( wasSigningRequested || wasPublishingRequested ) {
152
+ // signing was explicitly requested and/or we are publishing to Sonatype OSSRH
153
+ // - we need the signing to happen
154
+ signingExtension. required = true
155
+
156
+ var signingKey = resolveSigningKey()
157
+ var signingPassword = resolveSigningPassphrase()
158
+ signingExtension. useInMemoryPgpKeys( signingKey, signingPassword )
159
+ signingExtension. sign publishing. publications. publishedArtifacts
160
+ }
161
+ else {
162
+ // signing was not explicitly requested and we are not publishing to OSSRH,
163
+ // - disable all Sign tasks
164
+ tasks. withType( Sign ). each { enabled = false }
162
165
}
163
166
}
164
167
165
-
166
- boolean wasSigningExplicitlyRequested () {
167
- // check whether signing task was explicitly requested when running the build
168
- //
169
- // NOTE: due to https://discuss.gradle.org/t/how-to-tell-if-a-task-was-explicitly-asked-for-on-the-command-line/42853/3
170
- // we cannot definitively know whether the task was requested. Gradle really just does not expose this information.
171
- // so we make a convention - we check the "start parameters" object to see which task-names were requested;
172
- // the problem is that these are the raw names directly from the command line. e.g. it is perfectly legal to
173
- // say `gradlew signPubArtPub` in place of `gradlew signPublishedArtifactsPublication` - Gradle will simply
174
- // "expand" the name it finds. However, it does not make that available.
175
- //
176
- // so the convention is that we will check for the following task names
177
- //
178
- // for each of:
179
- // 1. `sign`
180
- // 2. `signPublications`
181
- // 3. `signPublishedArtifactsPublication`
182
- //
183
- // and we check both forms:
184
- // 1. "${taskName}"
185
- // 2. project.path + ":${taskName}"
186
- //
187
- // we need to check both again because of the "start parameters" discussion
188
-
189
- def signingTaskNames = [" sign" , " signPublications" , " signPublishedArtifactsPublication" ]
190
-
191
- for ( String taskName : signingTaskNames ) {
192
- if ( gradle. startParameter. taskNames. contains( taskName )
193
- || gradle. startParameter. taskNames. contains( " ${ project.path} :${ taskName} " ) ) {
194
- return true
195
- }
168
+ static String resolveSigningKey () {
169
+ var key = System . getenv(). get( " SIGNING_GPG_PRIVATE_KEY" )
170
+ if ( key != null ) {
171
+ return key
196
172
}
197
173
198
- return false
199
- }
174
+ var keyFile = System . getenv(). get( " SIGNING_GPG_PRIVATE_KEY_PATH" )
175
+ if ( keyFile != null ) {
176
+ return new File ( keyFile ). text
177
+ }
200
178
201
- if ( wasSigningExplicitlyRequested() ) {
202
- // signing was explicitly requested
203
- signingExtension. required = true
179
+ throw new RuntimeException ( " Cannot perform signing without GPG details." )
204
180
}
205
- else {
206
- gradle. taskGraph. whenReady { graph ->
207
- if ( graph. hasTask( signingTask ) ) {
208
- // signing is scheduled to happen.
209
- //
210
- // we know, from above if-check, that it was not explicitly requested -
211
- // so it is triggered via task dependency. make sure we want it to happen
212
- var publishingTask = project. tasks. getByName( " publishPublishedArtifactsPublicationToSonatypeRepository" ) as PublishToMavenRepository
213
- if ( graph. hasTask( publishingTask ) ) {
214
- // we are publishing to Sonatype OSSRH - we need the signing to happen
215
- signingExtension. required = true
216
- }
217
- else {
218
- // signing was not explicitly requested and we are not publishing to OSSRH,
219
- // so do not sign.
220
- signingTask. enabled = false
221
- }
222
- }
223
181
182
+ static String resolveSigningPassphrase () {
183
+ var passphrase = System . getenv(). get( " SIGNING_GPG_PASSPHRASE" )
184
+ if ( passphrase == null ) {
185
+ throw new RuntimeException ( " Cannot perform signing without GPG details." )
224
186
}
187
+ return passphrase
225
188
}
226
189
227
190
0 commit comments