[Backport 2.17] Fix CI workflow for windows #838
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
## | |
# Copyright OpenSearch Contributors | |
# SPDX-License-Identifier: Apache-2.0 | |
## | |
name: Test and Build Dashboards Notifications | |
on: [pull_request, push] | |
env: | |
PLUGIN_NAME: notifications-dashboards | |
OPENSEARCH_DASHBOARDS_VERSION: '2.x' | |
NOTIFICATIONS_PLUGIN_VERSION: '2.x' | |
jobs: | |
tests: | |
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 | |
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 }} | |
steps: | |
- name: Set up JDK | |
uses: actions/setup-java@v1 | |
with: | |
java-version: 11 | |
# 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 -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 Yarn | |
# 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 --single-version=loose | |
- 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" --opensearch.requestTimeout=120000 & | |
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: 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('**/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: Wait for OSD to be fully start | |
run: | | |
sleep 300 | |
curl http://localhost:5601/app/home#/ | |
curl http://localhost:9200 | |
- 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@v4 | |
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@v4 | |
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@v4 | |
with: | |
name: dashboards-notifications-${{ matrix.os }} | |
path: OpenSearch-Dashboards/plugins/dashboards-notifications/build |