forked from marcphilipp/nexus-publish-plugin
-
Notifications
You must be signed in to change notification settings - Fork 0
/
InitializeNexusStagingRepository.kt
132 lines (116 loc) · 5.38 KB
/
InitializeNexusStagingRepository.kt
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
129
130
131
132
/*
* Copyright 2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.marcphilipp.gradle.nexus
import de.marcphilipp.gradle.nexus.internal.NexusClient
import io.codearte.gradle.nexus.NexusStagingExtension
import org.gradle.api.DefaultTask
import org.gradle.api.GradleException
import org.gradle.api.artifacts.repositories.MavenArtifactRepository
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.Property
import org.gradle.api.publish.PublishingExtension
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.Optional
import org.gradle.api.tasks.TaskAction
import org.gradle.kotlin.dsl.property
import org.gradle.kotlin.dsl.the
import java.net.URI
import java.time.Duration
import javax.inject.Inject
@Suppress("UnstableApiUsage")
open class InitializeNexusStagingRepository @Inject
constructor(objects: ObjectFactory, extension: NexusPublishExtension, repository: NexusRepository, private val serverUrlToStagingRepoUrl: MutableMap<URI, URI>) : DefaultTask() {
@get:Input
val serverUrl: Property<URI> = objects.property()
@get:Optional
@get:Input
val username: Property<String> = objects.property()
@get:Optional
@get:Input
val password: Property<String> = objects.property()
@get:Optional
@get:Input
val packageGroup: Property<String> = objects.property()
@get:Optional
@get:Input
val stagingProfileId: Property<String> = objects.property()
@get:Input
val repositoryName: Property<String> = objects.property()
/**
* @see okhttp3.OkHttpClient.Builder.readTimeout
* @see okhttp3.OkHttpClient.Builder.writeTimeout
*/
@get:Internal
val clientTimeout: Property<Duration> = objects.property()
/**
* @see okhttp3.OkHttpClient.Builder.connectTimeout
*/
@get:Internal
val connectTimeout: Property<Duration> = objects.property()
init {
serverUrl.set(repository.nexusUrl)
username.set(repository.username)
password.set(repository.password)
packageGroup.set(extension.packageGroup)
stagingProfileId.set(repository.stagingProfileId)
repositoryName.set(repository.name)
clientTimeout.set(extension.clientTimeout)
connectTimeout.set(extension.connectTimeout)
this.onlyIf { extension.useStaging.getOrElse(false) }
}
@TaskAction
fun createStagingRepoAndReplacePublishingRepoUrl() {
val url = createStagingRepo()
replacePublishingRepoUrl(url)
}
internal fun createStagingRepo(): URI {
return serverUrlToStagingRepoUrl.computeIfAbsent(serverUrl.get()) { serverUrl ->
val client = NexusClient(serverUrl, username.orNull, password.orNull, clientTimeout.orNull, connectTimeout.orNull)
val stagingProfileId = determineStagingProfileId(client)
logger.info("Creating staging repository for stagingProfileId '{}'", stagingProfileId)
val stagingRepositoryId = client.createStagingRepository(stagingProfileId)
project.rootProject.plugins.withId("io.codearte.nexus-staging") {
val nexusStagingExtension = project.rootProject.the<NexusStagingExtension>()
try {
nexusStagingExtension.stagingRepositoryId.set(stagingRepositoryId)
} catch (e: NoSuchMethodError) {
logger.warn("For increased publishing reliability please update the io.codearte.nexus-staging plugin to at least version 0.20.0.\n" +
"If your version is at least 0.20.0, try to update the de.marcphilipp.nexus-publish plugin to its latest version.\n" +
"If this also does not make this warning go away, please report an issue for de.marcphilipp.nexus-publish.")
logger.debug("getStagingRepositoryId method not found on nexusStagingExtension", e)
}
}
client.getStagingRepositoryUri(stagingRepositoryId)
}
}
private fun determineStagingProfileId(client: NexusClient): String {
var stagingProfileId = stagingProfileId.orNull
if (stagingProfileId == null) {
val packageGroup = packageGroup.get()
logger.debug("No stagingProfileId set, querying for packageGroup '{}'", packageGroup)
stagingProfileId = client.findStagingProfileId(packageGroup)
?: throw GradleException("Failed to find staging profile for package group: $packageGroup")
}
return stagingProfileId
}
private fun replacePublishingRepoUrl(url: URI) {
val publishing = project.the<PublishingExtension>()
val repository = publishing.repositories.getByName(repositoryName.get()) as MavenArtifactRepository
logger.info("Updating URL of publishing repository '{}' to '{}'", repository.name, url)
repository.setUrl(url.toString())
}
}