From 0f6f182193b19578844f837418f9330f5c00e7f6 Mon Sep 17 00:00:00 2001 From: Adam Monsen Date: Thu, 18 Dec 2025 09:15:11 -0800 Subject: [PATCH 01/12] improve start release notes wording in step 3 --- fineract-doc/src/docs/en/chapters/release/process-step03.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fineract-doc/src/docs/en/chapters/release/process-step03.adoc b/fineract-doc/src/docs/en/chapters/release/process-step03.adoc index 48e39e5e9..1db633dd9 100644 --- a/fineract-doc/src/docs/en/chapters/release/process-step03.adoc +++ b/fineract-doc/src/docs/en/chapters/release/process-step03.adoc @@ -36,7 +36,7 @@ git checkout -b release/{revnumber} git push origin release/{revnumber} ---- -5. Add new release notes in Release Folders. The change list can be swiped from the JIRA release note tool (use the "text" format for the change log). See JIRA Cleanup above to ensure that the release notes generated by this tool are what you are expecting. +5. Start new release notes page under https://cwiki.apache.org/confluence/display/FINERACT/Fineract+Releases[Fineract Releases]. The change list can be swiped from the JIRA release note tool (use the "text" format for the change log). See JIRA Cleanup above to ensure that the release notes generated by this tool are what you are expecting. 6. Send en email announcing the new release branch on the earlier email thread + From ad2be8ad1cecc6a3d86b9e7a728b757f038d7b62 Mon Sep 17 00:00:00 2001 From: Adam Monsen Date: Thu, 18 Dec 2025 09:33:39 -0800 Subject: [PATCH 02/12] doc: remove errant config similar to 45404bafba96eda959154f7240794f66fa0dda6a All asciidoctor config must be in `fineract-doc/src/docs/en/config.adoc`. In this case `:sectnums:` re-starts ToC section numbering partway through the ToC. --- fineract-doc/src/docs/en/chapters/features/re-ageing.adoc | 5 ----- 1 file changed, 5 deletions(-) diff --git a/fineract-doc/src/docs/en/chapters/features/re-ageing.adoc b/fineract-doc/src/docs/en/chapters/features/re-ageing.adoc index 1b0bc776c..110b61ecd 100644 --- a/fineract-doc/src/docs/en/chapters/features/re-ageing.adoc +++ b/fineract-doc/src/docs/en/chapters/features/re-ageing.adoc @@ -1,9 +1,4 @@ = Loan Re-Aging -:doctype: book -:icons: font -:toc: left -:toclevels: 3 -:sectnums: == Overview From 2c4ed2e984b8723f9e1827835e61a968158719eb Mon Sep 17 00:00:00 2001 From: Adam Monsen Date: Thu, 18 Dec 2025 10:27:14 -0800 Subject: [PATCH 03/12] fix both NOTICE files for ATR ATR (the ASF Trusted Releases tool) expects these to follow a very specific template. In this case I had to s/by/at/ and add a newline. See: https://github.com/apache/tooling-trusted-releases/blob/52e202f2deae74d38bc60849736339b2ab919de8/atr/tasks/checks/license.py#L299 --- NOTICE_RELEASE | 4 ++-- NOTICE_SOURCE | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/NOTICE_RELEASE b/NOTICE_RELEASE index 083abdfe5..5a5d9b1dc 100644 --- a/NOTICE_RELEASE +++ b/NOTICE_RELEASE @@ -1,8 +1,8 @@ Apache Fineract Copyright 2008-2025 The Apache Software Foundation -This product includes software developed by The Apache Software -Foundation (http://www.apache.org/). +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). This product includes third party libraries and resource files from different providers. The details of the different packages and their diff --git a/NOTICE_SOURCE b/NOTICE_SOURCE index 869b39afa..085a41097 100644 --- a/NOTICE_SOURCE +++ b/NOTICE_SOURCE @@ -1,5 +1,5 @@ Apache Fineract Copyright 2008-2025 The Apache Software Foundation -This product includes software developed by The Apache Software -Foundation (http://www.apache.org/). +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). From 86f6a8c9b8a221d00079e89ed4afc7b41ba47684 Mon Sep 17 00:00:00 2001 From: Adam Monsen Date: Thu, 18 Dec 2025 10:45:32 -0800 Subject: [PATCH 04/12] add license to scripts/*.sh conform rather than bypass RAT license check --- build.gradle | 3 +-- scripts/split-features.sh | 17 +++++++++++++++++ scripts/split-tests.sh | 18 ++++++++++++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 1d25ed051..ee244517c 100644 --- a/build.gradle +++ b/build.gradle @@ -344,8 +344,7 @@ allprojects { "**/generated/**/*MapperImpl.java", '**/META-INF/fineract-test.config', // Apache-specific GitHub metadata settings file - '/.asf.yaml', - '**/*.sh' + '/.asf.yaml' ] } } diff --git a/scripts/split-features.sh b/scripts/split-features.sh index 2213af4cf..8e5fb2dd5 100755 --- a/scripts/split-features.sh +++ b/scripts/split-features.sh @@ -1,5 +1,22 @@ #!/bin/bash +# 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. + # Exit on any error set -e diff --git a/scripts/split-tests.sh b/scripts/split-tests.sh index c083fedf8..713466917 100755 --- a/scripts/split-tests.sh +++ b/scripts/split-tests.sh @@ -1,4 +1,22 @@ #!/bin/bash + +# 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. + # Usage: ./split-tests.sh set -e From 47ba127f238e00de283d0083c6856e273d0089f4 Mon Sep 17 00:00:00 2001 From: Adam Monsen Date: Thu, 18 Dec 2025 14:37:09 -0800 Subject: [PATCH 05/12] add RAT excludes for ATR --- .atr-rat-excludes-bin.txt | 27 ++++++++++++++++++++ .atr-rat-excludes-src.txt | 54 +++++++++++++++++++++++++++++++++++++++ fineract-war/build.gradle | 6 ++++- 3 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 .atr-rat-excludes-bin.txt create mode 100644 .atr-rat-excludes-src.txt diff --git a/.atr-rat-excludes-bin.txt b/.atr-rat-excludes-bin.txt new file mode 100644 index 000000000..62d78f043 --- /dev/null +++ b/.atr-rat-excludes-bin.txt @@ -0,0 +1,27 @@ +# 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. + +# See comment below license in .atr-rat-excludes-src.txt for an explanation of +# what this is. + +# if you make changes here, sort this list before committing asciibetically +# with en_US.UTF-8 lang/locale +.rat-excludes +README.md +fineract-documentation.pdf + +# vim:ft=conf diff --git a/.atr-rat-excludes-src.txt b/.atr-rat-excludes-src.txt new file mode 100644 index 000000000..715ddd1d7 --- /dev/null +++ b/.atr-rat-excludes-src.txt @@ -0,0 +1,54 @@ +# 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. + +# Path patterns to exclude from RAT checks run by ATR. +# +# RAT = Release Audit Tool (https://creadur.apache.org/rat/) +# ATR = ASF Trusted Releases (https://release-test.apache.org , https://github.com/apache/tooling-trusted-releases/) +# +# This duplicates exclusions in build.gradle. +# This is probably only necessary until both RAT and org.nosphere.apache.rat plugin are using 0.17. +# See https://github.com/eskatos/creadur-rat-gradle/issues/28 . +# Once both are on 0.17, we should be able to move the RAT excludes used during +# the build from build.gradle into a .rat-excludes file shared by both our +# build and ATR. +# Right now ATR does something custom, see +# https://github.com/apache/tooling-trusted-releases/issues/312 . +# If we get tired of waiting for the RAT gradle plugin or the ATR to upgrade to +# 0.17, we could write our own exclusion lists generator. + +# if you make changes here, sort this list before committing asciibetically +# with en_US.UTF-8 lang/locale +**/META-INF/fineract-test.config +**/legacy-docs/ +*.adoc +*.avsc +*.feature +*.html +*.md +*.mustache +*.puml +*.txt +.openapi-generator-ignore +/.asf.yaml +/.rat-excludes +/config/fineractdev-eclipse-preferences.epf +/fineract-provider/src/test/resources/results/xbrl.xml +/gradle/wrapper/gradle-wrapper.properties +org.springframework.boot.autoconfigure.AutoConfiguration.imports + +# vim:ft=conf diff --git a/fineract-war/build.gradle b/fineract-war/build.gradle index f606183cc..74b7bf31d 100644 --- a/fineract-war/build.gradle +++ b/fineract-war/build.gradle @@ -136,6 +136,9 @@ distributions { from "$rootDir/fineract-doc/build/docs/pdf/en/index.pdf" rename ('index.pdf', 'fineract-documentation.pdf') + + from "$rootDir/.atr-rat-excludes-bin.txt" + rename ('.atr-rat-excludes-bin.txt', '.rat-excludes') } } src { @@ -147,7 +150,7 @@ distributions { '**/.classpath', '.idea', 'out', '._.DS_Store', '.DS_Store', 'WebContent', '**/.externalToolbuilders', '.theia', 'LICENSE_RELEASE', 'NOTICE_RELEASE', '**/licenses', '*.class', '**/bin', '*.log', '.dockerignore', - '**/.gitkeep' + '**/.gitkeep', '.atr-rat-excludes-bin.txt' // Ensure consistent file paths for caching eachFile { details -> @@ -156,6 +159,7 @@ distributions { } rename ('LICENSE_SOURCE', 'LICENSE') rename ('NOTICE_SOURCE', 'NOTICE') + rename ('.atr-rat-excludes-src.txt', '.rat-excludes') } } } From 19305c6c606c655c54a2dd7fbe69427ad3259445 Mon Sep 17 00:00:00 2001 From: Adam Monsen Date: Thu, 18 Dec 2025 14:37:59 -0800 Subject: [PATCH 06/12] add license to .mailmap ATR was complaining --- .mailmap | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.mailmap b/.mailmap index 4155b158a..23211b408 100644 --- a/.mailmap +++ b/.mailmap @@ -1,3 +1,20 @@ +# 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. + # .mailmap unifies differences in commit names and emails, and shortens committers' names. # .mailmap format is a bit weird, e.g. https://github.com/sympy/sympy/wiki/Using-.mailmap explains it. # .mailmap official doc is on https://git-scm.com/docs/git-shortlog#_mapping_authors From 927f8dc5892d4d9bfaf65f63b9e79475b2f11e4a Mon Sep 17 00:00:00 2001 From: Adam Monsen Date: Thu, 18 Dec 2025 14:38:32 -0800 Subject: [PATCH 07/12] ignore .swp files when building src release just in case. I accidentally did this while working on the 1.14.0 release. --- fineract-war/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fineract-war/build.gradle b/fineract-war/build.gradle index 74b7bf31d..2540300c3 100644 --- a/fineract-war/build.gradle +++ b/fineract-war/build.gradle @@ -150,7 +150,7 @@ distributions { '**/.classpath', '.idea', 'out', '._.DS_Store', '.DS_Store', 'WebContent', '**/.externalToolbuilders', '.theia', 'LICENSE_RELEASE', 'NOTICE_RELEASE', '**/licenses', '*.class', '**/bin', '*.log', '.dockerignore', - '**/.gitkeep', '.atr-rat-excludes-bin.txt' + '**/.gitkeep', '*.swp', '.atr-rat-excludes-bin.txt' // Ensure consistent file paths for caching eachFile { details -> From 7923d9e6cb67611c506b6c527b64497996acdc58 Mon Sep 17 00:00:00 2001 From: Adam Monsen Date: Fri, 19 Dec 2025 08:40:40 -0800 Subject: [PATCH 08/12] exclude jquery-1.7.min.js from source release This is to workaround an issue, UI misunderstanding, or PEBKAC with the ATR (ASF Trusted Releases) tool wherein I am unable to exclude the license header check for this file. jQuery (and its dependencies) can be used entirely under the MIT, see . Once https://github.com/apache/tooling-trusted-releases/issues/312 ... is resolved we should be able to revert this workaround. While this workaround is in place, consumers of apiLive.htm must: 1. put a copy of jquery-1.7.min.js next to apiLive.htm 2. change apiLive.htm to refer to jquery-1.7.min.js on a CDN If someone needing apiLive.htm prefers the first option, they can grab a copy at https://code.jquery.com/jquery-1.7.min.js . If they prefer the second option, they can pick a minified or unminified link listed at https://blog.jquery.com/2011/11/03/jquery-1-7-released/ and modify line 6 of apiLive.htm to refer to that instead, for example: - + There are other ways to deal with the license header check as well. For example: We could use 2nd option above (always), or finally/actually port away from apiLive.htm (it is in legacy-docs, after all). --- fineract-war/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fineract-war/build.gradle b/fineract-war/build.gradle index 2540300c3..b5f6bcae3 100644 --- a/fineract-war/build.gradle +++ b/fineract-war/build.gradle @@ -150,7 +150,7 @@ distributions { '**/.classpath', '.idea', 'out', '._.DS_Store', '.DS_Store', 'WebContent', '**/.externalToolbuilders', '.theia', 'LICENSE_RELEASE', 'NOTICE_RELEASE', '**/licenses', '*.class', '**/bin', '*.log', '.dockerignore', - '**/.gitkeep', '*.swp', '.atr-rat-excludes-bin.txt' + '**/.gitkeep', '*.swp', '.atr-rat-excludes-bin.txt', '**/jquery-1.7.min.js' // Ensure consistent file paths for caching eachFile { details -> From f4aa11468d2f72998ab66d6550a37ca843753df7 Mon Sep 17 00:00:00 2001 From: Adam Monsen Date: Mon, 22 Dec 2025 09:57:47 -0800 Subject: [PATCH 09/12] improve svn release staging/release instructions All good. I tested these just now. ATR so far does artifact checks & voting/email management. Working with artifacts on the svn server is still our responsibility, for now. --- .../src/docs/en/chapters/release/process-step08.adoc | 10 +++++++--- .../src/docs/en/chapters/release/process-step12.adoc | 5 ++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/fineract-doc/src/docs/en/chapters/release/process-step08.adoc b/fineract-doc/src/docs/en/chapters/release/process-step08.adoc index f97ba4fec..e85db5a30 100644 --- a/fineract-doc/src/docs/en/chapters/release/process-step08.adoc +++ b/fineract-doc/src/docs/en/chapters/release/process-step08.adoc @@ -16,14 +16,18 @@ These files (or "artifacts") comprise the release candidate. Upload these files [source,bash,subs="attributes+"] ---- # this is a remote operation -svn mkdir https://dist.apache.org/repos/dist/dev/fineract/{revnumber} +svn mkdir -m "Create Fineract {revnumber} staging area πŸ—οΈ" \ + https://dist.apache.org/repos/dist/dev/fineract/{revnumber} + # create local svn-tracked folder "{revnumber}" svn checkout https://dist.apache.org/repos/dist/dev/fineract/{revnumber} + # prepare to upload cp path/to/new/folder/* {revnumber}/ cd {revnumber}/ + # actual upload occurs here -svn add * && svn commit +svn add * && svn commit -m "Stage Fineract {revnumber} 🎭" ---- NOTE: You will need your ASF Committer credentials to be able to access the Subversion host at `dist.apache.org`. @@ -36,4 +40,4 @@ NOTE: You will need your ASF Committer credentials to be able to access the Subv ./gradlew fineractReleaseStep8 -Pfineract.release.version={revnumber} ---- -CAUTION: This task is inefficient. Follow `svn mkdir` and other manual steps above. +CAUTION: Gradle task 8 is inefficient. We recommend `svn mkdir` and other manual steps above. diff --git a/fineract-doc/src/docs/en/chapters/release/process-step12.adoc b/fineract-doc/src/docs/en/chapters/release/process-step12.adoc index 0bcc44bdd..b479539a3 100644 --- a/fineract-doc/src/docs/en/chapters/release/process-step12.adoc +++ b/fineract-doc/src/docs/en/chapters/release/process-step12.adoc @@ -6,7 +6,10 @@ Move the release candidate from the dev area to the release area using a Subvers [source,bash,subs="attributes+"] ---- -svn mv https://dist.apache.org/repos/dist/dev/fineract/{revnumber} https://dist.apache.org/repos/dist/release/fineract/ +# this is a remote operation +svn mv -m "Release Fineract {revnumber} 🚒" \ + https://dist.apache.org/repos/dist/dev/fineract/{revnumber} \ + https://dist.apache.org/repos/dist/release/fineract/ ---- NOTE: https://www.apache.org/legal/release-policy.html#upload-ci[This must be done by a Fineract PMC member]. From 30b25cdaa1a9faa348edfd2750c4ae43b9d5ecf2 Mon Sep 17 00:00:00 2001 From: Adam Monsen Date: Mon, 22 Dec 2025 11:02:32 -0800 Subject: [PATCH 10/12] docs: adapt artifact checks to new ATR tool We're already reaping rewards for using ATR (checks+voting+email support), and I want us to do both the old way AND the new way for now. I'll consider the old release process in "soft deprecation" as the ATR matures. --- .../src/docs/en/chapters/release/process-step01.adoc | 2 ++ .../src/docs/en/chapters/release/process-step08.adoc | 6 +++++- .../src/docs/en/chapters/release/process-step09.adoc | 5 +++-- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/fineract-doc/src/docs/en/chapters/release/process-step01.adoc b/fineract-doc/src/docs/en/chapters/release/process-step01.adoc index b847af602..b1c935dd2 100644 --- a/fineract-doc/src/docs/en/chapters/release/process-step01.adoc +++ b/fineract-doc/src/docs/en/chapters/release/process-step01.adoc @@ -4,6 +4,8 @@ The RM should, if one doesn't already exist, first create a new release umbrella issue in JIRA. This issue is dedicated to tracking (a summary of) any discussion related to the planned new release. An example of such an issue is https://issues.apache.org/jira/browse/FINERACT-873[FINERACT-873]. +Next, the RM logs in to https://release-test.apache.org[the ATR (ASF Trusted Releases)] tool and clicks "+ Start a new release", naming the release `{revnumber}`. + The RM then creates a list of resolved issues & features through an initial check in JIRA for already resolved issues for the release, and then setup a timeline for release branch point. The time for the day the issue list is created to the release branch point must be at least two weeks in order to give the community a chance to prioritize and commit any last minute features and issues they would like to see in the upcoming release. The RM must then send the pointer to the umbrella issue along with the tentative timeline for branch point to the developer lists. Any work identified as release related that needs to be completed should be added as a sub tasks of the umbrella issue to allow all developers and users to see the overall release progress in one place. The umbrella issue shall also link to any issues still requiring clarification whether or not they will make it into the release. diff --git a/fineract-doc/src/docs/en/chapters/release/process-step08.adoc b/fineract-doc/src/docs/en/chapters/release/process-step08.adoc index e85db5a30..41cddef41 100644 --- a/fineract-doc/src/docs/en/chapters/release/process-step08.adoc +++ b/fineract-doc/src/docs/en/chapters/release/process-step08.adoc @@ -11,7 +11,11 @@ Next we'll stage the release candidate. Create a new folder and add these files: * apache-fineract-src-{revnumber}.tar.gz.sha512 * apache-fineract-src-{revnumber}.tar.gz.asc -These files (or "artifacts") comprise the release candidate. Upload these files to https://www.apache.org/legal/release-policy.html#stage[ASF's distribution dev/staging area] like so: +These files (or "artifacts") comprise the release candidate. + +First, upload these files to https://release-test.apache.org/compose/fineract/{revnumber}. This tool will initiate automated checks on the files. We'll come back to those in next step and ensure they pass. + +Next, upload these files to https://www.apache.org/legal/release-policy.html#stage[ASF's distribution dev/staging area] like so: [source,bash,subs="attributes+"] ---- diff --git a/fineract-doc/src/docs/en/chapters/release/process-step09.adoc b/fineract-doc/src/docs/en/chapters/release/process-step09.adoc index c0d177646..bf06e40e5 100644 --- a/fineract-doc/src/docs/en/chapters/release/process-step09.adoc +++ b/fineract-doc/src/docs/en/chapters/release/process-step09.adoc @@ -2,9 +2,9 @@ == Description -Following are the typical things we need to verify before voting on a release candidate. And the release manager should verify them too before calling out a vote. +Following are the typical things we need to verify before voting on a release candidate. And the release manager should verify them too before calling out a vote. Some of these checks are duplicated by https://release-test.apache.org[the ATR (ASF Trusted Releases) tool], and will need to continue to be duplicated until we get more comfortable with that tool. -Make sure release artifacts are hosted at https://dist.apache.org/repos/dist/dev/fineract +Make sure release artifacts are hosted at both https://release-test.apache.org/compose/fineract/{revnumber} AND https://dist.apache.org/repos/dist/dev/fineract * Release candidate files should match filenames mentioned earlier, and will be moved without renaming if/when the release vote passes. * Verify signatures and hashes. You may have to import the public key of the release manager to verify the signatures. (`gpg --import KEYS` or `gpg --recv-key `) @@ -14,6 +14,7 @@ Make sure release artifacts are hosted at https://dist.apache.org/repos/dist/dev * All files have correct headers (Rat check should be clean - `./gradlew rat`) * No jar files in the source artifacts * All tests pass both in CI and locally +* All ATR checks pass === Artifact verification From e1b03297482caa686bd0a103caf5cb64957175e8 Mon Sep 17 00:00:00 2001 From: Adam Monsen Date: Mon, 22 Dec 2025 11:28:24 -0800 Subject: [PATCH 11/12] port steps 10 & 11 to the ATR --- .../groovy/org.apache.fineract.release.gradle | 26 ------ .../fineract/gradle/FineractPlugin.groovy | 42 +-------- .../email/release.step10.vote.message.ftl | 51 ----------- .../email/release.step11.vote.message.ftl | 89 ------------------- .../step10.txt.ftl} | 10 ++- .../step11.txt.ftl} | 10 ++- .../en/chapters/release/process-step10.adoc | 13 +-- .../en/chapters/release/process-step11.adoc | 13 +-- 8 files changed, 28 insertions(+), 226 deletions(-) delete mode 100644 buildSrc/src/main/resources/email/release.step10.vote.message.ftl delete mode 100644 buildSrc/src/main/resources/email/release.step11.vote.message.ftl rename buildSrc/src/main/resources/{email/release.step10.vote.subject.ftl => instructions/step10.txt.ftl} (85%) rename buildSrc/src/main/resources/{email/release.step11.vote.subject.ftl => instructions/step11.txt.ftl} (85%) diff --git a/buildSrc/src/main/groovy/org.apache.fineract.release.gradle b/buildSrc/src/main/groovy/org.apache.fineract.release.gradle index 78fb085b6..254d80e22 100644 --- a/buildSrc/src/main/groovy/org.apache.fineract.release.gradle +++ b/buildSrc/src/main/groovy/org.apache.fineract.release.gradle @@ -196,36 +196,10 @@ fineract { step10: [ order: 10, description: 'Start voting on the dev mailing list', - email: [ - from: "${findProperty('fineract.config.email')}", - name: "${findProperty('fineract.config.name')}", - to: "${findProperty('fineract.config.email')}", - // to: 'dev@fineract.apache.org', - mime: 'text/plain', - subjectTemplate: [ - templateFile: "${projectDir}/buildSrc/src/main/resources/email/release.step10.vote.subject.ftl" - ], - messageTemplate: [ - templateFile: "${projectDir}/buildSrc/src/main/resources/email/release.step10.vote.message.ftl" - ] - ] ], step11: [ order: 11, description: 'Conclude the vote and announce results', - email: [ - from: "${findProperty('fineract.config.email')}", - name: "${findProperty('fineract.config.name')}", - to: "${findProperty('fineract.config.email')}", - // to: 'dev@fineract.apache.org', - mime: 'text/plain', - subjectTemplate: [ - templateFile: "${projectDir}/buildSrc/src/main/resources/email/release.step11.vote.subject.ftl" - ], - messageTemplate: [ - templateFile: "${projectDir}/buildSrc/src/main/resources/email/release.step11.vote.message.ftl" - ] - ] ], step12: [ order: 12, diff --git a/buildSrc/src/main/groovy/org/apache/fineract/gradle/FineractPlugin.groovy b/buildSrc/src/main/groovy/org/apache/fineract/gradle/FineractPlugin.groovy index c2bb039af..f1cf57ef7 100644 --- a/buildSrc/src/main/groovy/org/apache/fineract/gradle/FineractPlugin.groovy +++ b/buildSrc/src/main/groovy/org/apache/fineract/gradle/FineractPlugin.groovy @@ -18,7 +18,6 @@ */ package org.apache.fineract.gradle -import groovy.json.JsonSlurper import org.apache.commons.io.FileUtils import org.apache.commons.io.filefilter.NotFileFilter import org.apache.commons.io.filefilter.PrefixFileFilter @@ -384,23 +383,7 @@ class FineractPlugin implements Plugin { doFirst { FineractPluginExtension.FineractPluginStep step = step(extension, "step10") - String version = project.properties?['fineract.release.version'] - - if(!version) { - TextIO textIO = TextIoFactory.getTextIO(); - - version = textIO.newStringInputReader() - .withPattern("\\d+.\\d+.\\d+") - .read("Release Version"); - } - - // TODO: input validation, see FINERACT-1610 - - this.context?.project?['fineract.release.version'] = version - - if(step.email) { - emailService.send( processEmailParams(step.email, this.context) ) - } + printInstructions(project, "step10") } } @@ -409,28 +392,7 @@ class FineractPlugin implements Plugin { doFirst { FineractPluginExtension.FineractPluginStep step = step(extension, "step11") - String version = project.properties?['fineract.release.version'] - - if(!version) { - TextIO textIO = TextIoFactory.getTextIO() - - version = textIO.newStringInputReader() - .withPattern("\\d+.\\d+.\\d+") - .read("Release Version"); - } - - // TODO: input validation, see FINERACT-1610 - - this.context?.project?['fineract.release.version'] = version - - def jsonSlurper = new JsonSlurper() - def data = jsonSlurper.parse(new File("buildSrc/src/main/resources/vote/result.${version}.json")) - - this.context?.project?['fineract.vote'] = data - - if(step.email) { - emailService.send( processEmailParams(step.email, this.context) ) - } + printInstructions(project, "step11") } } diff --git a/buildSrc/src/main/resources/email/release.step10.vote.message.ftl b/buildSrc/src/main/resources/email/release.step10.vote.message.ftl deleted file mode 100644 index cf91d1746..000000000 --- a/buildSrc/src/main/resources/email/release.step10.vote.message.ftl +++ /dev/null @@ -1,51 +0,0 @@ -<#-- - - 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. - ---> -Hello everyone, - -We are proud to present Apache Fineract ${project['fineract.release.version']}, with the artifacts below up for a vote. Releases are important for a number of reasons: They put a stamp of approval on a set of code changes and they build momentum for future improvements. - -Release notes and ChangeLog: https://cwiki.apache.org/confluence/display/FINERACT/${project['fineract.release.version']}+-+Apache+Fineract - -Source and binary artifacts: https://dist.apache.org/repos/dist/dev/fineract/${project['fineract.release.version']}/ - -Tagged as ${project['fineract.release.version']} - -Committer PGP keys, including the release signing key: https://dist.apache.org/repos/dist/dev/fineract/KEYS - -Note that this release candidate contains source and binary artifacts. - -This vote will be open for 72 hours: - -[ ] +1 approve -[ ] +0 no opinion -[ ] -1 disapprove (and reason why) - -Please indicate if yours is a binding vote, and "Verified: YES/NO/PARTIAL". - -Verified: YES ... Verified integrity and signatures of release artifacts locally, built from source, ran jar/war: Did everything mentioned in the current release candidate verification guidance ( https://fineract.apache.org/docs/rc/#_artifact_verification ). If you did more than that, please specify. "Verified: YES" is required for binding votes. - -Verified: NO ... No testing performed on release candidate, e.g. relying on testing performed by other contributors and/or output of GitHub Actions, while exercising your right to vote. - -Verified: PARTIAL ... Please specify. - -Cheers, - -${project['fineract.config.name']} diff --git a/buildSrc/src/main/resources/email/release.step11.vote.message.ftl b/buildSrc/src/main/resources/email/release.step11.vote.message.ftl deleted file mode 100644 index 227d956d6..000000000 --- a/buildSrc/src/main/resources/email/release.step11.vote.message.ftl +++ /dev/null @@ -1,89 +0,0 @@ -<#-- - - 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. - ---> -<#if (project['fineract.vote'].approve.binding?size + project['fineract.vote'].approve.nonBinding?size > project['fineract.vote'].disapprove.binding?size + project['fineract.vote'].disapprove.nonBinding?size)> -Voting is now closed and has passed with the following tally, - -Binding +1s: ${project['fineract.vote'].approve.binding?size} -Non binding +1s: ${project['fineract.vote'].approve.nonBinding?size} -<#else> -Voting is now closed and has not passed with the following tally, - -Binding +1s: ${project['fineract.vote'].approve.binding?size} -Non binding +1s: ${project['fineract.vote'].approve.nonBinding?size} - -Binding -1s: ${project['fineract.vote'].disapprove.binding?size} -Non binding -1s: ${project['fineract.vote'].disapprove.nonBinding?size} - - -Here are the detailed results: - -<#list project['fineract.vote'].approve.binding> -Binding +1s: - <#items as item> -- ${item.name} - - - - -<#list project['fineract.vote'].approve.nonBinding> -Non binding +1s: - <#items as item> -- ${item.name} - - - - -<#list project['fineract.vote'].disapprove.binding> -Binding -1s: - <#items as item> -- ${item.name} - - - -<#list project['fineract.vote'].disapprove.nonBinding> -Non binding -1s: - <#items as item> -- ${item.name} - - - - -<#list project['fineract.vote'].noOpinion.binding> -Binding +0s: - <#items as item> -- ${item.name} - - - -<#list project['fineract.vote'].noOpinion.nonBinding> -Non binding +0s: - <#items as item> -- ${item.name} - - - -<#if (project['fineract.vote'].approve.binding?size + project['fineract.vote'].approve.nonBinding?size > project['fineract.vote'].disapprove.binding?size + project['fineract.vote'].disapprove.nonBinding?size)> -Thanks to everyone who voted! I'll now continue with the rest of the release process. -<#else> -Thanks to everyone who voted! Looks like we have to repeat the vote. - - -${project['fineract.config.name']} diff --git a/buildSrc/src/main/resources/email/release.step10.vote.subject.ftl b/buildSrc/src/main/resources/instructions/step10.txt.ftl similarity index 85% rename from buildSrc/src/main/resources/email/release.step10.vote.subject.ftl rename to buildSrc/src/main/resources/instructions/step10.txt.ftl index 9c8df5084..cbb81dd3d 100644 --- a/buildSrc/src/main/resources/email/release.step10.vote.subject.ftl +++ b/buildSrc/src/main/resources/instructions/step10.txt.ftl @@ -18,4 +18,12 @@ under the License. --> -[FINERACT] [VOTE] πŸ—³οΈ ${project['fineract.release.version']} for release + + +[INSTRUCTIONS:START] + +Initiate voting with the ATR (ASF Trusted Releases) tool. + +https://release-test.apache.org + +[INSTRUCTIONS:END] diff --git a/buildSrc/src/main/resources/email/release.step11.vote.subject.ftl b/buildSrc/src/main/resources/instructions/step11.txt.ftl similarity index 85% rename from buildSrc/src/main/resources/email/release.step11.vote.subject.ftl rename to buildSrc/src/main/resources/instructions/step11.txt.ftl index 380926605..5186a299e 100644 --- a/buildSrc/src/main/resources/email/release.step11.vote.subject.ftl +++ b/buildSrc/src/main/resources/instructions/step11.txt.ftl @@ -18,4 +18,12 @@ under the License. --> -[FINERACT] [VOTE] [RESULT] 🧾️ ${project['fineract.release.version']} for release + + +[INSTRUCTIONS:START] + +Conclude voting with the ATR (ASF Trusted Releases) tool. + +https://release-test.apache.org + +[INSTRUCTIONS:END] diff --git a/fineract-doc/src/docs/en/chapters/release/process-step10.adoc b/fineract-doc/src/docs/en/chapters/release/process-step10.adoc index 5a1a82a70..a7ba519d6 100644 --- a/fineract-doc/src/docs/en/chapters/release/process-step10.adoc +++ b/fineract-doc/src/docs/en/chapters/release/process-step10.adoc @@ -2,19 +2,14 @@ == Description -Voting has to be done on dev@fineract.apache.org. You can close the vote after voting period expires (72 hours) and you accumulate sufficient votes (minimum 3 x +1 PMC votes). - -[source,text] ----- -include::{rootdir}/buildSrc/src/main/resources/email/release.step10.vote.subject.ftl[lines=21..] - -include::{rootdir}/buildSrc/src/main/resources/email/release.step10.vote.message.ftl[lines=21..] ----- +Initiate voting with https://release-test.apache.org[the ATR (ASF Trusted Releases) tool]. == Gradle Task .Command [source,bash,subs="attributes+,+macros"] ---- -./gradlew fineractReleaseStep10 -Pfineract.release.version={revnumber} +./gradlew fineractReleaseStep10 ---- + +INFO: Use the ATR for this task. diff --git a/fineract-doc/src/docs/en/chapters/release/process-step11.adoc b/fineract-doc/src/docs/en/chapters/release/process-step11.adoc index 62aab040e..51a3de319 100644 --- a/fineract-doc/src/docs/en/chapters/release/process-step11.adoc +++ b/fineract-doc/src/docs/en/chapters/release/process-step11.adoc @@ -2,19 +2,14 @@ == Description -Upon receiving 3 x +1 from the PMC, or after 72 hours (whichever one comes first), reply to the voting thread and add the prefix "[RESULT]" to the subject line with the results, as follows: - -[source,text] ----- -include::{rootdir}/buildSrc/src/main/resources/email/release.step11.vote.subject.ftl[lines=21..] - -include::{rootdir}/buildSrc/src/main/resources/email/release.step11.vote.message.ftl[lines=21..] ----- +Conclude voting with https://release-test.apache.org[the ATR (ASF Trusted Releases) tool]. == Gradle Task .Command [source,text,subs="attributes+,+macros"] ---- -./gradlew fineractReleaseStep11 -Pfineract.release.version={revnumber} +./gradlew fineractReleaseStep11 ---- + +INFO: Use the ATR for this task. From 9977fb3fcbaf647eeb41948c154530926fe2d351 Mon Sep 17 00:00:00 2001 From: Adam Monsen Date: Mon, 22 Dec 2025 12:40:03 -0800 Subject: [PATCH 12/12] update manual release instructions Not gonna lie, I'm getting tired of maintaining this second source of truth. Hopefully my laziness, impatience, and hubris will tip the scales far enough to delete it. --- .../src/main/resources/instructions/step12.txt.ftl | 3 ++- .../src/main/resources/instructions/step13.txt.ftl | 1 + .../src/main/resources/instructions/step9.txt.ftl | 13 +------------ 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/buildSrc/src/main/resources/instructions/step12.txt.ftl b/buildSrc/src/main/resources/instructions/step12.txt.ftl index 22c8bec32..59f418dfc 100644 --- a/buildSrc/src/main/resources/instructions/step12.txt.ftl +++ b/buildSrc/src/main/resources/instructions/step12.txt.ftl @@ -24,6 +24,7 @@ Move the release candidate from the dev area to the release area using a Subversion server-side copy: -svn mv https://dist.apache.org/repos/dist/dev/fineract/${project['fineract.release.version']} https://dist.apache.org/repos/dist/release /fineract/ +# this is a remote operation +svn mv -m "Release Fineract 1.14.0 🚒" https://dist.apache.org/repos/dist/dev/fineract/${project['fineract.release.version']} https://dist.apache.org/repos/dist/release/fineract/ [INSTRUCTIONS:END] diff --git a/buildSrc/src/main/resources/instructions/step13.txt.ftl b/buildSrc/src/main/resources/instructions/step13.txt.ftl index 3a734bc71..db0b69712 100644 --- a/buildSrc/src/main/resources/instructions/step13.txt.ftl +++ b/buildSrc/src/main/resources/instructions/step13.txt.ftl @@ -30,5 +30,6 @@ and make sure that everything on the release tag is merged to develop and that e >> git push origin develop >> git branch -D release/${project['fineract.release.version']} >> git push origin :release/${project['fineract.release.version']} +>> git describe [INSTRUCTIONS:END] diff --git a/buildSrc/src/main/resources/instructions/step9.txt.ftl b/buildSrc/src/main/resources/instructions/step9.txt.ftl index 5d2cae8d9..ee7b00a5f 100644 --- a/buildSrc/src/main/resources/instructions/step9.txt.ftl +++ b/buildSrc/src/main/resources/instructions/step9.txt.ftl @@ -22,17 +22,6 @@ [INSTRUCTIONS:START] -Following are the typical things we need to verify before voting on a release candidate. And the release manager should verify them too before calling out a vote. - -Make sure release artifacts are hosted at https://dist.apache.org/repos/dist/dev/fineract - -* Release candidates should be in format apache-fineract-bin-${project['fineract.release.version']}.tar.gz -* Verify signatures and hashes. You may have to import the public key of the release manager to verify the signatures. (gpg --import KEYS or gpg --recv-key ) -* Git tag matches the released bits (diff -rf) -* Can compile docs and code successfully from source -* Verify DISCLAIMER, NOTICE and LICENSE (year etc) -* All files have correct headers (Rat check should be clean - gradlew rat) -* No jar files in the source artifacts -* Integration tests should work +See https://fineract.apache.org/docs/current/#_step_9_verify_distribution_staging [INSTRUCTIONS:END]