diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ca5fe68..069011df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,50 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +### [20.0.0](https://github.com/eea/volto-eea-kitkat/compare/19.1.0...20.0.0) - 2 November 2023 + +#### :rocket: Dependency updates + +- Release @eeacms/volto-call-to-action-block@4.2.2 [EEA Jenkins - [`7a22363`](https://github.com/eea/volto-eea-kitkat/commit/7a2236387494fec3fb8d3114c9e7026c1cc1f81d)] +- Release @eeacms/volto-columns-block@6.4.0 [EEA Jenkins - [`0b2de2e`](https://github.com/eea/volto-eea-kitkat/commit/0b2de2e4fe43cd448256969cc391522eba2ab824)] +- Release @eeacms/volto-tabs-block@7.0.0 [EEA Jenkins - [`9147ad2`](https://github.com/eea/volto-eea-kitkat/commit/9147ad2ba8425ee7763f238aaa420aa64212de2a)] +- Release @eeacms/volto-widget-dataprovenance@0.4.3 [EEA Jenkins - [`698a5bb`](https://github.com/eea/volto-eea-kitkat/commit/698a5bba577b0123e4021d769c6c91363ed5ed66)] +- Release @eeacms/volto-widget-geolocation@5.1.6 [EEA Jenkins - [`8f14ea8`](https://github.com/eea/volto-eea-kitkat/commit/8f14ea8f7890ee45631046e8561dc802d03a8ea3)] +- Release @eeacms/volto-corsproxy@3.1.5 [EEA Jenkins - [`c793451`](https://github.com/eea/volto-eea-kitkat/commit/c793451f94791e37007ebe23031178b0918f77d1)] +- Release @eeacms/volto-listing-block@6.0.2 [EEA Jenkins - [`af8adbb`](https://github.com/eea/volto-eea-kitkat/commit/af8adbbb719a8d72f8cf5c452c9585c522cdad42)] +- Release @eeacms/volto-object-widget@5.1.5 [EEA Jenkins - [`c6b98d1`](https://github.com/eea/volto-eea-kitkat/commit/c6b98d1aecfe87f742ac8a4b1d7277cedbda6a39)] +- Release @eeacms/volto-group-block@6.3.4 [EEA Jenkins - [`ba083f5`](https://github.com/eea/volto-eea-kitkat/commit/ba083f5e8764fe911503d2be9d0845746d658690)] +- Release @eeacms/volto-block-style@5.2.6 [EEA Jenkins - [`81b7dcd`](https://github.com/eea/volto-eea-kitkat/commit/81b7dcd156e96e887fa0f98b47f306490b48e476)] +- Release @eeacms/volto-slate-metadata-mentions@7.0.2 [EEA Jenkins - [`178c3df`](https://github.com/eea/volto-eea-kitkat/commit/178c3dfcd828d9029e915e590d60a47d70157147)] +- Release @eeacms/volto-slate-label@0.5.8 [EEA Jenkins - [`82e1d6f`](https://github.com/eea/volto-eea-kitkat/commit/82e1d6fb442f4857c2aa007978292c28ff79f89e)] +- Release @eeacms/volto-slate-footnote@6.1.8 [EEA Jenkins - [`9f9ae52`](https://github.com/eea/volto-eea-kitkat/commit/9f9ae525cca539951bea0c074251296eecf96579)] +- Release @eeacms/volto-tags-block@1.2.4 [EEA Jenkins - [`d2e5415`](https://github.com/eea/volto-eea-kitkat/commit/d2e54154ca24a27f066904178ae659d4f147ea71)] +- Release @eeacms/volto-description-block@1.2.4 [EEA Jenkins - [`1441def`](https://github.com/eea/volto-eea-kitkat/commit/1441def0159ff228ba16a20419d3e96182ad97ca)] +- Release @eeacms/volto-block-image-cards@1.3.5 [EEA Jenkins - [`4f94c4b`](https://github.com/eea/volto-eea-kitkat/commit/4f94c4b8aecadacc2d39f8c857834801623881ed)] +- Release @eeacms/volto-block-divider@6.1.5 [EEA Jenkins - [`78c17be`](https://github.com/eea/volto-eea-kitkat/commit/78c17be2c16aa8f4a069fabe9b2abcac230c97d2)] +- Release @eeacms/volto-widget-theme-picker@1.1.5 [EEA Jenkins - [`9a9fe5a`](https://github.com/eea/volto-eea-kitkat/commit/9a9fe5adc9ed905b476765100bd308468edc6352)] +- Release @eeacms/volto-widget-temporal-coverage@5.1.5 [EEA Jenkins - [`4e4aa71`](https://github.com/eea/volto-eea-kitkat/commit/4e4aa71d2e59ccdf70b93866381d32d4318bbf01)] +- Release @eeacms/volto-nextcloud-video-block@0.4.8 [EEA Jenkins - [`0f598c2`](https://github.com/eea/volto-eea-kitkat/commit/0f598c249758ac70be296c5077d6d28bc8b45a12)] +- Release @eeacms/volto-timeline-block@1.1.5 [EEA Jenkins - [`26ae113`](https://github.com/eea/volto-eea-kitkat/commit/26ae113dcf5086be5b31305ed0b8bd8eb70e35ea)] +- Release @eeacms/volto-metadata-block@6.0.3 [EEA Jenkins - [`d5964d8`](https://github.com/eea/volto-eea-kitkat/commit/d5964d8c84199b3af91186d1bc5d845779a2f74d)] +- Release @eeacms/volto-tabs-block@6.0.3 [EEA Jenkins - [`a661d93`](https://github.com/eea/volto-eea-kitkat/commit/a661d9307ee733c83315055145cd43707b521af6)] +- Release @eeacms/volto-hero-block@5.4.5 [EEA Jenkins - [`57580c8`](https://github.com/eea/volto-eea-kitkat/commit/57580c8903f7569f87378f73ab93ffbc3ccf577f)] +- Release @eeacms/volto-hero-block@5.4.4 [EEA Jenkins - [`a5ae5c5`](https://github.com/eea/volto-eea-kitkat/commit/a5ae5c586ad070ce6370039af7a74aa9a7852910)] + +#### :bug: Bug Fixes + +- fix(tests): after upgrade to volto-tabs-block 7.0 we now have variation instead of template [David Ichim - [`2156499`](https://github.com/eea/volto-eea-kitkat/commit/2156499a83a80a3ff5f23ea15e54fc0b8e3c01e2)] + +#### :house: Internal changes + + +#### :hammer_and_wrench: Others + +- Release 20.0.0 [Alin Voinea - [`d76fde9`](https://github.com/eea/volto-eea-kitkat/commit/d76fde92e0d632dccf7b7389ec5505b5b48b761a)] +- bump package version preparing for release [David Ichim - [`4c6cbf6`](https://github.com/eea/volto-eea-kitkat/commit/4c6cbf68687cfb8420877b00b57eff37814a4a33)] +- test: get latest version of image [valentinab25 - [`2610d85`](https://github.com/eea/volto-eea-kitkat/commit/2610d8516a01dc6c62b450edb9ad11df9a10892b)] +- test: use chromium for cypress [valentinab25 - [`3c7950e`](https://github.com/eea/volto-eea-kitkat/commit/3c7950eff45006c1e7ffa1371ef300097d6adc4f)] +- test: disable cypress video [valentinab25 - [`2beb13f`](https://github.com/eea/volto-eea-kitkat/commit/2beb13f864f9a0581ad5fa6ceaea832257f244de)] ### [19.1.0](https://github.com/eea/volto-eea-kitkat/compare/19.0.0...19.1.0) - 17 October 2023 #### :rocket: Dependency updates @@ -25,9 +69,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - chore: husky, lint-staged use fixed versions [valentinab25 - [`9879aa5`](https://github.com/eea/volto-eea-kitkat/commit/9879aa54f8fdbfe6651c1e447862eae75dfaad87)] -#### :hammer_and_wrench: Others - -- Release 19.1.0 [Alin Voinea - [`24ae853`](https://github.com/eea/volto-eea-kitkat/commit/24ae8533b0db7d75b7054b7761f095369af9d983)] ## [19.0.0](https://github.com/eea/volto-eea-kitkat/compare/18.2.0...19.0.0) - 16 October 2023 #### :rocket: Dependency updates diff --git a/Dockerfile b/Dockerfile index bd8e10dc..b1ce6036 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ # syntax=docker/dockerfile:1 ARG VOLTO_VERSION -FROM plone/frontend-builder:${VOLTO_VERSION} +FROM eeacms/frontend-builder:${VOLTO_VERSION} ARG ADDON_NAME ARG ADDON_PATH diff --git a/Jenkinsfile b/Jenkinsfile index 60a0607c..96aed4b9 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,16 +1,20 @@ pipeline { - agent any + agent { + node { label 'docker-host' } + } environment { - GIT_NAME = "volto-eea-kitkat" - NAMESPACE = "@eeacms" - SONARQUBE_TAGS = "volto.eea.europa.eu,climate-energy.eea.europa.eu,forest.eea.europa.eu,biodiversity.europa.eu,www.eea.europa.eu-ims,sustainability.eionet.europa.eu,clms.land.copernicus.eu,industry.eea.europa.eu,water.europa.eu-freshwater,demo-www.eea.europa.eu,clmsdemo.devel6cph.eea.europa.eu,water.europa.eu-marine,climate-adapt.eea.europa.eu,climate-advisory-board.devel4cph.eea.europa.eu,climate-advisory-board.europa.eu,www.eea.europa.eu-en" - DEPENDENCIES = "" - VOLTO = "16" - } + GIT_NAME = "volto-eea-kitkat" + NAMESPACE = "@eeacms" + SONARQUBE_TAGS = "volto.eea.europa.eu,climate-energy.eea.europa.eu,forest.eea.europa.eu,biodiversity.europa.eu,www.eea.europa.eu-ims,sustainability.eionet.europa.eu,clms.land.copernicus.eu,industry.eea.europa.eu,water.europa.eu-freshwater,demo-www.eea.europa.eu,clmsdemo.devel6cph.eea.europa.eu,water.europa.eu-marine,climate-adapt.eea.europa.eu,climate-advisory-board.devel4cph.eea.europa.eu,climate-advisory-board.europa.eu,www.eea.europa.eu-en" + DEPENDENCIES = "" + BACKEND_PROFILES = "eea.kitkat:testing" + BACKEND_ADDONS = "" + VOLTO = "16" + IMAGE_NAME = BUILD_TAG.toLowerCase() + } stages { - stage('Release') { when { allOf { @@ -20,52 +24,41 @@ pipeline { } steps { node(label: 'docker') { - withCredentials([string(credentialsId: 'eea-jenkins-token', variable: 'GITHUB_TOKEN'),string(credentialsId: 'eea-jenkins-npm-token', variable: 'NPM_TOKEN')]) { - sh '''docker pull eeacms/gitflow''' - sh '''docker run -i --rm --name="$BUILD_TAG-gitflow-master" -e GIT_BRANCH="$BRANCH_NAME" -e GIT_NAME="$GIT_NAME" -e GIT_TOKEN="$GITHUB_TOKEN" -e NPM_TOKEN="$NPM_TOKEN" -e LANGUAGE=javascript eeacms/gitflow''' + withCredentials([string(credentialsId: 'eea-jenkins-token', variable: 'GITHUB_TOKEN'), string(credentialsId: 'eea-jenkins-npm-token', variable: 'NPM_TOKEN')]) { + sh '''docker run -i --rm --pull always --name="$IMAGE_NAME-gitflow-master" -e GIT_BRANCH="$BRANCH_NAME" -e GIT_NAME="$GIT_NAME" -e GIT_TOKEN="$GITHUB_TOKEN" -e NPM_TOKEN="$NPM_TOKEN" -e LANGUAGE=javascript eeacms/gitflow''' } } } } - stage('Code') { + stage('Check if testing needed') { when { allOf { - environment name: 'CHANGE_ID', value: '' - not { changelog '.*^Automated release [0-9\\.]+$' } not { branch 'master' } + not { branch 'develop' } + environment name: 'CHANGE_ID', value: '' } } steps { - parallel( - - "ES lint": { - node(label: 'docker') { - sh '''docker run -i --rm --name="$BUILD_TAG-eslint" -e NAMESPACE="$NAMESPACE" -e GIT_NAME=$GIT_NAME -e GIT_BRANCH="$BRANCH_NAME" -e GIT_CHANGE_ID="$CHANGE_ID" -e VOLTO=$VOLTO plone/volto-addon-ci eslint''' - } - }, - - "Style lint": { - node(label: 'docker') { - sh '''docker run -i --rm --name="$BUILD_TAG-stylelint" -e NAMESPACE="$NAMESPACE" -e GIT_NAME=$GIT_NAME -e GIT_BRANCH="$BRANCH_NAME" -e GIT_CHANGE_ID="$CHANGE_ID" -e VOLTO=$VOLTO plone/volto-addon-ci stylelint''' - } - }, + script { + withCredentials([string(credentialsId: 'eea-jenkins-token', variable: 'GITHUB_TOKEN')]) { + check_result = sh script: '''docker run --pull always -i --rm --name="$IMAGE_NAME-gitflow-check" -e GIT_TOKEN="$GITHUB_TOKEN" -e GIT_BRANCH="$BRANCH_NAME" -e GIT_ORG="$GIT_ORG" -e GIT_NAME="$GIT_NAME" eeacms/gitflow /check_if_testing_needed.sh''', returnStatus: true - "Prettier": { - node(label: 'docker') { - sh '''docker run -i --rm --name="$BUILD_TAG-prettier" -e NAMESPACE="$NAMESPACE" -e GIT_NAME=$GIT_NAME -e GIT_BRANCH="$BRANCH_NAME" -e GIT_CHANGE_ID="$CHANGE_ID" -e VOLTO=$VOLTO plone/volto-addon-ci prettier''' + if (check_result == 0) { + env.SKIP_TESTS = 'yes' + } } - } - ) + } } } - stage('Tests') { + stage('Testing') { when { anyOf { allOf { not { environment name: 'CHANGE_ID', value: '' } environment name: 'CHANGE_TARGET', value: 'develop' + environment name: 'SKIP_TESTS', value: '' } allOf { environment name: 'CHANGE_ID', value: '' @@ -73,109 +66,144 @@ pipeline { not { changelog '.*^Automated release [0-9\\.]+$' } branch 'master' } + environment name: 'SKIP_TESTS', value: '' } } } - steps { - parallel( + stages { + stage('Build test image') { + steps { + checkout scm + sh '''docker build --pull --build-arg="VOLTO_VERSION=$VOLTO" --build-arg="ADDON_NAME=$NAMESPACE/$GIT_NAME" --build-arg="ADDON_PATH=$GIT_NAME" . -t $IMAGE_NAME-frontend''' + } + } + + stage('Fix code') { + when { + environment name: 'CHANGE_ID', value: '' + not { branch 'master' } + } + steps { + script { + fix_result = sh(script: '''docker run --name="$IMAGE_NAME-fix" --entrypoint=make --workdir=/app/src/addons/$GIT_NAME $IMAGE_NAME-frontend ci-fix''', returnStatus: true) + sh '''docker cp $IMAGE_NAME-fix:/app/src/addons/$GIT_NAME/src .''' + sh '''docker rm -v $IMAGE_NAME-fix''' + FOUND_FIX = sh(script: '''git diff | wc -l''', returnStdout: true).trim() - "Volto": { - node(label: 'docker') { - script { - try { - sh '''docker pull plone/volto-addon-ci''' - sh '''docker run -i --name="$BUILD_TAG-volto" -e NAMESPACE="$NAMESPACE" -e GIT_NAME=$GIT_NAME -e GIT_BRANCH="$BRANCH_NAME" -e GIT_CHANGE_ID="$CHANGE_ID" -e VOLTO=$VOLTO plone/volto-addon-ci''' - sh '''rm -rf xunit-reports''' - sh '''mkdir -p xunit-reports''' - sh '''docker cp $BUILD_TAG-volto:/opt/frontend/my-volto-project/coverage xunit-reports/''' - sh '''docker cp $BUILD_TAG-volto:/opt/frontend/my-volto-project/junit.xml xunit-reports/''' - sh '''docker cp $BUILD_TAG-volto:/opt/frontend/my-volto-project/unit_tests_log.txt xunit-reports/''' - stash name: "xunit-reports", includes: "xunit-reports/**" - archiveArtifacts artifacts: "xunit-reports/unit_tests_log.txt", fingerprint: true - catchError(buildResult: 'SUCCESS', stageResult: 'SUCCESS') { - publishHTML (target : [ - allowMissing: false, - alwaysLinkToLastBuild: true, - keepAll: true, - reportDir: 'xunit-reports/coverage/lcov-report', - reportFiles: 'index.html', - reportName: 'UTCoverage', - reportTitles: 'Unit Tests Code Coverage' - ]) - } - } finally { - catchError(buildResult: 'SUCCESS', stageResult: 'SUCCESS') { - junit testResults: 'xunit-reports/junit.xml', allowEmptyResults: true - } - sh script: '''docker rm -v $BUILD_TAG-volto''', returnStatus: true + if (FOUND_FIX != '0') { + withCredentials([string(credentialsId: 'eea-jenkins-token', variable: 'GITHUB_TOKEN')]) { + sh '''sed -i "s|url = .*|url = https://eea-jenkins:$GITHUB_TOKEN@github.com/eea/$GIT_NAME.git|" .git/config''' } + sh '''git fetch origin $GIT_BRANCH:$GIT_BRANCH''' + sh '''git checkout $GIT_BRANCH''' + sh '''git add src/''' + sh '''git commit -m "style: Automated code fix" ''' + sh '''git push --set-upstream origin $GIT_BRANCH''' + sh '''exit 1''' } } } - ) - } - } + } - stage('Integration tests') { - when { - anyOf { - allOf { - not { environment name: 'CHANGE_ID', value: '' } - environment name: 'CHANGE_TARGET', value: 'develop' + stage('ES lint') { + steps { + sh '''docker run --rm --name="$IMAGE_NAME-eslint" --entrypoint=make --workdir=/app/src/addons/$GIT_NAME $IMAGE_NAME-frontend lint''' } - allOf { - environment name: 'CHANGE_ID', value: '' - anyOf { - not { changelog '.*^Automated release [0-9\\.]+$' } - branch 'master' - } + } + + stage('Style lint') { + steps { + sh '''docker run --rm --name="$IMAGE_NAME-stylelint" --entrypoint=make --workdir=/app/src/addons/$GIT_NAME $IMAGE_NAME-frontend stylelint''' + } + } + + stage('Prettier') { + steps { + sh '''docker run --rm --name="$IMAGE_NAME-prettier" --entrypoint=make --workdir=/app/src/addons/$GIT_NAME $IMAGE_NAME-frontend prettier''' } } - } - steps { - parallel( - "Cypress": { - node(label: 'docker') { - script { - try { - sh '''docker pull eeacms/plone-backend; docker run --rm -d --name="$BUILD_TAG-plone" -e SITE="Plone" -e PROFILES="eea.kitkat:testing" eeacms/plone-backend''' - sh '''docker pull plone/volto-addon-ci; docker run -i --name="$BUILD_TAG-cypress" --link $BUILD_TAG-plone:plone -e NAMESPACE="$NAMESPACE" -e GIT_NAME=$GIT_NAME -e GIT_BRANCH="$BRANCH_NAME" -e GIT_CHANGE_ID="$CHANGE_ID" -e DEPENDENCIES="$DEPENDENCIES" -e VOLTO=$VOLTO plone/volto-addon-ci cypress''' + stage('Coverage Tests') { + parallel { + + stage('Unit tests') { + steps { + script { + try { + sh '''docker run --name="$IMAGE_NAME-volto" --entrypoint=make --workdir=/app/src/addons/$GIT_NAME $IMAGE_NAME-frontend test-ci''' + sh '''rm -rf xunit-reports''' + sh '''mkdir -p xunit-reports''' + sh '''docker cp $IMAGE_NAME-volto:/app/coverage xunit-reports/''' + sh '''docker cp $IMAGE_NAME-volto:/app/junit.xml xunit-reports/''' + publishHTML(target : [ + allowMissing: false, + alwaysLinkToLastBuild: true, + keepAll: true, + reportDir: 'xunit-reports/coverage/lcov-report', + reportFiles: 'index.html', + reportName: 'UTCoverage', + reportTitles: 'Unit Tests Code Coverage' + ]) } finally { + catchError(buildResult: 'SUCCESS', stageResult: 'SUCCESS') { + junit testResults: 'xunit-reports/junit.xml', allowEmptyResults: true + } + sh script: '''docker rm -v $IMAGE_NAME-volto''', returnStatus: true + } + } + } + } + + stage('Integration tests') { + steps { + script { try { - sh '''rm -rf cypress-reports cypress-results cypress-coverage''' - sh '''mkdir -p cypress-reports cypress-results cypress-coverage''' - sh '''docker cp $BUILD_TAG-cypress:/opt/frontend/my-volto-project/src/addons/$GIT_NAME/cypress/videos cypress-reports/''' - sh '''docker cp $BUILD_TAG-cypress:/opt/frontend/my-volto-project/src/addons/$GIT_NAME/cypress/reports cypress-results/''' - coverage = sh script: '''docker cp $BUILD_TAG-cypress:/opt/frontend/my-volto-project/src/addons/$GIT_NAME/coverage cypress-coverage/''', returnStatus: true - if ( coverage == 0 ) { - publishHTML (target : [allowMissing: false, + sh '''docker run --pull always --rm -d --name="$IMAGE_NAME-plone" -e SITE="Plone" -e PROFILES="$BACKEND_PROFILES" -e ADDONS="$BACKEND_ADDONS" eeacms/plone-backend''' + sh '''docker run --link $IMAGE_NAME-plone:plone --entrypoint=make --name="$IMAGE_NAME-cypress" --workdir=/app/src/addons/${GIT_NAME} -e "RAZZLE_INTERNAL_API_PATH=http://plone:8080/Plone" $IMAGE_NAME-frontend cypress-ci''' + } finally { + try { + sh '''rm -rf cypress-videos cypress-results cypress-coverage cypress-screenshots''' + sh '''mkdir -p cypress-videos cypress-results cypress-coverage cypress-screenshots''' + videos = sh script: '''docker cp $IMAGE_NAME-cypress:/app/src/addons/$GIT_NAME/cypress/videos cypress-videos/''', returnStatus: true + sh '''docker cp $IMAGE_NAME-cypress:/app/src/addons/$GIT_NAME/cypress/reports cypress-results/''' + screenshots = sh script: '''docker cp $IMAGE_NAME-cypress:/app/src/addons/$GIT_NAME/cypress/screenshots cypress-screenshots''', returnStatus: true + + archiveArtifacts artifacts: 'cypress-screenshots/**', fingerprint: true, allowEmptyArchive: true + + coverage = sh script: '''docker cp $IMAGE_NAME-cypress:/app/src/addons/$GIT_NAME/coverage cypress-coverage''', returnStatus: true + + if ( coverage == 0 ) { + publishHTML(target : [allowMissing: false, alwaysLinkToLastBuild: true, keepAll: true, reportDir: 'cypress-coverage/coverage/lcov-report', reportFiles: 'index.html', reportName: 'CypressCoverage', reportTitles: 'Integration Tests Code Coverage']) - } - sh '''touch empty_file; for ok_test in $(grep -E 'file=.*failures="0"' $(grep 'testsuites .*failures="0"' $(find cypress-results -name *.xml) empty_file | awk -F: '{print $1}') empty_file | sed 's/.* file="\\(.*\\)" time.*/\\1/' | sed 's#^cypress/integration/##g' | sed 's#^../../../node_modules/@eeacms/##g'); do rm -f cypress-reports/videos/$ok_test.mp4; rm -f cypress-reports/$ok_test.mp4; done''' - archiveArtifacts artifacts: 'cypress-reports/**/*.mp4', fingerprint: true, allowEmptyArchive: true - stash name: "cypress-coverage", includes: "cypress-coverage/**", allowEmpty: true - } - finally { - catchError(buildResult: 'SUCCESS', stageResult: 'SUCCESS') { + } + if ( videos == 0 ) { + sh '''for file in $(find cypress-results -name *.xml); do if [ $(grep -E 'failures="[1-9].*"' $file | wc -l) -eq 0 ]; then testname=$(grep -E 'file=.*failures="0"' $file | sed 's#.* file=".*\\/\\(.*\\.[jsxt]\\+\\)" time.*#\\1#' ); rm -f cypress-videos/videos/$testname.mp4; fi; done''' + archiveArtifacts artifacts: 'cypress-videos/**/*.mp4', fingerprint: true, allowEmptyArchive: true + } + } finally { + catchError(buildResult: 'SUCCESS', stageResult: 'SUCCESS') { junit testResults: 'cypress-results/**/*.xml', allowEmptyResults: true + } + sh script: "docker stop $IMAGE_NAME-plone", returnStatus: true + sh script: "docker rm -v $IMAGE_NAME-plone", returnStatus: true + sh script: "docker rm -v $IMAGE_NAME-cypress", returnStatus: true } - sh script: "docker stop $BUILD_TAG-plone", returnStatus: true - sh script: "docker rm -v $BUILD_TAG-plone", returnStatus: true - sh script: "docker rm -v $BUILD_TAG-cypress", returnStatus: true - } } } } } - - ) + } + } + post { + always { + sh script: "docker rmi $IMAGE_NAME-frontend", returnStatus: true + } } } @@ -199,19 +227,16 @@ pipeline { } } steps { - node(label: 'swarm') { - script{ - checkout scm - unstash "xunit-reports" - unstash "cypress-coverage" - def scannerHome = tool 'SonarQubeScanner'; - def nodeJS = tool 'NodeJS'; - withSonarQubeEnv('Sonarqube') { - sh '''sed -i "s#/opt/frontend/my-volto-project/src/addons/${GIT_NAME}/##g" xunit-reports/coverage/lcov.info''' - sh '''sed -i "s#src/addons/${GIT_NAME}/##g" xunit-reports/coverage/lcov.info''' - sh "export PATH=${scannerHome}/bin:${nodeJS}/bin:$PATH; sonar-scanner -Dsonar.javascript.lcov.reportPaths=./xunit-reports/coverage/lcov.info,./cypress-coverage/coverage/lcov.info -Dsonar.sources=./src -Dsonar.projectKey=$GIT_NAME-$BRANCH_NAME -Dsonar.projectVersion=$BRANCH_NAME-$BUILD_NUMBER" - sh '''try=2; while [ \$try -gt 0 ]; do curl -s -XPOST -u "${SONAR_AUTH_TOKEN}:" "${SONAR_HOST_URL}api/project_tags/set?project=${GIT_NAME}-${BRANCH_NAME}&tags=${SONARQUBE_TAGS},${BRANCH_NAME}" > set_tags_result; if [ \$(grep -ic error set_tags_result ) -eq 0 ]; then try=0; else cat set_tags_result; echo "... Will retry"; sleep 60; try=\$(( \$try - 1 )); fi; done''' - } + script { + def scannerHome = tool 'SonarQubeScanner' + def nodeJS = tool 'NodeJS' + withSonarQubeEnv('Sonarqube') { + sh '''sed -i "s#/app/src/addons/${GIT_NAME}/##g" xunit-reports/coverage/lcov.info''' + sh '''sed -i "s#src/addons/${GIT_NAME}/##g" xunit-reports/coverage/lcov.info''' + sh '''cat xunit-reports/coverage/lcov.info''' + sh '''cat cypress-coverage/coverage/lcov.info''' + sh "export PATH=${scannerHome}/bin:${nodeJS}/bin:$PATH; sonar-scanner -Dsonar.javascript.lcov.reportPaths=./xunit-reports/coverage/lcov.info,./cypress-coverage/coverage/lcov.info -Dsonar.sources=./src -Dsonar.projectKey=$GIT_NAME-$BRANCH_NAME -Dsonar.projectVersion=$BRANCH_NAME-$BUILD_NUMBER" + sh '''try=5; while [ \$try -gt 0 ]; do curl -s -XPOST -u "${SONAR_AUTH_TOKEN}:" "${SONAR_HOST_URL}api/project_tags/set?project=${GIT_NAME}-${BRANCH_NAME}&tags=${SONARQUBE_TAGS},${BRANCH_NAME}" > set_tags_result; if [ \$(grep -ic error set_tags_result ) -eq 0 ]; then try=0; else cat set_tags_result; echo "... Will retry"; sleep 15; try=\$(( \$try - 1 )); fi; done''' } } } @@ -232,47 +257,37 @@ pipeline { } } steps { - node(label: 'docker') { - script { - sh '''docker pull eeacms/gitflow''' - sh '''echo "Error" > checkresult.txt''' - catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') { - sh '''set -o pipefail; docker run -i --rm --name="$BUILD_TAG-gitflow-sn" -e GIT_BRANCH="$BRANCH_NAME" -e GIT_NAME="$GIT_NAME" eeacms/gitflow /checkSonarqubemaster.sh | grep -v "Found script" | tee checkresult.txt''' - } - - publishChecks name: 'SonarQube', title: 'Sonarqube Code Quality Check', summary: "Quality check on the SonarQube metrics from branch develop, comparing it with the ones from master branch. No bugs are allowed", - text: readFile(file: 'checkresult.txt'), conclusion: "${currentBuild.currentResult}", - detailsURL: "${env.BUILD_URL}display/redirect" + script { + sh '''echo "Error" > checkresult.txt''' + catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') { + sh '''set -o pipefail; docker run -i --rm --pull always --name="$IMAGE_NAME-gitflow-sn" -e GIT_BRANCH="$BRANCH_NAME" -e GIT_NAME="$GIT_NAME" eeacms/gitflow /checkSonarqubemaster.sh | grep -v "Found script" | tee checkresult.txt''' } + + publishChecks name: 'SonarQube', title: 'Sonarqube Code Quality Check', summary: 'Quality check on the SonarQube metrics from branch develop, comparing it with the ones from master branch. No bugs are allowed', + text: readFile(file: 'checkresult.txt'), conclusion: "${currentBuild.currentResult}", + detailsURL: "${env.BUILD_URL}display/redirect" } } } stage('Pull Request') { when { - allOf { - not { - environment name: 'CHANGE_ID', value: '' - } - environment name: 'CHANGE_TARGET', value: 'master' - not { changelog '.*^Automated release [0-9\\.]+$' } + not { + environment name: 'CHANGE_ID', value: '' } + environment name: 'CHANGE_TARGET', value: 'master' } steps { - node(label: 'docker') { - script { - if ( env.CHANGE_BRANCH != "develop" ) { - error "Pipeline aborted due to PR not made from develop branch" - } - withCredentials([string(credentialsId: 'eea-jenkins-token', variable: 'GITHUB_TOKEN')]) { - sh '''docker pull eeacms/gitflow''' - sh '''docker run -i --rm --name="$BUILD_TAG-gitflow-pr" -e GIT_CHANGE_TARGET="$CHANGE_TARGET" -e GIT_CHANGE_BRANCH="$CHANGE_BRANCH" -e GIT_CHANGE_AUTHOR="$CHANGE_AUTHOR" -e GIT_CHANGE_TITLE="$CHANGE_TITLE" -e GIT_TOKEN="$GITHUB_TOKEN" -e GIT_BRANCH="$BRANCH_NAME" -e GIT_CHANGE_ID="$CHANGE_ID" -e GIT_ORG="$GIT_ORG" -e GIT_NAME="$GIT_NAME" -e LANGUAGE=javascript eeacms/gitflow''' - } + script { + if (env.CHANGE_BRANCH != 'develop') { + error 'Pipeline aborted due to PR not made from develop branch' + } + withCredentials([string(credentialsId: 'eea-jenkins-token', variable: 'GITHUB_TOKEN')]) { + sh '''docker run --pull always -i --rm --name="$IMAGE_NAME-gitflow-pr" -e GIT_CHANGE_TARGET="$CHANGE_TARGET" -e GIT_CHANGE_BRANCH="$CHANGE_BRANCH" -e GIT_CHANGE_AUTHOR="$CHANGE_AUTHOR" -e GIT_CHANGE_TITLE="$CHANGE_TITLE" -e GIT_TOKEN="$GITHUB_TOKEN" -e GIT_BRANCH="$BRANCH_NAME" -e GIT_CHANGE_ID="$CHANGE_ID" -e GIT_ORG="$GIT_ORG" -e GIT_NAME="$GIT_NAME" -e LANGUAGE=javascript eeacms/gitflow''' } } } } - } post { diff --git a/Makefile b/Makefile index f3614a8d..a76622d6 100644 --- a/Makefile +++ b/Makefile @@ -50,6 +50,11 @@ VOLTO_VERSION?=16 ADDON_PATH="${DIR}" ADDON_NAME="@eeacms/${ADDON_PATH}" DOCKER_COMPOSE=PLONE_VERSION=${PLONE_VERSION} VOLTO_VERSION=${VOLTO_VERSION} ADDON_NAME=${ADDON_NAME} ADDON_PATH=${ADDON_PATH} docker compose +RAZZLE_INTERNAL_API_PATH?=http://localhost:8080/Plone +RAZZLE_DEV_PROXY_API_PATH?="${RAZZLE_INTERNAL_API_PATH}" +CYPRESS_API_PATH="${RAZZLE_DEV_PROXY_API_PATH}" + + # Top-level targets .PHONY: all @@ -77,11 +82,11 @@ shell: ## Start a shell in the frontend container .PHONY: cypress-open cypress-open: ## Open cypress integration tests - NODE_ENV=development $(NODE_MODULES)/cypress/bin/cypress open + CYPRESS_API_PATH="${RAZZLE_DEV_PROXY_API_PATH}" NODE_ENV=development $(NODE_MODULES)/cypress/bin/cypress open .PHONY: cypress-run cypress-run: ## Run cypress integration tests - NODE_ENV=development $(NODE_MODULES)/cypress/bin/cypress run + CYPRESS_API_PATH="${RAZZLE_DEV_PROXY_API_PATH}" NODE_ENV=development $(NODE_MODULES)/cypress/bin/cypress run --browser chromium .PHONY: test test: ## Run jest tests @@ -129,3 +134,31 @@ i18n: ## i18n help: ## Show this help. @echo -e "$$(grep -hE '^\S+:.*##' $(MAKEFILE_LIST) | sed -e 's/:.*##\s*/:/' -e 's/^\(.\+\):\(.*\)/\\x1b[36m\1\\x1b[m:\2/' | column -c2 -t -s :)" head -n 14 Makefile + +.PHONY: ci-fix +ci-fix: + echo "Running lint-fix" + make lint-fix + echo "Running prettier-fix" + make prettier-fix + echo "Running stylelint-fix" + make stylelint-fix + +.PHONY: test-ci +test-ci: + cd /app + RAZZLE_JEST_CONFIG=src/addons/${ADDON_PATH}/jest-addon.config.js CI=true yarn test src/addons/${ADDON_PATH}/src --watchAll=false --reporters=default --reporters=jest-junit --collectCoverage --coverageReporters lcov cobertura text + +.PHONY: start-ci +start-ci: + cd ../.. + yarn start & + +.PHONY: cypress-ci +cypress-ci: + cp .coverage.babel.config.js /app/babel.config.js + make start-ci + $(NODE_MODULES)/.bin/wait-on -t 240000 http://localhost:3000 + NODE_ENV=development make cypress-run + + diff --git a/README.md b/README.md index da18516a..e32b2f1a 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,10 @@ The [eea.kitkat](https://github.com/eea/eea.kitkat) Plone add-on is the backend ## Upgrade +### Upgrading to 20.x + +> This versions comes with `@eeacms/volto-tabs-block 17.x`. See this package [upgrade guide](https://github.com/eea/volto-tabs-block#upgrading-to-700) + ### Upgrading to 10.x > This version requires: `@plone/volto >= 16.0.0.alpha.45` (Sentry removed from Volto Core). diff --git a/cypress.config.js b/cypress.config.js index da8e7baf..34692091 100644 --- a/cypress.config.js +++ b/cypress.config.js @@ -5,7 +5,7 @@ module.exports = defineConfig({ defaultCommandTimeout: 8888, chromeWebSecurity: false, reporter: 'junit', - video: true, + video: false, retries: { runMode: 8, openMode: 0, diff --git a/cypress/e2e/01-block-tabs.cy.js b/cypress/e2e/01-block-tabs.cy.js index 542e548d..1a92d48f 100644 --- a/cypress/e2e/01-block-tabs.cy.js +++ b/cypress/e2e/01-block-tabs.cy.js @@ -27,7 +27,7 @@ describe('Blocks Tests', () => { .click({ force: true }); cy.get('.field-wrapper-title input').last().type('Tab 1'); - cy.get('.field-wrapper-template #field-template').click(); + cy.get('.field-wrapper-variation #field-variation').click(); cy.get('.react-select__menu').contains('Default').click(); cy.get('.field-wrapper-verticalAlign #field-verticalAlign').click(); cy.get('.react-select__menu').contains('Middle').click(); @@ -49,7 +49,7 @@ describe('Blocks Tests', () => { .contains('Tabs') .click({ force: true }); - cy.get('.field-wrapper-template #field-template').click(); + cy.get('.field-wrapper-variation #field-variation').click(); cy.get('.react-select__menu').contains('Carousel horizontal').click(); cy.get('.field-wrapper-verticalAlign #field-verticalAlign').click(); cy.get('.react-select__menu').contains('Bottom').click(); diff --git a/package.json b/package.json index c1e58301..2d0d41a2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@eeacms/volto-eea-kitkat", - "version": "19.1.0", + "version": "20.0.0", "description": "@eeacms/volto-eea-kitkat: Volto Add-ons bundle - A known good set of Volto addons to be used within all EEA projects and beyond", "main": "src/index.js", "author": "European Environment Agency: IDM2 A-Team", @@ -63,76 +63,76 @@ "@eeacms/volto-accordion-block": "10.4.3", "@eeacms/volto-anchors": "0.4.2", "@eeacms/volto-banner": "3.1.4", - "@eeacms/volto-block-divider": "6.1.4", - "@eeacms/volto-block-image-cards": "1.3.4", - "@eeacms/volto-block-style": "5.2.5", - "@eeacms/volto-call-to-action-block": "4.2.1", - "@eeacms/volto-columns-block": "6.3.5", - "@eeacms/volto-corsproxy": "3.1.4", - "@eeacms/volto-description-block": "1.2.3", - "@eeacms/volto-group-block": "6.3.3", - "@eeacms/volto-hero-block": "5.4.3", - "@eeacms/volto-listing-block": "6.0.1", + "@eeacms/volto-block-divider": "6.1.5", + "@eeacms/volto-block-image-cards": "1.3.5", + "@eeacms/volto-block-style": "5.2.6", + "@eeacms/volto-call-to-action-block": "4.2.2", + "@eeacms/volto-columns-block": "6.4.0", + "@eeacms/volto-corsproxy": "3.1.5", + "@eeacms/volto-description-block": "1.2.4", + "@eeacms/volto-group-block": "6.3.4", + "@eeacms/volto-hero-block": "5.4.5", + "@eeacms/volto-listing-block": "6.0.2", "@eeacms/volto-matomo": "4.2.1", - "@eeacms/volto-metadata-block": "6.0.2", - "@eeacms/volto-nextcloud-video-block": "0.4.7", - "@eeacms/volto-object-widget": "5.1.4", + "@eeacms/volto-metadata-block": "6.0.3", + "@eeacms/volto-nextcloud-video-block": "0.4.8", + "@eeacms/volto-object-widget": "5.1.5", "@eeacms/volto-quote-block": "1.2.3", "@eeacms/volto-resize-helper": "1.3.4", "@eeacms/volto-sentry-rancher-config": "4.0.0", - "@eeacms/volto-slate-footnote": "6.1.7", - "@eeacms/volto-slate-label": "0.5.7", - "@eeacms/volto-slate-metadata-mentions": "7.0.1", + "@eeacms/volto-slate-footnote": "6.1.8", + "@eeacms/volto-slate-label": "0.5.8", + "@eeacms/volto-slate-metadata-mentions": "7.0.2", "@eeacms/volto-slate-zotero": "5.2.5", "@eeacms/volto-statistic-block": "4.0.2", - "@eeacms/volto-tabs-block": "6.0.2", - "@eeacms/volto-tags-block": "1.2.3", + "@eeacms/volto-tabs-block": "7.0.0", + "@eeacms/volto-tags-block": "1.2.4", "@eeacms/volto-taxonomy": "4.1.1", - "@eeacms/volto-timeline-block": "1.1.4", - "@eeacms/volto-widget-dataprovenance": "0.4.2", - "@eeacms/volto-widget-geolocation": "5.1.5", - "@eeacms/volto-widget-temporal-coverage": "5.1.4", - "@eeacms/volto-widget-theme-picker": "1.1.4", + "@eeacms/volto-timeline-block": "1.1.5", + "@eeacms/volto-widget-dataprovenance": "0.4.3", + "@eeacms/volto-widget-geolocation": "5.1.6", + "@eeacms/volto-widget-temporal-coverage": "5.1.5", + "@eeacms/volto-widget-theme-picker": "1.1.5", "@eeacms/volto-widget-toggle": "3.1.4", "@kitconcept/volto-blocks-grid": "7.0.2", "@plone-collective/volto-sentry": "0.3.1" }, "resolutions": { - "@eeacms/volto-nextcloud-video-block": "0.4.7", + "@eeacms/volto-nextcloud-video-block": "0.4.8", "@eeacms/volto-anchors": "0.4.2", "@eeacms/volto-quote-block": "1.2.3", "@eeacms/volto-statistic-block": "4.0.2", - "@eeacms/volto-tags-block": "1.2.3", - "@eeacms/volto-call-to-action-block": "4.2.1", - "@eeacms/volto-hero-block": "5.4.3", - "@eeacms/volto-timeline-block": "1.1.4", - "@eeacms/volto-description-block": "1.2.3", - "@eeacms/volto-slate-label": "0.5.7", + "@eeacms/volto-tags-block": "1.2.4", + "@eeacms/volto-call-to-action-block": "4.2.2", + "@eeacms/volto-hero-block": "5.4.5", + "@eeacms/volto-timeline-block": "1.1.5", + "@eeacms/volto-description-block": "1.2.4", + "@eeacms/volto-slate-label": "0.5.8", "@plone-collective/volto-sentry": "0.3.1", "@eeacms/volto-accordion-block": "10.4.3", "@eeacms/volto-banner": "3.1.4", - "@eeacms/volto-block-divider": "6.1.4", - "@eeacms/volto-block-image-cards": "1.3.4", - "@eeacms/volto-block-style": "5.2.5", - "@eeacms/volto-columns-block": "6.3.5", - "@eeacms/volto-corsproxy": "3.1.4", - "@eeacms/volto-group-block": "6.3.3", - "@eeacms/volto-listing-block": "6.0.1", + "@eeacms/volto-block-divider": "6.1.5", + "@eeacms/volto-block-image-cards": "1.3.5", + "@eeacms/volto-block-style": "5.2.6", + "@eeacms/volto-columns-block": "6.4.0", + "@eeacms/volto-corsproxy": "3.1.5", + "@eeacms/volto-group-block": "6.3.4", + "@eeacms/volto-listing-block": "6.0.2", "@eeacms/volto-matomo": "4.2.1", - "@eeacms/volto-metadata-block": "6.0.2", - "@eeacms/volto-object-widget": "5.1.4", + "@eeacms/volto-metadata-block": "6.0.3", + "@eeacms/volto-object-widget": "5.1.5", "@eeacms/volto-resize-helper": "1.3.4", "@eeacms/volto-sentry-rancher-config": "4.0.0", - "@eeacms/volto-slate-footnote": "6.1.7", - "@eeacms/volto-slate-metadata-mentions": "7.0.1", + "@eeacms/volto-slate-footnote": "6.1.8", + "@eeacms/volto-slate-metadata-mentions": "7.0.2", "@eeacms/volto-slate-zotero": "5.2.5", - "@eeacms/volto-tabs-block": "6.0.2", + "@eeacms/volto-tabs-block": "7.0.0", "@eeacms/volto-taxonomy": "4.1.1", - "@eeacms/volto-widget-geolocation": "5.1.5", - "@eeacms/volto-widget-dataprovenance": "0.4.2", - "@eeacms/volto-widget-temporal-coverage": "5.1.4", + "@eeacms/volto-widget-geolocation": "5.1.6", + "@eeacms/volto-widget-dataprovenance": "0.4.3", + "@eeacms/volto-widget-temporal-coverage": "5.1.5", "@eeacms/volto-widget-toggle": "3.1.4", - "@eeacms/volto-widget-theme-picker": "1.1.4", + "@eeacms/volto-widget-theme-picker": "1.1.5", "@eeacms/countup": "2.0.6" }, "devDependencies": {