diff --git a/.circleci/config.yml b/.circleci/config.yml index 178aae6c..af74bf34 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,7 +2,7 @@ version: 2.1 orbs: docker: circleci/docker@2.1.1 node: circleci/node@5.0.2 - + sonarcloud: sonarsource/sonarcloud@2.0.0 jobs: generate_schema: executor: @@ -45,14 +45,23 @@ jobs: docker build --network=flexo-mms-test-network -t flexo-mms-test:latest -f Dockerfile-Test . docker run --network=flexo-mms-test-network --name flexo-mms-test-container flexo-mms-test:latest SIG_INT=$? - docker cp flexo-mms-test-container:/application/build/reports/tests /home/circleci/results + docker cp flexo-mms-test-container:/application/build /home/circleci/flexo-mms-layer1-service/build exit "$SIG_INT" - store_artifacts: - path: /home/circleci/results + path: /home/circleci/flexo-mms-layer1-service/build/reports/tests - persist_to_workspace: root: /home/circleci/ paths: - flexo-mms-layer1-service/* + scan: + executor: + name: docker/docker + working_directory: /home/circleci/flexo-mms-layer1-service + steps: + - checkout + - attach_workspace: + at: /home/circleci/flexo-mms-layer1-service + - sonarcloud/scan deploy_snapshot: executor: @@ -132,6 +141,11 @@ workflows: version: 2 build-test-deploy: jobs: + - scan: + requires: + - build_and_test + context: + - SonarCloud - generate_schema: filters: tags: @@ -139,6 +153,11 @@ workflows: context: - DockerHub - build_and_test: + post-steps: + - persist_to_workspace: + root: /home/circleci/flexo-mms-layer1-service + paths: + - build/* requires: - generate_schema filters: diff --git a/README.md b/README.md index c337868d..cc3aebb1 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,11 @@ # Flexo MMS Layer 1 -[![CircleCI](https://circleci.com/gh/Open-MBEE/flexo-mms-layer1-service.svg?style=shield)](https://circleci.com/gh/Open-MBEE/flexo-mms-layer1-service) +[![CircleCI](https://circleci.com/gh/Open-MBEE/flexo-mms-layer1-service.svg?style=shield)](https://circleci.com/gh/Open-MBEE/flexo-mms-layer1-service) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=Open-MBEE_flexo-mms-layer1-service&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=Open-MBEE_flexo-mms-layer1-service) +
+ SonarCloud + +[![Duplicated Lines (%)](https://sonarcloud.io/api/project_badges/measure?project=Open-MBEE_flexo-mms-layer1-service&metric=duplicated_lines_density)](https://sonarcloud.io/summary/new_code?id=Open-MBEE_flexo-mms-layer1-service) [![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=Open-MBEE_flexo-mms-layer1-service&metric=reliability_rating)](https://sonarcloud.io/summary/new_code?id=Open-MBEE_flexo-mms-layer1-service) [![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=Open-MBEE_flexo-mms-layer1-service&metric=sqale_index)](https://sonarcloud.io/summary/new_code?id=Open-MBEE_flexo-mms-layer1-service) [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=Open-MBEE_flexo-mms-layer1-service&metric=coverage)](https://sonarcloud.io/summary/new_code?id=Open-MBEE_flexo-mms-layer1-service) [![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=Open-MBEE_flexo-mms-layer1-service&metric=ncloc)](https://sonarcloud.io/summary/new_code?id=Open-MBEE_flexo-mms-layer1-service) [![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=Open-MBEE_flexo-mms-layer1-service&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=Open-MBEE_flexo-mms-layer1-service) [![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=Open-MBEE_flexo-mms-layer1-service&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=Open-MBEE_flexo-mms-layer1-service) [![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=Open-MBEE_flexo-mms-layer1-service&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=Open-MBEE_flexo-mms-layer1-service) [![Bugs](https://sonarcloud.io/api/project_badges/measure?project=Open-MBEE_flexo-mms-layer1-service&metric=bugs)](https://sonarcloud.io/summary/new_code?id=Open-MBEE_flexo-mms-layer1-service) [![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=Open-MBEE_flexo-mms-layer1-service&metric=vulnerabilities)](https://sonarcloud.io/summary/new_code?id=Open-MBEE_flexo-mms-layer1-service) +
This project is currently under development. This document describes how to set up a local dev environment. diff --git a/build.gradle.kts b/build.gradle.kts index 023df2fb..31291c1e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,10 +5,21 @@ plugins { kotlin("jvm") version "1.9.20" kotlin("plugin.serialization") version "1.9.20" jacoco + id("org.sonarqube") version "4.4.1.3373" } group = "org.openmbee.flexo.mms" -version = "0.1.0-ALPHA" +version = "0.1.2" + +sonar { + properties { + property("sonar.projectKey", "Open-MBEE_flexo-mms-layer1-service") + property("sonar.organization", "openmbee") + property("sonar.host.url", "https://sonarcloud.io") + property("sonar.coverage.jacoco.xmlReportPaths", "build/reports/jacoco/test/jacocoTestReport.xml") + } +} + application { mainClass.set("io.ktor.server.netty.EngineMain") } @@ -108,4 +119,7 @@ tasks.test { } tasks.jacocoTestReport { dependsOn(tasks.test) // tests are required to run before generating the report + reports { + xml.required.set(true) + } } diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 00000000..6815bc5f --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,6 @@ +sonar.projectKey=Open-MBEE_flexo-mms-layer1-service +sonar.organization=openmbee +sonar.language=kotlin +sonar.coverage.jacoco.xmlReportPaths=build/reports/jacoco/test/jacocoTestReport.xml +sonar.sources=src/main/ +sonar.tests=src/test/ \ No newline at end of file diff --git a/src/main/kotlin/org/openmbee/flexo/mms/routes/gsp/ModelLoad.kt b/src/main/kotlin/org/openmbee/flexo/mms/routes/gsp/ModelLoad.kt index 92607978..a496ea97 100644 --- a/src/main/kotlin/org/openmbee/flexo/mms/routes/gsp/ModelLoad.kt +++ b/src/main/kotlin/org/openmbee/flexo/mms/routes/gsp/ModelLoad.kt @@ -217,29 +217,53 @@ fun Route.loadModel() { // compute the delta run { - val updateString = genDiffUpdate("", localConditions, """ - graph mor-graph:Metadata { - # select the latest commit from the current named ref - ?srcRef mms:commit ?srcCommit . - - # get the latest snapshot associated with the source commit - ?srcCommit ^mms:commit/mms:snapshot ?srcSnapshot . - { - # prefer the model snapshot - ?srcSnapshot a mms:Model ; - mms:graph ?srcGraph . - } union { - # settle for staging... - ?srcSnapshot a mms:Staging ; - mms:graph ?srcGraph . + val selectQueryString = """ + select distinct ?srcGraph ?srcCommit { + graph mor-graph:Metadata { + # select the latest commit from the current named ref + ?srcRef mms:commit ?srcCommit . - # ...if model is not available - filter not exists { - ?srcCommit ^mms:commit/mms:snapshot/a mms:Model . + # get the latest snapshot associated with the source commit + ?srcCommit ^mms:commit/mms:snapshot ?srcSnapshot . + { + # prefer the model snapshot + ?srcSnapshot a mms:Model ; + mms:graph ?srcGraph . + } union { + # settle for staging... + ?srcSnapshot a mms:Staging ; + mms:graph ?srcGraph . + + # ...if model is not available + filter not exists { + ?srcCommit ^mms:commit/mms:snapshot/a mms:Model . + } } } } - """) + """.trimIndent() + + val selectResponseText = executeSparqlSelectOrAsk(selectQueryString) { + prefixes(prefixes) + + iri( + // use current branch as ref source + "srcRef" to prefixes["morb"]!!, + ) + } + + // parse the JSON response + val bindings = Json.parseToJsonElement(selectResponseText).jsonObject["results"]!!.jsonObject["bindings"]!!.jsonArray + + if(bindings.size != 1) { + throw ServerBugException("Failed to resolve source graph") + } + + val sourceGraphIri = bindings[0].jsonObject["srcGraph"]!!.jsonObject["value"]!!.jsonPrimitive.content + + val sourceCommitri = bindings[0].jsonObject["srcCommit"]!!.jsonObject["value"]!!.jsonPrimitive.content + + val updateString = genDiffUpdate("", localConditions, "") executeSparqlUpdate(updateString) { prefixes(prefixes) @@ -253,6 +277,12 @@ fun Route.loadModel() { // set dst commit (this commit) "dstCommit" to prefixes["morc"]!!, + + // use explicit srcGraph + "srcGraph" to sourceGraphIri, + + // use explicit srcCommit + "srcCommit" to sourceCommitri, ) } }