diff --git a/.github/workflows/dashboards-notifications-test-and-build-workflow.yml b/.github/workflows/dashboards-notifications-test-and-build-workflow.yml index 9f21a92c..517a8226 100644 --- a/.github/workflows/dashboards-notifications-test-and-build-workflow.yml +++ b/.github/workflows/dashboards-notifications-test-and-build-workflow.yml @@ -14,7 +14,13 @@ env: OPENSEARCH_VERSION: '3.0.0-SNAPSHOT' jobs: - tests: + Get-CI-Image-Tag: + uses: opensearch-project/opensearch-build/.github/workflows/get-ci-image-tag.yml@main + with: + product: opensearch-dashboards + + tests-linux: + needs: Get-CI-Image-Tag env: JEST_TEST_ARGS: ${{ matrix.jest_test_args }} # prevents extra Cypress installation progress messages @@ -26,25 +32,21 @@ jobs: # This setting says that all jobs should finish, even if one fails fail-fast: false matrix: - # TODO: macos-latest was removed due to CI flakiness, we can revisit adding it back later - os: [ ubuntu-latest, windows-latest ] + os: [ ubuntu-latest ] include: - - os: windows-latest - os_build_args: -x integTest -x jacocoTestReport - working_directory: X:\ - os_java_options: -Xmx4096M - cypress_cache_folder: ~/AppData/Local/Cypress/Cache - os: ubuntu-latest os_build_args: -x integTest -x jacocoTestReport jest_test_args: --coverage cypress_cache_folder: ~/.cache/Cypress - # TODO: Add back when macos-latest is back in the test matrix -# - os: macos-latest -# cypress_cache_folder: ~/Library/Caches/Cypress - name: Test and Build Dashboards Notifications on ${{ matrix.os }} runs-on: ${{ matrix.os }} + container: + # using the same image which is used by opensearch-build team to build the OpenSearch Distribution + # this image tag is subject to change as more dependencies and updates will arrive over time + image: ${{ needs.Get-CI-Image-Tag.outputs.ci-image-version-linux }} + # need to switch to root so that github actions can install runner binary on container without permission issues. + options: --user root steps: - name: Set up JDK @@ -60,21 +62,6 @@ jobs: repository: opensearch-project/notifications ref: '2.x' - # This is a hack, but this step creates a link to the X: mounted drive, which makes the path - # short enough to work on Windows - - name: Shorten Path - if: ${{ matrix.os == 'windows-latest' }} - run: | - git config --system core.longpaths true - subst 'X:' . - - - name: enable long paths in git - if: ${{ matrix.os == 'windows-latest' }} - run: | - # enable long paths to fix "path too long" errors when cloning repos in windows - git config --system core.longpaths true - shell: bash - - name: Check out the notifications repo uses: actions/checkout@v2 with: @@ -85,12 +72,9 @@ jobs: - name: Run Opensearch with plugin working-directory: ${{ env.WORKING_DIR }} run: | - # Install coreutils for macOS since timeout doesn't seem to available on that OS even when forcing bash shell - if [ "$RUNNER_OS" == "macOS" ]; then - brew install coreutils - fi + chown -R 1000:1000 `pwd` cd notifications/notifications - ./gradlew run -Dopensearch.version=${{ env.OPENSEARCH_VERSION }} -x integTest -x jacocoTestReport & + su `id -un 1000` -c "nohup ./gradlew run -Dopensearch.version=${{ env.OPENSEARCH_VERSION }} -x integTest -x jacocoTestReport &" timeout 300 bash -c 'while [[ "$(curl -s -o /dev/null -w ''%{http_code}'' localhost:9200)" != "200" ]]; do sleep 5; done' shell: bash env: @@ -107,55 +91,30 @@ jobs: ref: ${{ env.OPENSEARCH_DASHBOARDS_VERSION }} path: OpenSearch-Dashboards - - name: Setup Node - uses: actions/setup-node@v3 - with: - node-version-file: './OpenSearch-Dashboards/.nvmrc' - registry-url: 'https://registry.npmjs.org' - - - name: Install correct yarn version for OpenSearch Dashboards - # Need to use bash to avoid having a windows/linux specific step - shell: bash - run: | - YARN_VERSION=$(node -p "require('./OpenSearch-Dashboards/package.json').engines.yarn") - echo "Installing yarn@$YARN_VERSION" - npm i -g yarn@$YARN_VERSION - - - run: node -v - - run: yarn -v - - - name: Set npm to use bash for shell - if: ${{ matrix.os == 'windows-latest' }} - run: | - # Sets Windows to use bash for npm shell so the script commands work as intended - npm config set script-shell "C:\\Program Files\\git\\bin\\bash.exe" - - name: Move Notifications to Plugins Dir run: | mv dashboards-notifications OpenSearch-Dashboards/plugins/dashboards-notifications - - name: OpenSearch Dashboards Plugin Bootstrap - run: | - cd ./OpenSearch-Dashboards/plugins/dashboards-notifications - yarn osd bootstrap - - - name: Build Artifact + - name: OpenSearch Dashboards Plugin Bootstrap and build run: | - cd ./OpenSearch-Dashboards/plugins/dashboards-notifications - yarn build + chown -R 1000:1000 `pwd` + cd ./OpenSearch-Dashboards/ + su `id -un 1000` -c "source $NVM_DIR/nvm.sh && nvm use && node -v && yarn -v && + cd ./plugins/dashboards-notifications && + whoami && yarn osd bootstrap && yarn build" - name: Run unit tests uses: nick-fields/retry@v2 with: timeout_minutes: 30 max_attempts: 1 - command: cd ./OpenSearch-Dashboards/plugins/dashboards-notifications; yarn test:jest ${{ env.JEST_TEST_ARGS }} + command: cd ./OpenSearch-Dashboards/plugins/dashboards-notifications; su `id -un 1000` -c "yarn test:jest ${{ env.JEST_TEST_ARGS }}" shell: bash - name: Run OpenSearch Dashboards server run: | cd ./OpenSearch-Dashboards - yarn start --no-base-path --no-watch --server.host="0.0.0.0" & + su `id -un 1000` -c 'source $NVM_DIR/nvm.sh && nvm use && node -v && yarn -v && nohup yarn start --no-base-path --no-watch --server.host="0.0.0.0" &' timeout 900 bash -c 'while [[ "$(curl -s http://localhost:5601/api/status | jq -r '.status.overall.state')" != "green" ]]; do echo sleeping 5; sleep 5; done' curl -sk localhost:5601/api/status | jq netstat -anp tcp | grep LISTEN | grep 5601 || netstat -ntlp | grep 5601 @@ -167,41 +126,18 @@ jobs: # sleep two more minutes to make sure all the bundles have been built. shell: bash - - name: Install Cypress + - name: Install cypress run: | cd ./OpenSearch-Dashboards/plugins/dashboards-notifications - # This will install Cypress in case the binary is missing which can happen on Windows and Mac - # If the binary exists, this will exit quickly so it should not be an expensive operation - npx cypress install - shell: bash - - - name: Get Cypress version - id: cypress_version - run: | - cd ./OpenSearch-Dashboards/plugins/dashboards-notifications - echo "::set-output name=cypress_version::$(cat ./package.json | jq '.dependencies.cypress' | tr -d '"')" - - - name: Cache Cypress - id: cache-cypress - uses: actions/cache@v2 - with: - path: ${{ matrix.cypress_cache_folder }} - key: cypress-cache-v2-${{ runner.os }}-${{ hashFiles('OpenSearch-Dashboards/plugins/dashboards-notifications/package.json') }} - - - name: Reset npm's script shell - if: ${{ matrix.os == 'windows-latest' }} - run: | - # Resetting npm's script shell for Windows so `yarn run cypress` doesn't have conflicts - npm config delete script-shell + cypress_version=$(cat ./package.json | jq '.dependencies.cypress' | tr -d '"') + su `id -un 1000` -c "source $NVM_DIR/nvm.sh && nvm use && node -v && yarn -v && yarn install cypress@$cypress_version" - name: Run Cypress tests uses: cypress-io/github-action@v2 with: working-directory: OpenSearch-Dashboards/plugins/dashboards-notifications - command: yarn run cypress run + command: su `id -un 1000` -c "source $NVM_DIR/nvm.sh && nvm use && node -v && yarn -v && yarn run cypress run" wait-on: 'http://localhost:5601' - env: - CYPRESS_CACHE_FOLDER: ${{ matrix.cypress_cache_folder }} # Screenshots are only captured on failure, will change this once we do visual regression tests - uses: actions/upload-artifact@v1 @@ -218,7 +154,6 @@ jobs: path: OpenSearch-Dashboards/plugins/dashboards-notifications/.cypress/videos - name: Upload coverage - if: ${{ matrix.os == 'ubuntu-latest' }} uses: codecov/codecov-action@v1 with: flags: dashboards-notifications @@ -230,3 +165,216 @@ jobs: with: name: dashboards-notifications path: OpenSearch-Dashboards/plugins/dashboards-notifications/build + +# tests-windows-macos: +# env: +# JEST_TEST_ARGS: ${{ matrix.jest_test_args }} +# # prevents extra Cypress installation progress messages +# CI: 1 +# # avoid warnings like "tput: No value for $TERM and no -T specified" +# TERM: xterm +# WORKING_DIR: ${{ matrix.working_directory }}. +# strategy: +# # This setting says that all jobs should finish, even if one fails +# fail-fast: false +# matrix: +# # TODO: macos-latest was removed due to CI flakiness, we can revisit adding it back later +# os: [ windows-latest ] +# include: +# - os: windows-latest +# os_build_args: -x integTest -x jacocoTestReport +# working_directory: X:\ +# os_java_options: -Xmx4096M +# cypress_cache_folder: ~/AppData/Local/Cypress/Cache +# # TODO: Add back when macos-latest is back in the test matrix +## - os: macos-latest +## cypress_cache_folder: ~/Library/Caches/Cypress +# +# +# name: Test and Build Dashboards Notifications on ${{ matrix.os }} +# runs-on: ${{ matrix.os }} +# +# steps: +# - name: Set up JDK +# uses: actions/setup-java@v2 +# with: +# distribution: temurin # Temurin is a distribution of adoptium +# java-version: 11 +# +# - name: Checkout Plugin +# uses: actions/checkout@v2 +# with: +# path: notifications +# repository: opensearch-project/notifications +# ref: '2.x' +# +# # This is a hack, but this step creates a link to the X: mounted drive, which makes the path +# # short enough to work on Windows +# - name: Shorten Path +# if: ${{ matrix.os == 'windows-latest' }} +# run: | +# git config --system core.longpaths true +# subst 'X:' . +# +# - name: enable long paths in git +# if: ${{ matrix.os == 'windows-latest' }} +# run: | +# # enable long paths to fix "path too long" errors when cloning repos in windows +# git config --system core.longpaths true +# shell: bash +# +# - name: Check out the notifications repo +# uses: actions/checkout@v2 +# with: +# repository: opensearch-project/notifications +# ref: ${{ env.NOTIFICATIONS_PLUGIN_VERSION }} +# path: notifications +# +# - name: Run Opensearch with plugin +# working-directory: ${{ env.WORKING_DIR }} +# run: | +# # Install coreutils for macOS since timeout doesn't seem to available on that OS even when forcing bash shell +# if [ "$RUNNER_OS" == "macOS" ]; then +# brew install coreutils +# fi +# cd notifications/notifications +# ./gradlew run -Dopensearch.version=${{ env.OPENSEARCH_VERSION }} -x integTest -x jacocoTestReport & +# timeout 300 bash -c 'while [[ "$(curl -s -o /dev/null -w ''%{http_code}'' localhost:9200)" != "200" ]]; do sleep 5; done' +# shell: bash +# env: +# _JAVA_OPTIONS: ${{ matrix.os_java_options }} +# +# - name: Checkout Notification Dashboards plugin +# uses: actions/checkout@v2 +# with: +# path: dashboards-notifications +# - name: Checkout OpenSearch Dashboards +# uses: actions/checkout@v2 +# with: +# repository: opensearch-project/Opensearch-Dashboards +# ref: ${{ env.OPENSEARCH_DASHBOARDS_VERSION }} +# path: OpenSearch-Dashboards +# +# - name: Setup Node +# uses: actions/setup-node@v3 +# with: +# node-version-file: './OpenSearch-Dashboards/.nvmrc' +# registry-url: 'https://registry.npmjs.org' +# +# - name: Install correct yarn version for OpenSearch Dashboards +# # Need to use bash to avoid having a windows/linux specific step +# shell: bash +# run: | +# YARN_VERSION=$(node -p "require('./OpenSearch-Dashboards/package.json').engines.yarn") +# echo "Installing yarn@$YARN_VERSION" +# npm i -g yarn@$YARN_VERSION +# +# - run: node -v +# - run: yarn -v +# +# - name: Set npm to use bash for shell +# if: ${{ matrix.os == 'windows-latest' }} +# run: | +# # Sets Windows to use bash for npm shell so the script commands work as intended +# npm config set script-shell "C:\\Program Files\\git\\bin\\bash.exe" +# +# - name: Move Notifications to Plugins Dir +# run: | +# mv dashboards-notifications OpenSearch-Dashboards/plugins/dashboards-notifications +# +# - name: OpenSearch Dashboards Plugin Bootstrap +# run: | +# cd ./OpenSearch-Dashboards/plugins/dashboards-notifications +# yarn osd bootstrap +# +# - name: Build Artifact +# run: | +# cd ./OpenSearch-Dashboards/plugins/dashboards-notifications +# yarn build +# +# - name: Run unit tests +# uses: nick-fields/retry@v2 +# with: +# timeout_minutes: 30 +# max_attempts: 1 +# command: cd ./OpenSearch-Dashboards/plugins/dashboards-notifications; yarn test:jest ${{ env.JEST_TEST_ARGS }} +# shell: bash +# +# - name: Run OpenSearch Dashboards server +# run: | +# cd ./OpenSearch-Dashboards +# yarn start --no-base-path --no-watch --server.host="0.0.0.0" & +# timeout 900 bash -c 'while [[ "$(curl -s http://localhost:5601/api/status | jq -r '.status.overall.state')" != "green" ]]; do echo sleeping 5; sleep 5; done' +# curl -sk localhost:5601/api/status | jq +# netstat -anp tcp | grep LISTEN | grep 5601 || netstat -ntlp | grep 5601 +# shell: bash +# +# - name: Add sleep to wait for bundle build completion +# run: | +# sleep 300 +# # sleep two more minutes to make sure all the bundles have been built. +# shell: bash +# +# - name: Install Cypress +# run: | +# cd ./OpenSearch-Dashboards/plugins/dashboards-notifications +# # This will install Cypress in case the binary is missing which can happen on Windows and Mac +# # If the binary exists, this will exit quickly so it should not be an expensive operation +# npx cypress install +# shell: bash +# +# - name: Get Cypress version +# id: cypress_version +# run: | +# cd ./OpenSearch-Dashboards/plugins/dashboards-notifications +# echo "::set-output name=cypress_version::$(cat ./package.json | jq '.dependencies.cypress' | tr -d '"')" +# +# - name: Cache Cypress +# id: cache-cypress +# uses: actions/cache@v2 +# with: +# path: ${{ matrix.cypress_cache_folder }} +# key: cypress-cache-v2-${{ runner.os }}-${{ hashFiles('OpenSearch-Dashboards/plugins/dashboards-notifications/package.json') }} +# +# - name: Reset npm's script shell +# if: ${{ matrix.os == 'windows-latest' }} +# run: | +# # Resetting npm's script shell for Windows so `yarn run cypress` doesn't have conflicts +# npm config delete script-shell +# +# - name: Run Cypress tests +# uses: cypress-io/github-action@v2 +# with: +# working-directory: OpenSearch-Dashboards/plugins/dashboards-notifications +# command: yarn run cypress run +# wait-on: 'http://localhost:5601' +# env: +# CYPRESS_CACHE_FOLDER: ${{ matrix.cypress_cache_folder }} +# +# # Screenshots are only captured on failure, will change this once we do visual regression tests +# - uses: actions/upload-artifact@v1 +# if: failure() +# with: +# name: cypress-screenshots-${{ matrix.os }} +# path: OpenSearch-Dashboards/plugins/dashboards-notifications/.cypress/screenshots +# +# # Test run video was always captured, so this action uses "always()" condition +# - uses: actions/upload-artifact@v1 +# if: always() +# with: +# name: cypress-videos-${{ matrix.os }} +# path: OpenSearch-Dashboards/plugins/dashboards-notifications/.cypress/videos +# +# - name: Upload coverage +# if: ${{ matrix.os == 'ubuntu-latest' }} +# uses: codecov/codecov-action@v1 +# with: +# flags: dashboards-notifications +# directory: OpenSearch-Dashboards/plugins/ +# token: ${{ secrets.CODECOV_TOKEN }} +# +# - name: Upload Artifact +# uses: actions/upload-artifact@v1 +# with: +# name: dashboards-notifications +# path: OpenSearch-Dashboards/plugins/dashboards-notifications/build