name: "E2e test on main branch push" # These jobs can be tested with nektos/act tool # https://github.com/nektos/act # # Look for "!env.ACT" in the DRY_RUN expression below on: push: branches: - '202[2-9].[39].x' env: BUILD_OS: linux BUILD_ARCH: amd64 GO_VERSION: 1.19 GOFLAGS: -mod=readonly NODE_VERSION: 16 CYPRESS_VERSION: 13.5.0 CYPRESS_HOST: http://localhost:8888 CYPRESS_BASE_URL: http://localhost:8888 CYPRESS_ADMIN_URL: http://localhost:8080 CYPRESS_COMPOSE_URL: http://localhost:8081 CYPRESS_WORKFLOW_URL: http://localhost:8082 CYPRESS_REPORTER_URL: http://localhost:8083 CYPRESS_ONE_URL: http://localhost:8086 CYPRESS_PRIVACY_URL: http://localhost:8087 CYPRESS_USER_EMAIL: cypress@test.com CYPRESS_USER_PASSWORD: cypress123 CYPRESS_USER_PASSWORD_NEW: newcypress123 CYPRESS_USER_EMAIL_NEW: permissions@email.com CYPRESS_USER_DPO: dpo@email.com CYPRESS_USER_DPO_PASSWORD: dpo@email.com CYPRESS_PROVISION_DB_DSN: postgres://corteza:root@localhost:5432/corteza_cy_test?sslmode=disable jobs: server-client-setup: name: server and client test strategy: matrix: client: - { port: 8080, name: admin } # todo - these tests must first be provisioned in order to work, # only admin for now # - { port: 8080, name: server } # - { port: 8081, name: compose } # - { port: 8082, name: workflow } # - { port: 8083, name: reporter } # - { port: 8086, name: one } # - { port: 8087, name: privacy } runs-on: ubuntu-20.04 steps: - name: Setup environment env: RELEASE_CRUST_SFTP_KEY: ${{ secrets.RELEASE_CRUST_SFTP_KEY }} RELEASE_CRUST_SFTP_URI: ${{ secrets.RELEASE_CRUST_SFTP_URI }} CLIENT_NAME: ${{ matrix.client.name }} run: | echo "SCREENSHOTS_GEN_FOLDER=$(date +"%Y%m%d%H%M%S")_$CLIENT_NAME" >> $GITHUB_ENV && \ echo "TMP_KEY=$(mktemp)" >> $GITHUB_ENV echo $SCREENSHOTS_GEN_FOLDER - name: Create crust key env: RELEASE_CRUST_SFTP_KEY: ${{ secrets.RELEASE_CRUST_SFTP_KEY }} RELEASE_CRUST_KEY_FILE: ${{ env.TMP_KEY }} run: | echo ${RELEASE_CRUST_SFTP_KEY} | base64 -d > ${RELEASE_CRUST_KEY_FILE} && \ echo ${RELEASE_CRUST_SFTP_KEY} > /tmp/foo - name: Make folder for uploaded screenshots env: RELEASE_CRUST_SFTP_URI: ${{ secrets.RELEASE_CRUST_SFTP_URI }} RELEASE_CRUST_KEY_FILE: ${{ env.TMP_KEY }} SCREENSHOTS_GEN_FOLDER: ${{ env.SCREENSHOTS_GEN_FOLDER }} run: | printf '%s\n' 'cd screenshots' "mkdir ${SCREENSHOTS_GEN_FOLDER}" | sftp -o "StrictHostKeyChecking no" -i ${RELEASE_CRUST_KEY_FILE} ${RELEASE_CRUST_SFTP_URI} - uses: actions/setup-node@v3 with: { node-version: "${{ env.NODE_VERSION }}" } - uses: actions/setup-go@v3 with: { go-version: "${{ env.GO_VERSION }}" } - name: Setup YARN run: npm install -g yarn @vue/cli-service - name: Checkout corteza repo uses: actions/checkout@v3 with: path: corteza token: ${{ secrets.GITHUB_TOKEN }} ref: ${{ github.ref_name }} - name: Clone CY repo uses: actions/checkout@v3 with: repository: cortezaproject/corteza-e2e-cypress token: ${{ secrets.GITHUB_TOKEN }} ref: ${{ github.ref_name }} path: corteza-e2e-cypress - name: Cache lib dependencies uses: actions/cache@v3 with: path: | corteza/lib/vue/node_modules corteza/lib/js/node_modules key: ${{ runner.os }}-modules-${{ hashFiles('corteza/lib/vue/yarn.lock', 'corteza/lib/js/yarn.lock') }} - name: Copy server language files working-directory: corteza/server/pkg/locale run: make src/en - name: Copy assets working-directory: corteza env: CLIENT_NAME: ${{ matrix.client.name }} run: | mv ./.github/workflows/assets/docker-compose.yaml ./ cp .github/workflows/assets/client/vue.config-builder.js client/web/${CLIENT_NAME}/public/vue.config-builder.js cp .github/workflows/assets/client/config.js client/web/${CLIENT_NAME}/public/config.js docker-compose config > /tmp/docker-compose.corteza.yaml cd ../corteza-e2e-cypress && docker-compose config > /tmp/docker-compose.corteza-e2e.yaml - name: Cache Docker images uses: ScribeMD/docker-cache@0.3.7 with: key: docker-${{ runner.os }}-${{ hashFiles('/tmp/docker-compose.corteza.yaml', '/tmp/docker-compose.corteza-e2e.yaml') }} - name: Run server and db working-directory: corteza run: | docker-compose run -d --name backend backend docker-compose run -d --name postgres postgres - name: Build js working-directory: corteza/lib/js run: | yarn install yarn build - name: Build vue working-directory: corteza/lib/vue run: | yarn install yarn build - name: Run ${{ matrix.client.name }} working-directory: corteza # re-link the packages for each app env: CLIENT_NAME: ${{ matrix.client.name }} CLIENT_PORT: ${{ matrix.client.port }} run: | docker-compose \ run -d \ --name "${CLIENT_NAME}" \ --use-aliases \ client \ sh -c "ls && cd /corteza/lib/js && yarn link && \ cd /corteza/lib/vue && yarn link && \ cd /corteza/client/web/${CLIENT_NAME} && \ yarn link @cortezaproject/corteza-vue && \ yarn link @cortezaproject/corteza-js && \ yarn install && \ yarn serve --port ${CLIENT_PORT}" # github actions do not support docker-compose --wait - name: Wait for postgres healthcheck run: timeout 180s sh -c 'until docker ps | grep postgres | grep -q healthy; do echo "Waiting for container to be healthy..."; sleep 1; done' - name: Wait for ${{ matrix.client.name }} healthcheck env: CLIENT_NAME: ${{ matrix.client.name }} run: | timeout 180s sh -c 'until docker ps | grep ${CLIENT_NAME} | grep -q healthy; do echo "Waiting for container to be healthy..."; sleep 1; done' - name: Wait for backend healthcheck run: timeout 180s sh -c 'until docker ps | grep backend | grep -q healthy; do echo "Waiting for container to be healthy..."; sleep 1; done' - name: Run CY tests for ${{ matrix.client.name }} env: CLIENT_NAME: ${{ matrix.client.name }} CLIENT_PORT: ${{ matrix.client.port }} working-directory: corteza-e2e-cypress run: | yarn install docker-compose run \ --entrypoint="bash -c \" \ cypress run --spec cypress/e2e/basic-functionalities/${CLIENT_NAME}/index.cy.js --browser chrome \ \"" \ cypress - name: Upload screenshots if: failure() env: RELEASE_CRUST_SFTP_URI: ${{ secrets.RELEASE_CRUST_SFTP_URI }} RELEASE_CRUST_KEY_FILE: ${{ env.TMP_KEY }} SCREENSHOTS_GEN_FOLDER: ${{ env.SCREENSHOTS_GEN_FOLDER }} run: | printf '%s\n' "cd screenshots/${SCREENSHOTS_GEN_FOLDER}" 'put -r corteza-e2e-cypress/cypress/screenshots/*' | sftp -q -o "StrictHostKeyChecking no" -i ${RELEASE_CRUST_KEY_FILE} ${RELEASE_CRUST_SFTP_URI} - name: Publish results # always() runs the step even when canceled manually if: success() || failure() working-directory: corteza-e2e-cypress env: RELEASE_CRUST_SFTP_URI: ${{ secrets.RELEASE_CRUST_SFTP_URI }} RELEASE_CRUST_KEY_FILE: ${{ env.TMP_KEY }} run: | npx mochawesome-merge "cypress/reports/*.json" > cypress/report.json && \ npx marge -o cypress/reports-build -f index.html -i cypress/report.json && \ echo "put cypress/reports-build/index.html" | sftp -q -o "StrictHostKeyChecking no" -i ${RELEASE_CRUST_KEY_FILE} ${RELEASE_CRUST_SFTP_URI} notify-failure: needs: [ server-client-setup ] runs-on: ubuntu-20.04 if: failure() steps: - name: Send message on failed testing results uses: fadenb/matrix-chat-message@v0.0.6 env: E2E_REPORTS_USER: ${{ secrets.E2E_REPORTS_USER }} E2E_REPORTS_PASS: ${{ secrets.E2E_REPORTS_PASS }} SCREENSHOTS_GEN_FOLDER: ${{ env.SCREENSHOTS_GEN_FOLDER }} with: homeserver: ${{ secrets.MATRIX_HOME_SERVER }} token: ${{ secrets.MATRIX_ACCESS_TOKEN }} channel: ${{ secrets.MATRIX_ROOM_ID }} message: | ❌ E2e tests did not pass, screenshots provided 🔗 https://${{ secrets.E2E_REPORTS_USER }}:${{ secrets.E2E_REPORTS_PASS }}@releases.cortezaproject.org/e2e-reports/ 📷 https://${{ secrets.E2E_REPORTS_USER }}:${{ secrets.E2E_REPORTS_PASS }}@releases.cortezaproject.org/e2e-reports/screenshots/${{ env.SCREENSHOTS_GEN_FOLDER }}/