Skip to content
1 change: 1 addition & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@ Please make sure these boxes are checked before submitting your pull request - t
- [ ] Follow our [coding conventions](https://cwiki.apache.org/confluence/display/FINERACT/Coding+Conventions).
- [ ] Add required Swagger annotation and update API documentation at fineract-provider/src/main/resources/static/legacy-docs/apiLive.htm with details of any API changes
- [ ] [This PR must not be a "code dump"](https://cwiki.apache.org/confluence/display/FINERACT/Pull+Request+Size+Limit). Large changes can be made in a branch, with assistance. Ask for help on the [developer mailing list](https://fineract.apache.org/#contribute).
- [ ] If merging this PR resolves a JIRA issue, I will mark that issue as resolved and set "Fix Version/s" appropriately.

Your assigned reviewer(s) will follow our [guidelines for code reviews](https://cwiki.apache.org/confluence/display/FINERACT/Code+Review+Guide).
9 changes: 7 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -298,8 +298,8 @@ Our `ClasspathHellDuplicatesCheckRuleTest` detects classes that appear in more t

### Pull Requests

We request that your commit message includes a FINERACT JIRA issue and a one-liner that describes the changes.
Start with an upper case imperative verb (not past form), and a short but concise clear description. (E.g. "FINERACT-821: Add enforced HideUtilityClassConstructor checkstyle").
Your PR title must include a JIRA issue and a one-liner that describes the changes.
Start your one-liner after the JIRA issue id. Use an upper case present-tense imperative verb and a short but concise clear description. (E.g. "FINERACT-821: Add enforced HideUtilityClassConstructor checkstyle").

If your PR is failing to pass our CI build due to a test failure, then:

Expand All @@ -320,6 +320,10 @@ Each commit should be reviewable and logically coherent.
Add detail and context as necessary in commit log messages to communicate not only *what* you changed, but *why*, including summaries of discussions leading to the changes, ideas/plans for future changes, etc.
Keep the *what* simple: Use the summary (first line) and let the diff otherwise speak for itself.

If your PR is a single commit, use the PR title verbatim in the first line of the commit log message. Add as much detail as you want in the commit log body.

If your PR is multiple commits, use the first line of the commit log message to summarize changes specific to that commit (using present-tense imperative language, e.g. _update release signing gpg guidance_). You may include the JIRA issue id in the first line or somewhere in the commit log body.

Contributors: squash, rebase, and force-push your PR branches as you see fit.
You might, for example, rebase on top of `develop`.
You might also squash several commits with code formatting / whitespace fixes, but keep separate commits for code changes affecting functionality.
Expand All @@ -337,6 +341,7 @@ We have an automated bot which marks pull requests as "stale" after a while, and

After PR review and passing CI build, a committer will merge your PR branch into our primary integration branch, `develop`, either locally or on GitHub using "Merge pull request - Create a merge commit" (not "Squash and merge" and not "Rebase and merge").

If merging the PR resolved a JIRA issue, mark that issue as resolved and set "Fix Version/s" to the next unreleased version. These fix versions only apply to the `apache/fineract` repository. Other repositories should set "Fix Version/s" to "Unknown".

### Signing Your Commits

Expand Down
19 changes: 8 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ flexible, extensible foundation for a wide range of financial services. By
making robust banking technology openly available, it lowers barriers for
institutions and innovators to reach underserved and unbanked populations.

Have a look at the [documentation](https://fineract.apache.org/docs/current), the [wiki](https://cwiki.apache.org/confluence/display/FINERACT) or at the [FAQ](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=91554327), if this README does not answer what you are looking for.
Have a look at the [documentation](https://fineract.apache.org/docs/stable), the [wiki](https://cwiki.apache.org/confluence/display/FINERACT) or at the [FAQ](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=91554327), if this README does not answer what you are looking for.


COMMUNITY
Expand All @@ -29,11 +29,8 @@ In the moment you get started writing code, please consult our [CONTRIBUTING](CO

REQUIREMENTS
============
* 16GB RAM and 8 core CPU (minimum hardware for running Fineract -- development and testing may require more)
* PostgreSQL >= 18.0 ([support for other backend databases is deprecated](https://cwiki.apache.org/confluence/display/FINERACT/FSIP-9%3A+Standardize+on+PostgreSQL))
* Java >= 21 (Azul Zulu JVM is tested by our CI on GitHub Actions)

Tomcat (min. v10) is only needed if you wish to deploy the Fineract WAR to a separate external servlet container. You do not need to install Tomcat to run Fineract. We recommend the use of the self-contained JAR, which transparently embeds a servlet container using Spring Boot.
See [Fineract Development Environment](https://fineract.apache.org/docs/develop/#_fineract_development_environment) in the docs for hardware, software, and tool prerequisites and recommendations.


SECURITY
Expand All @@ -42,7 +39,7 @@ For a list of known vulnerabilities, see [Apache Fineract Security Reports](http

If you believe you have found a new vulnerability, [let us know privately](https://fineract.apache.org/#contribute).

For details about security during development and deployment, see the documentation [here](https://fineract.apache.org/docs/current/#_security).
For details about security during development and deployment, see the documentation [here](https://fineract.apache.org/docs/stable/#_security).

PRIVATE FORKS
============
Expand All @@ -60,7 +57,7 @@ Follow these steps to quickly set up and run Apache Fineract locally.

### Prerequisites

- Java 21 or higher (Azul Zulu is recommended)
- [Java JDK](https://fineract.apache.org/docs/develop/#_fineract_development_environment)
- PostgreSQL running locally, listening on port 5432 with proper permissions (see [below](#database-and-tables) for how to run PostgreSQL in Docker)

```bash
Expand Down Expand Up @@ -115,7 +112,7 @@ Expected response for fresh instance:
How to run for production
---

Running Fineract _just to try it out_ is relatively easy. If you intend to use it _in a production environment_, be aware that a proper deployment can be complex, costly, and time-consuming. Considerations include: Security, privacy, compliance, performance, service availability, backups, and more. **The Fineract project does not provide a comprehensive guide for deploying Fineract in production.** You might need skills in enterprise Java applications and more. Alternatively, you could pay a vendor for Fineract deployment and maintenance. You will find tips and tricks for [deploying](https://fineract.apache.org/docs/current/#_deployment) and [securing](https://fineract.apache.org/docs/current/#_securing_fineract) Fineract in our official documentation.
Running Fineract _just to try it out_ is relatively easy. If you intend to use it _in a production environment_, be aware that a proper deployment can be complex, costly, and time-consuming. Considerations include: Security, privacy, compliance, performance, service availability, backups, and more. **The Fineract project does not provide a comprehensive guide for deploying Fineract in production.** You might need skills in enterprise Java applications and more. Alternatively, you could pay a vendor for Fineract deployment and maintenance. You will find tips and tricks for [deploying](https://fineract.apache.org/docs/stable/#_deployment) and [securing](https://fineract.apache.org/docs/stable/#_securing_fineract) Fineract in our official documentation.


How to build the JAR file
Expand Down Expand Up @@ -332,7 +329,7 @@ Kafka support is also disabled by default. In `docker-compose-postgresql-kafka.y
During the development Fineract was tested with PLAINTEXT Kafka brokers without authentication and with AWS MSK using IAM authentication. The extra [JAR file](https://github.com/aws/aws-msk-iam-auth/releases) required for IAM authentication is already added to the classpath.
An example MSK setup can be found in `docker-compose-postgresql-kafka-msk.yml`.

The full list of supported Kafka related properties is documented in the [Fineract Platform documentation](https://fineract.apache.org/docs/current/).
The full list of supported Kafka related properties is documented in the [Fineract Platform documentation](https://fineract.apache.org/docs/stable/).


DATABASE AND TABLES
Expand Down Expand Up @@ -395,7 +392,7 @@ NOTE: We keep backwards compatibility until one of the next releases to ensure t
RELEASES
============

[Official releases](https://fineract.apache.org/#downloads) are created quarterly, at the end of each quarter. Our [documented release procedure](https://fineract.apache.org/docs/current/#_releases) follows the [ASF release policy](https://www.apache.org/legal/release-policy.html).
[Official releases](https://fineract.apache.org/#downloads) are created quarterly, at the end of each quarter. Our [documented release procedure](https://fineract.apache.org/docs/develop/#_releases) follows the [ASF release policy](https://www.apache.org/legal/release-policy.html).

See <https://cwiki.apache.org/confluence/display/FINERACT/Fineract+Releases> for an archive of historical release notes along with JIRA issues relevant to each release.

Expand Down Expand Up @@ -434,4 +431,4 @@ PLATFORM API

Fineract does not provide a UI, but provides an API. Running Fineract locally, the Swagger documentation can be accessed under `https://localhost:8443/fineract-provider/swagger-ui/index.html`. A live version can be accessed via [this Sandbox](https://sandbox.mifos.community/fineract-provider/swagger-ui/index.html) (not hosted by us).

Apache Fineract supports client code generation using [Swagger Codegen](https://github.com/swagger-api/swagger-codegen) based on the [OpenAPI Specification](https://swagger.io/specification/). For more instructions on how to generate client code, check [this section](https://fineract.apache.org/docs/current/#_generate_api_client) of the Fineract documentation. [This video](https://www.youtube.com/watch?v=FlVd-0YAo6c) documents the use of the Swagger-UI.
Apache Fineract supports client code generation using [Swagger Codegen](https://github.com/swagger-api/swagger-codegen) based on the [OpenAPI Specification](https://swagger.io/specification/). For more instructions on how to generate client code, check [this section](https://fineract.apache.org/docs/develop/#_generate_api_client) of the Fineract documentation. [This video](https://www.youtube.com/watch?v=FlVd-0YAo6c) documents the use of the Swagger-UI.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -382,7 +382,7 @@ file("${rootDir}/custom").eachDir { companyDir ->
file("${rootDir}/custom/${companyDir.name}").eachDir { categoryDir ->
if('build' != categoryDir.name) {
file("${rootDir}/custom/${companyDir.name}/${categoryDir.name}").eachDir { moduleDir ->
if('build' != moduleDir.name) {
if('build' != moduleDir.name && file("${moduleDir}/build.gradle").exists()) {
project.fineractJavaProjects.add(project(":custom:${companyDir.name}:${categoryDir.name}:${moduleDir.name}"))
project.fineractCustomProjects.add(project(":custom:${companyDir.name}:${categoryDir.name}:${moduleDir.name}"))
}
Expand Down
2 changes: 1 addition & 1 deletion buildSrc/src/main/resources/instructions/step13.txt.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
As discussed in https://issues.apache.org/jira/browse/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:

>> git checkout develop
>> git switch develop
>> git merge release/${project['fineract.release.version']}
>> git push origin develop
>> git branch -D release/${project['fineract.release.version']}
Expand Down
2 changes: 1 addition & 1 deletion custom/docker/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ jib {
file("${rootDir}/custom/${companyDir.name}").eachDir { categoryDir ->
if('build' != categoryDir.name) {
file("${rootDir}/custom/${companyDir.name}/${categoryDir.name}").eachDir { moduleDir ->
if('build' != moduleDir.name) {
if('build' != moduleDir.name && file("${moduleDir}/build.gradle").exists()) {
implementation project(":custom:${companyDir.name}:${categoryDir.name}:${moduleDir.name}")
}
}
Expand Down
2 changes: 1 addition & 1 deletion fineract-command/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ You can try it out with the following instructions (it's still in a private repo
```
git clone git@github.com:vidakovic/fineract.git
cd fineract
git checkout feature/FINERACT-2169
git switch feature/FINERACT-2169
./gradlew :fineract-command:build
./gradlew :fineract-command:jmh
```
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,15 @@ Develop currently represents work toward Apache Fineract 1.0.0. Please submit al

[source]
----
git checkout develop
git switch develop
----

=== Use short branch names
Branches used when submitting pull requests should preferably be named according to issues prefixed FINERACT followed by a dash and the issue number, e.g. 'FINERACT-1234'. This is important, because branch names show up in the merge commits that result from accepting pull requests and should be as expressive and concise as possible.

[source]
----
git checkout -b [topic]
git switch -c [topic]
----

=== Pull in changes
Expand All @@ -36,7 +36,7 @@ To pull in upstream changes from repository you forked:

[source]
----
git checkout develop
git switch develop
git fetch upstream
git merge upstream/develop
----
Expand All @@ -55,7 +55,7 @@ After you pulled all changes from upstream you need to rebase your topic branch

[source]
----
git checkout [topic]
git switch [topic]
git rebase develop
----

Expand All @@ -65,4 +65,4 @@ If you are ready push your topic branch to your GitHub account:
git push origin [topic]
----

Now thats your changes have been pushed to your github account, follow the steps and guidelines found xref:submitting-a-pull-request.adoc[here] to submit your pull request from your git account to fineract.
Now thats your changes have been pushed to your github account, follow the steps and guidelines found xref:submitting-a-pull-request.adoc[here] to submit your pull request from your git account to fineract.
Original file line number Diff line number Diff line change
Expand Up @@ -112,10 +112,10 @@ To run the check locally, you need a baseline spec to compare against:
----
# 1. Generate the baseline from develop
git stash
git checkout develop
git switch develop
./gradlew :fineract-provider:resolve --no-daemon
cp fineract-provider/build/resources/main/static/fineract.json /tmp/baseline.json
git checkout -
git switch -
git stash pop
# 2. Generate your current spec and compare
Expand Down
2 changes: 1 addition & 1 deletion fineract-doc/src/docs/en/chapters/development/git.adoc
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
= Git

TBD
Version 2.23 or later (supporting `git switch` and `git restore`).
12 changes: 9 additions & 3 deletions fineract-doc/src/docs/en/chapters/development/gpg.adoc
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
= GPG
= GnuPG

TBD
GNU Privacy Guard is used for signing commits and releases and for verifying those signatures. Any https://gnupg.org/download/#end-of-life[non-EOL v2 release of GnuPG] should work.

See <<Signing releases>> for help generating keys.

== Committers

Please make sure to provide your GPG fingerprint in your Apache committer profile at https://id.apache.org.
Provide your public key fingerprint in your Apache committer profile at https://id.apache.org.

== PMC members

Include your public key in https://downloads.apache.org/fineract/KEYS[our KEYS file].
2 changes: 1 addition & 1 deletion fineract-doc/src/docs/en/chapters/development/gradle.adoc
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
= Gradle

TBD
The https://docs.gradle.org/current/userguide/gradle_wrapper.html[Gradle Wrapper] included with Fineract will automatically run the correct version of Gradle.
6 changes: 5 additions & 1 deletion fineract-doc/src/docs/en/chapters/development/index.adoc
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
= Fineract Development Environment

TBD
* 16GB RAM and 8 core CPU (minimum hardware for running Fineract -- development and testing may require more)
* PostgreSQL >= 18.0 (https://cwiki.apache.org/confluence/display/FINERACT/FSIP-9%3A+Standardize+on+PostgreSQL[support for other backend databases is deprecated])
* Java >= 21 (https://www.azul.com/downloads/?package=jdk#zulu[Azul Zulu JVM] is tested by our CI on GitHub Actions)

Tomcat (min. v10) is only needed if you wish to deploy the Fineract WAR to a separate external servlet container. You do not need to install Tomcat to run Fineract. We recommend the use of the self-contained JAR, which transparently embeds a servlet container using Spring Boot.

include::git.adoc[leveloffset=+1]

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
= SDKMAN

We recommend using SKDMAN to manage the following developer tools:
We recommend using SDKMAN to manage the following developer tools:

- JDK
- Spring Boot CLI
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
= GPG
= Signing releases

Generate GPG key pairs if you don't already have them and publish them. Please use your Apache email address when creating your GPG keypair. If you already have configured GPG and associated your keypair with a non-Apache email address then please consider creating a separate one just for all things related to Fineract (or Apache in general).

Expand Down Expand Up @@ -224,3 +224,8 @@ gXXeWjafxBmHT1cM8hoBZBYzgTu9nK5UnllWunfaHXiCBG4oQQ==
=85/F
-----END PGP PUBLIC KEY BLOCK-----
----
See also:
* https://infra.apache.org/release-signing.html[Signing Releases]
* https://infra.apache.org/openpgp.html[Cryptography with OpenPGP]
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ git log <1>
+
[source,bash,subs="attributes+,+macros"]
----
git checkout -b release/{revnumber}
git switch -c release/{revnumber}
----

4. Push new branch to Apache Fineract repository
Expand Down
10 changes: 9 additions & 1 deletion fineract-doc/src/docs/en/chapters/release/process-step04.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,15 @@

== Description

You first need to close the release in JIRA so that the about to be released version cannot be used as "fixVersion" for new bugs anymore. Go to JIRA "Administer project" page and follow "Versions" in left menu. Table with list of all releases should appear, click on additional menu on the right of your release and choose "Release" option. Submit release date and you're done.
You first need to close the release in JIRA so that the about to be released version cannot be used as "fixVersion" for new bugs anymore.

https://issues.apache.org/jira/plugins/servlet/project-config/FINERACT/administer-versions?status=released-unreleased[Click this link] or go to JIRA "Administer project" page and follow "Versions" in left menu.

A form to add new releases and a table with list of all releases should appear. First, create the _next_ release. Enter that version number in the form and click "Add".

Next, in the "Actions" column in the table, click on ⋯ (three horizontal dots menu) to the right of release {version}. Choose "Release". Enter the current date (doesn't need to be the date the release is acutally announced).

TIP: For the "Unresolved Issues" radio button: If unresolved issues block the release, ignore them and proceed. If they'll be part of another release, move them to that version.

== Gradle Task

Expand Down
8 changes: 4 additions & 4 deletions fineract-doc/src/docs/en/chapters/release/process-step05.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -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 -b release/{revnumber} <1>
git tag -a {revnumber} -m "Fineract {revnumber} release" -s <2>
git push origin tag {revnumber}
git switch -c release/{revnumber} <1>
Comment thread
meonkeys marked this conversation as resolved.
git tag -a {revnumber} -m "Fineract {revnumber} release" -s
git push origin tag {revnumber} <2>
----
<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.
<2> You may opt to wait to push the tag until just before <<Step 10: Start Vote>>. By that time you'll be done with <<Step 9: Verify Distribution Staging>>, so it's less likely you'd need to try to move the tag. Git tags are meant to be immutable and they tend to spread like viruses. Moving them can be painful or tricky.

CAUTION: It is important to create so called annotated tags (vs. lightweight) for releases.

Expand Down
Loading
Loading