Skip to content

Commit bc68686

Browse files
committed
[#1322] BUILD: switch from Bintray jcenter to Maven Central
1 parent f5ce235 commit bc68686

File tree

10 files changed

+383
-671
lines changed

10 files changed

+383
-671
lines changed

build.gradle

Lines changed: 14 additions & 356 deletions
Large diffs are not rendered by default.

gradle.properties

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ junitDepVersion = 4.11
1515
junitVersion = 4.12
1616
springBootVersion = 2.4.3
1717

18-
# projectPreviousReleaseVersion is non-SNAPSHOT, only published releases
19-
projectPreviousReleaseVersion = 4\\.6\\.1
18+
# projectPreviousPublishedVersion is non-SNAPSHOT, only published releases
19+
projectPreviousPublishedVersion = 4\\.6\\.1
2020
# projectPreviousVersionRegex may be a SNAPSHOT
21-
projectPreviousVersionRegex = 4\\.6\\.1
22-
projectVersion = 4.6.2-SNAPSHOT
21+
projectPreviousVersionRegex = 4\\.6\\.1
22+
projectVersion = 4.6.2-SNAPSHOT
2323

2424
releaseDate = 2021-01-03
2525
releaseDatePreviousRegex = 2021\\-01\\-03

gradle/docs.gradle

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
apply plugin: 'java'
2+
apply plugin: 'org.asciidoctor.jvm.convert'
3+
pluginManager.withPlugin('org.asciidoctor.jvm.convert') { // if plugin applied, execute this action
4+
configurations {
5+
tabbedCodeExt
6+
}
7+
dependencies {
8+
tabbedCodeExt "com.bmuschko:asciidoctorj-tabbed-code-extension:0.3"
9+
}
10+
}
11+
12+
Map<org.gradle.api.JavaVersion, String> linkMap = org.gradle.api.JavaVersion.values().collectEntries { version ->
13+
[(version) : 'https://docs.oracle.com/javase/8/docs/api/']
14+
}
15+
linkMap.remove(org.gradle.api.JavaVersion.VERSION_HIGHER)
16+
for (int i = 12; i < 20; i++) { try { linkMap.remove(org.gradle.api.JavaVersion.valueOf("VERSION_$i")); } catch (Exception ignored) {} }
17+
linkMap << [(org.gradle.api.JavaVersion.VERSION_1_9) : 'https://docs.oracle.com/javase/9/docs/api/']
18+
linkMap << [(org.gradle.api.JavaVersion.VERSION_1_10) : 'https://docs.oracle.com/javase/10/docs/api/']
19+
linkMap << [(org.gradle.api.JavaVersion.VERSION_11) : 'https://docs.oracle.com/en/java/javase/11/docs/api/']
20+
21+
javadoc.options.overview = "src/main/java/overview.html"
22+
javadoc.options.links += [
23+
linkMap.get(org.gradle.api.JavaVersion.current(), 'https://docs.oracle.com/en/java/javase/12/docs/api/'),
24+
]
25+
//javadoc.options.linksOffline linkMap.get(org.gradle.api.JavaVersion.current(), 'https://docs.oracle.com/en/java/javase/12/docs/api/'), 'gradle/javadocs/jdk/9/'
26+
27+
javadoc {
28+
options.encoding = 'UTF-8'
29+
//logger.warn(sourceSets.main.allJava.sourceDirectories.files.toString())
30+
File javadocExe = new File((String) System.getenv("JAVA_11_HOME@@@"), "bin/javadoc.exe")
31+
if (javadocExe.exists()) {
32+
executable = javadocExe
33+
javadoc.options.links = [ 'https://docs.oracle.com/en/java/javase/11/docs/api/' ]
34+
inputs.property("moduleName", moduleName)
35+
options.addStringOption('-module', moduleName)
36+
//source(sourceSets.main.java)
37+
source = sourceSets.main.allJava
38+
options.addStringsOption("-module-source-path", ";").setValue(["C:\\Users\\remko\\IdeaProjects\\picocli3\\src\\main\\java", "C:\\Users\\remko\\IdeaProjects\\picocli3\\src\\main\\java9"])
39+
options.addStringOption('-module-path', classpath.asPath)
40+
options.addBooleanOption('-frames')
41+
}
42+
}
43+
javadoc.dependsOn(jar)
44+
javadoc.dependsOn('asciidoctor')
45+
asciidoctorj {
46+
version = '2.4.3'
47+
}
48+
asciidoctor {
49+
sourceDir = file('docs')
50+
outputDir = file('build/docs')
51+
logDocuments = true
52+
configurations 'tabbedCodeExt'
53+
baseDirFollowsSourceDir()
54+
// backends 'pdf', 'html'
55+
// attributes 'sourcedir': file('docs') //project.sourceSets.main.java.srcDirs[0]
56+
//// attributes 'pdf-stylesdir': 'theme',
57+
//// 'pdf-style': 'custom',
58+
//// 'sourcedir': file('docs') //project.sourceSets.main.java.srcDirs[0]
59+
}

gradle/publish-mavencentral.gradle

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
apply plugin: 'java'
2+
apply plugin: 'distribution'
3+
apply plugin: 'maven-publish'
4+
apply plugin: 'signing'
5+
6+
7+
task javadocJar(type: Jar, dependsOn: javadoc) {
8+
from javadoc.destinationDir
9+
archiveClassifier.set('javadoc')
10+
}
11+
task sourcesJar(type: Jar) {
12+
from sourceSets.main.java.srcDirs
13+
archiveClassifier.set('sources')
14+
}
15+
task testJar(type: Jar, dependsOn: compileTestJava) {
16+
from sourceSets.test.output
17+
archiveClassifier.set('tests')
18+
}
19+
task testSourcesJar(type: Jar) {
20+
from sourceSets.test.java.srcDirs
21+
archiveClassifier.set('test-sources')
22+
}
23+
24+
artifacts {
25+
archives jar
26+
archives javadocJar
27+
archives sourcesJar
28+
archives testJar
29+
archives testSourcesJar
30+
}
31+
tasks.withType(GenerateModuleMetadata) {
32+
enabled = false // fix for https://github.com/remkop/picocli/issues/1152
33+
}
34+
distributions {
35+
main {
36+
distributionBaseName = "$archivesBaseName-all"
37+
contents {
38+
from jar
39+
from javadocJar
40+
from sourcesJar
41+
from testJar
42+
from testSourcesJar
43+
from ('LICENSE')
44+
from ("$rootDir/RELEASE-NOTES.md")
45+
}
46+
}
47+
}
48+
49+
// different for each module
50+
group = PUBLISH_GROUP_ID
51+
version = PUBLISH_VERSION
52+
53+
ext["signing.keyId"] = ''
54+
ext["signing.password"] = ''
55+
ext["signing.secretKeyRingFile"] = ''
56+
ext["ossrhUsername"] = ''
57+
ext["ossrhPassword"] = ''
58+
ext["sonatypeStagingProfileId"] = ''
59+
60+
File secretPropsFile = project.rootProject.file('local.properties')
61+
if (secretPropsFile.exists()) {
62+
Properties p = new Properties()
63+
p.load(new FileInputStream(secretPropsFile))
64+
p.each { name, value ->
65+
ext[name] = value
66+
}
67+
} else {
68+
ext["signing.keyId"] = System.getenv('SIGNING_KEY_ID')
69+
ext["signing.password"] = System.getenv('SIGNING_PASSWORD')
70+
ext["signing.secretKeyRingFile"] = System.getenv('SIGNING_SECRET_KEY_RING_FILE')
71+
ext["ossrhUsername"] = System.getenv('MAVEN_OSS_USER')
72+
ext["ossrhPassword"] = System.getenv('MAVEN_OSS_PASSWORD')
73+
ext["sonatypeStagingProfileId"] = System.getenv('SONATYPE_STAGING_PROFILE_ID')
74+
}
75+
76+
publishing {
77+
publications {
78+
release(MavenPublication) {
79+
from components.java
80+
artifact javadocJar
81+
artifact sourcesJar
82+
artifact testJar
83+
artifact testSourcesJar
84+
groupId group
85+
artifactId project.name
86+
version PUBLISH_VERSION
87+
//version "$projectVersion"
88+
// pom configuration for MavenPublication, as per https://docs.gradle.org/current/userguide/publishing_maven.html#sec:modifying_the_generated_pom
89+
pom {
90+
packaging = 'jar'
91+
name = project.name
92+
description = project.description
93+
url = 'http://picocli.info'
94+
inceptionYear = '2018'
95+
licenses {
96+
license {
97+
name = "The Apache Software License, version 2.0"
98+
url = "http://www.apache.org/licenses/LICENSE-2.0.txt"
99+
distribution = "repo"
100+
}
101+
}
102+
developers {
103+
developer {
104+
id = "rpopma"
105+
name = "Remko Popma"
106+
107+
}
108+
}
109+
scm {
110+
url = "https://github.com/remkop/picocli/tree/master"
111+
connection = 'scm:git:https://github.com/remkop/picocli.git'
112+
developerConnection = 'scm:git:ssh://github.com:remkop/picocli.git'
113+
}
114+
}
115+
}
116+
}
117+
repositories {
118+
maven {
119+
name = "sonatype"
120+
url = "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
121+
122+
credentials {
123+
username ossrhUsername
124+
password ossrhPassword
125+
}
126+
}
127+
}
128+
}
129+
130+
signing {
131+
sign publishing.publications
132+
}

gradle/release-tasks.gradle

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
task bumpReadmeVersion {
2+
doLast {
3+
// README.md
4+
ant.replaceregexp(match: "$projectPreviousPublishedVersion", replace: "$version", flags: 'g', byline: true, encoding: 'UTF8') {
5+
fileset(dir: '.', includes: 'README.md')
6+
fileset(dir: './picocli-codegen/', includes: 'README.adoc')
7+
fileset(dir: './picocli-groovy/', includes: 'README.md')
8+
fileset(dir: './picocli-shell-jline2/', includes: 'README.md')
9+
fileset(dir: './picocli-shell-jline3/', includes: 'README.md')
10+
fileset(dir: './picocli-spring-boot-starter/', includes: 'README.md')
11+
fileset(dir: './picocli-examples/annotation-processing/') {
12+
include(name: '**/pom.xml')
13+
include(name: '**/build.gradle')
14+
}
15+
fileset(dir: './picocli-examples/generate-man-pages/') {
16+
include(name: '**/pom.xml')
17+
include(name: '**/build.gradle')
18+
}
19+
//fileset(dir: './picocli-examples/src/main/groovy/', includes: '**/*.groovy')
20+
}
21+
}
22+
}
23+
task bumpVersion {
24+
doLast {
25+
ant.replaceregexp(match: "$projectPreviousVersionRegex", replace: "$version", flags: 'g', byline: true, encoding: 'UTF8') {
26+
fileset(dir: 'src/main/java/picocli', includes: 'CommandLine.java')
27+
fileset(dir: 'src/test/java/picocli', includes: 'CommandLineTest.java')
28+
fileset(dir: 'src/main/java/picocli', includes: 'AutoComplete.java')
29+
fileset(dir: 'src/test/java/picocli', includes: 'AutoCompleteTest.java')
30+
fileset(dir: 'picocli-codegen/src/main/java/picocli/codegen/aot/graalvm', includes: 'DynamicProxyConfigGenerator.java')
31+
fileset(dir: 'picocli-codegen/src/main/java/picocli/codegen/aot/graalvm', includes: 'JniConfigGenerator.java')
32+
fileset(dir: 'picocli-codegen/src/main/java/picocli/codegen/aot/graalvm', includes: 'ReflectionConfigGenerator.java')
33+
fileset(dir: 'picocli-codegen/src/main/java/picocli/codegen/aot/graalvm', includes: 'ResourceConfigGenerator.java')
34+
fileset(dir: 'picocli-codegen/src/main/java/picocli/codegen/docgen/manpage', includes: 'ManPageGenerator.java')
35+
}
36+
ant.replaceregexp(match: "version $projectPreviousVersionRegex", replace: "version $version", flags: 'g', byline: true, encoding: 'UTF8') {
37+
fileset(dir: 'src/test/java/picocli', includes: 'AutoCompleteTest.java')
38+
}
39+
// Doc header
40+
ant.replaceregexp(match: ":revnumber: $projectPreviousVersionRegex", replace: ":revnumber: $version", flags: 'g', byline: true, encoding: 'UTF8') {
41+
fileset(dir: 'docs', includes: 'index.adoc')
42+
fileset(dir: 'docs', includes: 'quick-guide.adoc')
43+
fileset(dir: 'docs', includes: 'autocomplete.adoc')
44+
fileset(dir: 'docs', includes: 'picocli-programmatic-api.adoc')
45+
}
46+
// Annotation Processor section
47+
ant.replaceregexp(match: ":picocli-codegen:$projectPreviousVersionRegex", replace: ":picocli-codegen:$version", flags: 'g', byline: true, encoding: 'UTF8') {
48+
fileset(dir: 'docs', includes: 'index.adoc')
49+
}
50+
// Groovy section
51+
ant.replaceregexp(match: ":picocli-groovy:$projectPreviousVersionRegex", replace: ":picocli-groovy:$version", flags: 'g', byline: true, encoding: 'UTF8') {
52+
fileset(dir: 'docs', includes: 'index.adoc')
53+
}
54+
// Spring Boot section
55+
ant.replaceregexp(match: ":picocli-spring-boot-starter:$projectPreviousVersionRegex", replace: ":picocli-spring-boot-starter:$version", flags: 'g', byline: true, encoding: 'UTF8') {
56+
fileset(dir: 'docs', includes: 'index.adoc')
57+
}
58+
// Downloads section, Gradle
59+
ant.replaceregexp(match: ":picocli:$projectPreviousVersionRegex", replace: ":picocli:$version", flags: 'g', byline: true, encoding: 'UTF8') {
60+
fileset(dir: 'docs', includes: 'index.adoc')
61+
}
62+
// Downloads section, Maven
63+
ant.replaceregexp(match: "<version>$projectPreviousVersionRegex</version>", replace: "<version>$version</version>", flags: 'g', byline: true, encoding: 'UTF8') {
64+
fileset(dir: 'docs', includes: 'index.adoc')
65+
}
66+
// Downloads section, SBT
67+
ant.replaceregexp(match: "\"picocli\" % \"$projectPreviousVersionRegex\"", replace: "\\\"picocli\\\" % \\\"$version\\\"", flags: 'g', byline: true, encoding: 'UTF8') {
68+
fileset(dir: 'docs', includes: 'index.adoc')
69+
}
70+
// Downloads section, Ivy
71+
ant.replaceregexp(match: "rev=\"$projectPreviousVersionRegex\"", replace: "rev=\\\"$version\\\"", flags: 'g', byline: true, encoding: 'UTF8') {
72+
fileset(dir: 'docs', includes: 'index.adoc')
73+
}
74+
// Downloads section, Grape
75+
ant.replaceregexp(match: "module='picocli', version=\'$projectPreviousVersionRegex\'\\)", replace: "module='picocli', version=\'$version\')", flags: 'g', byline: true, encoding: 'UTF8') {
76+
fileset(dir: 'docs', includes: 'index.adoc')
77+
}
78+
// Downloads section, Leiningen
79+
ant.replaceregexp(match: "info.picocli/picocli \"$projectPreviousVersionRegex\"", replace: "info.picocli/picocli \"$version\"", flags: 'g', byline: true, encoding: 'UTF8') {
80+
fileset(dir: 'docs', includes: 'index.adoc')
81+
}
82+
// Downloads section, Buildr
83+
ant.replaceregexp(match: "info.picocli:picocli:jar:$projectPreviousVersionRegex", replace: "info.picocli:picocli:jar:$version", flags: 'g', byline: true, encoding: 'UTF8') {
84+
fileset(dir: 'docs', includes: 'index.adoc')
85+
}
86+
// Running the Application and Packaging sections
87+
ant.replaceregexp(match: "picocli-${projectPreviousVersionRegex}.jar", replace: "picocli-${version}.jar", flags: 'g', byline: true, encoding: 'UTF8') {
88+
fileset(dir: 'docs', includes: 'index.adoc')
89+
fileset(dir: 'docs', includes: 'quick-guide.adoc')
90+
}
91+
ant.replaceregexp(match: releaseDatePreviousRegex, replace: releaseDate, flags: 'g', byline: true, encoding: 'UTF8') {
92+
fileset(dir: 'docs', includes: 'index.adoc')
93+
fileset(dir: 'docs', includes: 'quick-guide.adoc')
94+
fileset(dir: 'docs', includes: 'autocomplete.adoc')
95+
fileset(dir: 'docs', includes: 'picocli-programmatic-api.adoc')
96+
fileset(dir: 'picocli-codegen', includes: 'README.adoc')
97+
}
98+
}
99+
}
100+
task copyCodeGenDocs(type: Copy) {
101+
from('build/docs/man/') { include 'index.html' }
102+
from('picocli-codegen/build/docs/html5/') { include '*.html' }
103+
into 'docs/man'
104+
}
105+
task copyDocs(type: Copy) {
106+
dependsOn(copyCodeGenDocs)
107+
from('build/docs/')
108+
into 'docs'
109+
}
110+
111+
112+
/*
113+
Release procedure:
114+
1. edit version numbers: remove -SNAPSHOT classifier; edit releaseDate
115+
2. gradlew bumpVersion
116+
3. check modified files
117+
4. gradlew clean build
118+
5. gradlew copyDocs
119+
6. update RELEASE-NOTES.md
120+
7. gradlew bumpReadmeVersion
121+
7a update README.md (latest version, release notes)
122+
8. commit -m "Release picocli version ..."
123+
9. tag v$version
124+
10. gradlew bintrayUpload - to publish to bintray.com
125+
126+
11. edit version numbers: increase minor version and add -SNAPSHOT classifier
127+
12. gradlew bumpVersion
128+
13. check modified files
129+
14. commit -m "Prepare for next development cycle"
130+
15. push (make sure that Push Tags is checked)
131+
132+
16. Log in to GitHub, go to https://github.com/remkop/picocli/releases
133+
17. Click the new tag, click Edit button, update title and release notes (copy from RELEASE-NOTES.md)
134+
18. Upload picocli-$version.jar and picocli-all$version.zip to GitHub
135+
136+
19. Log in to Bintray
137+
20. Navigate to the page for the new version
138+
21. Edit version: Publication Date, Description, VCS tag, GitHub release notes file (RELEASE-NOTES.md)
139+
22. On the version page, Release Notes tab, select GitHub File
140+
23. Publish artifacts to JCenter
141+
24. On the version page, Maven Central tab, sync to Maven (takes several minutes)
142+
143+
(When releasing from branch)
144+
25. Switch to master
145+
26. cherry-pick the "Release picocli version ..." commit
146+
27. gradlew bumpVersion
147+
28. check modified files
148+
29. commit -m "Update master for next development cycle after release x.x (from branch x.x)"
149+
*/

0 commit comments

Comments
 (0)