mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-10-26 08:06:09 +01:00
Implement publish for release-yaml
This commit is contained in:
committed by
René Pfeuffer
parent
a2fd8ff2f1
commit
efce411a41
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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() {
|
||||
|
||||
@@ -34,6 +34,7 @@ class PackagingPlugin implements Plugin<Project> {
|
||||
project.ext.PackageYaml = PackageYamlTask
|
||||
project.ext.ReleaseYaml = ReleaseYamlTask
|
||||
project.ext.HttpUploadTask = HttpUploadTask
|
||||
project.ext.GitHubUploadTask = GitHubUploadTask
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user