Skip to content

Commit

Permalink
Add backend dockerfile and cd workflow
Browse files Browse the repository at this point in the history
  • Loading branch information
sahinakkaya committed Dec 6, 2024
1 parent aac4f23 commit a414833
Show file tree
Hide file tree
Showing 2 changed files with 123 additions and 0 deletions.
44 changes: 44 additions & 0 deletions .github/workflows/backends.cd.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
name: Backend CD
on:
workflow_dispatch:
# schedule:
# - cron: '38 19 * * *' # run the cron job every day at 19.38
# push:
# branches:
# - "main"
# tags-ignore:
# - "**"
# paths:
# - "backend/**"
# - ".github/workflows/**"
# - ".github/actions/**"
env:
REGISTRY: ghcr.io
jobs:
build-and-push-blackjack-backend:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Log in to the Container registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/sahinakkaya/blackjack-backend
- name: Build and push Docker image
uses: docker/build-push-action@v6
with:
context: server
file: server/Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
79 changes: 79 additions & 0 deletions server/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
# syntax=docker/dockerfile:1
# Keep this syntax directive! It's used to enable Docker BuildKit

# Based on https://github.com/python-poetry/poetry/discussions/1879?sort=top#discussioncomment-216865
# but I try to keep it updated (see history)

################################
# PYTHON-BASE
# Sets up all our shared environment variables
################################
FROM python:3.12-slim as python-base

Check warning on line 11 in server/Dockerfile

View workflow job for this annotation

GitHub Actions / build-and-push-blackjack-backend

The 'as' keyword should match the case of the 'from' keyword

FromAsCasing: 'as' and 'FROM' keywords' casing do not match More info: https://docs.docker.com/go/dockerfile/rule/from-as-casing/

# python
ENV PYTHONUNBUFFERED=1 \
# prevents python creating .pyc files
PYTHONDONTWRITEBYTECODE=1 \
\
# pip
PIP_DISABLE_PIP_VERSION_CHECK=on \
PIP_DEFAULT_TIMEOUT=100 \
\
# poetry
# https://python-poetry.org/docs/configuration/#using-environment-variables
POETRY_VERSION=1.8.2 \
# make poetry install to this location
POETRY_HOME="/opt/poetry" \
# make poetry create the virtual environment in the project's root
# it gets named `.venv`
POETRY_VIRTUALENVS_IN_PROJECT=true \
# do not ask any interactive question
POETRY_NO_INTERACTION=1 \
\
# paths
# this is where our requirements + virtual environment will live
PYSETUP_PATH="/opt/pysetup" \
VENV_PATH="/opt/pysetup/.venv"

# prepend poetry and venv to path
ENV PATH="$POETRY_HOME/bin:$VENV_PATH/bin:$PATH"


################################
# BUILDER-BASE
# Used to build deps + create our virtual environment
################################
FROM python-base as builder-base

Check warning on line 46 in server/Dockerfile

View workflow job for this annotation

GitHub Actions / build-and-push-blackjack-backend

The 'as' keyword should match the case of the 'from' keyword

FromAsCasing: 'as' and 'FROM' keywords' casing do not match More info: https://docs.docker.com/go/dockerfile/rule/from-as-casing/
RUN apt-get update \
&& apt-get install --no-install-recommends -y \
# deps for installing poetry
curl \
# deps for building python deps
build-essential

# install poetry - respects $POETRY_VERSION & $POETRY_HOME
# The --mount will mount the buildx cache directory to where
# Poetry and Pip store their cache so that they can re-use it
RUN --mount=type=cache,target=/root/.cache \
curl -sSL https://install.python-poetry.org | python3 -

# copy project requirement files here to ensure they will be cached.
WORKDIR $PYSETUP_PATH
COPY poetry.lock pyproject.toml ./

# install runtime deps - uses $POETRY_VIRTUALENVS_IN_PROJECT internally
RUN --mount=type=cache,target=/root/.cache \
poetry install --no-root --no-directory --only main

################################
# PRODUCTION
# Final image used for runtime
################################
FROM python-base as production

Check warning on line 72 in server/Dockerfile

View workflow job for this annotation

GitHub Actions / build-and-push-blackjack-backend

The 'as' keyword should match the case of the 'from' keyword

FromAsCasing: 'as' and 'FROM' keywords' casing do not match More info: https://docs.docker.com/go/dockerfile/rule/from-as-casing/
ENV FASTAPI_ENV=production
COPY --from=builder-base $PYSETUP_PATH $PYSETUP_PATH
COPY ./blackjack /app/blackjack

WORKDIR /app

CMD ["gunicorn", "-b", ":8000", "-k", "uvicorn.workers.UvicornWorker", "blackjack.socketio_test:app"]

0 comments on commit a414833

Please sign in to comment.