From efce411a41cf8dbea5ec20fad826fc6bdcacc398 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Mon, 11 Jan 2021 14:40:38 +0100 Subject: [PATCH] Implement publish for release-yaml --- .../com/cloudogu/scm/GitHubUploadTask.groovy | 120 ++++++++++++++++++ .../com/cloudogu/scm/HttpUploadTask.groovy | 51 +------- .../com/cloudogu/scm/PackagingPlugin.groovy | 1 + .../groovy/com/cloudogu/scm/UploadTask.groovy | 86 +++++++++++++ scm-packaging/release-yaml/build.gradle | 20 +++ 5 files changed, 234 insertions(+), 44 deletions(-) create mode 100644 build-plugins/src/main/groovy/com/cloudogu/scm/GitHubUploadTask.groovy create mode 100644 build-plugins/src/main/groovy/com/cloudogu/scm/UploadTask.groovy diff --git a/build-plugins/src/main/groovy/com/cloudogu/scm/GitHubUploadTask.groovy b/build-plugins/src/main/groovy/com/cloudogu/scm/GitHubUploadTask.groovy new file mode 100644 index 0000000000..b4e623d0db --- /dev/null +++ b/build-plugins/src/main/groovy/com/cloudogu/scm/GitHubUploadTask.groovy @@ -0,0 +1,120 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.cloudogu.scm + +import com.google.common.base.Strings +import groovy.json.JsonOutput +import org.eclipse.jetty.client.HttpClient +import org.eclipse.jetty.client.api.Request +import org.eclipse.jetty.client.util.StringContentProvider +import org.eclipse.jetty.http.HttpMethod +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.Nested +import org.gradle.api.tasks.Optional + +import java.nio.charset.StandardCharsets + +class GitHubUploadTask extends UploadTask { + + @Input + @Optional + String apiToken + + @Input + String owner + + @Input + String repo + + @Input + String path + + @Input + String branch = "master" + + @Input + String message + + @Nested + private Author author = new Author() + + @Nested + private Author commiter + + void author(Closure closure) { + closure.setDelegate(author) + closure.call() + } + + void commiter(Closure closure) { + closure.setDelegate(commiter) + closure.call() + } + + @Override + Request createRequest(HttpClient client) { + Request request = client.newRequest("https://api.github.com/repos/${owner}/${repo}/contents/${path}") + request.method(HttpMethod.PUT) + request.header("Accept", "application/vnd.github.v3+json") + if (!Strings.isNullOrEmpty(apiToken)) { + request.header("Authorization","Token ${apiToken}") + } + + def body = [ + message: message, + branch: branch, + content: artifact.getBytes().encodeBase64().toString() + ] + if (author?.valid) { + body.author = [ + name: author.name, + email: author.email + ] + } + if (commiter?.valid) { + body.commiter = [ + name: commiter.name, + email: commiter.email + ] + } + request.content(new StringContentProvider(JsonOutput.toJson(body), StandardCharsets.UTF_8)) + return request + } + + static class Author { + + @Input + @Optional + String name + + @Input + @Optional + String email + + boolean isValid() { + !Strings.isNullOrEmpty(name) && !Strings.isNullOrEmpty(email) + } + } +} diff --git a/build-plugins/src/main/groovy/com/cloudogu/scm/HttpUploadTask.groovy b/build-plugins/src/main/groovy/com/cloudogu/scm/HttpUploadTask.groovy index 54ca036f96..024bebbc49 100644 --- a/build-plugins/src/main/groovy/com/cloudogu/scm/HttpUploadTask.groovy +++ b/build-plugins/src/main/groovy/com/cloudogu/scm/HttpUploadTask.groovy @@ -26,25 +26,17 @@ package com.cloudogu.scm import org.eclipse.jetty.client.HttpClient -import org.eclipse.jetty.client.api.ContentResponse +import org.eclipse.jetty.client.api.Request import org.eclipse.jetty.client.util.BasicAuthentication -import org.eclipse.jetty.util.ssl.SslContextFactory -import org.gradle.api.DefaultTask -import org.gradle.api.GradleException import org.gradle.api.tasks.Input import org.gradle.api.tasks.Optional -import org.gradle.api.tasks.TaskAction -import org.gradle.api.tasks.bundling.AbstractArchiveTask import org.slf4j.Logger import org.slf4j.LoggerFactory -class HttpUploadTask extends DefaultTask { +class HttpUploadTask extends UploadTask { private static final Logger LOG = LoggerFactory.getLogger(HttpUploadTask) - @Input - File artifact - @Input String snapshotUrl @@ -69,47 +61,18 @@ class HttpUploadTask extends DefaultTask { } } - void artifact(Object object) { - println object - println object.class - if (object instanceof AbstractArchiveTask) { - artifact = object.getArchiveFile().get().asFile - } else if (object instanceof File) { - artifact = object - } else if (object instanceof String) { - artifact = new File(object) - } else { - throw new IllegalArgumentException("unknown artifact type") - } - } - - @TaskAction - void upload() { + @Override + Request createRequest(HttpClient client) { URI uri = URI.create(createURL()) LOG.info("Upload {} with {} to {}", artifact, method, uri) - SslContextFactory.Client sslContextFactory = new SslContextFactory.Client() - HttpClient client = new HttpClient(sslContextFactory) client.getAuthenticationStore().addAuthenticationResult(new BasicAuthentication.BasicResult( uri, username, password )) - client.start() - try { - ContentResponse response = client.newRequest(uri) - .method(method) - .file(artifact.toPath()) - .send() - - int status = response.getStatus() - if (status >= 300) { - throw new GradleException("failed to upload artifact, server returned ${status}") - } else { - LOG.info("successfully upload artifact, server returned with status {}", status) - } - } finally { - client.stop() - } + return client.newRequest(uri) + .method(method) + .file(artifact.toPath()) } private String createURL() { diff --git a/build-plugins/src/main/groovy/com/cloudogu/scm/PackagingPlugin.groovy b/build-plugins/src/main/groovy/com/cloudogu/scm/PackagingPlugin.groovy index 2e371dc3ef..7d3876c4fd 100644 --- a/build-plugins/src/main/groovy/com/cloudogu/scm/PackagingPlugin.groovy +++ b/build-plugins/src/main/groovy/com/cloudogu/scm/PackagingPlugin.groovy @@ -34,6 +34,7 @@ class PackagingPlugin implements Plugin { project.ext.PackageYaml = PackageYamlTask project.ext.ReleaseYaml = ReleaseYamlTask project.ext.HttpUploadTask = HttpUploadTask + project.ext.GitHubUploadTask = GitHubUploadTask } } diff --git a/build-plugins/src/main/groovy/com/cloudogu/scm/UploadTask.groovy b/build-plugins/src/main/groovy/com/cloudogu/scm/UploadTask.groovy new file mode 100644 index 0000000000..e94180ef46 --- /dev/null +++ b/build-plugins/src/main/groovy/com/cloudogu/scm/UploadTask.groovy @@ -0,0 +1,86 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + + +package com.cloudogu.scm + +import org.eclipse.jetty.client.HttpClient +import org.eclipse.jetty.client.api.ContentResponse +import org.eclipse.jetty.client.api.Request +import org.eclipse.jetty.util.ssl.SslContextFactory +import org.gradle.api.DefaultTask +import org.gradle.api.GradleException +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.TaskAction +import org.gradle.api.tasks.bundling.AbstractArchiveTask +import org.slf4j.Logger +import org.slf4j.LoggerFactory + +abstract class UploadTask extends DefaultTask { + + private static final Logger LOG = LoggerFactory.getLogger(HttpUploadTask) + + @InputFile + File artifact + + @Input + boolean skip = false + + void artifact(Object object) { + if (object instanceof AbstractArchiveTask) { + artifact = object.getArchiveFile().get().asFile + } else if (object instanceof File) { + artifact = object + } else if (object instanceof String) { + artifact = new File(object) + } else { + throw new IllegalArgumentException("unknown artifact type") + } + } + + @TaskAction + void upload() { + if (skip) { + LOG.warn("upload is skipped") + } + SslContextFactory.Client sslContextFactory = new SslContextFactory.Client() + HttpClient client = new HttpClient(sslContextFactory) + try { + client.start() + ContentResponse response = createRequest(client).send() + int status = response.getStatus() + if (status >= 300) { + throw new GradleException("failed to upload artifact, server returned ${status}") + } else { + LOG.info("successfully upload artifact, server returned with status {}", status) + } + } finally { + client.stop() + } + } + + abstract Request createRequest(HttpClient client) + +} diff --git a/scm-packaging/release-yaml/build.gradle b/scm-packaging/release-yaml/build.gradle index 352e433bfd..113d27e5bc 100644 --- a/scm-packaging/release-yaml/build.gradle +++ b/scm-packaging/release-yaml/build.gradle @@ -1,3 +1,5 @@ +import com.cloudogu.scm.GitHubUploadTask + /* * MIT License * @@ -46,6 +48,24 @@ task distribution(type: ReleaseYaml) { configuration = configurations.packageYaml } +task publish(type: GitHubUploadTask) { + owner = "scm-manager" + repo = "website" + path = "content/releases/${project.version.replace('.', '-')}.yml" + branch = "master" + message = "add release descriptor for ${project.version}" + author { + name = "CES Marvin" + email = "cesmarvin@cloudogu.com" + } + artifact = file('build/libs/release.yml') + if (project.hasProperty("gitHubApiToken")) { + apiToken = project.property("gitHubApiToken") + } + skip = isSnapshot + dependsOn 'distribution' +} + license { header rootProject.file("LICENSE.txt") strictCheck true