Support local hoster #900
Workflow file for this run
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
name: CI | |
on: | |
push: | |
branches: ["main"] | |
pull_request: | |
branches: ["main"] | |
workflow_dispatch: | |
workflow_call: | |
permissions: | |
contents: read | |
env: | |
FORCE_COLOR: "1" # Make tools pretty. | |
PYTHON_LATEST: "3.11" | |
POETRY_VERSION: "1.4.0" | |
POETRY_VIRTUALENVS_CREATE: false | |
jobs: | |
linting: | |
name: Linting | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: actions/setup-python@v4 | |
with: | |
python-version: ${{ env.PYTHON_LATEST }} | |
- uses: snok/install-poetry@v1 | |
with: | |
version: ${{ env.POETRY_VERSION }} | |
- name: Install dependencies | |
run: | | |
poetry self add "poetry-dynamic-versioning[plugin]" | |
poetry install | |
- name: black | |
run: python -m black --check --diff . | |
- name: flake8 | |
run: python -m flake8 . | |
- name: isort | |
run: python -m isort --check-only -v --profile black . | |
typing: | |
name: Typing | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: actions/setup-python@v4 | |
with: | |
python-version: ${{ env.PYTHON_LATEST }} | |
- uses: snok/install-poetry@v1 | |
with: | |
version: ${{ env.POETRY_VERSION }} | |
- name: Install dependencies | |
run: | | |
poetry self add "poetry-dynamic-versioning[plugin]" | |
poetry install | |
- name: mypy | |
run: python -m mypy src tests | |
unit-tests: | |
name: unit tests on ${{ matrix.python-version }} | |
runs-on: ubuntu-22.04 | |
strategy: | |
fail-fast: false | |
matrix: | |
python-version: ["3.11"] | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: actions/setup-python@v4 | |
with: | |
python-version: ${{ env.PYTHON_LATEST }} | |
- uses: snok/install-poetry@v1 | |
with: | |
version: ${{ env.POETRY_VERSION }} | |
- name: Install dependencies | |
run: | | |
poetry self add "poetry-dynamic-versioning[plugin]" | |
poetry install | |
- run: coverage run -m pytest -m 'not e2e' | |
env: | |
# FoxOps test configuration | |
FOXOPS_GITLAB_ADDRESS: https://nonsense.com/api/v4 | |
FOXOPS_GITLAB_TOKEN: nonsense | |
# Test runner configuration | |
COVERAGE_FILE: .coverage.unit.${{ matrix.python-version }} | |
- name: Upload coverage data | |
uses: actions/upload-artifact@v3 | |
with: | |
name: coverage-data | |
path: .coverage.* | |
if-no-files-found: ignore | |
e2e-tests: | |
name: e2e tests on ${{ matrix.python-version }} | |
runs-on: ubuntu-22.04 | |
strategy: | |
fail-fast: false | |
matrix: | |
python-version: ["3.11"] | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: actions/setup-python@v4 | |
with: | |
python-version: ${{ env.PYTHON_LATEST }} | |
- uses: snok/install-poetry@v1 | |
with: | |
version: ${{ env.POETRY_VERSION }} | |
- name: Install dependencies | |
run: | | |
poetry self add "poetry-dynamic-versioning[plugin]" | |
poetry install | |
- name: Start GitLab test instance | |
run: | | |
docker compose up -d | |
./scripts/await-healthy.sh | |
- run: coverage run -m pytest -m 'e2e' | |
env: | |
# FoxOps test configuration | |
FOXOPS_GITLAB_ADDRESS: https://nonsense.com/api/v4 | |
FOXOPS_GITLAB_TOKEN: nonsense | |
# Test runner configuration | |
COVERAGE_FILE: .coverage.e2e.${{ matrix.python-version }} | |
- name: Upload coverage data | |
uses: actions/upload-artifact@v3 | |
with: | |
name: coverage-data | |
path: .coverage.* | |
if-no-files-found: ignore | |
coverage: | |
name: Combine & check coverage | |
runs-on: ubuntu-latest | |
needs: [unit-tests, e2e-tests] | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: actions/setup-python@v4 | |
with: | |
# Use latest Python, so it understands all syntax. | |
python-version: ${{env.PYTHON_LATEST}} | |
- run: python -m pip install --upgrade coverage[toml] | |
- uses: actions/download-artifact@v3 | |
with: | |
name: coverage-data | |
- name: Combine coverage & fail if it's <70%. | |
run: | | |
python -m coverage combine | |
python -m coverage html --skip-covered --skip-empty | |
python -m coverage report --fail-under=70 | |
- name: Upload HTML report | |
uses: actions/upload-artifact@v3 | |
with: | |
name: html-report | |
path: htmlcov | |
package: | |
name: Build & verify package | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: actions/setup-python@v4 | |
with: | |
python-version: ${{ env.PYTHON_LATEST }} | |
- run: python -m pip install build twine check-wheel-contents | |
- run: python -m build --sdist --wheel . | |
- run: ls -l dist | |
- run: check-wheel-contents dist/*.whl | |
- name: Check long_description | |
run: python -m twine check dist/* | |
container: | |
permissions: | |
packages: write | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Set up QEMU | |
uses: docker/setup-qemu-action@v2 | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v2 | |
- name: Login to GitHub Container Registry | |
uses: docker/login-action@v2 | |
with: | |
registry: ghcr.io | |
username: ${{ github.repository_owner }} | |
password: ${{ secrets.GITHUB_TOKEN }} | |
- name: Build and push | |
uses: docker/build-push-action@v3 | |
with: | |
context: . | |
push: ${{ (github.event.pull_request.head.repo.full_name == github.repository) || (github.ref == 'refs/heads/main') }} | |
tags: | | |
ghcr.io/roche/foxops:${{ github.sha }} | |
docs: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: actions/setup-python@v4 | |
with: | |
python-version: ${{ env.PYTHON_LATEST }} | |
- uses: snok/install-poetry@v1 | |
with: | |
version: ${{ env.POETRY_VERSION }} | |
- name: Install dependencies | |
run: | | |
poetry self add "poetry-dynamic-versioning[plugin]" | |
poetry install | |
- run: make -C docs html | |
- uses: actions/upload-artifact@v3 | |
with: | |
name: DocumentationHTML | |
path: docs/build/html/ | |
install-dev: | |
name: Verify dev env | |
runs-on: ${{ matrix.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
os: [ubuntu-latest, macos-latest, windows-latest] | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: actions/setup-python@v4 | |
with: | |
python-version: ${{ env.PYTHON_LATEST }} | |
- run: python -m pip install -e . | |
- run: python -c 'import foxops; print(foxops.__version__)' | |
build-ui: | |
runs-on: ubuntu-latest | |
defaults: | |
run: | |
working-directory: ui | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: actions/setup-node@v3 | |
with: | |
node-version: '16.17.0' | |
- name: Install dependencies 🖥 | |
run: npm install | |
- name: Lint ui/src ✔️ | |
run: npm run lint | |
- name: Unit tests 🤞 | |
run: npm run test | |
- name: Build UI 🏰 | |
run: npm run build |