This is an automated email from the ASF dual-hosted git repository.
meonkeys pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git
The following commit(s) were added to refs/heads/develop by this push:
new 67272d1aea FINERACT-2336: improve asciidoc post-1.12.1 release
67272d1aea is described below
commit 67272d1aea163da9bebdf6ff56ead270bd47632d
Author: Adam Monsen <[email protected]>
AuthorDate: Mon Jul 14 12:47:32 2025 -0700
FINERACT-2336: improve asciidoc post-1.12.1 release
* update release notice years in NOTICE_RELEASE and NOTICE_SOURCE
* step 5
* simplify mention of tests: "Ensure all tests pass for this commit both
in CI and locally"
* recommend GPG signing annotated release tag
* step 8: improve svn commands
* This way is simpler and more efficient, especially with a bunch of
release candidate dirs in the staging area.
* step 10: mention need to test rc before +1 vote -- See:
* https://www.apache.org/legal/release-policy.html#release-approval
* https://www.apache.org/legal/release-policy.html#approving-a-release
* step 12: only PMC members can upload releases
* step 13: simplify & explain "finalize branch" instructions
* Document what worked for me for 1.12.1.
* I didn't need to create the extra `merge-$VERSION` branch and do the
recursive merge.
* document how asciidoctor upgrade is blocked
* see "official docs - deps stuck" thread on fineract dev mailing list
* https://lists.apache.org/thread/7mmsj13spb11vgz0z38fhwgzwtq03brr
* can't upgrade to 4.x because of one of these:
* https://github.com/asciidoctor/asciidoctorj-pdf/issues/25
* https://github.com/jruby/jruby/issues/5573
* https://github.com/asciidoctor/asciidoctorj-pdf/issues/16
* improve asciidoc config - opt for simplicity where the complexity adds
nothing
* compat-mode is off by default, no need for it here
* default optimization should be fine
* media should have been screen | print | prepress, just leave it as
default instead
* page size? I really don't think this is going to be printed much, just
go with default
* PDF version 1.8 is invalid, just use the default unless we someday have
a good reason to pin this
* reduce copyright years sources of truth
* see also:
https://docs.asciidoctor.org/pdf-converter/latest/asciidoc-attributes/
* remove unnecessary asciidoctorj 3.0.0 version string -- no need to pin
this
* remove prompt character from Bash shell examples
* it isn't properly syntax-highlighted and it looks confusing with line
numbers (which we might want to add)
* it isn't necessary
* the prompt character ("%" in this case) is not typically included in
shell code examples because it makes it harder to copy and paste shell code
examples
* $ is likely more common than % (at least on Debian/Ubuntu), but either
way I'd say exclude it
* fix source code syntax labels - use "bash" only when it is actually Bash
shell code
* persistence.adoc
* fix broken enumerated list
* resolves these warnings seen with, e.g.: `gradle --info doc`
* `Jul 27, 2025 8:26:48 PM
uri:classloader:/gems/asciidoctor-2.0.10/lib/asciidoctor/parser.rb
parse_list_item`
* `WARNING: chapters/architecture/persistence.adoc: line 104: list item
index: expected 1, got 2`
* `Jul 27, 2025 8:26:48 PM
uri:classloader:/gems/asciidoctor-2.0.10/lib/asciidoctor/parser.rb parse_list`
* `WARNING: chapters/architecture/persistence.adoc: line 110: list item
index: expected 1, got 3`
* fix wrapping (we use hardbreaks)
* fix typo: `s/plane text/plain text/`
* switch to rouge syntax highlighter - it handles more source languages
* fix broken long shell code lines
* fix .avro file syntax highlighting (it's JSON)
* configuration-gpg.adoc
* fix accidental block continuation
* One little plus sign was making `= Email` appear verbatim in rendered
output because it was interpreted as a list continuation.
* See
https://docs.asciidoctor.org/asciidoc/latest/lists/continuation/#list-continuation
* recommend more secure keys
* add a line continuation for an enumerated list
* architecture-overview.puml: remove this unused (likely a "Hello World")
diagram
* release-schedule.puml: fix pluralization of days
* purely aesthetic: doesn't affect chart rendering
* fix src/bin/binary tarball name typos
* missed a few in e090da2a01d2b39b2bc9e33db801575dcaacaaf3
* fix release branch name
* must match `release/{revnumber}`, per gitVersioning stanza in top level
build.gradle
* harden.adoc: fix broken link to CISA
* fineract-doc/build.gradle
* ensure HTML task has diagrams and images availble
---
NOTICE_RELEASE | 2 +-
NOTICE_SOURCE | 2 +-
README.md | 2 +
build.gradle | 4 +
.../email/release.step03.branch.message.ftl | 2 +-
.../email/release.step10.vote.message.ftl | 4 +-
.../src/main/resources/instructions/step13.txt.ftl | 12 +--
.../src/main/resources/instructions/step9.txt.ftl | 2 +-
fineract-doc/build.gradle | 31 ++++----
.../docs/en/chapters/architecture/batch-jobs.adoc | 6 +-
.../docs/en/chapters/architecture/persistence.adoc | 42 ++++++----
.../architecture/reliable-event-framework.adoc | 8 +-
.../src/docs/en/chapters/custom/intro.adoc | 1 +
.../en/chapters/release/configuration-gpg.adoc | 91 +++++++++++-----------
.../docs/en/chapters/release/process-step01.adoc | 2 +-
.../docs/en/chapters/release/process-step02.adoc | 2 +-
.../docs/en/chapters/release/process-step03.adoc | 14 ++--
.../docs/en/chapters/release/process-step04.adoc | 2 +-
.../docs/en/chapters/release/process-step05.adoc | 12 +--
.../docs/en/chapters/release/process-step06.adoc | 36 ++++++---
.../docs/en/chapters/release/process-step07.adoc | 17 ++--
.../docs/en/chapters/release/process-step08.adoc | 14 ++--
.../docs/en/chapters/release/process-step09.adoc | 69 +++++++++++++++-
.../docs/en/chapters/release/process-step10.adoc | 2 +-
.../docs/en/chapters/release/process-step11.adoc | 2 +-
.../docs/en/chapters/release/process-step12.adoc | 6 +-
.../docs/en/chapters/release/process-step13.adoc | 22 +++---
.../docs/en/chapters/release/process-step14.adoc | 2 +-
.../docs/en/chapters/release/process-step15.adoc | 2 +-
.../src/docs/en/chapters/security/harden.adoc | 4 +-
fineract-doc/src/docs/en/config.adoc | 8 +-
.../docs/en/diagrams/architecture-overview.puml | 3 -
.../src/docs/en/diagrams/release-schedule.puml | 2 +-
33 files changed, 262 insertions(+), 168 deletions(-)
diff --git a/NOTICE_RELEASE b/NOTICE_RELEASE
index 10dfd7f96a..083abdfe51 100644
--- a/NOTICE_RELEASE
+++ b/NOTICE_RELEASE
@@ -1,5 +1,5 @@
Apache Fineract
-Copyright 2008-2021 The Apache Software Foundation
+Copyright 2008-2025 The Apache Software Foundation
This product includes software developed by The Apache Software
Foundation (http://www.apache.org/).
diff --git a/NOTICE_SOURCE b/NOTICE_SOURCE
index 57c087f090..869b39afa1 100644
--- a/NOTICE_SOURCE
+++ b/NOTICE_SOURCE
@@ -1,5 +1,5 @@
Apache Fineract
-Copyright 2008-2021 The Apache Software Foundation
+Copyright 2008-2025 The Apache Software Foundation
This product includes software developed by The Apache Software
Foundation (http://www.apache.org/).
diff --git a/README.md b/README.md
index 5b158a3718..5a653ca02f 100644
--- a/README.md
+++ b/README.md
@@ -271,6 +271,8 @@ Additionally, IDEs such as IntelliJ are useful for editing
the AsciiDoc source f
HTML rendered from the AsciiDoc source files is also available online at
<https://fineract.apache.org/docs/current/>.
+A release version is derived from source control. The version will include
`-SNAPSHOT` unless the current branch looks like a release or release
maintenance branch. See `gitVersioning` settings in `build.gradle` for details.
+
Connection pool configuration
=============================
diff --git a/build.gradle b/build.gradle
index a8a58ad682..66046387fd 100644
--- a/build.gradle
+++ b/build.gradle
@@ -107,6 +107,10 @@ plugins {
id 'net.ltgt.errorprone' version '4.1.0' apply false
id 'io.swagger.core.v3.swagger-gradle-plugin' version '2.2.23' apply false
id 'com.gorylenko.gradle-git-properties' version '2.4.2' apply false
+ // can't upgrade to 4.x because of one of these:
+ // https://github.com/asciidoctor/asciidoctorj-pdf/issues/25
+ // https://github.com/jruby/jruby/issues/5573
+ // https://github.com/asciidoctor/asciidoctorj-pdf/issues/16
id 'org.asciidoctor.jvm.convert' version '3.3.2' apply false
id 'org.asciidoctor.jvm.pdf' version '3.3.2' apply false
id 'com.google.cloud.tools.jib' version '3.4.5' apply false
diff --git
a/buildSrc/src/main/resources/email/release.step03.branch.message.ftl
b/buildSrc/src/main/resources/email/release.step03.branch.message.ftl
index 0c5665e828..a6f3667b25 100644
--- a/buildSrc/src/main/resources/email/release.step03.branch.message.ftl
+++ b/buildSrc/src/main/resources/email/release.step03.branch.message.ftl
@@ -24,7 +24,7 @@ Hello everyone,
You can continue working and merging PRs to the develop branch for future
releases, as always.
-The DRAFT release notes are on
https://cwiki.apache.org/confluence/display/FINERACT/${project['fineract.release.version']}+-+Apache+Fineract.
Does anyone see anything missing?
+The DRAFT release notes are on
https://cwiki.apache.org/confluence/display/FINERACT/${project['fineract.release.version']}+-+Apache+Fineract
. Does anyone see anything missing?
Does anyone have any last minutes changes they would like to see cherry-picked
to branch ${project['fineract.release.version']}, or are we good go and
actually cut the release based on this branch as it is?
diff --git a/buildSrc/src/main/resources/email/release.step10.vote.message.ftl
b/buildSrc/src/main/resources/email/release.step10.vote.message.ftl
index 31d5b36ae4..8be7ff5d0e 100644
--- a/buildSrc/src/main/resources/email/release.step10.vote.message.ftl
+++ b/buildSrc/src/main/resources/email/release.step10.vote.message.ftl
@@ -30,7 +30,7 @@ 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 contains source and binary artifacts.
+Note that this release candidate contains source and binary artifacts.
This vote will be open for 72 hours:
@@ -38,7 +38,7 @@ This vote will be open for 72 hours:
[ ] +0 no opinion
[ ] -1 disapprove (and reason why)
-Please indicate if you are a binding vote (member of the PMC).
+Please indicate if you are a binding vote (member of the PMC). Note: PMC
members are required to download, compile, and test the artifacts before
submitting their +1 vote.
Please also indicate with "Tested: YES/NO/PARTIAL" if you have locally built
and/or tested these artifacts and/or a clone of the code checked out to the
release commit, following the form:
diff --git a/buildSrc/src/main/resources/instructions/step13.txt.ftl
b/buildSrc/src/main/resources/instructions/step13.txt.ftl
index 64f6ff9bc6..3a734bc711 100644
--- a/buildSrc/src/main/resources/instructions/step13.txt.ftl
+++ b/buildSrc/src/main/resources/instructions/step13.txt.ftl
@@ -26,13 +26,9 @@ As discussed in
https://issues.apache.org/jira/browse/FINERACT-1154, now that ev
and make sure that everything on the release tag is merged to develop and that
e.g. git describe works:
>> git checkout develop
->> git branch -D ${project['fineract.release.version']}
->> git push origin :${project['fineract.release.version']}
->> git checkout develop
->> git checkout -b merge-${project['fineract.release.version']}
->> git merge -s recursive -Xignore-all-space
${project['fineract.release.version']}
->> git commit
->> git push <USER>
->> hub pull-request
+>> git merge release/${project['fineract.release.version']}
+>> git push origin develop
+>> git branch -D release/${project['fineract.release.version']}
+>> git push origin :release/${project['fineract.release.version']}
[INSTRUCTIONS:END]
diff --git a/buildSrc/src/main/resources/instructions/step9.txt.ftl
b/buildSrc/src/main/resources/instructions/step9.txt.ftl
index 70ddb63cf5..5d2cae8d92 100644
--- a/buildSrc/src/main/resources/instructions/step9.txt.ftl
+++ b/buildSrc/src/main/resources/instructions/step9.txt.ftl
@@ -26,7 +26,7 @@ Following are the typical things we need to verify before
voting on a release ca
Make sure release artifacts are hosted at
https://dist.apache.org/repos/dist/dev/fineract
-* Release candidates should be in format
apache-fineract-${project['fineract.release.version']}-binary.tar.gz
+* 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
<key id>)
* Git tag matches the released bits (diff -rf)
* Can compile docs and code successfully from source
diff --git a/fineract-doc/build.gradle b/fineract-doc/build.gradle
index 67ce8887d9..41710c31bc 100644
--- a/fineract-doc/build.gradle
+++ b/fineract-doc/build.gradle
@@ -19,9 +19,9 @@
apply plugin: 'org.asciidoctor.jvm.convert'
apply plugin: 'org.asciidoctor.jvm.pdf'
-asciidoctorj {
- version = '2.5.3'
+// see also:
https://asciidoctor.github.io/asciidoctor-gradle-plugin/master/user-guide/
+asciidoctorj {
attributes = [
version: "${project.version}",
docdate: new Date(),
@@ -35,16 +35,23 @@ asciidoctorj {
]
modules {
- pdf.version '1.6.2'
- diagram.version '2.2.1'
- epub.version '1.5.1'
- // revealjs.version '4.1.0'
+ diagram.use()
}
fatalWarnings ~/include file not found|missing callout|image to embed not
found or not readable/
fatalWarnings missingIncludes()
}
+task copyImages(type: Copy) {
+ from "${projectDir}/src/docs/en/images"
+ into "${buildDir}/generated/images"
+}
+
+task copyDiagrams(type: Copy) {
+ from "${projectDir}/src/docs/en/diagrams"
+ into "${buildDir}/generated/diagrams"
+}
+
asciidoctor {
languages 'en'
@@ -57,17 +64,9 @@ asciidoctor {
logging.captureStandardError LogLevel.INFO
- dependsOn(':fineract-client:clean', ':fineract-client:buildAsciidoc')
-}
-
-task copyImages(type: Copy) {
- from "${projectDir}/src/docs/en/images"
- into "${buildDir}/generated/images"
-}
+ dependsOn copyImages, copyDiagrams
-task copyDiagrams(type: Copy) {
- from "${projectDir}/src/docs/en/diagrams"
- into "${buildDir}/generated/diagrams"
+ dependsOn(':fineract-client:clean', ':fineract-client:buildAsciidoc')
}
asciidoctorPdf {
diff --git a/fineract-doc/src/docs/en/chapters/architecture/batch-jobs.adoc
b/fineract-doc/src/docs/en/chapters/architecture/batch-jobs.adoc
index 8a08a7df53..9b920edf3c 100644
--- a/fineract-doc/src/docs/en/chapters/architecture/batch-jobs.adoc
+++ b/fineract-doc/src/docs/en/chapters/architecture/batch-jobs.adoc
@@ -213,7 +213,7 @@ The business steps are configurable through APIs:
Retrieving the configuration for a job:
-[source]
+[source,text]
----
GET /fineract-provider/api/v1/jobs/{jobName}/steps?tenantIdentifier={tenantId}
HTTP 200
@@ -235,7 +235,7 @@ HTTP 200
Updating the business step configuration for a job:
-[source]
+[source,text]
----
PUT /fineract-provider/api/v1/jobs/{jobName}/steps?tenantIdentifier={tenantId}
@@ -274,7 +274,7 @@ When the Inline job gets triggered then the corresponding
existing job will run
Triggering the Inline Loan COB Job:
-[source]
+[source,text]
----
POST /fineract-provider/api/v1/jobs/LOAN_COB/inline?tenantIdentifier={tenantId}
diff --git a/fineract-doc/src/docs/en/chapters/architecture/persistence.adoc
b/fineract-doc/src/docs/en/chapters/architecture/persistence.adoc
index 75e816d560..320939f646 100644
--- a/fineract-doc/src/docs/en/chapters/architecture/persistence.adoc
+++ b/fineract-doc/src/docs/en/chapters/architecture/persistence.adoc
@@ -33,22 +33,32 @@ The actual code can be found in the `DatabaseTypeResolver`
class.
== Tenant database security
-The tenant database schema password is stored in the
`tenant_server_connections` table in the tenant database.
-The password and the read only schema password are encrypted using the
`fineract.tenant.master-password` property.
-By default, the database property will be encrypted in the first start from a
plane text.
+The tenant database schema password is stored in the
`tenant_server_connections` table in the tenant database. The password and the
read only schema password are encrypted using the
`fineract.tenant.master-password` property. By default, the database property
will be encrypted in the first start from a plain text.
When you want to generate a new encrypted password, you can use the
`org.apache.fineract.infrastructure.core.service.database.DatabasePasswordEncryptor`
class.
=== Database password encryption usage
-```
-java -cp fineract-provider.jar
-Dloader.main=org.apache.fineract.infrastructure.core.service.database.DatabasePasswordEncryptor
org.springframework.boot.loader.PropertiesLauncher <masterPassword>
<plainPassword>
-```
+
+[%nowrap,bash]
+----
+java -cp fineract-provider.jar \
+
-Dloader.main=org.apache.fineract.infrastructure.core.service.database.DatabasePasswordEncryptor
\
+ org.springframework.boot.loader.PropertiesLauncher \
+ <masterPassword> \
+ <plainPassword>
+----
For example:
-```
-java -cp fineract-provider-0.0.0-48f7e315.jar
-Dloader.main=org.apache.fineract.infrastructure.core.service.database.DatabasePasswordEncryptor
org.springframework.boot.loader.PropertiesLauncher fineract-master-password
fineract-tenant-password
+
+[%nowrap,text]
+----
+java -cp fineract-provider-0.0.0-48f7e315.jar \
+
-Dloader.main=org.apache.fineract.infrastructure.core.service.database.DatabasePasswordEncryptor
\
+ org.springframework.boot.loader.PropertiesLauncher \
+ fineract-master-password \
+ fineract-tenant-password
The encrypted password:
VLwGl7vOP/q275ZTku+PNGWnGwW4mzzNHSNaO9Pr67WT5/NZMpBr9tGYYiYsqwL1eRew2jl7O3/N1EFbLlXhSA==
-```
+----
== Data-access layer
@@ -85,38 +95,38 @@ The switch from Flyway (1.6.x) to Liquibase (1.7.x) was
planned to be as smooth
=== Troubleshooting
1. During upgrade from Fineract 1.5.0 to 1.6.0, Liquibase fails
-
++
After dropping the flyway migrations table (schema_version), Liquibase runs its
own migrations which fails (in recreating tables which already exist) because
we are aiming to re-use DB with existing data from Fineract 1.5.0.
-
++
Solution: The latest release version (1.6.0) doesn't have Liquibase at all, it
still runs Flyway migrations. Only the develop branch (later to be 1.7.0) got
switched to Liquibase. Do not pull the develop before upgrading your instance.
-
++
Make sure first you upgrade your instance (aka database schema with Fineract
1.6.0).
Then upgrade with the current develop branch. Check if some migration scripts
did not run which led to some operations failing due to slight differences in
schema. Try with running the missing migrations manually.
-
++
Note: develop is considered unstable until released.
2. Upgrading database from MySQL 5.7 as advised to Maria DB 10.6, fails. If we
use data from version 18.03.01 it fails to migrate the data. If we use
databases
running on 1.5.0 release it completes the startup but the system login fails.
-
++
Solution: A database upgrade is separate thing to take care of.
3. We are getting `ScehmaUpgradeNeededException: Make sure to upgrade to
Fineract
1.6 first and then to a newer version` error while upgrading to `tag 1.6`.
-
++
1.6 version shouldn't include Liquibase. It will only be released after 1.6.
Make sure Liquibase is dropping `schema_version` table, as there is no Flyway
it is not required. Drop Flyway and use Liquibase for both migrations and
database independence. In case, if you still get errors, you can use git SHA
`746c589a6e809b33d68c0596930fcaa7338d5270` and Flyway migration will be done to
the latest.
-
++
```
TENANT_LATEST_FLYWAY_VERSION = 392;
TENANT_LATEST_FLYWAY_SCRIPT_NAME =
diff --git
a/fineract-doc/src/docs/en/chapters/architecture/reliable-event-framework.adoc
b/fineract-doc/src/docs/en/chapters/architecture/reliable-event-framework.adoc
index 8a6bdcb103..ea6efe17de 100644
---
a/fineract-doc/src/docs/en/chapters/architecture/reliable-event-framework.adoc
+++
b/fineract-doc/src/docs/en/chapters/architecture/reliable-event-framework.adoc
@@ -156,7 +156,7 @@ For example the OfficeDataV1 Avro schema looks the
following:
.`OfficeDataV1.avsc`
[%collapsible]
====
-[source,avroschema]
+[source,json]
----
include::{rootdir}/fineract-avro-schemas/src/main/avro/office/v1/OfficeDataV1.avsc[]
----
@@ -175,7 +175,7 @@ This implies that for putting a single event message onto a
message queue for ex
The message schema looks the following:
.`MessageV1.avsc`
-[source,avroschema]
+[source,json]
----
include::{rootdir}/fineract-avro-schemas/src/main/avro/MessageV1.avsc[]
----
@@ -370,7 +370,7 @@ New Avro schemas can be easily created. Just create a new
Avro schema file in th
=== BigDecimal support in Avro schemas
Apache Avro by default doesn't support complex types like a BigDecimal. It has
to be implemented using a custom snippet like this:
-[source,avroschema]
+[source,json]
----
include::{rootdir}/fineract-avro-schemas/src/main/resources/avro-templates/bigdecimal.avsc[]
----
@@ -380,7 +380,7 @@ It's a 20 precision and 8 scale BigDecimal.
Obviously it's quite challenging to copy-paste this snippet to every single
BigDecimal field, so there's a customization in place for Fineract.
The type `bigdecimal` is supported natively, and you're free to use it like
this:
-[source,avroschema]
+[source,json]
----
{
"default": null,
diff --git a/fineract-doc/src/docs/en/chapters/custom/intro.adoc
b/fineract-doc/src/docs/en/chapters/custom/intro.adoc
index 54ea099a2a..ad72bc6ae6 100644
--- a/fineract-doc/src/docs/en/chapters/custom/intro.adoc
+++ b/fineract-doc/src/docs/en/chapters/custom/intro.adoc
@@ -37,6 +37,7 @@
include::{rootdir}/custom/acme/note/service/build.gradle[lines=19..]
NOTE: You don't need to edit `settings.gradle` to add your modules/libraries.
If you follow above convention they'll get included automatically.
+
5. The dependency.gradle file could look something like this:
++
[source,groovy]
----
include::{rootdir}/custom/acme/note/service/dependencies.gradle[lines=19..]
diff --git a/fineract-doc/src/docs/en/chapters/release/configuration-gpg.adoc
b/fineract-doc/src/docs/en/chapters/release/configuration-gpg.adoc
index 9605661f99..d85d07d1a7 100644
--- a/fineract-doc/src/docs/en/chapters/release/configuration-gpg.adoc
+++ b/fineract-doc/src/docs/en/chapters/release/configuration-gpg.adoc
@@ -13,26 +13,25 @@ gpg --version
----
+
.Output GPG version
-[source,bash]
+[source,text]
----
-gpg (GnuPG) 2.2.27
-libgcrypt 1.9.4
-Copyright (C) 2021 Free Software Foundation, Inc.
+gpg (GnuPG) 2.4.4
+libgcrypt 1.10.3
+Copyright (C) 2024 g10 Code GmbH
License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
-Home: /home/aleks/.gnupg
+Home: /home/user/.gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2
-
----
+
-CAUTION: The insecure hash algorithm SHA1 is still supported in version
2.2.27. SHA1 is obsolete and you don't want to use it to generate your
signature.
+CAUTION: The insecure hash algorithm SHA1 is still supported in version 2.4.4.
SHA1 is obsolete and you don't want to use it to generate your signature.
2. Generate your GPG key pair:
+
@@ -43,60 +42,61 @@ gpg --full-gen-key
----
+
.Output generate GPG key pair (step 1: key type selection)
-[source,bash]
+[source,text]
----
-gpg (GnuPG) 2.2.27; Copyright (C) 2021 Free Software Foundation, Inc.
-This is free software: you are free to change and redistribute it.
-There is NO WARRANTY, to the extent permitted by law.
-
Please select what kind of key you want:
- (1) RSA and RSA (default)
+ (1) RSA and RSA
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
+ (9) ECC (sign and encrypt) *default*
+ (10) ECC (sign only)
(14) Existing key from card
-Your selection?
+Your selection?
----
+
-There are four options. The default is to use RSA to create the key pair. Good
enough for us.
+Choose the default.
+
-.Output generate GPG key pair (step 2: key length selection)
-[source,bash]
+.Output generate GPG key pair (step 2: elliptic curve selection)
+[source,text]
----
-RSA keys may be between 1024 and 4096 bits long.
-What keysize do you want? (2048)
+Please select which elliptic curve you want:
+ (1) Curve 25519 *default*
+ (4) NIST P-384
+ (6) Brainpool P-256
+Your selection?
----
+
-The default key length is 2048 bits. 1024 is obsolete and a longer 4096 RSA
key will not provide more security than 2048 RSA key. Use the default.
+Again, choose the default.
+
.Output generate GPG key pair (step 3: validity selection)
-[source,bash]
+[source,text]
----
-Requested keysize is 2048 bits
Please specify how long the key should be valid.
- 0 = key does not expire
- <n> = key expires in n days
- <n>w = key expires in n weeks
- <n>m = key expires in n months
- <n>y = key expires in n years
-Key is valid for? (0)2y
+ 0 = key does not expire
+ <n> = key expires in n days
+ <n>w = key expires in n weeks
+ <n>m = key expires in n months
+ <n>y = key expires in n years
+Key is valid for? (0) 2y
----
+
2 years for the validity of your keys should be fine. You can always update
the expiration time later on.
+
.Output generate GPG key pair (step 4: confirmation)
-[source,bash]
+[source,text]
----
Key expires at Sun 16 Apr 2024 08:10:24 PM UTC
-Is this correct? (y/N)y
+Is this correct? (y/N) y
----
+
Confirm if everything is correct.
+
.Output generate GPG key pair (step 5: provide user details)
-[source,bash]
+[source,text]
----
GnuPG needs to construct a user ID to identify your key.
+
Real name: Aleksandar Vidakovic
Email address: [email protected]
Comment:
@@ -105,7 +105,7 @@ Comment:
Provide your user details for the key. This is important because this
information will be included in our key. It's one way of indicating who is
owner of this key. The email address is a unique identifier for a person. You
can leave Comment blank.
+
.Output generate GPG key pair (step 6: user ID selection)
-[source,bash]
+[source,text]
----
You selected this USER-ID:
"Aleksandar Vidakovic <[email protected]>"
@@ -119,7 +119,7 @@ After the selection of your user ID GPG will ask for a
passphrase to protect you
CAUTION: Don't lose your private key password. You won't be able to unlock and
use your private key without it.
+
.Output generate GPG key pair (step 7: gpg key pair generation)
-[source,bash]
+[source,text]
----
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
@@ -130,7 +130,7 @@ generator a better chance to gain enough entropy.
Generating the GPG keys will take a while.
+
.Output generate GPG key pair (step 8: gpg key pair finished)
-[source,bash]
+[source,text]
----
gpg: key 7890ABCD marked as ultimately trusted <1>
gpg: directory '/home/aleks/.gnupg/openpgp-revocs.d' created
@@ -141,21 +141,23 @@ gpg: checking the trustdb
gpg: marginals needed: 3 completes needed: 1 trust model: PGP
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: next trustdb check due at 2024-04-16
-pub rsa2048/7890ABCD 2022-04-16 [S] [expires: 2024-04-16] <3>
+pub ed25519/7890ABCD 2022-04-16 [SC] [expires: 2024-04-16] <3>
Key fingerprint = ABCD EFGH IJKL MNOP QRST UVWX YZ12 3456 7890 ABCD <4>
uid [ultimate] Aleksandar Vidakovic <[email protected]> <5>
-sub rsa2048/4FGHIJ56 2022-04-16 [] [expires: 2024-04-16]
+sub cv25519/4FGHIJ56 2022-04-16 [E] [expires: 2024-04-16] <6>
----
+
-<1> GPG created a unique identifier in HEX format for your public key. When
someone wants to download your public key, they can refer to it either with
your email address or this HEX value.
+<1> GPG created a unique identifier in hexadecimal format for your public key.
When someone wants to download your public key, they can refer to it either
with your email address or this hex value. The hex value is sometimes prefixed
with `0x` as is commonly done with hexadecimal numbers.
+
-<2> GPG created a revocation certificate and its directory. You should never
share your private key. If your private key is compromised, you need to use
your revocation certificate to revoke your key.
+<2> GPG created a revocation certificate and its directory. If your private
key is compromised, you need to use your revocation certificate to revoke your
key.
+
-<3> The public key is 2048 bits using RSA algorithm and shows the expiration
date of 16 Apr 2024. The public key ID `7890ABCD` matches the last 8 bits of
key fingerprint.
+<3> The public key uses the Ed25519 ECC (Elliptic Curve Cryptography)
algorithm and shows the expiration date of 16 Apr 2024. The public key ID
`0x7890ABCD` matches the last 8 characters of key fingerprint. The `[SC]`
indicates this key is used to sign (prove authorship) and certify (issue
subkeys for encryption, signature and authentication operations).
<4> The key fingerprint (`ABCD EFGH IJKL MNOP QRST UVWX YZ12 3456 7890 ABCD`)
is a hash of your public key.
+
<5> Your name and your email address are shown with information about the
subkey.
+
+<6> This Curve25519 subkey is used for encryption.
++
Now you can find that there are two files created under
~/.gnupg/private-keys-v1.d/ directory. These two files are binary files with
.key extension.
3. Export your public key:
@@ -177,7 +179,7 @@ gpg --export-secret-keys --armor [email protected] >
privkey.asc
Your private key should be kept in a safe place, like an encrypted flash
drive. Treat it like your house key. Only you can have it and don't lose it.
And you must remember your passphrase, otherwise you can't unlock your private
key.
+
You should protect your revocation certificate. Anyone in possession of your
revocation certificate, could immediately revoke your public/private key pair
and generate fake ones.
-
++
IMPORTANT: Please contact a PMC member to add your GPG public key in
Fineract's Subversion repository. This is necessary to be able to validate
published releases.
1. Upload your GPG key to a keyserver:
@@ -189,7 +191,7 @@ gpg --send-keys ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCD
+
Before doing this, make sure that your default keyserver is
hkp://keyserver.ubuntu.com/. You can do this by changing the default keyserver
in ~/.gnupg/dirmngr.conf:
+
-[source,bash]
+[source,text]
----
keyserver hkp://keyserver.ubuntu.com/
----
@@ -198,7 +200,9 @@ Alternatively you can provide the keyserver with the send
command:
+
[source,bash]
----
-gpg --keyserver 'hkp://keyserver.ubuntu.com:11371' --send-keys
ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCD
+gpg \
+ --keyserver 'hkp://keyserver.ubuntu.com:11371' \
+ --send-keys ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCD
----
+
Another option to publish your key is to submit an armored public key directly
at https://keyserver.ubuntu.com/. You can create the necessary data with this
command by providing the email address that you used when you created your key
pair:
@@ -210,7 +214,7 @@ gpg --armor --export [email protected]
+
Output:
+
-[source,bash]
+[source,text]
----
-----BEGIN PGP PUBLIC KEY BLOCK-----
@@ -222,4 +226,3 @@ gXXeWjafxBmHT1cM8hoBZBYzgTu9nK5UnllWunfaHXiCBG4oQQ==
=85/F
-----END PGP PUBLIC KEY BLOCK-----
----
-+
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 e4491c22b2..b847af602b 100644
--- a/fineract-doc/src/docs/en/chapters/release/process-step01.adoc
+++ b/fineract-doc/src/docs/en/chapters/release/process-step01.adoc
@@ -22,5 +22,5 @@
include::{rootdir}/buildSrc/src/main/resources/email/release.step01.headsup.mess
.Command
[source,bash,subs="attributes+,+macros"]
----
-% ./gradlew fineractReleaseStep1 -Pfineract.release.issue=1234
-Pfineract.releaseBranch.date="Monday, April 25, 2022"
-Pfineract.release.version={revnumber}
+./gradlew fineractReleaseStep1 -Pfineract.release.issue=1234
-Pfineract.releaseBranch.date="Monday, April 25, 2022"
-Pfineract.release.version={revnumber}
----
diff --git a/fineract-doc/src/docs/en/chapters/release/process-step02.adoc
b/fineract-doc/src/docs/en/chapters/release/process-step02.adoc
index b126d0fa12..22056cd878 100644
--- a/fineract-doc/src/docs/en/chapters/release/process-step02.adoc
+++ b/fineract-doc/src/docs/en/chapters/release/process-step02.adoc
@@ -28,7 +28,7 @@ Finally, check out the output of the JIRA release note tool
to see which tickets
.Command
[source,bash,subs="attributes+,+macros"]
----
-% ./gradlew fineractReleaseStep2 -Pfineract.release.version={revnumber}
+./gradlew fineractReleaseStep2 -Pfineract.release.version={revnumber}
----
CAUTION: This task is not yet automated!
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 2d9ead3d1d..48e39e5e93 100644
--- a/fineract-doc/src/docs/en/chapters/release/process-step03.adoc
+++ b/fineract-doc/src/docs/en/chapters/release/process-step03.adoc
@@ -10,30 +10,30 @@ You do not need to ask committers to hold off any commits
until you have branche
+
[source,bash]
----
-% git clone [email protected]:apache/fineract.git
-% cd fineract
+git clone [email protected]:apache/fineract.git
+cd fineract
----
2. Check that current HEAD points to commit on which you want to base new
release branch. Checkout a particular earlier commit if not.
+
[source,bash]
----
-% git log <1>
+git log <1>
----
<1> Check current branch history. HEAD should point to commit that you want to
be base for your release branch
-3. Create a new release branch with name "$Version"
+3. Create a new release branch using the version number
+
[source,bash,subs="attributes+,+macros"]
----
-% git checkout -b {revnumber}
+git checkout -b release/{revnumber}
----
4. Push new branch to Apache Fineract repository
+
[source,bash,subs="attributes+,+macros"]
----
-% git push origin {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.
@@ -52,5 +52,5 @@
include::{rootdir}/buildSrc/src/main/resources/email/release.step03.branch.messa
.Command
[source,bash,subs="attributes+,+macros"]
----
-% ./gradlew fineractReleaseStep3 -Pfineract.release.date="Monday, May 10,
2022" -Pfineract.release.version={revnumber}
+./gradlew fineractReleaseStep3 -Pfineract.release.date="Monday, May 10, 2022"
-Pfineract.release.version={revnumber}
----
diff --git a/fineract-doc/src/docs/en/chapters/release/process-step04.adoc
b/fineract-doc/src/docs/en/chapters/release/process-step04.adoc
index 41dc3cf893..eeb8f47bc9 100644
--- a/fineract-doc/src/docs/en/chapters/release/process-step04.adoc
+++ b/fineract-doc/src/docs/en/chapters/release/process-step04.adoc
@@ -9,7 +9,7 @@ You first need to close the release in JIRA so that the about
to be released ver
.Command
[source,bash]
----
-% ./gradlew fineractReleaseStep4
+./gradlew fineractReleaseStep4
----
CAUTION: This task is not yet automated!
diff --git a/fineract-doc/src/docs/en/chapters/release/process-step05.adoc
b/fineract-doc/src/docs/en/chapters/release/process-step05.adoc
index 844434ede0..9a7a0b77c3 100644
--- a/fineract-doc/src/docs/en/chapters/release/process-step05.adoc
+++ b/fineract-doc/src/docs/en/chapters/release/process-step05.adoc
@@ -6,12 +6,12 @@ Next, you create a git tag from the HEAD of the release's git
branch.
[source,bash,subs="attributes+,+macros"]
----
-% git checkout {revnumber}
-% ./gradlew clean integrationTests <1>
-% git tag -a {revnumber} -m "Fineract {revnumber} release"
-% git push origin tag {revnumber}
+git checkout -b release/{revnumber} <1>
+git tag -a {revnumber} -m "Fineract {revnumber} release" -s <2>
+git push origin tag {revnumber}
----
-<1> Run additonally manual tests with the community app.
+<1> Ensure all tests pass for this commit both in CI and locally.
+<2> `-s` is optional but recommended: GPG signatures on tags are useful for
trust and integrity.
CAUTION: It is important to create so called annotated tags (vs. lightweight)
for releases.
@@ -20,5 +20,5 @@ CAUTION: It is important to create so called annotated tags
(vs. lightweight) fo
.Command
[source,bash,subs="attributes+,+macros"]
----
-% ./gradlew fineractReleaseStep5 -Pfineract.release.version={revnumber}
+./gradlew fineractReleaseStep5 -Pfineract.release.version={revnumber}
----
diff --git a/fineract-doc/src/docs/en/chapters/release/process-step06.adoc
b/fineract-doc/src/docs/en/chapters/release/process-step06.adoc
index 89378d18bb..d967baba70 100644
--- a/fineract-doc/src/docs/en/chapters/release/process-step06.adoc
+++ b/fineract-doc/src/docs/en/chapters/release/process-step06.adoc
@@ -4,10 +4,13 @@
Create source and binary tarballs.
+// FIXME - clean this up? focus on what commands should actually be run
+
[source,bash,subs="attributes+"]
----
-% ./gradlew build -x test
+./gradlew --rerun-tasks srcDistTar binaryDistTar <1>
----
+<1> The source tarball might not be created if `--rerun-tasks` is omitted.
Look in `fineract-war/build/distributions/` for the tarballs.
@@ -15,23 +18,34 @@ Make sure to do some sanity checks. The source tarball and
the code in the relea
[source,bash,subs="attributes+"]
----
-% cd /fineract-release-preparations
-% tar -xvf path/to/apache-fineract-src-{revnumber}.tar.gz
-% git clone [email protected]:apache/fineract.git
-% cd fineract/
-% git checkout tags/{revnumber}
-% cd ..
-% diff -r fineract apache-fineract-src-{revnumber}
+cd /fineract-release-preparations
+tar -xvf path/to/apache-fineract-src-{revnumber}.tar.gz
+git clone [email protected]:apache/fineract.git
+cd fineract/
+git checkout tags/{revnumber}
+cd ..
+diff -r fineract apache-fineract-src-{revnumber}
+----
+
+// FIXME - add output example
+
+Make sure the code compiles and tests pass on the uncompressed source. Do as
much testing as you can and share what you did. Here's the bare minimum check:
+
+[source,bash,subs="attributes+"]
+----
+./gradlew build -x test -x doc
----
-Make sure the code compiles and tests pass on the uncompressed source. Do as
much testing as you can and share what you did. Ideally you'd build code and
docs and run every possible test and check, but
https://github.com/apache/fineract/actions[running everything has complex
dependencies, caches, and takes many hours]. It is rarely done in practice
offline / local / on developer machines. But please, go ahead and run the test
and doc tasks, and more! Grab a cup of coffee and run everythi [...]
+Ideally you'd build code and docs and run every possible test and check, but
https://github.com/apache/fineract/actions[running everything has complex
dependencies, caches, and takes many hours]. It is rarely done in practice
offline / local / on developer machines. But please, go ahead and run the test
and doc tasks, and more! Grab a cup of coffee and run everything you can. See
the various builds in `.github/workflows/` and try the same things on your own.
We should all hammer on a rel [...]
-Finally, inspect `apache-fineract-{revnumber}-binary.tar.gz`. Make sure the
`fineract-provider-{revnumber}.jar` can be run directly, and the
`fineract-provider.war` can be run with Tomcat.
+Finally, inspect `apache-fineract-bin-{revnumber}.tar.gz`. Make sure the
`fineract-provider-{revnumber}.jar` can be run directly, and the
`fineract-provider.war` can be run with Tomcat.
== Gradle Task
.Command
[source,bash]
----
-% ./gradlew fineractReleaseStep6
+./gradlew fineractReleaseStep6
----
+
+CAUTION: This task doesn't work. Build release artifacts manually as indicated
above.
diff --git a/fineract-doc/src/docs/en/chapters/release/process-step07.adoc
b/fineract-doc/src/docs/en/chapters/release/process-step07.adoc
index 1d5bd257d3..1d47c67941 100644
--- a/fineract-doc/src/docs/en/chapters/release/process-step07.adoc
+++ b/fineract-doc/src/docs/en/chapters/release/process-step07.adoc
@@ -6,10 +6,17 @@ Release source and binary tarballs must be checksummed and
signed. In order to s
[source,bash,subs="attributes+,+macros"]
----
-% gpg --armor --output apache-fineract-src-{revnumber}.tar.gz.asc --detach-sig
apache-fineract-src-{revnumber}.tar.gz
-% gpg --print-md SHA512 apache-fineract-src-{revnumber}.tar.gz >
apache-fineract-src-{revnumber}.tar.gz.sha512
-% gpg --armor --output apache-fineract-bin-{revnumber}.tar.gz.asc --detach-sig
apache-fineract-bin-{revnumber}.tar.gz
-% gpg --print-md SHA512 apache-fineract-bin-{revnumber}.tar.gz >
apache-fineract-bin-{revnumber}.tar.gz.sha512
+# sign
+gpg --armor --output apache-fineract-src-{revnumber}.tar.gz.asc \
+ --detach-sig apache-fineract-src-{revnumber}.tar.gz
+gpg --armor --output apache-fineract-bin-{revnumber}.tar.gz.asc \
+ --detach-sig apache-fineract-bin-{revnumber}.tar.gz
+
+# hash
+gpg --print-md SHA512 apache-fineract-src-{revnumber}.tar.gz \
+ > apache-fineract-src-{revnumber}.tar.gz.sha512
+gpg --print-md SHA512 apache-fineract-bin-{revnumber}.tar.gz \
+ > apache-fineract-bin-{revnumber}.tar.gz.sha512
----
== Gradle Task
@@ -17,5 +24,5 @@ Release source and binary tarballs must be checksummed and
signed. In order to s
.Command
[source,bash]
----
-% ./gradlew fineractReleaseStep7
+./gradlew fineractReleaseStep7
----
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 0af567e8de..05a73770bb 100644
--- a/fineract-doc/src/docs/en/chapters/release/process-step08.adoc
+++ b/fineract-doc/src/docs/en/chapters/release/process-step08.adoc
@@ -17,11 +17,11 @@ Upload these files to ASF's distribution dev (staging) area:
[source,bash,subs="attributes+"]
----
-% svn co https://dist.apache.org/repos/dist/dev/fineract/ fineract-dist-dev
-% mkdir fineract-dist-dev/{revnumber}
-% cp path/to/files/* fineract-dist-dev/{revnumber}/
-% cd fineract-dist-dev
-% svn commit
+svn mkdir https://dist.apache.org/repos/dist/dev/fineract/{revnumber}
+svn checkout https://dist.apache.org/repos/dist/dev/fineract/{revnumber}
+cp path/to/files/* {revnumber}/
+cd {revnumber}/
+svn add * && svn commit
----
NOTE: You will need your ASF Committer credentials to be able to access the
Subversion host at `dist.apache.org`.
@@ -31,5 +31,7 @@ NOTE: You will need your ASF Committer credentials to be able
to access the Subv
.Command
[source,bash,subs="attributes+,+macros"]
----
-% ./gradlew fineractReleaseStep8 -Pfineract.release.version={revnumber}
+./gradlew fineractReleaseStep8 -Pfineract.release.version={revnumber}
----
+
+CAUTION: This task is inefficient. Follow `svn mkdir` and other manual steps
above.
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 9dd65d1492..e532f3ad7b 100644
--- a/fineract-doc/src/docs/en/chapters/release/process-step09.adoc
+++ b/fineract-doc/src/docs/en/chapters/release/process-step09.adoc
@@ -13,14 +13,79 @@ Make sure release artifacts are hosted at
https://dist.apache.org/repos/dist/dev
* 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
+* All tests pass both in CI and locally
+
+=== Artifact verification
+
+[source,bash,subs="attributes+"]
+----
+# source tarball signature and checksum verification steps
+# we'll check the source tarball first
+version={revnumber}
+src=apache-fineract-src-$version.tar.gz
+
+# upon success: prints "Good signature" and returns successful exit code
+# upon failure: prints "BAD signature" and returns error exit code
+gpg --verify $src.asc
+
+# upon success: prints nothing and returns successful exit code
+# upon failure: prints checksum differences and returns error exit code
+gpg --print-md SHA512 $src | diff - $src.sha512
+
+# binary tarball signature and checksum verification steps and outputs are
similar
+bin=apache-fineract-bin-$version.tar.gz
+gpg --verify $bin.asc
+gpg --print-md SHA512 $bin | diff - $bin.sha512
+----
+
+For folks new to https://www.gnupg.org/[GnuPG], there are a couple things to
note. First, if it says the source or binary tarball detached signature is
correct, that's great! That's the most important part.
+
+Second, if you've imported `KEYS` but gpg warns you the key used for signing
is not trusted, you can tell gpg you trust the key to squelch the warning.
Ideally you meet the alleged key owner in person and check their ID first. Once
you trust their identity matches, you then indicate your trust for their key.
+
+Start with `gpg --edit-key KEYID`, substituting the signing key id for
`KEYID`. At the `gpg>` prompt, run the `trust` command and choose `4` (I trust
fully). You could also choose `3` (marginal), but do _not_ choose `5`
(ultimate).
+
+TIP: Consider also https://en.wikipedia.org/wiki/Key_signing_party[signing]
and https://en.wikipedia.org/wiki/Web_of_trust[uploading] each other's keys.
+
+=== Build from source
+
+[source,bash]
+----
+tar -xzf $src
+cd apache-fineract-src-$version
+gradle build -x test -x doc
+cd ..
+----
+
+=== Run from binary
+
+Before running this you must first start a database server and ensure the
`fineract_default` and `fineract_tenant` databases exist. Then:
+
+[source,bash]
+----
+tar -xzf $bin
+cd apache-fineract-bin-$version
+cat << 'EndOfRcenv' >> rcenv
+FINERACT_SERVER_SSL_ENABLED=false
+FINERACT_SERVER_PORT=8080
+BACKEND_PROTOCOL=http
+BACKEND_PORT=$FINERACT_SERVER_PORT
+EndOfRcenv
+docker run --rm -it -v "$(pwd):/usr/local/tomcat/webapps" \
+ --net=host --env-file=rcenv tomcat:jre21
+----
+
+Confirm the following:
+
+. http://localhost:8080/fineract-provider/actuator/health works
+. http://localhost:8080/fineract-provider/actuator/info displays the expected
information
+. API calls work against http://localhost:8080/fineract-provider/api/v1
== Gradle Task
.Command
[source,bash,subs="attributes+,+macros"]
----
-% ./gradlew fineractReleaseStep9 -Pfineract.release.version={revnumber}
+./gradlew fineractReleaseStep9 -Pfineract.release.version={revnumber}
----
CAUTION: This task is not yet automated!
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 eb36cdc237..5a1a82a70d 100644
--- a/fineract-doc/src/docs/en/chapters/release/process-step10.adoc
+++ b/fineract-doc/src/docs/en/chapters/release/process-step10.adoc
@@ -16,5 +16,5 @@
include::{rootdir}/buildSrc/src/main/resources/email/release.step10.vote.message
.Command
[source,bash,subs="attributes+,+macros"]
----
-% ./gradlew fineractReleaseStep10 -Pfineract.release.version={revnumber}
+./gradlew fineractReleaseStep10 -Pfineract.release.version={revnumber}
----
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 01134f86b1..62aab040ed 100644
--- a/fineract-doc/src/docs/en/chapters/release/process-step11.adoc
+++ b/fineract-doc/src/docs/en/chapters/release/process-step11.adoc
@@ -16,5 +16,5 @@
include::{rootdir}/buildSrc/src/main/resources/email/release.step11.vote.message
.Command
[source,text,subs="attributes+,+macros"]
----
-% ./gradlew fineractReleaseStep11 -Pfineract.release.version={revnumber}
+./gradlew fineractReleaseStep11 -Pfineract.release.version={revnumber}
----
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 0cdb8b0f01..0bcc44bddd 100644
--- a/fineract-doc/src/docs/en/chapters/release/process-step12.adoc
+++ b/fineract-doc/src/docs/en/chapters/release/process-step12.adoc
@@ -6,9 +6,11 @@ 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/
+svn mv 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].
+
You will now get an automated email from the Apache Reporter Service
([email protected]), subject "Please add your release data for
'fineract'" to add the release data (version and date) to the database on
https://reporter.apache.org/addrelease.html?fineract (requires PMC membership).
== Gradle Task
@@ -16,7 +18,7 @@ You will now get an automated email from the Apache Reporter
Service (no-reply@r
.Command
[source,bash,subs="attributes+,+macros"]
----
-% ./gradlew fineractReleaseStep12 -Pfineract.release.version={revnumber}
+./gradlew fineractReleaseStep12 -Pfineract.release.version={revnumber}
----
CAUTION: This task is not yet automated!
diff --git a/fineract-doc/src/docs/en/chapters/release/process-step13.adoc
b/fineract-doc/src/docs/en/chapters/release/process-step13.adoc
index 131f1cbadb..30f55afcf2 100644
--- a/fineract-doc/src/docs/en/chapters/release/process-step13.adoc
+++ b/fineract-doc/src/docs/en/chapters/release/process-step13.adoc
@@ -2,28 +2,26 @@
== Description
-As discussed in
https://issues.apache.org/jira/browse/FINERACT-1154[FINERACT-1154], now that
everything is final, please do the following to remove the release branch (and
just keep the tag), and make sure that everything on the release tag is merged
to develop and that e.g. git describe works:
+As discussed in
https://issues.apache.org/jira/browse/FINERACT-1154[FINERACT-1154], now that
everything is final, please do the following to remove the release branch (and
just keep the tag), and make sure that everything on the release tag is merged
to develop and that e.g. `git describe` works:
[source,bash,subs="attributes+,+macros"]
----
-% git checkout develop
-% git branch -D {revnumber}
-% git push origin :{revnumber}
-% git checkout develop
-% git checkout -b merge-{revnumber}
-% git merge -s recursive -Xignore-all-space {revnumber} <1>
-% git commit
-% git push $USER
-% hub pull-request
+git checkout develop
+git merge release/{revnumber} <1>
+git push origin develop
+git branch -D release/{revnumber}
+git push origin :release/{revnumber}
+git describe <2>
----
-<1> Manually resolve merge conflicts, if any
+<1> This merge is necessary for posterity: It's how we're able to preserve and
trace lineage from releases to descendent commit. Note this is a traditional
merge. This is for simplicity, and is an exception to our otherwise
https://github.com/apache/fineract#merge-strategy[flat git commit history].
+<2> The output must refer to the most recent release. For example, if your
working copy is checked out to the `develop` branch, the current commit is
`0762a012e`, and the latest release tag (28 commits ago) was `1.12.1`, the
output of `git describe` would be `1.12.1-28-g0762a012e`.
== Gradle Task
.Command
[source,bash,subs="attributes+,+macros"]
----
-% ./gradlew fineractReleaseStep13 -Pfineract.release.version={revnumber}
+./gradlew fineractReleaseStep13 -Pfineract.release.version={revnumber}
----
CAUTION: This task is not yet automated!
diff --git a/fineract-doc/src/docs/en/chapters/release/process-step14.adoc
b/fineract-doc/src/docs/en/chapters/release/process-step14.adoc
index eccf776024..a3b444507d 100644
--- a/fineract-doc/src/docs/en/chapters/release/process-step14.adoc
+++ b/fineract-doc/src/docs/en/chapters/release/process-step14.adoc
@@ -11,7 +11,7 @@ CAUTION: This step is not yet automated. We are working on a
static site generat
.Command
[source,bash]
----
-% ./gradlew fineractReleaseStep14 <1>
+./gradlew fineractReleaseStep14 <1>
----
<1> Currently doing nothing. Will trigger in the future the static site
generator and publish on Github.
diff --git a/fineract-doc/src/docs/en/chapters/release/process-step15.adoc
b/fineract-doc/src/docs/en/chapters/release/process-step15.adoc
index 8ccc7d1e8f..4f199a9b03 100644
--- a/fineract-doc/src/docs/en/chapters/release/process-step15.adoc
+++ b/fineract-doc/src/docs/en/chapters/release/process-step15.adoc
@@ -16,5 +16,5 @@
include::{rootdir}/buildSrc/src/main/resources/email/release.step15.announce.mes
.Command
[source,bash,subs="attributes+,+macros"]
----
-% ./gradlew fineractReleaseStep15 -Pfineract.release.version={revnumber}
+./gradlew fineractReleaseStep15 -Pfineract.release.version={revnumber}
----
diff --git a/fineract-doc/src/docs/en/chapters/security/harden.adoc
b/fineract-doc/src/docs/en/chapters/security/harden.adoc
index 172da42da9..ba1c646aa6 100644
--- a/fineract-doc/src/docs/en/chapters/security/harden.adoc
+++ b/fineract-doc/src/docs/en/chapters/security/harden.adoc
@@ -18,7 +18,7 @@ Also, we recommend you familiarize yourself with the OWASP
foundation and the "C
In the world of Microfinance or small banking operations (in some
geographies), it is possible that you can run Fineract on a private network, or
isolated from the internet by being hosted locally and securing all
connections. This could involve establishing a VPN with limited ports open, and
only accepting connections within that VPN. At the far end of this spectrum, is
running it isolated and air-gapped as a backend accounting system, where there
is no internet connection on that devic [...]
-=== Running it connected but behind a firewalls
+=== Running it connected but behind a firewall
It should be clear that running it on the internet directly, without API
monitoring and filtering, is a bad idea. This is especially true if your
Fineract instance is connected to a payment mechanism of any kind. Imagine an
exploit being used to gain access and then to send funds from an account to an
outside merchant or bank. An attacker could drain an account before you can
detect the issue. And, then it will depend on the payment scheme rules whether
any of those funds are recoverable.
@@ -46,7 +46,7 @@ There is a way to run those APIs endpoint (re-written but
consistent) in a separ
=== User Education and Training
-Educating and training your team is another limb of your organizational
cybersecurity defense. Equipped with engaging security awareness training
sessions, end-users can be prepared with both knowledge and skills on how to
identify potential security threats and react to them. You can get more
information from some of the resources offered in the course during CISA
Training: https://www.cisa.gov/c
+Educating and training your team is another limb of your organizational
cybersecurity defense. Equipped with engaging security awareness training
sessions, end-users can be prepared with both knowledge and skills on how to
identify potential security threats and react to them. You can get more
information from some of the resources offered in the course during CISA
Training: https://www.cisa.gov
=== Regular Security Audits and Compliance Checks
diff --git a/fineract-doc/src/docs/en/config.adoc
b/fineract-doc/src/docs/en/config.adoc
index 06eb05e5b8..1bc515b5f8 100644
--- a/fineract-doc/src/docs/en/config.adoc
+++ b/fineract-doc/src/docs/en/config.adoc
@@ -1,20 +1,14 @@
:doctype: book
-:compat-mode!:
-:optimize: printer
-:media: printer
:compress:
-:pdf-page-size: LETTER
:experimental:
-:pdf-version: 1.8
:page-layout: base
:toc-title: Table of Contents
:toc: left
:toclevels: 2
:icons: font
-:source-highlighter: coderay
+:source-highlighter: rouge
:experimental:
:source-language: java
-:years: 2015-2024
:lang: en
:encoding: utf-8
:linkattrs:
diff --git a/fineract-doc/src/docs/en/diagrams/architecture-overview.puml
b/fineract-doc/src/docs/en/diagrams/architecture-overview.puml
deleted file mode 100644
index febbbf1638..0000000000
--- a/fineract-doc/src/docs/en/diagrams/architecture-overview.puml
+++ /dev/null
@@ -1,3 +0,0 @@
-@startuml
-Bob -> Alice : Hello
-@enduml
\ No newline at end of file
diff --git a/fineract-doc/src/docs/en/diagrams/release-schedule.puml
b/fineract-doc/src/docs/en/diagrams/release-schedule.puml
index 32c0c80b24..1939ef2874 100644
--- a/fineract-doc/src/docs/en/diagrams/release-schedule.puml
+++ b/fineract-doc/src/docs/en/diagrams/release-schedule.puml
@@ -1,6 +1,6 @@
@startgantt
[Heads up email] lasts 1 day
-[Open release branch] lasts 7 day
+[Open release branch] lasts 7 days
[Prepare distribution for staging] lasts 2 days
[Vote for distribution on staging] lasts 3 days
[Prepare distribution for release] lasts 2 days