From 8f355263e17424ccd799278a52422a86d175b857 Mon Sep 17 00:00:00 2001 From: Jialiang Liang <109499885+RyanL1997@users.noreply.github.com> Date: Mon, 18 Dec 2023 15:30:20 -0800 Subject: [PATCH] [CI/CD] Add E2E Cypress workflow for Dashboards Reporting (#262) * [CI/CD] Add E2E Cypress workflow for Dashboards Reporting Signed-off-by: Ryan Liang * Enable multiple try for bootstrap Signed-off-by: Ryan Liang * Add 3 times retry for osd bootstrap Signed-off-by: Ryan Liang * Correct the name of the job and title Signed-off-by: Ryan Liang --------- Signed-off-by: Ryan Liang --- .../workflows/cypress-e2e-reporting-test.yml | 180 ++++++++++++++++++ .gitignore | 5 +- cypress.config.js | 36 ++++ cypress.json | 17 -- 4 files changed, 220 insertions(+), 18 deletions(-) create mode 100644 .github/workflows/cypress-e2e-reporting-test.yml create mode 100644 cypress.config.js delete mode 100644 cypress.json diff --git a/.github/workflows/cypress-e2e-reporting-test.yml b/.github/workflows/cypress-e2e-reporting-test.yml new file mode 100644 index 00000000..28e7da81 --- /dev/null +++ b/.github/workflows/cypress-e2e-reporting-test.yml @@ -0,0 +1,180 @@ +name: Cypress E2E Dashboards Reporting Plugin Test + +on: [pull_request, push] + +env: + CI: 1 + # avoid warnings like "tput: No value for $TERM and no -T specified" + TERM: xterm + OPENSEARCH_DASHBOARDS_VERSION: 'main' + OPENSEARCH_VERSION: '3.0.0' + OPENSEARCH_PLUGIN_VERSION: '3.0.0.0' + PLUGIN_NAME: dashboards-reporting + +jobs: + tests: + name: Run Cypress E2E Dashboards Reporting Plugin Tests + strategy: + fail-fast: false + matrix: + os: [ ubuntu-latest ] + jdk: [ 11 ] + runs-on: ${{ matrix.os }} + + steps: + - name: Set up JDK + uses: actions/setup-java@v1 + with: + java-version: ${{ matrix.jdk }} + + - name: Download Job Scheduler artifact + uses: suisei-cn/actions-download-file@v1.4.0 + with: + url: https://aws.oss.sonatype.org/service/local/artifact/maven/redirect?r=snapshots&g=org.opensearch.plugin&a=opensearch-job-scheduler&v=${{ env.OPENSEARCH_PLUGIN_VERSION }}-SNAPSHOT&p=zip + target: plugin-artifacts/ + filename: job-scheduler.zip + + - name: Download Reports Scheduler artifact + uses: suisei-cn/actions-download-file@v1.4.0 + with: + url: https://aws.oss.sonatype.org/service/local/artifact/maven/redirect?r=snapshots&g=org.opensearch.plugin&a=opensearch-reports-scheduler&v=${{ env.OPENSEARCH_PLUGIN_VERSION }}-SNAPSHOT&p=zip + target: plugin-artifacts/ + filename: reports-scheduler.zip + + - name: Download OpenSearch + uses: peternied/download-file@v2 + with: + url: https://artifacts.opensearch.org/snapshots/core/opensearch/${{ env.OPENSEARCH_VERSION }}-SNAPSHOT/opensearch-min-${{ env.OPENSEARCH_VERSION }}-SNAPSHOT-linux-x64-latest.tar.gz + + - name: Extract OpenSearch + run: | + tar -xzf opensearch-*.tar.gz + rm -f opensearch-*.tar.gz + shell: bash + + - name: Install Job Scheduler + run: | + /bin/bash -c "yes | ./opensearch-${{ env.OPENSEARCH_VERSION }}-SNAPSHOT/bin/opensearch-plugin install file:$(pwd)/plugin-artifacts/job-scheduler.zip" + shell: bash + + - name: Install Reports Scheduler + run: | + /bin/bash -c "yes | ./opensearch-${{ env.OPENSEARCH_VERSION }}-SNAPSHOT/bin/opensearch-plugin install file:$(pwd)/plugin-artifacts/reports-scheduler.zip" + shell: bash + + - name: Run OpenSearch + run: | + /bin/bash -c "./opensearch-${{ env.OPENSEARCH_VERSION }}-SNAPSHOT/bin/opensearch &" + sleep 30 + shell: bash + + - name: Check OpenSearch Running on Linux + if: ${{ runner.os != 'Windows'}} + run: curl http://localhost:9200/ + shell: bash + + - name: Show OpenSearch Logs + if: always() + run: cat ./opensearch-${{ env.OPENSEARCH_VERSION }}-SNAPSHOT/logs/opensearch.log + shell: bash + + - name: Checkout OpenSearch Dashboards + uses: actions/checkout@v2 + with: + path: OpenSearch-Dashboards + repository: opensearch-project/OpenSearch-Dashboards + ref: ${{ env.OPENSEARCH_DASHBOARDS_VERSION }} + fetch-depth: 0 + filter: | + cypress + test + + - name: Checkout Dashboards Reporting Plugin in OpenSearch Dashboards Plugins Dir + uses: actions/checkout@v2 + with: + path: OpenSearch-Dashboards/plugins/${{ env.PLUGIN_NAME }} + + - id: tool-versions + run: | + echo "node_version=$(cat .node-version)" >> $GITHUB_OUTPUT + echo "yarn_version=$(jq -r '.engines.yarn' package.json)" >> $GITHUB_OUTPUT + working-directory: OpenSearch-Dashboards + shell: bash + + - uses: actions/setup-node@v1 + with: + node-version: ${{ steps.tool-versions.outputs.node_version }} + registry-url: 'https://registry.npmjs.org' + + - name: Setup Opensearch Dashboards + run: | + npm uninstall -g yarn + echo "Installing yarn ${{ steps.tool-versions.outputs.yarn_version }}" + npm i -g yarn@${{ steps.tool-versions.outputs.yarn_version }} + yarn cache clean + working-directory: OpenSearch-Dashboards + shell: bash + + - name: OpenSearch Dashboards Plugin Bootstrap + run: | + max_retries=3 + count=0 + until yarn osd bootstrap; do + exit_code=$? + count=$(($count + 1)) + echo "Attempt $count/$max_retries failed with exit code $exit_code, retrying..." + if [ $count -ge $max_retries ]; then + echo "Reached maximum retry attempts, stopping..." + exit $exit_code + fi + sleep 5 # Wait for 5 seconds before retrying + done + working-directory: OpenSearch-Dashboards + shell: bash + + - name: Run Opensearch Dashboards with Dashboards Reporting Plugin Installed + run: | + nohup yarn start --no-base-path --no-watch | tee dashboard.log & + working-directory: OpenSearch-Dashboards + + - name : Check If OpenSearch Dashboards Is Ready + if: ${{ runner.os == 'Linux' }} + run: | + if timeout 600 grep -q "bundles compiled successfully after" <(tail -n0 -f dashboard.log); then + echo "OpenSearch Dashboards compiled successfully." + else + echo "Timeout for 600 seconds reached. OpenSearch Dashboards did not finish compiling." + exit 1 + fi + working-directory: OpenSearch-Dashboards + + - name: Install Cypress + run: | + npx cypress install + shell: bash + working-directory: OpenSearch-Dashboards/plugins/${{ env.PLUGIN_NAME }} + + - name: Get Cypress version + id: cypress_version + run: | + echo "::set-output name=cypress_version::$(cat ./package.json | jq '.dependencies.cypress' | tr -d '"')" + working-directory: OpenSearch-Dashboards/plugins/${{ env.PLUGIN_NAME }} + + - name: Run Cypress tests + run: | + yarn cypress:run --browser chrome --headless --spec '.cypress/integration/*' + working-directory: OpenSearch-Dashboards/plugins/${{ env.PLUGIN_NAME }} + + - name: Capture failure screenshots + uses: actions/upload-artifact@v1 + if: failure() + with: + name: cypress-screenshots-${{ matrix.os }} + path: OpenSearch-Dashboards/plugins/${{ env.PLUGIN_NAME }}/.cypress/screenshots + + - name: Capture test video + uses: actions/upload-artifact@v1 + if: failure() + with: + name: cypress-videos-${{ matrix.os }} + path: OpenSearch-Dashboards/plugins/${{ env.PLUGIN_NAME }}/.cypress/videos diff --git a/.gitignore b/.gitignore index 0bebbcb8..2b2e4f50 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,7 @@ yarn-error.log .history/ .eslintcache package-lock.json -/target/ \ No newline at end of file +/target/ +.cypress/screenshots +.cypress/videos +.cypress/downloads diff --git a/cypress.config.js b/cypress.config.js new file mode 100644 index 00000000..dff98e5e --- /dev/null +++ b/cypress.config.js @@ -0,0 +1,36 @@ +const { defineConfig } = require('cypress'); + +module.exports = defineConfig({ + video: true, + chromeWebSecurity: true, + fixturesFolder: '.cypress/fixtures', + screenshotsFolder: '.cypress/screenshots', + videosFolder: '.cypress/videos', + downloadsFolder: '.cypress/downloads', + viewportWidth: 2000, + viewportHeight: 1320, + requestTimeout: 60000, + responseTimeout: 60000, + defaultCommandTimeout: 60000, + //experimentalNetworkStubbing: true, + //experimentalMemoryManagement: true, + numTestsKeptInMemory: 10, //Default value 50, chrome crashes without lowering + env: { + opensearch: 'localhost:9200', + opensearchDashboards: 'localhost:5601', + security_enabled: true, + }, + 'cypress-watch-and-reload': { + watch: ['common/**', 'public/**', 'server/**'], + }, + e2e: { + // We've imported your old cypress plugins here. + // You may want to clean this up later by importing these. + setupNodeEvents(on, config) { + return require('./.cypress/plugins/index.js')(on, config); + }, + baseUrl: 'http://localhost:5601', + specPattern: '.cypress/integration/**/*.spec.{js,jsx,ts,tsx}', + supportFile: '.cypress/support/index.js', + }, +}); diff --git a/cypress.json b/cypress.json deleted file mode 100644 index e72b2afa..00000000 --- a/cypress.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "video": true, - "fixturesFolder": ".cypress/fixtures", - "integrationFolder": ".cypress/integration", - "pluginsFile": ".cypress/plugins/index.js", - "screenshotsFolder": ".cypress/screenshots", - "supportFile": ".cypress/support/index.js", - "videosFolder": ".cypress/videos", - "requestTimeout": 60000, - "responseTimeout": 60000, - "defaultCommandTimeout": 60000, - "env": { - "opensearch": "localhost:9200", - "opensearchDashboards": "localhost:5601", - "security_enabled": true - } -}