diff --git a/buildSrc/src/main/groovy/org.apache.fineract.release.gradle b/buildSrc/src/main/groovy/org.apache.fineract.release.gradle index 50bd11a9d..3345ff886 100644 --- a/buildSrc/src/main/groovy/org.apache.fineract.release.gradle +++ b/buildSrc/src/main/groovy/org.apache.fineract.release.gradle @@ -111,7 +111,9 @@ fineract { templateFile: "${projectDir}/buildSrc/src/main/resources/jira/changelog.txt.ftl" ], gpg: [ - file: "${projectDir}/buildSrc/build/libs/buildSrc.jar" + files: [ + "${projectDir}/buildSrc/build/libs/buildSrc.jar" + ] ] ], step1: [ @@ -173,7 +175,10 @@ fineract { order: 7, description: 'Sign the distribution artifacts', gpg: [ - file: "${rootDir}/fineract-war/build/distributions/apache-fineract-binary-${project.version}.tar.gz" + files: [ + "${rootDir}/fineract-war/build/distributions/apache-fineract-${project.version}-src.tar.gz", + "${rootDir}/fineract-war/build/distributions/apache-fineract-${project.version}-binary.tar.gz" + ] ] ], step8: [ 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 fb308c7a2..305952da8 100644 --- a/buildSrc/src/main/groovy/org/apache/fineract/gradle/FineractPlugin.groovy +++ b/buildSrc/src/main/groovy/org/apache/fineract/gradle/FineractPlugin.groovy @@ -324,7 +324,7 @@ class FineractPlugin implements Plugin { // step 6 project.tasks.register("fineractReleaseStep6") { - dependsOn(":fineract-war:binaryDistTar") + dependsOn(":fineract-war:distTar") } // step 7 @@ -334,13 +334,11 @@ class FineractPlugin implements Plugin { gpgService.sign(step.gpg) - def md5 = gpgService.md5(step.gpg) - def md5File = new File("${step.gpg.file}.md5") - md5File.write md5 + step.gpg.files.findAll { + gpgService.md5(step.gpg) - def sha512 = gpgService.sha512(step.gpg) - def sha512File = new File("${step.gpg.file}.sha512") - sha512File.write sha512 + gpgService.sha512(step.gpg) + } } } diff --git a/buildSrc/src/main/groovy/org/apache/fineract/gradle/FineractPluginExtension.groovy b/buildSrc/src/main/groovy/org/apache/fineract/gradle/FineractPluginExtension.groovy index fad37e071..b38834f33 100644 --- a/buildSrc/src/main/groovy/org/apache/fineract/gradle/FineractPluginExtension.groovy +++ b/buildSrc/src/main/groovy/org/apache/fineract/gradle/FineractPluginExtension.groovy @@ -159,6 +159,6 @@ class FineractPluginExtension { } static class FineractPluginGpgParams { - String file + List files } } diff --git a/buildSrc/src/main/groovy/org/apache/fineract/gradle/service/GpgService.groovy b/buildSrc/src/main/groovy/org/apache/fineract/gradle/service/GpgService.groovy index 7e8c6470f..9750c128a 100644 --- a/buildSrc/src/main/groovy/org/apache/fineract/gradle/service/GpgService.groovy +++ b/buildSrc/src/main/groovy/org/apache/fineract/gradle/service/GpgService.groovy @@ -92,11 +92,13 @@ class GpgService { } void sign(FineractPluginExtension.FineractPluginGpgParams params) { - InputStream is = new FileInputStream(params.file) + params.files.findAll { + InputStream is = new FileInputStream(it) - BCPGOutputStream os = new BCPGOutputStream(new ArmoredOutputStream(new FileOutputStream(params.file + ".asc"))) - sign(is).encode(os) - os.close(); + BCPGOutputStream os = new BCPGOutputStream(new ArmoredOutputStream(new FileOutputStream(it + ".asc"))) + sign(is).encode(os) + os.close(); + } } PGPSignature sign(InputStream is) throws IOException, PGPException, GeneralSecurityException { @@ -115,12 +117,20 @@ class GpgService { } - String md5(FineractPluginExtension.FineractPluginGpgParams params) { - return calc(new FileInputStream(params.file), MessageDigest.getInstance("MD5", BouncyCastleProvider.PROVIDER_NAME)) + void md5(FineractPluginExtension.FineractPluginGpgParams params) { + params.files.findAll { + def result = calc(new FileInputStream(it), MessageDigest.getInstance("MD5", BouncyCastleProvider.PROVIDER_NAME)) + def file = new File("${it}.md5") + file.write result + } } - String sha512(FineractPluginExtension.FineractPluginGpgParams params) { - return calc(new FileInputStream(params.file), MessageDigest.getInstance("SHA-512", BouncyCastleProvider.PROVIDER_NAME)) + void sha512(FineractPluginExtension.FineractPluginGpgParams params) { + params.files.findAll { + def result = calc(new FileInputStream(it), MessageDigest.getInstance("SHA-512", BouncyCastleProvider.PROVIDER_NAME)) + def file = new File("${it}.sha512") + file.write result + } } private static String calc(InputStream is, MessageDigest digest) { diff --git a/buildSrc/src/main/resources/vote/result.1.8.0.json b/buildSrc/src/main/resources/vote/result.1.8.0.json new file mode 100644 index 000000000..3988fbce0 --- /dev/null +++ b/buildSrc/src/main/resources/vote/result.1.8.0.json @@ -0,0 +1,96 @@ +{ + "approve": { + "binding": [ + { + "name": "James Daily", + "email": "jamespdailey@gmail.com" + }, + { + "name": "Arnold Galovics", + "email": "arnold@apache.org" + }, + { + "name": "Avik Ganguly", + "email": "avik@fynarfin.io" + }, + { + "name": "Ed Cable", + "email": "edcable@mifos.org" + }, + { + "name": "Aleksandar Vidakovic", + "email": "aleks@apache.org" + }, + { + "name": "Terence Monteiro", + "email": "terence.placker@gmail.com" + }, + { + "name": "Awasum Yannick", + "email": "awasum@apache.org" + } + ], + "nonBinding": [ + { + "name": "Victor Manuel Romero Rodriguez", + "email": "victor.romero@fintecheando.mx" + }, + { + "name": "Bruce Tushabe", + "email": "brucetushabe@gmail.com" + }, + { + "name": "Kigred", + "email": "kigred.developer@gmail.com" + }, + { + "name": "Bharath Gowda", + "email": "bgowda@mifos.org" + }, + { + "name": "Robert Jakech", + "email": "robert@fiter.io" + }, + { + "name": "Arthur Magezi", + "email": "artmagezi@gmail.com" + }, + { + "name": "Robert Ippez", + "email": "ippezrobert@gmail.com" + }, + { + "name": "Sifiso Mtetwa", + "email": "sifiso@skyburgsystems.org" + }, + { + "name": "Zayad A. Said", + "email": "zayyad@intrasofttechnologies.com" + }, + { + "name": "Hitech Prajapati", + "email": "hitesh.kams.prajapati@gmail.com" + }, + { + "name": "Kelvin Ikome", + "email": "kelvin@ciniter.com" + }, + { + "name": "Nasser Kaze", + "email": "kazenasser@gmail.com" + } + ] + }, + "disapprove": { + "binding": [ + ], + "nonBinding": [ + ] + }, + "noOpinion": { + "binding": [ + ], + "nonBinding": [ + ] + } +} diff --git a/fineract-doc/.asciidoctorconfig b/fineract-doc/.asciidoctorconfig index 26a82e248..b8b621676 100644 --- a/fineract-doc/.asciidoctorconfig +++ b/fineract-doc/.asciidoctorconfig @@ -1,5 +1,5 @@ :years: 2015-2022 -:revnumber: 1.7.0 +:revnumber: 1.8.0 :draft: true :rootdir: {asciidoctorconfigdir}/.. :generated: {asciidoctorconfigdir}/build/generated/asciidoc diff --git a/fineract-doc/src/docs/en/chapters/release/index.adoc b/fineract-doc/src/docs/en/chapters/release/index.adoc index d8efa23f3..67b670d2c 100644 --- a/fineract-doc/src/docs/en/chapters/release/index.adoc +++ b/fineract-doc/src/docs/en/chapters/release/index.adoc @@ -12,4 +12,6 @@ include::configuration.adoc[leveloffset=+1] include::process.adoc[leveloffset=+1] +include::maintenance.adoc[leveloffset=+1] + include::publish.adoc[leveloffset=+1] diff --git a/fineract-doc/src/docs/en/chapters/release/maintenance.adoc b/fineract-doc/src/docs/en/chapters/release/maintenance.adoc new file mode 100644 index 000000000..8cf8abd2a --- /dev/null +++ b/fineract-doc/src/docs/en/chapters/release/maintenance.adoc @@ -0,0 +1,13 @@ += Maintenance Release Process + +IMPORTANT: This is a first attempt to introduce maintenance releases. Some details might change as soon as we get more experience with the process and feedback from the community. The numbers here are still more or less arbitrary, and we'll adapt as necessary. + +== Rules + +- hotfix releases are reserved for critical (BLOCKER) bugs and security issues. Probably we'll have some kind of voting process in place, e. g. "minimum 3 x +1 votes from PMC members" +- we will support (for now to start) two minor versions back counting from the last release; this would mean that once 1.8.0 is out we would support 1.8.x and 1.7.x, but not 1.6.x and older; this rule is tentative, we'll see then what we do in the future when we have more feedback. +- guaranteed backward compatibility with the last minor release; i. e. "1.6.1" is a drop-in replacement for "1.6.0" +- NO new features, tables, data, REST endpoints +- NO major (or "minor" framework upgrades); i. e. if we used Spring Boot "2.6.1" in version "1.6.0" of Fineract we can upgrade dependencies to "2.6.10" (unless it breaks something of course), but not to "2.7.2" of Spring Boot + +NOTE: The rest of the release process is the same as for normal releases. In the future we might have smaller time windows for reviews. \ No newline at end of file diff --git a/fineract-doc/src/docs/en/config.adoc b/fineract-doc/src/docs/en/config.adoc index 0cc9b3326..dd47f4ec7 100644 --- a/fineract-doc/src/docs/en/config.adoc +++ b/fineract-doc/src/docs/en/config.adoc @@ -5,7 +5,7 @@ :compress: :pdf-page-size: LETTER :experimental: -:pdf-version: 1.7 +:pdf-version: 1.8 :page-layout: base :toc-title: Table of Contents :toc: left diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountReadPlatformServiceImpl.java index 31e8e3f0e..10c8a1cc2 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountReadPlatformServiceImpl.java @@ -264,7 +264,6 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead public List retrieveAllSavingsDataForInterestPosting(final boolean backdatedTxnsAllowedTill, final int pageSize, final Integer status, final Long maxSavingsId) { LocalDate yesterday = DateUtils.getBusinessLocalDate().minusDays(1); - String sql = "select " + this.savingAccountMapperForInterestPosting.schema() + "join (select a.id from m_savings_account a where a.id > ? and a.status_enum = ? limit ?) b on b.id = sa.id "; if (backdatedTxnsAllowedTill) { diff --git a/fineract-war/build.gradle b/fineract-war/build.gradle index aca955e22..1690079ac 100644 --- a/fineract-war/build.gradle +++ b/fineract-war/build.gradle @@ -58,11 +58,7 @@ tasks.withType(Tar) { distributions { binary { - if(project.hasProperty("distVersion")) { - distributionBaseName = "apache-fineract-$distVersion-binary" - } else { - distributionBaseName = "apache-fineract-binary" - } + distributionBaseName = 'apache-fineract-binary' contents { from ("$rootDir/fineract-client/build/libs/") { include 'fineract-client-*.jar' @@ -88,12 +84,7 @@ distributions { } } src { - if(project.hasProperty("distVersion")) { - distributionBaseName = "apache-fineract-$distVersion-src" - } else { - distributionBaseName = "apache-fineract-src" - } - + distributionBaseName = 'apache-fineract-src' contents { from "$rootDir/" exclude '**/build' , '.git', '**/.gradle', '.github', '**/.settings', '**/.project', '**/.classpath', '.idea', 'out', '._.DS_Store', '.DS_Store', 'WebContent', '**/.externalToolbuilders', '.theia', '.gitpod.yml', '.travis.yml', 'LICENSE_RELEASE', 'NOTICE_RELEASE', '**/licenses', '*.class', '**/bin', '*.log', '.dockerignore', '**/.gitkeep' @@ -101,6 +92,10 @@ distributions { rename ('NOTICE_SOURCE', 'NOTICE') } } + doLast { + file("${buildDir}/distributions/apache-fineract-binary-${version}.tar.gz").renameTo("${buildDir}/distributions/apache-fineract-${version}-binary.tar.gz") + file("${buildDir}/distributions/apache-fineract-src-${version}.tar.gz").renameTo("${buildDir}/distributions/apache-fineract-${version}-src.tar.gz") + } } binaryDistZip.enabled false