Skip to content

Merge pull request #4689 from nautobot/u/glennmatthews-4686-docker-up… #5

Merge pull request #4689 from nautobot/u/glennmatthews-4686-docker-up…

Merge pull request #4689 from nautobot/u/glennmatthews-4686-docker-up… #5

---
# Full CI for commits to the integration branches (main, develop, next)
name: "CI - Integration Branch"
on: # yamllint disable
push:
branches:
- "main"
- "develop"
- "next"
workflow_call:
workflow_dispatch:
jobs:
check-schema:
name: "Run REST API schema checks"
runs-on: "ubuntu-22.04"
env:
INVOKE_NAUTOBOT_LOCAL: "True"
NAUTOBOT_DB_USER: "nautobot"
NAUTOBOT_DB_PASSWORD: "decinablesprewad"
NAUTOBOT_DB_ENGINE: "django_prometheus.db.backends.postgresql"
NAUTOBOT_CONFIG: "nautobot/core/tests/nautobot_config.py"
services:
postgres:
image: "postgres:13-alpine"
env:
POSTGRES_USER: "nautobot"
POSTGRES_PASSWORD: "decinablesprewad"
POSTGRES_DB: "nautobot"
ports:
- "5432:5432"
steps:
- name: "Check out repository code"
uses: "actions/checkout@v3"
- name: "Setup environment"
uses: "networktocode/gh-action-setup-poetry-environment@v2"
- name: "Run check-schema"
# REST API schema generation currently includes GraphQL schema generation, which is dependent on the DB :-(
run: "poetry run invoke migrate check-schema"
tests-postgres:
name: "Unit tests (PostgreSQL and Python 3.11)"
runs-on: "ubuntu-22.04"
env:
INVOKE_NAUTOBOT_LOCAL: "True"
NAUTOBOT_DB_USER: "nautobot"
NAUTOBOT_DB_PASSWORD: "decinablesprewad"
NAUTOBOT_DB_ENGINE: "django_prometheus.db.backends.postgresql"
services:
postgres:
image: "postgres:13-alpine"
env:
POSTGRES_USER: "nautobot"
POSTGRES_PASSWORD: "decinablesprewad"
POSTGRES_DB: "nautobot"
ports:
- "5432:5432"
redis:
image: "redis:6-alpine"
ports:
- "6379:6379"
steps:
- name: "Check out repository code"
uses: "actions/checkout@v3"
- name: "Setup environment"
uses: "networktocode/gh-action-setup-poetry-environment@v2"
with:
python-version: "3.11"
- name: "Remove Installed Nautobots (Poetry Workaround)" # Workaround for https://github.com/python-poetry/poetry/issues/2918
run: "for i in $(ls -d1 ~/.cache/pypoetry/virtualenvs/*/lib/*/site-packages/nautobot-*.dist-info); do poetry run pip uninstall -y nautobot; done"
- name: "Reinstall Nautobot Local"
run: "poetry install"
- name: "Run unittest"
run: "poetry run invoke unittest --failfast --keepdb"
- name: "Run coverage"
run: "poetry run invoke unittest-coverage"
tests-mysql:
name: "Unit tests (MySQL and Python 3.8)"
runs-on: "ubuntu-22.04"
env:
INVOKE_NAUTOBOT_LOCAL: "True"
NAUTOBOT_DB_USER: "root"
NAUTOBOT_DB_PASSWORD: "decinablesprewad"
NAUTOBOT_DB_HOST: "127.0.0.1"
NAUTOBOT_DB_PORT: "3306"
NAUTOBOT_DB_ENGINE: "django_prometheus.db.backends.mysql"
services:
mysql:
image: "mysql:8"
env:
MYSQL_ROOT_PASSWORD: "decinablesprewad"
MYSQL_PASSWORD: "decinablesprewad"
MYSQL_DATABASE: "nautobot"
ports:
- "3306:3306"
redis:
image: "redis:6-alpine"
ports:
- "6379:6379"
steps:
- name: "Check out repository code"
uses: "actions/checkout@v3"
- name: "Setup environment"
uses: "networktocode/gh-action-setup-poetry-environment@v2"
with:
python-version: "3.8"
- name: "Remove Installed Nautobots (Poetry Workaround)" # Workaround for https://github.com/python-poetry/poetry/issues/2918
run: "for i in $(ls -d1 ~/.cache/pypoetry/virtualenvs/*/lib/*/site-packages/nautobot-*.dist-info); do poetry run pip uninstall -y nautobot; done"
- name: "Reinstall Nautobot Local"
run: "poetry install"
- name: "Install Required Dependencies for MySql Client"
run: "sudo apt-get update && sudo apt-get install --no-install-recommends -y default-libmysqlclient-dev gcc"
- name: "Install MySql Dependencies"
run: "poetry install --no-interaction --no-root --extras mysql"
- name: "Run unittest"
run: "poetry run invoke unittest --failfast --keepdb"
- name: "Run coverage"
run: "poetry run invoke unittest-coverage"
tests-ui:
runs-on: "ubuntu-20.04"
env:
INVOKE_NAUTOBOT_LOCAL: "True"
steps:
- name: "Check out repository code"
uses: "actions/checkout@v2"
- name: "Setup environment"
uses: "networktocode/gh-action-setup-poetry-environment@v2"
- name: "Install NPM Dependencies"
working-directory: ./nautobot/ui
run: "npm ci"
- name: "Setup base aliases for tests"
working-directory: ./nautobot/ui
run: "mkdir generated && cp src/file_templates/jsconfig-base.json generated/jsconfig.paths.json"
- name: "Setup base app_imports for mock"
working-directory: ./nautobot/ui
run: "echo 'export const NautobotApps = {}; export default NautobotApps;' > generated/app_imports.js"
- name: "Run unittest-ui"
working-directory: ./nautobot/ui
run: "poetry run invoke unittest-ui"
migration-tests-mysql:
name: "Run migrations against test dataset (MySQL and Python 3.8)"
runs-on: "ubuntu-20.04"
env:
MIGRATION_TEST_DATASET: "development/datasets/nautobot_1.5.16_mysql.tar.gz"
INVOKE_NAUTOBOT_LOCAL: "True"
NAUTOBOT_CONFIG: "nautobot/core/tests/nautobot_config.py"
NAUTOBOT_DB_USER: "root"
NAUTOBOT_DB_PASSWORD: "decinablesprewad"
NAUTOBOT_DB_HOST: "127.0.0.1"
NAUTOBOT_DB_PORT: "3306"
NAUTOBOT_DB_ENGINE: "django_prometheus.db.backends.mysql"
services:
mysql:
image: "mysql:8"
env:
MYSQL_ROOT_PASSWORD: "decinablesprewad"
MYSQL_PASSWORD: "decinablesprewad"
MYSQL_DATABASE: "nautobot"
ports:
- "3306:3306"
steps:
- name: "Check out repository code"
uses: "actions/checkout@v2"
- name: "Setup environment"
uses: "networktocode/gh-action-setup-poetry-environment@v2"
with:
python-version: "3.8"
- name: "Remove Installed Nautobots (Poetry Workaround)" # Workaround for https://github.com/python-poetry/poetry/issues/2918
run: "for i in $(ls -d1 ~/.cache/pypoetry/virtualenvs/*/lib/*/site-packages/nautobot-*.dist-info); do poetry run pip uninstall -y nautobot; done"
- name: "Reinstall Nautobot Local"
run: "poetry install"
- name: "Install Required Dependencies for MySql Client"
run: "sudo apt-get update && sudo apt-get install --no-install-recommends -y default-libmysqlclient-dev gcc"
- name: "Install MySql Dependencies"
run: "poetry install --no-interaction --no-root --extras mysql"
- name: "Run migration test"
run: "poetry run invoke migration-test --db-engine mysql --dataset $MIGRATION_TEST_DATASET"
migration-tests-postgres:
name: "Run migrations against test dataset (PostgreSQL and Python 3.11)"
runs-on: "ubuntu-20.04"
env:
MIGRATION_TEST_DATASET: "development/datasets/nautobot_1.5.16_postgres.tar.gz"
INVOKE_NAUTOBOT_LOCAL: "True"
NAUTOBOT_CONFIG: "nautobot/core/tests/nautobot_config.py"
NAUTOBOT_DB_USER: "nautobot"
NAUTOBOT_DB_PASSWORD: "decinablesprewad"
NAUTOBOT_DB_ENGINE: "django_prometheus.db.backends.postgresql"
PGPASSWORD: "decinablesprewad"
services:
postgres:
image: "postgres:13-alpine"
env:
POSTGRES_USER: "nautobot"
POSTGRES_PASSWORD: "decinablesprewad"
POSTGRES_DB: "nautobot"
ports:
- "5432:5432"
steps:
- name: "Check out repository code"
uses: "actions/checkout@v2"
- name: "Setup environment"
uses: "networktocode/gh-action-setup-poetry-environment@v2"
with:
python-version: "3.11"
- name: "Remove Installed Nautobots (Poetry Workaround)" # Workaround for https://github.com/python-poetry/poetry/issues/2918
run: "for i in $(ls -d1 ~/.cache/pypoetry/virtualenvs/*/lib/*/site-packages/nautobot-*.dist-info); do poetry run pip uninstall -y nautobot; done"
- name: "Reinstall Nautobot Local"
run: "poetry install"
- name: "Run migration test"
run: "poetry run invoke migration-test --db-engine postgres --dataset $MIGRATION_TEST_DATASET"
integration-test:
runs-on: "ubuntu-22.04"
env:
INVOKE_NAUTOBOT_LOCAL: "True"
NAUTOBOT_DB_USER: "nautobot"
NAUTOBOT_DB_PASSWORD: "decinablesprewad"
NAUTOBOT_DB_ENGINE: "django_prometheus.db.backends.postgresql"
NAUTOBOT_SELENIUM_URL: "http://localhost:4444/wd/hub"
services:
postgres:
image: "postgres:13-alpine"
env:
POSTGRES_USER: "nautobot"
POSTGRES_PASSWORD: "decinablesprewad"
POSTGRES_DB: "nautobot"
ports:
- "5432:5432"
redis:
image: "redis:6-alpine"
ports:
- "6379:6379"
selenium:
image: "selenium/standalone-firefox:4.9.1"
ports:
- "4444:4444"
steps:
- name: "Check out repository code"
uses: "actions/checkout@v3"
- name: "Setup environment"
uses: "networktocode/gh-action-setup-poetry-environment@v2"
- name: "Remove Installed Nautobots (Poetry Workaround)" # Workaround for https://github.com/python-poetry/poetry/issues/2918
run: "for i in $(ls -d1 ~/.cache/pypoetry/virtualenvs/*/lib/*/site-packages/nautobot-*.dist-info); do poetry run pip uninstall -y nautobot; done"
- name: "Reinstall Nautobot Local"
run: "poetry install"
- name: "Run Integration Tests"
# If NAUTOBOT_SELENIUM_HOST is set to 'localhost' or '127.0.0.1' the connection does not work
run: "NAUTOBOT_SELENIUM_HOST=`hostname -f` poetry run invoke integration-test --keepdb"
- name: "Run coverage"
run: "poetry run invoke unittest-coverage"
container-build:
name: "Build Container Images (amd64 on GHCR Only)"
runs-on: "ubuntu-22.04"
if: |
github.event_name == 'push' &&
(github.ref_name == 'develop' || github.ref_name == 'next' || github.ref_name == 'ltm/1.6')
needs:
- "check-schema"
- "integration-test"
- "migration-tests-mysql"
- "migration-tests-postgres"
- "tests-mysql"
- "tests-postgres"
- "tests-ui"
strategy:
fail-fast: true
matrix:
python-version: [ "3.8", "3.9", "3.10", "3.11" ]
steps:
- name: "Configuration"
id: "config"
shell: "bash"
run: |
if [[ "${{ github.ref_name }}" == "ltm/1.6" ]]; then
export BRANCH="ltm-1.6"
else
export BRANCH="${{ github.ref_name }}"
fi
export TAG_LATEST="false"
export TAG_LATEST_FOR_BRANCH="false"
export TAG_LATEST_FOR_PY="false"
if [[ $BRANCH == "develop" ]]; then
export TAG_LATEST_FOR_PY="true"
fi
if [[ "${{ matrix.python-version }}" == "3.11" ]]; then
export TAG_LATEST_FOR_BRANCH="true"
if [[ $TAG_LATEST_FOR_PY == "true" ]]; then
export TAG_LATEST="true"
fi
fi
echo "branch=$BRANCH" >> $GITHUB_OUTPUT
echo "tag-latest=$TAG_LATEST" >> $GITHUB_OUTPUT
echo "tag-latest-for-branch=$TAG_LATEST_FOR_BRANCH" >> $GITHUB_OUTPUT
echo "tag-latest-for-py=$TAG_LATEST_FOR_PY" >> $GITHUB_OUTPUT
- name: "Check out repository code"
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.actor }}"
password: "${{ secrets.GITHUB_TOKEN }}"
- name: "Build `final`"
if: |
steps.config.outputs.tag-latest-for-branch == 'true'
uses: "./.github/actions/build-nautobot-image"
with:
branch: "${{ steps.config.outputs.branch }}"
image: "ghcr.io/nautobot/nautobot"
platforms: "linux/amd64"
push: "false"
python-version: "${{ matrix.python-version }}"
tag-latest: "${{ steps.config.outputs.tag-latest }}"
tag-latest-for-branch: "${{ steps.config.outputs.tag-latest-for-branch }}"
tag-latest-for-py: "${{ steps.config.outputs.tag-latest-for-py }}"
target: "final"
- name: "Build and Push `final-dev`"
uses: "./.github/actions/build-nautobot-image"
with:
branch: "${{ steps.config.outputs.branch }}"
image: "ghcr.io/nautobot/nautobot-dev"
platforms: "linux/amd64"
push: "true"
python-version: "${{ matrix.python-version }}"
tag-latest: "${{ steps.config.outputs.tag-latest }}"
tag-latest-for-branch: "${{ steps.config.outputs.tag-latest-for-branch }}"
tag-latest-for-py: "${{ steps.config.outputs.tag-latest-for-py }}"
target: "final-dev"