Skip to content

Separate out entity models in SOFT and DLite #337

Separate out entity models in SOFT and DLite

Separate out entity models in SOFT and DLite #337

Workflow file for this run

name: CI - Tests
on:
pull_request:
push:
branches:
- 'main'
- 'push-action/**' # Allow pushing to protected branches (using CasperWA/push-protected)
jobs:
basic-tests:
name: External
uses: SINTEF/ci-cd/.github/workflows/[email protected]
with:
# General setup
install_extras: "[dev]"
# pre-commit
python_version_pre-commit: "3.10"
# pylint & safety
python_version_pylint_safety: "3.10"
run_pylint: false
# Build dist
python_version_package: "3.10"
build_libs: flit
build_cmd: flit build
# Build documentation
run_build_docs: false
docker:
name: Docker
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
docker_target: ["development", "production"]
env:
# "Regular" entities service configuration values
ENTITIES_SERVICE_MONGO_URI: mongodb://localhost:27017
ENTITIES_SERVICE_X509_CERTIFICATE_FILE: docker_security/test-client.pem
ENTITIES_SERVICE_CA_FILE: docker_security/test-ca.pem
# These are used in the Dockerfile as well as in pytest
ENTITIES_SERVICE_HOST: localhost
ENTITIES_SERVICE_PORT: 8000
steps:
- name: Checkout ${{ github.repository }}
uses: actions/checkout@v4
- name: Setup Python 3.10
uses: actions/setup-python@v5
with:
python-version: "3.10"
- name: Run MongoDB
run: |
# Create folder for certificates
mkdir -p docker_security
chmod 777 docker_security
# Generate certificates
cd docker_security && ${{ github.workspace }}/.github/docker_init/setup_mongo_security.sh
cd ${{ github.workspace }}
# Pull mongo:7 image and run it
docker pull mongo:7
docker run --rm -d \
--env MONGO_INITDB_ROOT_USERNAME=root \
--env MONGO_INITDB_ROOT_PASSWORD=root \
--name "mongo" \
--network "host" \
--volume "${{ github.workspace }}/.github/docker_init/create_x509_user.js:/docker-entrypoint-initdb.d/0_create_x509_user.js" \
--volume "${{ github.workspace }}/docker_security:/mongo_tls" \
mongo:7 \
--tlsMode allowTLS --tlsCertificateKeyFile /mongo_tls/test-server1.pem --tlsCAFile /mongo_tls/test-ca.pem
sleep 10 # Wait for the database to start
- name: Build Docker image
run: |
docker build \
--pull \
--tag entities-service \
--target ${{ matrix.docker_target }} \
.
- name: Install test dependencies
run: |
python -m pip install -U pip
pip install -U setuptools wheel
pip install -U -e .[testing]
- name: Run Docker container
run: |
# Create logging directory and file
mkdir -p logs
touch -a logs/entities_service.log
# Run the service in the background
docker run --rm -d \
--env ENTITIES_SERVICE_MONGO_URI \
--env ENTITIES_SERVICE_X509_CERTIFICATE_FILE \
--env ENTITIES_SERVICE_CA_FILE \
--env PORT=${ENTITIES_SERVICE_PORT} \
--env RUN_TIME=40 \
--env STOP_TIME=3 \
--name "entities-service" \
--network "host" \
--volume "${PWD}:/app" \
--entrypoint "./.github/utils/coverage_entrypoint.sh" \
entities-service \
${{ matrix.docker_target }}
sleep 5 # Wait for the service to start
- name: Run tests
run: |
{
pytest -vv --live-backend --cov-report=
} || {
echo "Failed! Here's the Docker logs for the service:" &&
docker logs entities-service &&
echo -e "\nAnd the service log:" &&
cat logs/entities_service.log &&
exit 1
}
- name: Collect coverage
run: |
# We have mapped the current working directory with the service's working
# directory in Docker. This means that we can, first of all, stop the service
# via a file touch, and then collect the coverage data from the service.
#
# See the .github/utils/coverage_entrypoint.sh file for more details on the
# stopping mechanism.
touch stop_gunicorn
sleep 3 # Wait for the service to stop
mv .coverage .coverage.pytest
coverage combine --data-file=.coverage.final --rcfile=pyproject.toml .coverage.pytest .coverage.docker
coverage xml --data-file=.coverage.final --rcfile=pyproject.toml -o coverage.xml
coverage report --data-file=.coverage.final --rcfile=pyproject.toml --show-missing --skip-covered --skip-empty
- name: Upload coverage
if: github.repository_owner == 'SINTEF'
uses: codecov/codecov-action@v3
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: coverage.xml
fail_ci_if_error: true
env_vars: OS,PYTHON
flags: docker
env:
OS: ubuntu-latest
PYTHON: '3.10'
pytest:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python_version: ["3.10", "3.11", "3.12"]
steps:
- name: Checkout ${{ github.repository }}
uses: actions/checkout@v4
- name: Setup Python ${{ matrix.python_version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python_version }}
- name: Install test dependencies
run: |
python -m pip install -U pip
pip install -U setuptools wheel flit
pip install -U -e .[testing]
- name: Run pytest
run: pytest -vv --cov-report=xml
- name: Upload coverage
if: github.repository_owner == 'SINTEF'
uses: codecov/codecov-action@v3
with:
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: true
env_vars: OS,PYTHON
flags: local
env:
OS: ubuntu-latest
PYTHON: ${{ matrix.python_version }}