Skip to content

Config improvements #327

Config improvements

Config improvements #327

name: API & frontend
on:
push:
branches:
- main
pull_request:
jobs:
test:
runs-on: ubuntu-latest
timeout-minutes: 90
services:
postgres:
image: postgres
env:
POSTGRES_USER: skyportal
POSTGRES_PASSWORD: anything
ports:
- 5432:5432
# needed because the postgres container does not provide a
# healthcheck
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
strategy:
fail-fast: false
matrix:
test_subset:
[
"api_and_utils_pt1",
"api_and_utils_pt2",
"frontend_pt1",
"frontend_pt2",
"flaky",
"external",
]
steps:
- uses: actions/setup-python@v5
with:
python-version: "3.10"
- uses: actions/setup-node@v3
with:
node-version: 20
- name: Checkout main
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: main
submodules: true
- name: Checkout branch being tested
uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: true
clean: false
- name: Fetch submodules
run: |
git submodule update --init --recursive
- uses: actions/cache@v2
with:
path: |
~/.npm
key: ${{ runner.os }}-npm-${{ hashFiles('package.json') }}
- uses: actions/cache@v2
with:
path: |
~/.cache/pip
key: ${{ runner.os }}-${{ hashFiles('**/requirements*.txt') }}
- name: Install system dependencies
run: |
sudo apt update -y
### firefox installation
sudo snap remove firefox
sudo add-apt-repository ppa:mozillateam/ppa
printf 'Package: *\nPin: release o=LP-PPA-mozillateam\nPin-Priority: 1001' | sudo tee /etc/apt/preferences.d/mozilla-firefox
sudo apt install -y wget unzip firefox libcurl4-gnutls-dev libgnutls28-dev
# if nginx is already installed, remove it
sudo apt remove -y nginx nginx-common nginx-core nginx-full
sudo apt purge -y nginx nginx-common nginx-core nginx-full
# add the PPA repository with brotli support for nginx
sudo add-apt-repository ppa:ondrej/nginx -y
sudo apt update -y
sudo apt install nginx libnginx-mod-http-brotli-static libnginx-mod-http-brotli-filter -y
pip install pip==24.0
pip install wheel numpy
export NPM_PACKAGES="${HOME}/.npm-packages"
export PATH=${NPM_PACKAGES}/bin:$PATH
export NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH"
sudo npm -g install npm@latest
which python; python --version
echo npm $(npm --version)
echo node $(node --version)
nginx -v
firefox --version
- name: Install Python dependencies
run: |
pip install -r requirements.txt
pip install -r skyportal/requirements.txt
pip install -r skyportal/baselayer/requirements.txt
- name: Apply Icare patches
run: |
./icare.sh build --skip_services_check
- name: Write SkyPortal configs
run: |
cd skyportal
cat << EOF > config.yaml
database:
database: skyportal
host: localhost
port: 5432
user: skyportal
password: anything
EOF
cat << EOF > config.default.yaml
database:
database: skyportal
host: localhost
port: 5432
user: skyportal
password: anything
EOF
cat << EOF > test_config.yaml
database:
database: skyportal_test
user: skyportal
host: localhost
port: 5432
password: anything
server:
auth:
debug_login: True
EOF
- name: Initialize SkyPortal
run: |
# Usually, we create databases on the local machine, so
# `createdb` just works out of the box. However, when doing
# this on a server, as in our case, we need to specify extra
# options.
#
# db_init should not complain if the databases exist already
#
echo "localhost:5432:*:skyportal:anything" > ~/.pgpass
chmod 600 ~/.pgpass
createdb -h localhost -U skyportal skyportal_test
psql -U skyportal -h localhost -c "GRANT ALL PRIVILEGES ON DATABASE skyportal_test TO skyportal;" skyportal_test
export NPM_CONFIG_LEGACY_PEER_DEPS="true"
./icare.sh build --init --skip_services_check
pip list --format=columns
npm ls --depth 0 || true
- name: Install Geckodriver / Selenium
run: |
GECKO_VER=0.34.0
CACHED_DOWNLOAD_DIR=~/.local/downloads
FILENAME=geckodriver-v${GECKO_VER}-linux64.tar.gz
if [[ ! -f ${CACHED_DOWNLOAD_DIR=}/${FILENAME} ]]; then
wget https://github.com/mozilla/geckodriver/releases/download/v${GECKO_VER}/${FILENAME} --directory-prefix=${CACHED_DOWNLOAD_DIR} --no-clobber
fi
sudo tar -xzf ${CACHED_DOWNLOAD_DIR}/geckodriver-v${GECKO_VER}-linux64.tar.gz -C /usr/local/bin
geckodriver --version
python -c "import selenium; print(f'Selenium {selenium.__version__}')"
- name: Patch test_frontend.py for a longer timeout
run: |
cd patched_skyportal
sed -i 's/timeout=60/timeout=180/g' baselayer/tools/test_frontend.py
- name: Patch Notifications.jsx for a longer display
run: |
cd patched_skyportal
sed -i 's/duration = 3000/duration = 15000/g' baselayer/static/js/components/Notifications.jsx
- name: Refresh SkyPortal dependencies for tested version
run: |
cd patched_skyportal
export PYTHONPATH=$PYTHONPATH:$(pwd)
export NPM_CONFIG_LEGACY_PEER_DEPS="true"
make dependencies
- name: Run front-end tests part 1
if: ${{ matrix.test_subset == 'frontend_pt1' }}
run: |
cd patched_skyportal
PYTHONPATH=. python baselayer/tools/test_frontend.py --xml --headless 'skyportal/tests/frontend/sources_and_observingruns_etc'
- name: Run front-end tests part 2
if: ${{ matrix.test_subset == 'frontend_pt2' }}
run: |
cd patched_skyportal
PYTHONPATH=. python baselayer/tools/test_frontend.py --xml --headless '--ignore=skyportal/tests/frontend/sources_and_observingruns_etc skyportal/tests/frontend'
- name: Run API & utils tests part 1
if: ${{ matrix.test_subset == 'api_and_utils_pt1' }}
run: |
cd patched_skyportal
PYTHONPATH=. python baselayer/tools/test_frontend.py --xml --headless 'skyportal/tests/api/candidates_sources_events'
- name: Run API & utils tests part 2
if: ${{ matrix.test_subset == 'api_and_utils_pt2' }}
run: |
cd patched_skyportal
PYTHONPATH=. python baselayer/tools/test_frontend.py --xml --headless '--ignore=skyportal/tests/api/candidates_sources_events skyportal/tests/api skyportal/tests/tools skyportal/tests/utils skyportal/tests/rate_limiting'
- name: Run flaky tests
if: ${{ matrix.test_subset == 'flaky' }}
continue-on-error: true
run: |
cd patched_skyportal
PYTHONPATH=. python baselayer/tools/test_frontend.py --xml --headless 'skyportal/tests/flaky'
- name: Run external tests
if: ${{ matrix.test_subset == 'external' }}
continue-on-error: true
run: |
cd patched_skyportal
PYTHONPATH=. python baselayer/tools/test_frontend.py --xml --headless 'skyportal/tests/external'
- name: Upload logs
uses: actions/upload-artifact@v2
if: ${{ always() }}
with:
name: logs
path: patched_skyportal/log
- name: Upload test post-mortem reports
uses: actions/upload-artifact@v2
if: ${{ always() }}
with:
name: test-results
path: patched_skyportal/test-results
- name: Upload generated plots
uses: actions/upload-artifact@v2
if: ${{ always() }}
with:
name: generated-plots
path: patched_skyportal/skyportal/tests/data/*_expected.png