cookiecutter-django/{{cookiecutter.project_slug}}/.github/workflows/ci.yml
Paul Wulff 6237573637
Speed up CI pytest by 30%: Change ci.yml to only build images relevant for running pytest (#4863)
In order to run pytest we can constrain the build command to only build the images related to the django service. 

This mainly prevents the docs image from being built unnecessarily.

This cuts run time of the Github Actions workflow from approx. 4min 30s to below 3min.
2024-02-16 09:55:24 +00:00

101 lines
2.5 KiB
YAML

name: CI
# Enable Buildkit and let compose use it to speed up image building
env:
DOCKER_BUILDKIT: 1
COMPOSE_DOCKER_CLI_BUILD: 1
on:
pull_request:
branches: ['master', 'main']
paths-ignore: ['docs/**']
push:
branches: ['master', 'main']
paths-ignore: ['docs/**']
concurrency:
group: {% raw %}${{ github.head_ref || github.run_id }}{% endraw %}
cancel-in-progress: true
jobs:
linter:
runs-on: ubuntu-latest
steps:
- name: Checkout Code Repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
{%- if cookiecutter.open_source_license != 'Not open source' %}
# Consider using pre-commit.ci for open source project
{%- endif %}
- name: Run pre-commit
uses: pre-commit/action@v3.0.0
# With no caching at all the entire ci process takes 3m to complete!
pytest:
runs-on: ubuntu-latest
{%- if cookiecutter.use_docker == 'n' %}
services:
{%- if cookiecutter.use_celery == 'y' %}
redis:
image: redis:6
ports:
- 6379:6379
{%- endif %}
postgres:
image: postgres:{{ cookiecutter.postgresql_version }}
ports:
- 5432:5432
env:
POSTGRES_PASSWORD: postgres
env:
{%- if cookiecutter.use_celery == 'y' %}
CELERY_BROKER_URL: 'redis://localhost:6379/0'
{%- endif %}
# postgres://user:password@host:port/database
DATABASE_URL: 'postgres://postgres:postgres@localhost:5432/postgres'
{%- endif %}
steps:
- name: Checkout Code Repository
uses: actions/checkout@v4
{%- if cookiecutter.use_docker == 'y' %}
- name: Build the Stack
run: docker compose -f local.yml build django
- name: Run DB Migrations
run: docker compose -f local.yml run --rm django python manage.py migrate
- name: Run Django Tests
run: docker compose -f local.yml run django pytest
- name: Tear down the Stack
run: docker compose -f local.yml down
{%- else %}
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
cache: pip
cache-dependency-path: |
requirements/base.txt
requirements/local.txt
- name: Install Dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements/local.txt
- name: Test with pytest
run: pytest
{%- endif %}