diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml new file mode 100644 index 0000000..035548b --- /dev/null +++ b/.github/workflows/tests.yaml @@ -0,0 +1,37 @@ +name: test and analysis + +on: + # Trigger analysis when pushing in master or pull requests, and when creating + # a pull request. + push: + branches: + - main + - develop + pull_request: + types: [opened, synchronize, reopened] + +jobs: + sonarcloud: + runs-on: ubuntu-latest + steps: + + - uses: actions/checkout@v2 + with: + # Disabling shallow clone is recommended for improving relevancy of reporting + fetch-depth: 0 + + - uses: actions/setup-node@v2 + with: + node-version: '16' + + - name: 'Install Dependencies' + run: npm install + + - name: 'Test all projects' + run: npm run nx -- run-many --target=test --all --codeCoverage + + - name: SonarCloud Scan + uses: sonarsource/sonarcloud-github-action@master + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/.gitignore b/.gitignore index 0845852..c9b99da 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,4 @@ testem.log Thumbs.db **/.env +test-reports/** diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile index 2fbb812..2bb733d 100644 --- a/.gitpod.Dockerfile +++ b/.gitpod.Dockerfile @@ -20,3 +20,12 @@ RUN wget https://github.com/gruntwork-io/cloud-nuke/releases/download/${CLOUD_NU ### https://github.com/jckuester/awsls#installation RUN brew install jckuester/tap/awsls +RUN sudo apt-get update && sudo apt-get install -y jq + +ENV SONAR_SCANNER_OPTS "-Xmx1024m" +ENV SONAR_SCANNER_CLI_VERSION=4.4.0.2170 + +RUN curl --insecure -OL https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-${SONAR_SCANNER_CLI_VERSION}-linux.zip &&\ + unzip sonar-scanner-cli-${SONAR_SCANNER_CLI_VERSION}-linux.zip && ls + +ENV PATH=~/sonar-scanner-${SONAR_SCANNER_CLI_VERSION}-linux/bin:$PATH diff --git a/apps/app/jest.config.js b/apps/app/jest.config.js index ddd50b2..2a591bf 100644 --- a/apps/app/jest.config.js +++ b/apps/app/jest.config.js @@ -10,4 +10,10 @@ module.exports = { moduleFileExtensions: ['ts', 'js', 'html'], coverageDirectory: '../../coverage/apps/app', testEnvironment: 'node', + testEnvironmentOptions: { + sonarReporter: { + reportFile: '../../coverage/apps/app/test-reporter.xml', + reportPath: 'test-reports', + }, + }, } diff --git a/apps/app/project.json b/apps/app/project.json index f94ef86..731876c 100644 --- a/apps/app/project.json +++ b/apps/app/project.json @@ -56,7 +56,8 @@ "outputs": ["coverage/apps/app"], "options": { "jestConfig": "apps/app/jest.config.js", - "passWithNoTests": true + "passWithNoTests": true, + "codeCoverage": true } } }, diff --git a/jest.preset.js b/jest.preset.js index 81c2857..d0569c0 100644 --- a/jest.preset.js +++ b/jest.preset.js @@ -1,3 +1,9 @@ const nxPreset = require('@nrwl/jest/preset') -module.exports = { ...nxPreset } +module.exports = { + ...nxPreset, + testResultsProcessor: 'jest-sonar-reporter', + reporters: ['default', 'jest-junit'], + coverageReporters: ['lcov', 'text', 'html'], + codeCoverage: true, +} diff --git a/libs/users-typeorm/jest.config.js b/libs/users-typeorm/jest.config.js index 640e542..b5641ad 100644 --- a/libs/users-typeorm/jest.config.js +++ b/libs/users-typeorm/jest.config.js @@ -21,4 +21,5 @@ module.exports = { statements: 90, }, }, + reporters: ['jest-sonar-reporter'], } diff --git a/package-lock.json b/package-lock.json index 8cd95a7..75b9c05 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "express": "^4.17.1", "express-session": "^1.17.2", "firebase-admin": "^9.6.0", + "jest-sonar-reporter": "^2.0.0", "passport": "^0.5.0", "passport-spotify": "^2.0.0", "pino": "^6.11.2", @@ -62,6 +63,7 @@ "firebase-tools": "^9.23.0", "fs-extra": "^10.0.0", "jest": "27.2.3", + "jest-junit": "^13.0.0", "prettier": "2.5.1", "ts-jest": "27.0.5", "ts-node": "~9.1.1", @@ -13495,6 +13497,42 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/jest-junit": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-13.0.0.tgz", + "integrity": "sha512-JSHR+Dhb32FGJaiKkqsB7AR3OqWKtldLd6ZH2+FJ8D4tsweb8Id8zEVReU4+OlrRO1ZluqJLQEETm+Q6/KilBg==", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "strip-ansi": "^6.0.1", + "uuid": "^8.3.2", + "xml": "^1.0.1" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/jest-junit/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-junit/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-leak-detector": { "version": "27.4.2", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.4.2.tgz", @@ -14079,6 +14117,17 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/jest-sonar-reporter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jest-sonar-reporter/-/jest-sonar-reporter-2.0.0.tgz", + "integrity": "sha512-ZervDCgEX5gdUbdtWsjdipLN3bKJwpxbvhkYNXTAYvAckCihobSLr9OT/IuyNIRT1EZMDDwR6DroWtrq+IL64w==", + "dependencies": { + "xml": "^1.0.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/jest-util": { "version": "27.2.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.2.0.tgz", @@ -21405,6 +21454,11 @@ "node": ">=8" } }, + "node_modules/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=" + }, "node_modules/xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", @@ -32434,6 +32488,35 @@ } } }, + "jest-junit": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-13.0.0.tgz", + "integrity": "sha512-JSHR+Dhb32FGJaiKkqsB7AR3OqWKtldLd6ZH2+FJ8D4tsweb8Id8zEVReU4+OlrRO1ZluqJLQEETm+Q6/KilBg==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "strip-ansi": "^6.0.1", + "uuid": "^8.3.2", + "xml": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "jest-leak-detector": { "version": "27.4.2", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.4.2.tgz", @@ -32900,6 +32983,14 @@ } } }, + "jest-sonar-reporter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jest-sonar-reporter/-/jest-sonar-reporter-2.0.0.tgz", + "integrity": "sha512-ZervDCgEX5gdUbdtWsjdipLN3bKJwpxbvhkYNXTAYvAckCihobSLr9OT/IuyNIRT1EZMDDwR6DroWtrq+IL64w==", + "requires": { + "xml": "^1.0.1" + } + }, "jest-util": { "version": "27.2.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.2.0.tgz", @@ -38438,6 +38529,11 @@ "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", "devOptional": true }, + "xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=" + }, "xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", diff --git a/package.json b/package.json index 805422f..286a69a 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "express": "^4.17.1", "express-session": "^1.17.2", "firebase-admin": "^9.6.0", + "jest-sonar-reporter": "^2.0.0", "passport": "^0.5.0", "passport-spotify": "^2.0.0", "pino": "^6.11.2", @@ -82,9 +83,19 @@ "firebase-tools": "^9.23.0", "fs-extra": "^10.0.0", "jest": "27.2.3", + "jest-junit": "^13.0.0", "prettier": "2.5.1", "ts-jest": "27.0.5", "ts-node": "~9.1.1", "typescript": "4.3.5" + }, + "jest-junit": { + "outputDirectory": "test-reports", + "outputName": "junit.xml" + }, + "jestSonar": { + "reportPath": "test-reports", + "reportFile": "test-reporter.xml", + "indent": 4 } } diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 0000000..be3f547 --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,12 @@ +sonar.host.url=https://sonarcloud.io +sonar.organization=lazyorange + +sonar.projectVersion=1 +sonar.sources=apps/**/src/**,libs/**/src/** +sonar.test.inclusions=**/*.spec.ts +sonar.sourceEncoding=UTF-8 + +sonar.javascript.lcov.reportPaths=coverage/**/lcov.info +sonar.typescript.lcov.reportPaths=coverage/**/lcov.info +sonar.testExecutionReportPaths=test-reports/test-reporter.xml +sonar.exclusions=/node_modules/