This is an automated email from the ASF dual-hosted git repository. toulmean pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-tuweni.git
commit 4bb47f3fdc60d99cc677b4de46f2d6cebd8b0348 Author: Antoine Toulme <[email protected]> AuthorDate: Sun Jul 14 22:07:41 2019 -0700 Add stage task --- .gitignore | 1 + build.gradle | 2 + gradle/stage.gradle | 246 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 249 insertions(+) diff --git a/.gitignore b/.gitignore index 14ea8fc..6ddc3c5 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,4 @@ target/ tmp/ build/ out/ +_staged diff --git a/build.gradle b/build.gradle index abc8fa4..127240d 100644 --- a/build.gradle +++ b/build.gradle @@ -88,6 +88,8 @@ gradle.startParameter.taskNames = expandedTaskList.flatten() apply from: "${rootDir}/wrapper.gradle" +apply from: "${rootDir}/gradle/stage.gradle" + ////// // RAT checks diff --git a/gradle/stage.gradle b/gradle/stage.gradle new file mode 100644 index 0000000..455c18c --- /dev/null +++ b/gradle/stage.gradle @@ -0,0 +1,246 @@ +import org.gradle.api.internal.project.IsolatedAntBuilder + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +apply plugin: StagePlugin + +class VerifyStageTask extends DefaultTask { + + @TaskAction + def run() { + // check if credentials are set + if (project.findProperty("asfNexusUsername") == null) { + throw new GradleException("Missing nexus username") + } + if (project.findProperty("asfNexusPassword") == null) { + throw new GradleException("Missing nexus password") + } + if (project.findProperty('signing.keyId') == null) { + throw new GradleException("Missing GPG key ID") + } + if (project.findProperty('signing.gnupg.keyName') == null) { + throw new GradleException("Missing GPG key name") + } + // make sure we are building a release + if (System.getenv('BUILD_RELEASE') != 'true') { + throw new GradleException("BUILD_RELEASE is not set to true. Run export BUILD_RELEASE=true") + } + // make sure signing is enabled + if (System.getenv("ENABLE_SIGNING") != 'true') { + throw new GradleException("ENABLE_SIGNING is not set to true. Run export ENABLE_SIGNING=true") + } + + // make sure there are no local changes. + def status = new ByteArrayOutputStream() + project.exec { + commandLine 'git', 'status', '-s' + standardOutput = status + } + if (status.size() != 0) { + throw new GradleException("Local changes detected") + } + + // check the version matches the branch. + def branchOutput = new ByteArrayOutputStream() + project.exec { + commandLine 'git', 'rev-parse', '--abbrev-ref', 'HEAD' + standardOutput = branchOutput + } + def branch = branchOutput.toString().trim() + if (!project.version.startsWith(branch)) { + throw new GradleException("$project.version does not start with $branch") + } + } +} + +class StageBuildTask extends DefaultTask { + + @TaskAction + def run() { + // run the build, publishing the artifacts to Nexus as staging + project.exec { commandLine "./gradlew", "clean", "build" } + project.exec { commandLine "./gradlew", "publish" } + } +} + +class SubversionStageTask extends DefaultTask { + @TaskAction + def run() { + if (!file("_staged/$project.version-incubating")) + // create _staged folder + project.exec { commandLine "mkdir", "-p", "_staged" } + + // create the folder in SVN where we will stage the binaries + project.exec { + commandLine "svn", "mkdir", "-m", "Add new Apache Tuweni folder for release $project.version", "https://dist.apache.org/repos/dist/dev/incubator/tuweni/$project.version-incubating" + } + + // check out the SVN repository where we will store the binaries + project.exec { + commandLine "svn", "checkout", "https://dist.apache.org/repos/dist/dev/incubator/tuweni/$project.version-incubating", "_staged/$project.version-incubating" + } + } +} + +class CopyStagedTask extends DefaultTask { + + @TaskAction + def copy() { + // copy distributions over to the folder + project.exec { + commandLine "bash", "-c", "cp dist/build/distributions/tuweni-* _staged/$project.version-incubating/" + } + + // add incubating to the version. + def fileNames = [] + def fileOutput = new ByteArrayOutputStream() + project.exec { + commandLine "ls", "_staged/$project.version-incubating/" + standardOutput fileOutput + } + fileOutput.toString().split("\n").each { + fileNames.add([ + it, + it.replace(project.version, "$project.version-incubating") + ]) + } + + fileNames.each { + def src = it[0] + def target = it[1] + project.exec { + workingDir "_staged/$project.version-incubating/" + commandLine "mv", src, target + } + } + + // now commit the staged files + project.exec { + workingDir "_staged/$project.version-incubating/" + commandLine 'bash', '-c', 'svn add tuweni-*' + } + project.exec { + workingDir "_staged/$project.version-incubating/" + commandLine 'svn', 'ci', '-m', "Add Apache Tuweni $project.version release candidate" + } + } +} + +class GitStageTask extends DefaultTask { + @TaskAction + def run() { + def branchOutput = new ByteArrayOutputStream() + project.exec { + commandLine 'git', 'rev-parse', '--abbrev-ref', 'HEAD' + standardOutput = branchOutput + } + def branch = branchOutput.toString().trim() + // tag the repo + project.exec { + commandLine 'git', 'tag', '-m', "Release $project.version-incubating", "v$project.version-incubating" + } + project.exec { + commandLine 'git', 'push', 'origin', branch, '--tags' + } + } +} + +class EmailPromptTask extends DefaultTask { + @TaskAction + def run() { + println(""" +To: [email protected] +Subject:[VOTE] Tuweni $project.version-incubating release +We're voting on the source distributions available here: +https://dist.apache.org/repos/dist/dev/incubator/tuweni/$project.version-incubating/dist/ +Specifically: +https://dist.apache.org/repos/dist/dev/incubator/tuweni/$project.version-incubating/dist/tuweni-$project.version-incubating.tgz +https://dist.apache.org/repos/dist/dev/incubator/tuweni/$project.version-incubating/dist/tuweni-$project.version-incubating.zip +The release tag is present here: +https://github.com/apache/incubator-tuweni/releases/tag/v$project.version-incubating + +The documentation generated for this release is available here: +https://dist.apache.org/repos/dist/dev/incubator/tuweni/$project.version-incubating/site/ +This release includes the following changes: + +// TODO fill changes +""") + } +} + +class StageTask extends DefaultTask { + + @TaskAction + def stage() { + new VerifyStageTask().run() + new StageBuildTask().run() + new SubversionStageTask().run() + new CopyStagedTask().run() + new GitStageTask().run() + new EmailPromptTask().run() + } +} + +class StagePlugin implements Plugin<Project> { + void apply(Project project) { + configureDependencies(project) + project.plugins.apply(JavaPlugin) + + Task stageTask = project.task("stage", + type: StageTask, + group: 'Build', + description: 'Stages Apache Tuweni.') + + Task verifyStage = project.task("stageVerify", + type: VerifyStageTask, + group: "Build", + description: 'Verifies Apache Tuweni can be staged.') + + Task buildStage = project.task("stageBuild", + type: StageBuildTask, + group: "Build", + description: 'Builds Apache Tuweni to be staged.') + + Task subversionStage = project.task("stageSVN", + type: SubversionStageTask, + group: "Build", + description: 'Creates staging folder on SVN and checks it out') + + Task copyStage = project.task("stageCopy", + type: CopyStagedTask, + group: 'Build', + description: 'Copy over distributions to staged area and push them to SVN') + + Task gitStageTask = project.task("stageGitTag", + type: GitStageTask, + group: 'Build', + description: 'Tag in git the current stage') + + Task emailPrompt = project.task("stageEmail", + type: EmailPromptTask, + group: 'Build', + description: 'Email example to console showing what to send') + + } + + void configureDependencies(final Project project) { + project.repositories { mavenCentral() } + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
