|
| 1 | +package net.minecraftforge.gradleutils |
| 2 | + |
| 3 | +import groovy.json.JsonBuilder |
| 4 | +import groovy.transform.CompileStatic |
| 5 | +import org.gradle.api.DefaultTask |
| 6 | +import org.gradle.api.Project |
| 7 | +import org.gradle.api.provider.Property |
| 8 | +import org.gradle.api.provider.ProviderFactory |
| 9 | +import org.gradle.api.publish.maven.MavenPublication |
| 10 | +import org.gradle.api.tasks.Input |
| 11 | +import org.gradle.api.tasks.Optional |
| 12 | +import org.gradle.api.tasks.TaskAction |
| 13 | +import org.gradle.api.tasks.TaskProvider |
| 14 | +import org.jetbrains.annotations.ApiStatus |
| 15 | + |
| 16 | +import javax.inject.Inject |
| 17 | +import javax.net.ssl.SSLContext |
| 18 | +import java.net.http.HttpClient |
| 19 | +import java.net.http.HttpRequest |
| 20 | +import java.net.http.HttpResponse |
| 21 | +import java.time.Duration |
| 22 | + |
| 23 | +@CompileStatic |
| 24 | +@ApiStatus.Experimental |
| 25 | +abstract class PromoteArtifact extends DefaultTask { |
| 26 | + static TaskProvider<PromoteArtifact> register(Project project, MavenPublication publication) { |
| 27 | + project.tasks.register('promoteArtifact', PromoteArtifact) { task -> |
| 28 | + final webhookURL = GradleUtils.getEnvVar('PROMOTE_ARTIFACT_WEBHOOK', project.providers) |
| 29 | + final username = GradleUtils.getEnvVar('PROMOTE_ARTIFACT_WEBHOOK', project.providers) |
| 30 | + final password = GradleUtils.getEnvVar('PROMOTE_ARTIFACT_WEBHOOK', project.providers) |
| 31 | + task.onlyIf { webhookURL.present && username.present && password.present } |
| 32 | + |
| 33 | + task.artifactGroup.set publication.groupId |
| 34 | + task.artifactName.set publication.artifactId |
| 35 | + task.artifactVersion.set publication.version |
| 36 | + task.webhookURL.set webhookURL |
| 37 | + task.username.set username |
| 38 | + task.password.set password |
| 39 | + } |
| 40 | + } |
| 41 | + |
| 42 | + @Inject |
| 43 | + abstract ProviderFactory getProviders() |
| 44 | + |
| 45 | + PromoteArtifact() { |
| 46 | + this.artifactGroup.convention 'net.minecraftforge' |
| 47 | + this.artifactName.convention this.providers.provider { this.project.name } |
| 48 | + this.artifactVersion.convention this.providers.provider { String.valueOf this.project.version } |
| 49 | + this.promotionType.convention Type.LATEST |
| 50 | + } |
| 51 | + |
| 52 | + @Input |
| 53 | + abstract Property<String> getArtifactGroup() |
| 54 | + |
| 55 | + @Input |
| 56 | + abstract Property<String> getArtifactName() |
| 57 | + |
| 58 | + @Input |
| 59 | + abstract Property<String> getArtifactVersion() |
| 60 | + |
| 61 | + @Input |
| 62 | + @Optional |
| 63 | + abstract Property<Type> getPromotionType() |
| 64 | + |
| 65 | + @Input |
| 66 | + abstract Property<String> getWebhookURL() |
| 67 | + |
| 68 | + @Input |
| 69 | + abstract Property<String> getUsername() |
| 70 | + |
| 71 | + @Input |
| 72 | + abstract Property<String> getPassword() |
| 73 | + |
| 74 | + static enum Type { |
| 75 | + LATEST, RECOMMENDED; |
| 76 | + |
| 77 | + @Override |
| 78 | + String toString() { |
| 79 | + return super.toString().toLowerCase() |
| 80 | + } |
| 81 | + } |
| 82 | + |
| 83 | + @TaskAction |
| 84 | + void exec() { |
| 85 | + var client = HttpClient |
| 86 | + .newBuilder() |
| 87 | + .sslParameters(SSLContext.default.defaultSSLParameters.tap { protocols = ["TLSv1.3"] }) |
| 88 | + .build() |
| 89 | + |
| 90 | + var request = HttpRequest |
| 91 | + .newBuilder() |
| 92 | + .uri(URI.create(this.webhookURL.get())) |
| 93 | + .setHeader("Content-Type", 'application/json') |
| 94 | + .setHeader("Authorization", "Basic ${Base64.getEncoder().encodeToString("${this.username.get()}:${this.password.get()}".getBytes())}") |
| 95 | + .timeout(Duration.ofSeconds(10)) |
| 96 | + .POST(HttpRequest.BodyPublishers.ofString(new JsonBuilder( |
| 97 | + group: this.artifactGroup.get(), |
| 98 | + artifact: this.artifactName.get(), |
| 99 | + version: this.artifactVersion.get(), |
| 100 | + type: this.promotionType.getOrElse(Type.LATEST).toString() |
| 101 | + ).toPrettyString())) |
| 102 | + .build() |
| 103 | + |
| 104 | + var response = client.send(request, HttpResponse.BodyHandlers.ofString()) |
| 105 | + if (response.statusCode() != 200) { |
| 106 | + throw new RuntimeException("Failed to promote artifact: ${response.statusCode()} ${response.body()}") |
| 107 | + } |
| 108 | + } |
| 109 | +} |
0 commit comments