name: CI on: workflow_dispatch: push: branches-ignore: - dependabot/** tags: - v[0-9]+\.[0-9]+\.[0-9]+ pull_request: concurrency: group: ${{ github.workflow }}-${{ github.repository }}/${{ github.ref }} cancel-in-progress: true env: JAVA_VERSION: 17 NODE_VERSION: 16.14.2 ARTIFACTS_CYPRESS_TESTS_NAME: cypress-tests ARTIFACTS_CYPRESS_TESTS_PATH: web/cypress ARTIFACTS_KADAI_JARS_NAME: kadai-jars ARTIFACTS_KADAI_JARS_PATH: ~/.m2/repository/io/kadai ARTIFACTS_KADAI_WEB_NAME: kadai-web ARTIFACTS_KADAI_WEB_PATH: web/dist ARTIFACTS_JACOCO_REPORTS_NAME: jacoco-reports ARTIFACTS_JACOCO_REPORTS_PATH: "**/jacoco.exec" CACHE_WEB_NAME: web # IMPORTANT: this cannot start with CACHE_MAVEN_NAME's value # because the 'compile_backend' job would otherwise use this as a fallback cache. CACHE_MAVEN_FOR_WEB_NAME: mvn-for-web CACHE_MAVEN_NAME: maven CACHE_SONAR_NAME: sonar jobs: compile_backend: name: Compile all maven modules runs-on: ubuntu-20.04 steps: - name: Git checkout uses: actions/checkout@v4 - name: Set up JDK ${{ env.JAVA_VERSION }} uses: actions/setup-java@v4 with: distribution: adopt java-version: ${{ env.JAVA_VERSION }} - name: Cache maven dependencies id: cache uses: actions/cache@v4 with: path: ~/.m2 key: ${{ runner.os }}-${{ env.CACHE_MAVEN_NAME }}-${{ hashFiles('**/pom.xml') }} restore-keys: ${{ runner.os }}-${{ env.CACHE_MAVEN_NAME }} - name: Change versions to match tag run: ci/change_version.sh -m . - name: Compile & build run: ./mvnw -B install -DskipTests -Djacoco.skip - name: Populate cache if: steps.cache.outputs.cache-hit != 'true' run: | ./mvnw -B dependency:go-offline ./mvnw -B test -Dtest=GibtEsNet -Dsurefire.failIfNoSpecifiedTests=false - name: Upload kadai artifacts uses: actions/upload-artifact@v4 with: name: ${{ env.ARTIFACTS_KADAI_JARS_NAME }} path: ${{ env.ARTIFACTS_KADAI_JARS_PATH }} if-no-files-found: error - name: Remove kadai artifacts from cache run: rm -rf ${{ env.ARTIFACTS_KADAI_JARS_PATH }} - name: Cancel workflow if: failure() uses: andymckay/cancel-action@0.5 compile_frontend: name: Compile kadai-web runs-on: ubuntu-20.04 steps: - name: Git checkout uses: actions/checkout@v4 - name: Set up JDK ${{ env.JAVA_VERSION }} uses: actions/setup-java@v4 with: distribution: adopt java-version: ${{ env.JAVA_VERSION }} - name: Use Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@v4.0.3 with: node-version: ${{ env.NODE_VERSION }} - name: Cache web dependencies id: web-cache uses: actions/cache@v4 with: path: web/node_modules key: ${{ runner.OS }}-${{ env.CACHE_WEB_NAME }}-${{ hashFiles('**/yarn.lock') }} - name: Cache maven dependencies (for web) id: maven-cache uses: actions/cache@v4 with: path: ~/.m2 key: ${{ runner.OS }}-${{ env.CACHE_MAVEN_FOR_WEB_NAME }}-${{ hashFiles('**/pom.xml') }} restore-keys: ${{ runner.OS }}-${{ env.CACHE_MAVEN_FOR_WEB_NAME }} - name: Populate maven cache run: ./mvnw -B dependency:go-offline -pl :kadai-web -am if: steps.maven-cache.outputs.cache-hit != 'true' - name: Install Dependencies if: steps.web-cache.outputs.cache-hit != 'true' working-directory: web run: yarn ci - name: Compile & build working-directory: web run: | yarn lint yarn build:prod - name: Build maven artifact run: ./mvnw -B install -pl :kadai-web -am - name: Upload kadai-web dist artifact uses: actions/upload-artifact@v4 with: name: ${{ env.ARTIFACTS_KADAI_WEB_NAME }} path: ${{ env.ARTIFACTS_KADAI_WEB_PATH }} if-no-files-found: error - name: Remove kadai artifacts from cache run: rm -rf ~/.m2/repository/io/kadai - name: Cancel workflow if: failure() uses: andymckay/cancel-action@0.5 test_frontend: runs-on: ubuntu-20.04 name: Test kadai-web needs: [ compile_frontend ] steps: - name: Git checkout uses: actions/checkout@v4 - name: Use Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@v4.0.3 with: node-version: ${{ env.NODE_VERSION }} - name: Cache web dependencies id: web-cache uses: actions/cache@v4 with: path: web/node_modules key: ${{ runner.OS }}-${{ env.CACHE_WEB_NAME }}-${{ hashFiles('**/yarn.lock') }} # Theoretically this step below not necessary because we reuse the cache from the 'compile_frontend' job. # Sometimes the cache is not created, therefore this is a fallback. - name: Install Dependencies if: steps.web-cache.outputs.cache-hit != 'true' working-directory: web run: yarn ci - name: Cache maven dependencies (for web) id: maven-cache uses: actions/cache@v4 with: path: ~/.m2 key: ${{ runner.OS }}-${{ env.CACHE_MAVEN_FOR_WEB_NAME }}-${{ hashFiles('**/pom.xml') }} restore-keys: ${{ runner.OS }}-${{ env.CACHE_MAVEN_FOR_WEB_NAME }} # Theoretically this step below not necessary because we reuse the cache from the 'compile_frontend' job. # Sometimes the cache is not created, therefore this is a fallback. - name: Populate cache run: ./mvnw -B dependency:go-offline -pl :kadai-web -am if: steps.maven-cache.outputs.cache-hit != 'true' - name: Test working-directory: web run: yarn run test -- --coverageReporters text-summary - name: Cancel workflow if: failure() uses: andymckay/cancel-action@0.5 test_e2e: runs-on: ubuntu-20.04 name: Test E2E needs: [ compile_frontend, compile_backend ] steps: - name: Git checkout uses: actions/checkout@v4 - name: Set up JDK ${{ env.JAVA_VERSION }} uses: actions/setup-java@v4 with: distribution: adopt java-version: ${{ env.JAVA_VERSION }} - name: Use Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@v4.0.3 with: node-version: ${{ env.NODE_VERSION }} - name: Cache web dependencies id: web-cache uses: actions/cache@v4 with: path: web/node_modules key: ${{ runner.OS }}-${{ env.CACHE_WEB_NAME }}-${{ hashFiles('**/yarn.lock') }} # Theoretically this step below not necessary because we reuse the cache from the 'compile_frontend' job. # Sometimes the cache is not created, therefore this is a fallback. - name: Install Dependencies if: steps.web-cache.outputs.cache-hit != 'true' working-directory: web run: yarn ci - name: Cache maven dependencies id: maven-cache uses: actions/cache@v4 with: path: ~/.m2 key: ${{ runner.os }}-${{ env.CACHE_MAVEN_NAME }}-${{ hashFiles('**/pom.xml') }} - name: Download kadai artifacts uses: actions/download-artifact@v4 with: name: ${{ env.ARTIFACTS_KADAI_JARS_NAME }} path: ${{ env.ARTIFACTS_KADAI_JARS_PATH }} - name: Change versions to match tag run: ci/change_version.sh -m . # Theoretically this step below not necessary because we reuse the cache from the 'compile_frontend' job. # Sometimes the cache is not created, therefore this is a fallback. - name: Populate cache run: ./mvnw -B dependency:go-offline -pl :kadai-rest-spring-example-boot -am if: steps.maven-cache.outputs.cache-hit != 'true' - name: Download kadai-web dist artifact uses: actions/download-artifact@v4 with: name: ${{ env.ARTIFACTS_KADAI_WEB_NAME }} path: ${{ env.ARTIFACTS_KADAI_WEB_PATH }} - name: Build frontend run: ./mvnw install -pl :kadai-web - name: Cypress tests working-directory: web run: | ../mvnw -B spring-boot:run -P history.plugin -f .. -pl :kadai-rest-spring-example-boot &> /dev/null & npx wait-port -t 30000 localhost:8080 && yarn run e2e-standalone --spec "cypress/integration/monitor/**" - name: Upload Cypress tests if: failure() uses: actions/upload-artifact@v4 with: name: ${{ env.ARTIFACTS_CYPRESS_TESTS_NAME }} path: ${{ env.ARTIFACTS_CYPRESS_TESTS_PATH }} - name: Cancel workflow if: failure() uses: andymckay/cancel-action@0.5 test_backend: runs-on: ubuntu-20.04 name: Test ${{ matrix.module }} on ${{ matrix.database }} needs: [ compile_backend ] strategy: matrix: module: - kadai-common - kadai-common-security - kadai-common-data - kadai-common-logging - kadai-common-test - kadai-core - kadai-core-test - kadai-cdi - kadai-cdi-example - kadai-test-api - kadai-spring - kadai-spring-example - kadai-spi-routing-dmn-router - kadai-routing-rest - kadai-rest-spring - kadai-rest-spring-test-lib - kadai-rest-spring-example-common - kadai-loghistory-provider - kadai-simplehistory-provider - kadai-simplehistory-rest-spring database: - H2 include: - module: kadai-core database: POSTGRES - module: kadai-core database: DB2 - module: kadai-core database: ORACLE - module: kadai-core-test database: POSTGRES - module: kadai-core-test database: DB2 - module: kadai-core-test database: ORACLE - module: kadai-test-api database: POSTGRES - module: kadai-test-api database: DB2 - module: kadai-test-api database: ORACLE - module: kadai-simplehistory-provider database: DB2 - module: kadai-simplehistory-provider database: POSTGRES - module: kadai-simplehistory-provider database: ORACLE - module: kadai-rest-spring-example-boot database: DB2 - module: kadai-rest-spring-example-boot database: ORACLE - module: kadai-rest-spring-example-wildfly database: POSTGRES steps: - name: Git checkout uses: actions/checkout@v4 - name: Set up JDK ${{ env.JAVA_VERSION }} uses: actions/setup-java@v4 with: distribution: adopt java-version: ${{ env.JAVA_VERSION }} - name: Cache maven dependencies uses: actions/cache@v4 with: path: ~/.m2 key: ${{ runner.os }}-${{ env.CACHE_MAVEN_NAME }}-${{ hashFiles('**/pom.xml') }} restore-keys: ${{ runner.os }}-${{ env.CACHE_MAVEN_NAME }} - name: Download kadai artifacts uses: actions/download-artifact@v4 with: name: ${{ env.ARTIFACTS_KADAI_JARS_NAME }} path: ${{ env.ARTIFACTS_KADAI_JARS_PATH }} - name: Change versions to match tag run: | ci/change_version.sh -m . ci/update_kadai_dependency_for_wildfly.sh - name: Test run: ./mvnw -B verify -pl :${{matrix.module}} -Dcheckstyle.skip env: DB: ${{ matrix.database }} - name: Upload JaCoCo Report if: matrix.database == 'H2' uses: actions/upload-artifact@v4 with: name: ${{ env.ARTIFACTS_JACOCO_REPORTS_NAME }}-${{ matrix.module }} path: ${{ env.ARTIFACTS_JACOCO_REPORTS_PATH }} if-no-files-found: ignore - name: Cancel workflow if: failure() uses: andymckay/cancel-action@0.5 deploy_to_azure: runs-on: ubuntu-20.04 name: Deploy demo app to Microsoft Azure if: github.repository == 'kadai-io/kadai' && github.ref == 'refs/heads/master' && github.head_ref == '' needs: [ test_frontend, test_e2e, test_backend ] steps: - name: Git checkout uses: actions/checkout@v4 - name: Set up JDK ${{ env.JAVA_VERSION }} uses: actions/setup-java@v4 with: distribution: adopt java-version: ${{ env.JAVA_VERSION }} - name: Cache maven dependencies uses: actions/cache@v4 with: path: ~/.m2 key: ${{ runner.os }}-${{ env.CACHE_MAVEN_NAME }}-${{ hashFiles('**/pom.xml') }} restore-keys: ${{ runner.os }}-${{ env.CACHE_MAVEN_NAME }} - name: Download kadai artifacts uses: actions/download-artifact@v4 with: name: ${{ env.ARTIFACTS_KADAI_JARS_NAME }} path: ${{ env.ARTIFACTS_KADAI_JARS_PATH }} - name: Download kadai-web dist artifact uses: actions/download-artifact@v4 with: name: ${{ env.ARTIFACTS_KADAI_WEB_NAME }} path: ${{ env.ARTIFACTS_KADAI_WEB_PATH }} - name: Build kadai-web run: ./mvnw -B install -pl :kadai-web - name: Generate Javadoc run: ./mvnw -B clean javadoc:jar -pl :kadai-core,:kadai-cdi,:kadai-spring - name: Build Example Application run: ./mvnw -B install -P history.plugin -pl :kadai-rest-spring-example-boot -DskipTests -Dcheckstyle.skip -Dmaven.javadoc.skip -Djacoco.skip - name: Verify Example Application contains documentation run: ci/verify_docs_jar.sh - name: Login to Microsoft Azure uses: Azure/login@v2 with: creds: '{"clientId":"${{ secrets.CLIENT_ID }}","clientSecret":"${{ secrets.CLIENT_SECRET }}","subscriptionId":"${{ secrets.SUBSCRIPTION_ID }}","tenantId":"${{ secrets.TENANT_ID }}"}' - name: Deploy to Microsoft Azure uses: Azure/webapps-deploy@v2 with: app-name: kadaiio package: rest/kadai-rest-spring-example-boot/target/kadai-rest-spring-example-boot.jar - name: Wait for Azure for 60 seconds uses: jakejarvis/wait-action@master with: time: '60s' - name: Smoke test documentation run: ci/verify_docs_alive.sh - name: Cancel workflow if: failure() uses: andymckay/cancel-action@0.5