From 121dc99fed980adeedee2d38da2ca3bd33ee259e Mon Sep 17 00:00:00 2001 From: Gerben Jongerius Date: Thu, 14 Mar 2024 13:04:41 +0100 Subject: [PATCH 01/13] Add the workflows for building PRs to main and main itself. --- .github/workflows/pull-request-gate.yml | 24 +++++ .github/workflows/release-build.yml | 30 ++++++ bpmn-process/build.gradle.kts | 5 +- .../finance/bpmn/AccountReconcileIT.java | 2 + .../finance/bpmn/BudgetAnalysisIT.java | 2 + .../finance/bpmn/ContractWarningIT.java | 2 + .../jongsoft/finance/bpmn/ImportJobIT.java | 2 + .../finance/bpmn/ProcessSchedulerIT.java | 2 + .../finance/bpmn/ProfileImportIT.java | 2 + .../finance/bpmn/ScheduledTransactionIT.java | 2 + .../bpmn/process/ProcessExtension.java | 5 +- .../bpmn/process/RunningProcessExecution.java | 6 +- .../finance/bpmn/process/RuntimeContext.java | 6 +- build.gradle.kts | 102 +++++------------- settings.gradle.kts | 1 + 15 files changed, 107 insertions(+), 86 deletions(-) create mode 100644 .github/workflows/pull-request-gate.yml create mode 100644 .github/workflows/release-build.yml diff --git a/.github/workflows/pull-request-gate.yml b/.github/workflows/pull-request-gate.yml new file mode 100644 index 00000000..53b157bc --- /dev/null +++ b/.github/workflows/pull-request-gate.yml @@ -0,0 +1,24 @@ +name: Validate Pull Request + +on: + pull_request: + branches: + - main + +jobs: + quality_gate: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Configure Java version + uses: actions/setup-java@v3 + with: + java-version: '21' + distribution: 'temurin' + architecture: x64 + - name: Setup Gradle + uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 + - name: Build code + run: ./gradlew test + - name: Quality gate + run: ./gradlew sonar -Dsonar.gradle.skipCompile=true -Dsonar.host.url=https://sonarcloud.io -Dsonar.projectKey="FinTrack:API" -Dsonar.organization=jongsoft -Dsonar.token=${{ secrets.SONAR_TOKEN }} diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml new file mode 100644 index 00000000..38019c74 --- /dev/null +++ b/.github/workflows/release-build.yml @@ -0,0 +1,30 @@ +name: Build Rest Application Release + +on: + push: + branches: + - main + +jobs: + release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Configure Java version + uses: actions/setup-java@v3 + with: + java-version: '21' + distribution: 'temurin' + architecture: x64 + - name: Setup Gradle + uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 + - name: Build code + run: ./gradlew build + - name: Quality gate + run: ./gradlew sonar -Dsonar.gradle.skipCompile=true -Dsonar.host.url=https://sonarcloud.io -Dsonar.projectKey=Fintrack:API -Dsonar.organization=jongsoft -Dsonar.token=${{ secrets.SONAR_TOKEN }} + - name: Publish artifacts + run: ./gradlew publish + env: + NEXUS_PASSWORD: ${{ GITHUB_ACTOR }} + NEXUS_USER: ${{ secrets.GITHUB_TOKEN }} + diff --git a/bpmn-process/build.gradle.kts b/bpmn-process/build.gradle.kts index 62c61fa0..0d202b1e 100644 --- a/bpmn-process/build.gradle.kts +++ b/bpmn-process/build.gradle.kts @@ -4,7 +4,6 @@ micronaut { dependencies { annotationProcessor(mn.lombok) - testAnnotationProcessor(mn.lombok) implementation(libs.lang) implementation(libs.lang.xml) @@ -19,15 +18,15 @@ dependencies { // Investigate if this can be swapped for micronaut serde implementation(mn.micronaut.jackson.databind) implementation(mn.micronaut.serde.jackson) + implementation(mn.validation) implementation(project(":core")) implementation(project(":domain")) implementation(project(":rule-engine")) + // needed for the testing of the application runtimeOnly(mn.h2) runtimeOnly(mn.snakeyaml) - implementation(mn.validation) - testRuntimeOnly(mn.logback.classic) testImplementation(mn.micronaut.test.junit5) testImplementation(libs.bundles.junit) diff --git a/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/AccountReconcileIT.java b/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/AccountReconcileIT.java index cee23e86..31a4847e 100644 --- a/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/AccountReconcileIT.java +++ b/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/AccountReconcileIT.java @@ -4,6 +4,7 @@ import com.jongsoft.finance.bpmn.process.RuntimeContext; import com.jongsoft.finance.domain.account.Account; import com.jongsoft.lang.Control; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import org.apache.commons.lang3.mutable.MutableObject; import org.assertj.core.api.Assertions; import org.camunda.bpm.engine.variable.Variables; @@ -14,6 +15,7 @@ import java.math.BigDecimal; import java.math.RoundingMode; +@MicronautTest @ProcessExtension @DisplayName("Account reconciliation feature") class AccountReconcileIT { diff --git a/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/BudgetAnalysisIT.java b/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/BudgetAnalysisIT.java index 71bdae19..645b6324 100644 --- a/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/BudgetAnalysisIT.java +++ b/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/BudgetAnalysisIT.java @@ -8,6 +8,7 @@ import com.jongsoft.finance.domain.user.Budget; import com.jongsoft.finance.providers.SettingProvider; import com.jongsoft.lang.Collections; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import jakarta.inject.Inject; import org.assertj.core.api.Assertions; import org.camunda.bpm.engine.variable.Variables; @@ -16,6 +17,7 @@ import org.junit.jupiter.api.Test; import org.mockito.Mockito; +@MicronautTest @ProcessExtension @DisplayName("Budget analysis feature") public class BudgetAnalysisIT { diff --git a/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/ContractWarningIT.java b/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/ContractWarningIT.java index 65d575da..b9156f91 100644 --- a/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/ContractWarningIT.java +++ b/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/ContractWarningIT.java @@ -5,6 +5,7 @@ import com.jongsoft.finance.core.MailDaemon; import com.jongsoft.finance.domain.account.Account; import com.jongsoft.finance.domain.account.Contract; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -17,6 +18,7 @@ import java.util.Map; import java.util.Properties; +@MicronautTest @ProcessExtension @DisplayName("Contract warning feature") public class ContractWarningIT { diff --git a/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/ImportJobIT.java b/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/ImportJobIT.java index 53000373..550b258f 100644 --- a/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/ImportJobIT.java +++ b/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/ImportJobIT.java @@ -9,6 +9,7 @@ import com.jongsoft.finance.domain.transaction.Transaction; import com.jongsoft.finance.providers.AccountProvider; import com.jongsoft.finance.serialized.ImportConfigJson; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -17,6 +18,7 @@ import java.util.Map; import java.util.Set; +@MicronautTest @ProcessExtension @DisplayName("CSV Import feature") public class ImportJobIT { diff --git a/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/ProcessSchedulerIT.java b/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/ProcessSchedulerIT.java index 0ac83622..f6ca9be4 100644 --- a/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/ProcessSchedulerIT.java +++ b/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/ProcessSchedulerIT.java @@ -3,6 +3,7 @@ import com.jongsoft.finance.bpmn.process.ProcessExtension; import com.jongsoft.finance.bpmn.process.RuntimeContext; import com.jongsoft.finance.schedule.Periodicity; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import org.apache.commons.lang3.mutable.MutableObject; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; @@ -13,6 +14,7 @@ import java.util.Date; import java.util.Map; +@MicronautTest @ProcessExtension @DisplayName("Process Scheduler feature") class ProcessSchedulerIT { diff --git a/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/ProfileImportIT.java b/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/ProfileImportIT.java index 245ac08b..c53f6237 100644 --- a/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/ProfileImportIT.java +++ b/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/ProfileImportIT.java @@ -6,6 +6,7 @@ import com.jongsoft.finance.domain.account.Account; import com.jongsoft.finance.domain.user.Budget; import com.jongsoft.lang.collection.Sequence; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -14,6 +15,7 @@ import java.time.LocalDate; import java.util.Map; +@MicronautTest @ProcessExtension @DisplayName("Profile import feature") public class ProfileImportIT { diff --git a/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/ScheduledTransactionIT.java b/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/ScheduledTransactionIT.java index 617f8056..95c8ce2f 100644 --- a/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/ScheduledTransactionIT.java +++ b/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/ScheduledTransactionIT.java @@ -4,6 +4,7 @@ import com.jongsoft.finance.bpmn.process.RuntimeContext; import com.jongsoft.finance.domain.account.Account; import com.jongsoft.finance.domain.transaction.ScheduledTransaction; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import org.assertj.core.api.Assertions; import org.camunda.bpm.engine.variable.Variables; import org.junit.jupiter.api.DisplayName; @@ -11,6 +12,7 @@ import java.time.LocalDate; +@MicronautTest @ProcessExtension @DisplayName("Scheduled Transaction feature") class ScheduledTransactionIT { diff --git a/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/process/ProcessExtension.java b/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/process/ProcessExtension.java index 2f109e0e..88fa40f7 100644 --- a/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/process/ProcessExtension.java +++ b/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/process/ProcessExtension.java @@ -1,14 +1,15 @@ package com.jongsoft.finance.bpmn.process; +import io.micronaut.context.annotation.Executable; import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.extension.ExtendWith; +import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -@MicronautTest -@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@Inherited @Retention(RetentionPolicy.RUNTIME) @ExtendWith({ ProcessTestExtension.class diff --git a/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/process/RunningProcessExecution.java b/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/process/RunningProcessExecution.java index baafa07d..fa6335b6 100644 --- a/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/process/RunningProcessExecution.java +++ b/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/process/RunningProcessExecution.java @@ -1,18 +1,18 @@ package com.jongsoft.finance.bpmn.process; -import lombok.extern.slf4j.Slf4j; import org.assertj.core.api.Assertions; import org.assertj.core.api.ListAssert; import org.camunda.bpm.engine.ProcessEngine; import org.camunda.bpm.engine.runtime.ProcessInstance; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.HashMap; import java.util.Map; import java.util.function.Consumer; -@Slf4j public class RunningProcessExecution implements ProcessTestExtension.ProcessExecution { - + private final static Logger log = LoggerFactory.getLogger(RunningProcessExecution.class); private final ProcessEngine processEngine; private final ProcessInstance processInstance; diff --git a/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/process/RuntimeContext.java b/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/process/RuntimeContext.java index d07fcf7d..4be24c4a 100644 --- a/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/process/RuntimeContext.java +++ b/bpmn-process/src/test/java/com/jongsoft/finance/bpmn/process/RuntimeContext.java @@ -28,7 +28,6 @@ import io.micronaut.context.ApplicationContext; import io.micronaut.context.event.ApplicationEventPublisher; import io.micronaut.core.reflect.ReflectionUtils; -import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.mutable.MutableLong; import org.assertj.core.api.Assertions; import org.assertj.core.api.ListAssert; @@ -37,15 +36,18 @@ import org.mockito.Mockito; import org.mockito.stubbing.Answer; import org.mockito.stubbing.OngoingStubbing; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.math.BigDecimal; import java.time.LocalDate; import java.util.*; import java.util.function.Consumer; -@Slf4j public class RuntimeContext { + private static final Logger log = LoggerFactory.getLogger(RuntimeContext.class); + private ApplicationContext applicationContext; private ApplicationEventPublisher applicationEventPublisher; diff --git a/build.gradle.kts b/build.gradle.kts index e69e2553..d83651dd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,83 +1,33 @@ plugins { id("io.micronaut.library") apply false id("maven-publish") - id("signing") id("java") + id("org.sonarqube") } -var isCiCd = System.getProperty("cicd") == "true" +subprojects { + apply(plugin = "java") + apply(plugin = "io.micronaut.library") + apply(plugin = "maven-publish") -//subprojects { -// apply(plugin = "java") -// apply(plugin = "io.micronaut.library") -// -// apply(plugin = "signing") -// apply(plugin = "maven-publish") -// -// if (isCiCd) { -// // when running in CI/CD environment we need to build with sources and JavaDoc and publish to maven central -// java { -// withSourcesJar() -// withJavadocJar() -// } -// -// tasks.javadoc { -// options { -// // silence the Javadoc generation -// this as StandardJavadocDocletOptions -// addBooleanOption("Xdoclint:none", true) -// } -// } -// -// publishing { -// publications { -// create("maven") { -// groupId = "com.jongsoft.finance" -// version = "3.3.0-SNAPSHOT" -// -// from(components["java"]) -// -// pom { -// description = "The REST-API for Pledger.io" -// url = "https://www.pledger.io/" -// name = project.name -// scm { -// connection = "scm:git:git@bitbucket.org:jongsoftdev/fintrack-application.git" -// developerConnection = "scm:git:git@bitbucket.org:jongsoftdev/fintrack-application.git" -// url = "https://bitbucket.org/jongsoftdev/fintrack-application/src/master/" -// } -// licenses { -// license { -// name = "MIT License" -// url = "http://www.opensource.org/licenses/mit-license.php" -// } -// } -// developers { -// developer { -// id = "gjong" -// name = "Gerben Jongerius" -// email = "g.jongerius@jong-soft.com" -// } -// } -// } -// } -// } -// -// repositories { -// maven { -// url = uri(layout.buildDirectory.dir("repo")) -// -// if (System.getenv("CI") == "true") -// credentials { -// username = System.getenv("OSSRH_USERNAME") -// password = System.getenv("OSSRH_PASSWORD") -// } -// } -// } -// } -// -// signing { -// sign(publishing.publications["maven"]) -// } -// } -//} \ No newline at end of file + publishing { + publications { + create("maven") { + groupId = "com.jongsoft.finance" + version = "3.3.0-SNAPSHOT" + from(components["java"]) + } + } + + + repositories { + maven { + uri("https://maven.pkg.github.com/pledger-io/central") + credentials { + username = System.getenv("NEXUS_USER") + password = System.getenv("NEXUS_PASSWORD") + } + } + } + } +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index e1d82b21..aa263762 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -6,6 +6,7 @@ pluginManagement { id("io.micronaut.library").version("4.3.4") id("io.micronaut.application").version("4.3.4") id("io.freefair.lombok").version("8.4") + id("org.sonarqube").version("4.4.1.3373") id("signing") id("maven-publish") From 04667a019bd797095aeb913823090e7aab38bd67 Mon Sep 17 00:00:00 2001 From: Gerben Jongerius Date: Thu, 14 Mar 2024 13:11:19 +0100 Subject: [PATCH 02/13] Update workflows monitoring branch from main to master. --- .github/workflows/pull-request-gate.yml | 2 +- .github/workflows/release-build.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pull-request-gate.yml b/.github/workflows/pull-request-gate.yml index 53b157bc..152defc2 100644 --- a/.github/workflows/pull-request-gate.yml +++ b/.github/workflows/pull-request-gate.yml @@ -3,7 +3,7 @@ name: Validate Pull Request on: pull_request: branches: - - main + - master jobs: quality_gate: diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index 38019c74..7998afa7 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -3,7 +3,7 @@ name: Build Rest Application Release on: push: branches: - - main + - master jobs: release: From f23ec14cd3d532ea95629dfd37125cabd5f22c59 Mon Sep 17 00:00:00 2001 From: Gerben Jongerius Date: Thu, 14 Mar 2024 13:29:13 +0100 Subject: [PATCH 03/13] Move to the sonarsource scanner rather than a duplicate build --- .github/workflows/feature-build.yml | 1 + .github/workflows/pull-request-gate.yml | 12 ++-- bitbucket-pipelines.yml | 80 ------------------------- private-key.gpg.enc | 55 ----------------- sonar-project.properties | 2 + 5 files changed, 9 insertions(+), 141 deletions(-) delete mode 100644 bitbucket-pipelines.yml delete mode 100644 private-key.gpg.enc create mode 100644 sonar-project.properties diff --git a/.github/workflows/feature-build.yml b/.github/workflows/feature-build.yml index ecb336f6..87da022b 100644 --- a/.github/workflows/feature-build.yml +++ b/.github/workflows/feature-build.yml @@ -4,6 +4,7 @@ on: branches: - 'feature/**' + permissions: contents: read diff --git a/.github/workflows/pull-request-gate.yml b/.github/workflows/pull-request-gate.yml index 152defc2..60afe8fa 100644 --- a/.github/workflows/pull-request-gate.yml +++ b/.github/workflows/pull-request-gate.yml @@ -6,7 +6,7 @@ on: - master jobs: - quality_gate: + code-quality: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -16,9 +16,9 @@ jobs: java-version: '21' distribution: 'temurin' architecture: x64 - - name: Setup Gradle - uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 - - name: Build code - run: ./gradlew test - name: Quality gate - run: ./gradlew sonar -Dsonar.gradle.skipCompile=true -Dsonar.host.url=https://sonarcloud.io -Dsonar.projectKey="FinTrack:API" -Dsonar.organization=jongsoft -Dsonar.token=${{ secrets.SONAR_TOKEN }} + uses: sonarsource/sonarcloud-github-action@master + with: + sonar-token: ${{ secrets.SONAR_TOKEN }} + github-token: ${{ secrets.GITHUB_TOKEN }} + java-version: 21 diff --git a/bitbucket-pipelines.yml b/bitbucket-pipelines.yml deleted file mode 100644 index bceb5e5e..00000000 --- a/bitbucket-pipelines.yml +++ /dev/null @@ -1,80 +0,0 @@ -image: maven:3-amazoncorretto-21 - -pipelines: - default: - - step: - caches: - - gradle - script: - - bash ./gradlew classes - - pull-requests: - feature/*: - - step: - name: Build software - caches: - - gradle - script: - - bash ./gradlew check - artifacts: - - .gradle/** - - "**/build/**" - - step: - name: Quality Gate - caches: - - gradle - script: - - bash ./gradlew sonar - - branches: - master: - - step: - name: Build software - caches: - - gradle - script: - - bash ./gradlew check - artifacts: - - .gradle/** - - "**/build/**" - - parallel: - - step: - name: Deploy snapshot - caches: - - gradle - script: - - export GPG_TTY=$(tty) - - yum install openssl11 gnupg -y - - openssl11 aes-256-cbc -a -k "$SIGNING_PWD" -in private-key.gpg.enc -out private-key.gpg -d - - gpg --import private-key.gpg - - printf "signing.keyId=$GPG_KEY\nsigning.password=$GPG_PASSWORD\nsigning.secretKeyRingFile=$BITBUCKET_CLONE_DIR/private-key.gpg" > ~/.gradle/gradle.properties - - bash ./gradlew publish - - step: - name: Quality gate - caches: - - gradle - script: - - bash ./gradlew sonar - - release/*: - - step: - name: Build - caches: - - gradle - script: - - bash ./gradlew clean build - artifacts: - - .gradle/** - - "**/build/libs/*.jar" - - step: - name: Publish release - trigger: manual - caches: - - gradle - script: - - export GPG_TTY=$(tty) - - yum install openssl11 gnupg -y - - openssl11 aes-256-cbc -a -k "$SIGNING_PWD" -in private-key.gpg.enc -out private-key.gpg -d - - gpg --import private-key.gpg - - printf "signing.keyId=$GPG_KEY\nsigning.password=$GPG_PASSWORD\nsigning.secretKeyRingFile=$BITBUCKET_CLONE_DIR/private-key.gpg" > ~/.gradle/gradle.properties - - bash ./gradlew -x jar publish diff --git a/private-key.gpg.enc b/private-key.gpg.enc deleted file mode 100644 index b427a119..00000000 --- a/private-key.gpg.enc +++ /dev/null @@ -1,55 +0,0 @@ -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 -ZEVVzaEWXQMiy1eljFq+0w== diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 00000000..3fd6594b --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,2 @@ +sonar.projectKey=FinTrack:API +sonar.organization=jongsoft \ No newline at end of file From e433982d40b10b0bc935be9fcebd54e431e096fe Mon Sep 17 00:00:00 2001 From: Gerben Jongerius Date: Thu, 14 Mar 2024 13:31:42 +0100 Subject: [PATCH 04/13] Fix issue in the sonar scanner configuration. --- .github/workflows/pull-request-gate.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/pull-request-gate.yml b/.github/workflows/pull-request-gate.yml index 60afe8fa..8adc9812 100644 --- a/.github/workflows/pull-request-gate.yml +++ b/.github/workflows/pull-request-gate.yml @@ -18,7 +18,6 @@ jobs: architecture: x64 - name: Quality gate uses: sonarsource/sonarcloud-github-action@master - with: - sonar-token: ${{ secrets.SONAR_TOKEN }} - github-token: ${{ secrets.GITHUB_TOKEN }} - java-version: 21 + env: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 3faeff453627340be39c513c61aabcad44545bb6 Mon Sep 17 00:00:00 2001 From: Gerben Jongerius Date: Thu, 14 Mar 2024 14:29:14 +0100 Subject: [PATCH 05/13] Change the build configuration. --- .github/workflows/component-build.yml | 32 +++++++++++++++++++++++++ .github/workflows/feature-build.yml | 25 ------------------- .github/workflows/pull-request-gate.yml | 7 ++++++ 3 files changed, 39 insertions(+), 25 deletions(-) create mode 100644 .github/workflows/component-build.yml delete mode 100644 .github/workflows/feature-build.yml diff --git a/.github/workflows/component-build.yml b/.github/workflows/component-build.yml new file mode 100644 index 00000000..ce29bf48 --- /dev/null +++ b/.github/workflows/component-build.yml @@ -0,0 +1,32 @@ +name: Build flow + +on: [workflow_call] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Configure Java version + uses: actions/setup-java@v3 + with: + java-version: '21' + distribution: 'temurin' + architecture: x64 + - name: Setup Gradle + uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 + - name: Build code + run: ./gradlew check + - name: Upload build results + uses: actions/upload-artifact@v4 + with: + name: build-artifact + path: | + **/build/classes/** + **/build/libs/*.jar + - name: Upload test results + uses: actions/upload-artifact@v4 + with: + name: test-artifact + path: | + **/build/test-results/** \ No newline at end of file diff --git a/.github/workflows/feature-build.yml b/.github/workflows/feature-build.yml deleted file mode 100644 index 87da022b..00000000 --- a/.github/workflows/feature-build.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Build a feature branch -on: - push: - branches: - - 'feature/**' - - -permissions: - contents: read - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Configure Java version - uses: actions/setup-java@v3 - with: - java-version: '21' - distribution: 'temurin' - architecture: x64 - - name: Setup Gradle - uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 - - name: Build code - run: ./gradlew check \ No newline at end of file diff --git a/.github/workflows/pull-request-gate.yml b/.github/workflows/pull-request-gate.yml index 8adc9812..cacd365b 100644 --- a/.github/workflows/pull-request-gate.yml +++ b/.github/workflows/pull-request-gate.yml @@ -6,8 +6,11 @@ on: - master jobs: + build: + uses: ./.github/workflows/component-build.yml code-quality: runs-on: ubuntu-latest + needs: build steps: - uses: actions/checkout@v4 - name: Configure Java version @@ -16,6 +19,10 @@ jobs: java-version: '21' distribution: 'temurin' architecture: x64 + - name: Download build artifact + uses: actions/download-artifact@v4 + with: + name: build-artifact - name: Quality gate uses: sonarsource/sonarcloud-github-action@master env: From f0ab557063ac7c324e75f48359d78a80b46f0b9b Mon Sep 17 00:00:00 2001 From: Gerben Jongerius Date: Thu, 14 Mar 2024 14:43:58 +0100 Subject: [PATCH 06/13] Configure the location of the binaries for sonar --- sonar-project.properties | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sonar-project.properties b/sonar-project.properties index 3fd6594b..b0d26811 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -1,2 +1,3 @@ sonar.projectKey=FinTrack:API -sonar.organization=jongsoft \ No newline at end of file +sonar.organization=jongsoft +sonar.java.binaries=build/classes/java/main \ No newline at end of file From 5667f33acc00ff837031032ffdeb46204008d553 Mon Sep 17 00:00:00 2001 From: Gerben Jongerius Date: Thu, 14 Mar 2024 15:16:53 +0100 Subject: [PATCH 07/13] Moving the sonar configuration into the gradle build --- build.gradle.kts | 7 +++++++ sonar-project.properties | 3 --- 2 files changed, 7 insertions(+), 3 deletions(-) delete mode 100644 sonar-project.properties diff --git a/build.gradle.kts b/build.gradle.kts index d83651dd..067d6ed8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -10,6 +10,13 @@ subprojects { apply(plugin = "io.micronaut.library") apply(plugin = "maven-publish") + sonar { + properties { + property("sonar.projectKey", "FinTrack:API") + property("sonar.organization", "jongsoft") + } + } + publishing { publications { create("maven") { diff --git a/sonar-project.properties b/sonar-project.properties deleted file mode 100644 index b0d26811..00000000 --- a/sonar-project.properties +++ /dev/null @@ -1,3 +0,0 @@ -sonar.projectKey=FinTrack:API -sonar.organization=jongsoft -sonar.java.binaries=build/classes/java/main \ No newline at end of file From 32c3e6f3fded30feaa277e250e68824be791abae Mon Sep 17 00:00:00 2001 From: Gerben Jongerius Date: Thu, 14 Mar 2024 15:47:19 +0100 Subject: [PATCH 08/13] Update build configuration for sonar --- .github/workflows/pull-request-gate.yml | 5 +---- build.gradle.kts | 14 +++++++------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/.github/workflows/pull-request-gate.yml b/.github/workflows/pull-request-gate.yml index cacd365b..579e92db 100644 --- a/.github/workflows/pull-request-gate.yml +++ b/.github/workflows/pull-request-gate.yml @@ -24,7 +24,4 @@ jobs: with: name: build-artifact - name: Quality gate - uses: sonarsource/sonarcloud-github-action@master - env: - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: ./gradlew sonar -Dsonar.token=${{ secrets.SONAR_TOKEN }} diff --git a/build.gradle.kts b/build.gradle.kts index 067d6ed8..ad714d5e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,18 +5,18 @@ plugins { id("org.sonarqube") } +sonar { + properties { + property("sonar.projectKey", "FinTrack:API") + property("sonar.organization", "jongsoft") + } +} + subprojects { apply(plugin = "java") apply(plugin = "io.micronaut.library") apply(plugin = "maven-publish") - sonar { - properties { - property("sonar.projectKey", "FinTrack:API") - property("sonar.organization", "jongsoft") - } - } - publishing { publications { create("maven") { From 8c4c2fcdccd157e9ea1b155540ab2e459de5d612 Mon Sep 17 00:00:00 2001 From: Gerben Jongerius Date: Thu, 14 Mar 2024 15:55:52 +0100 Subject: [PATCH 09/13] Skip compile for sonar and set hostname. --- .github/workflows/pull-request-gate.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pull-request-gate.yml b/.github/workflows/pull-request-gate.yml index 579e92db..4294f0f6 100644 --- a/.github/workflows/pull-request-gate.yml +++ b/.github/workflows/pull-request-gate.yml @@ -24,4 +24,4 @@ jobs: with: name: build-artifact - name: Quality gate - run: ./gradlew sonar -Dsonar.token=${{ secrets.SONAR_TOKEN }} + run: ./gradlew sonar -Dsonar.token=${{ secrets.SONAR_TOKEN }} -Dsonar.gradle.skipCompile=true -Dsonar.host.url=https://sonarcloud.io From 0634e00db4dabade9d39014b3581d5ebc0ecce0d Mon Sep 17 00:00:00 2001 From: Gerben Jongerius Date: Thu, 14 Mar 2024 16:07:50 +0100 Subject: [PATCH 10/13] Setup new project key for sonar --- build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index ad714d5e..dc8c565e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,8 +7,8 @@ plugins { sonar { properties { - property("sonar.projectKey", "FinTrack:API") - property("sonar.organization", "jongsoft") + property("sonar.projectKey", "rest-application") + property("sonar.organization", "pledger-io") } } From 63f70a8099f65000884ae822faa956d38b6d55f0 Mon Sep 17 00:00:00 2001 From: Gerben Jongerius Date: Thu, 14 Mar 2024 16:20:37 +0100 Subject: [PATCH 11/13] Add code coverage information --- .github/workflows/component-build.yml | 1 + build.gradle.kts | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/.github/workflows/component-build.yml b/.github/workflows/component-build.yml index ce29bf48..1b615dd6 100644 --- a/.github/workflows/component-build.yml +++ b/.github/workflows/component-build.yml @@ -24,6 +24,7 @@ jobs: path: | **/build/classes/** **/build/libs/*.jar + **/build/jacoco/*.exec - name: Upload test results uses: actions/upload-artifact@v4 with: diff --git a/build.gradle.kts b/build.gradle.kts index dc8c565e..d351e25a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,7 +2,9 @@ plugins { id("io.micronaut.library") apply false id("maven-publish") id("java") + id("org.sonarqube") + id("jacoco") } sonar { @@ -16,6 +18,17 @@ subprojects { apply(plugin = "java") apply(plugin = "io.micronaut.library") apply(plugin = "maven-publish") + apply(plugin = "jacoco") + + tasks.test { + finalizedBy(tasks.jacocoTestReport) + } + + tasks.jacocoTestReport { + reports { + xml.required = true + } + } publishing { publications { From f9439bc3cac6778d8aca2cde3a145bab5032be1a Mon Sep 17 00:00:00 2001 From: Gerben Jongerius Date: Thu, 14 Mar 2024 16:29:38 +0100 Subject: [PATCH 12/13] Fix the project key in sonar. --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index d351e25a..9b9dfe81 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,7 +9,7 @@ plugins { sonar { properties { - property("sonar.projectKey", "rest-application") + property("sonar.projectKey", "pledger-io_rest-application") property("sonar.organization", "pledger-io") } } From d4133f979230f3cc48cb44a20b65545267e8d2f4 Mon Sep 17 00:00:00 2001 From: Gerben Jongerius Date: Thu, 14 Mar 2024 17:25:04 +0100 Subject: [PATCH 13/13] update main build file [skip ci] --- .github/workflows/release-build.yml | 11 ++++------- README.md | 6 +++--- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index 7998afa7..b4ce3956 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -6,8 +6,11 @@ on: - master jobs: + build: + uses: ./.github/workflows/component-build.yml release: runs-on: ubuntu-latest + needs: build steps: - uses: actions/checkout@v4 - name: Configure Java version @@ -16,14 +19,8 @@ jobs: java-version: '21' distribution: 'temurin' architecture: x64 - - name: Setup Gradle - uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 - - name: Build code - run: ./gradlew build - - name: Quality gate - run: ./gradlew sonar -Dsonar.gradle.skipCompile=true -Dsonar.host.url=https://sonarcloud.io -Dsonar.projectKey=Fintrack:API -Dsonar.organization=jongsoft -Dsonar.token=${{ secrets.SONAR_TOKEN }} - name: Publish artifacts - run: ./gradlew publish + run: ./gradlew publish -x check env: NEXUS_PASSWORD: ${{ GITHUB_ACTOR }} NEXUS_USER: ${{ secrets.GITHUB_TOKEN }} diff --git a/README.md b/README.md index 8177981d..7d8a8a3a 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ # FinTrack ![Sonatype Nexus (Releases)](https://img.shields.io/nexus/r/com.jongsoft.finance/fintrack-api?server=https%3A%2F%2Foss.sonatype.org) ![Sonatype Nexus (Snapshots)](https://img.shields.io/nexus/s/com.jongsoft.finance/fintrack-api?server=https%3A%2F%2Foss.sonatype.org) -![Bitbucket Pipelines](https://img.shields.io/bitbucket/pipelines/jongsoftdev/fintrack-application/master) -[![SonarCloud Quality](https://sonarcloud.io/api/project_badges/measure?project=FinTrack%3AAPI&metric=alert_status&style=flat-square)](https://sonarcloud.io/dashboard?id=FinTrack%3AAPI) -[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=FinTrack%3AAPI&metric=coverage&style=flat-square)](https://sonarcloud.io/dashboard?id=FinTrack%3AAPI) +![Release Build](https://github.com/pledger-io/rest-application/actions/workflows/release-build.yml/badge.svg) +[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=pledger-io_rest-application&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=pledger-io_rest-application) +[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=pledger-io_rest-application&metric=coverage)](https://sonarcloud.io/summary/new_code?id=pledger-io_rest-application) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) -----------------------