Skip to content

updated ci.yml

updated ci.yml #89

Workflow file for this run

name: CI Pipeline
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
# Export Requirements
export-requirements:
name: Export Requirements
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Install Poetry
run: |
curl -sSL https://install.python-poetry.org | python3 -
export PATH="$HOME/.local/bin:$PATH"
- name: Export Requirements
run: |
poetry export -f requirements.txt --output app/requirements.txt --without-hashes
poetry export -f requirements.txt --with dev --output app/requirements-dev.txt --without-hashes
# Build Dev Docker Image for Testing
build-dev-image:
name: Build Dev Docker Image
runs-on: ubuntu-latest
needs: export-requirements
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Docker Hub Login
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_API_KEY }}
- name: Build Dev Docker Image
run: |
docker buildx build \
--target builder \
--platform linux/amd64 \
--file development/Dockerfile.prod \
--build-arg REQUIREMENTS_FILE=requirements-dev.txt \
--tag ${{ secrets.DOCKER_USERNAME }}/${{ secrets.HEROKU_APP_NAME }}:dev \
--push .
# Test and Lint Stage
test-and-lint:
name: Test and Lint with Dev Image
runs-on: ubuntu-latest
needs: build-dev-image
services:
postgres:
image: postgres:latest
env:
POSTGRES_DB: users
POSTGRES_USER: runner
POSTGRES_PASSWORD: runner
ports:
- 5432:5432
options: >-
--health-cmd="pg_isready -U runner"
--health-interval=10s
--health-timeout=5s
--health-retries=5
env:
DATABASE_URL: ${{ vars.DATABASE_URL }}
DJANGO_ALLOWED_HOSTS: ${{ vars.DJANGO_ALLOWED_HOSTS }}
SECRET_KEY: ${{ secrets.SECRET_KEY }}
steps:
- name: Docker Hub Login
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_API_KEY }}
- name: Pull Dev Docker Image
run: |
docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.HEROKU_APP_NAME }}:dev
- name: Run Django Container for Tests
run: |
docker run -d \
--name test_django_app \
--network=host \
-e DATABASE_URL=${{ vars.DATABASE_URL }} \
-e DJANGO_ALLOWED_HOSTS=${{ vars.DJANGO_ALLOWED_HOSTS }} \
-e SECRET_KEY=${{ secrets.SECRET_KEY }} \
${{ secrets.DOCKER_USERNAME }}/${{ secrets.HEROKU_APP_NAME }}:dev
- name: Run Database Migrations
run: |
docker exec test_django_app python manage.py migrate
- name: Run Tests
run: |
docker exec test_django_app pytest -p no:warnings --cov=.
- name: Run Linting
run: |
docker exec test_django_app bash -c "black --check . --exclude='migrations|env' && \
ruff check . --exclude 'tests/*,movies/migrations/*,tasks.py,drf_project/settings.py'"
- name: Stop and Remove Django Container
run: |
docker stop test_django_app
docker rm test_django_app
# Build Production Docker Image
build-prod-image:
name: Build Production Docker Image
runs-on: ubuntu-latest
needs: test-and-lint
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Docker Hub Login
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_API_KEY }}
- name: Build and Push Prod Docker Image
run: docker ps
- name: Build and Push Prod Docker Image
run: |
docker buildx build \
--platform linux/amd64 \
--file development/Dockerfile.prod \
--build-arg REQUIREMENTS_FILE=requirements.txt \
--tag ${{ secrets.DOCKER_USERNAME }}/${{ secrets.HEROKU_APP_NAME }}:latest \
--push .
# Release Stage
release:
name: Deploy to Heroku
runs-on: ubuntu-latest
needs: build-prod-image
steps:
- name: Docker Hub Login
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_API_KEY }}
- name: Pull Prod Docker Image
run: |
docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.HEROKU_APP_NAME }}:latest
- name: Deploy to Heroku
run: |
heroku container:push web --app ${{ secrets.HEROKU_APP_NAME }}
heroku container:release web --app ${{ secrets.HEROKU_APP_NAME }}