Skip to content

Commit

Permalink
✨ feat: Added Docker push workflow, Dockerfile updates, and build scr…
Browse files Browse the repository at this point in the history
…ipt (#807)

* ✨ feat: Added Docker push workflow, Dockerfile updates, and build script

add Docker Push workflow and stages for building and pushing Docker images with different variants for autoraghq/autorag, including handling production image tagging and updating Docker Hub description.

* ♻️ refactor: remove unnecessary tags and pull request configuration from Docker Push workflow

---------

Co-authored-by: Jeffrey (Dongkyu) Kim <[email protected]>
  • Loading branch information
hongsw and vkehfdl1 authored Oct 8, 2024
1 parent 98c35c0 commit 5c4c0f2
Show file tree
Hide file tree
Showing 4 changed files with 157 additions and 11 deletions.
91 changes: 91 additions & 0 deletions .github/workflows/docker-push.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
name: Docker Push

on:
push:
branches: [ "main" ]

env:
DOCKER_REPO: "autoraghq/autorag"

jobs:
check-version:
runs-on: ubuntu-latest
outputs:
changed: ${{ steps.version_changed.outputs.changed }}
steps:
- name: Checkout code
uses: actions/[email protected]

- name: Get changed files
id: changed-files
uses: tj-actions/[email protected]

- name: Check for VERSION file change
id: version_changed
env:
ALL_CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }}
run: |
echo "changed=false" >> $GITHUB_OUTPUT
if echo "${ALL_CHANGED_FILES}" | grep -q 'VERSION'; then
echo "changed=true" >> $GITHUB_OUTPUT
fi
build-and-push:
needs: check-version
if: needs.check-version.outputs.changed == 'true'
runs-on: ubuntu-latest
strategy:
matrix:
variant: [all] # [all, ko, dev, parsing]
steps:
- name: Checkout code
uses: actions/[email protected]

- name: Read VERSION file
run: echo "VERSION=$(cat autorag/VERSION)" >> $GITHUB_ENV

- name: Set up Docker Buildx
uses: docker/[email protected]

- name: Login to Docker Hub
uses: docker/[email protected]
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}

- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/[email protected]
with:
images: ${{ env.DOCKER_REPO }}
tags: |
type=raw,value=${{ env.VERSION }}-${{ matrix.variant }}
type=raw,value=${{ matrix.variant }},enable=${{ github.ref == format('refs/heads/{0}', 'main') }}
type=raw,value=latest-${{ matrix.variant }},enable=${{ github.ref == format('refs/heads/{0}', 'main') }}
- name: Build and push Docker image
uses: docker/[email protected]
with:
context: .
file: ./Dockerfile
push: true
# push: ${{ github.event_name != 'pull_request' && matrix.variant != 'test' }}
tags: ${{ env.DOCKER_REPO }}:${{ env.VERSION }}-${{matrix.variant}}
labels: ${{ steps.meta.outputs.labels }}
build-args: |
TARGET_STAGE=${{ matrix.variant }}
- name: Tag and push 'all' for production
run: |
docker pull ${{ env.DOCKER_REPO }}:${{ env.VERSION }}-${{matrix.variant}}
docker tag ${{ env.DOCKER_REPO }}:${{ env.VERSION }}-${{matrix.variant}} ${{ env.DOCKER_REPO }}:latest
docker push ${{ env.DOCKER_REPO }}:${{ env.VERSION }}-${{matrix.variant}}
docker push ${{ env.DOCKER_REPO }}:latest
# - name: Update Docker Hub description
# uses: peter-evans/dockerhub-description@v3
# with:
# username: ${{ secrets.DOCKER_HUB_USERNAME }}
# password: ${{ secrets.DOCKER_HUB_PASSWORD }}
# repository: ${{ env.DOCKER_REPO }}
# short-description: ${{ github.event.repository.description }}
36 changes: 26 additions & 10 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Base stage: Install dependencies
# Base stage: Install common dependencies
FROM python:3.10-slim AS base

# Install system dependencies
Expand All @@ -19,27 +19,43 @@ WORKDIR /usr/src/app
# Install Python dependencies
RUN pip install --upgrade pip setuptools setuptools-scm
COPY requirements.txt /usr/src/app/requirements.txt

RUN pip install -r requirements.txt

# Copy project files
COPY . /usr/src/app
RUN pip install -e ./

# Test stage: Run tests if CI=true
# Test stage
FROM base AS test

# Install testing dependencies
RUN pip install pytest pytest-xdist

# Run tests if CI is set to true
RUN pytest -o log_cli=true --log-cli-level=INFO -n auto tests
# Ko stage
FROM base AS ko
RUN pip install --no-cache-dir kiwipiepy>=0.18.0 konlpy
ENTRYPOINT ["python", "-m", "autorag.cli"]

# Dev stage
FROM base AS dev
RUN pip install --no-cache-dir ruff pre-commit
ENTRYPOINT ["python", "-m", "autorag.cli"]

# Parsing stage
FROM base AS parsing
RUN pip install --no-cache-dir PyMuPDF pdfminer.six pdfplumber unstructured jq "unstructured[pdf]" "PyPDF2<3.0" pdf2image
ENTRYPOINT ["python", "-m", "autorag.cli"]

# Parsing stage
FROM base AS all
# TODO
ENTRYPOINT ["python", "-m", "autorag.cli"]

# Production stage: Create final image for production
# Production stage (includes all features)
FROM base AS production
RUN pip install --no-cache-dir \
kiwipiepy>=0.18.0 konlpy \
ruff pre-commit \
PyMuPDF pdfminer.six pdfplumber unstructured jq "unstructured[pdf]" "PyPDF2<3.0" pdf2image

COPY projects /usr/src/app/projects

# Set the entrypoint for the production application
ENTRYPOINT ["python", "-m", "autorag.cli"]
# ENTRYPOINT ["bash"]
2 changes: 1 addition & 1 deletion autorag/VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.3.3
0.3.3-rc16
39 changes: 39 additions & 0 deletions build_and_push.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#!/bin/bash

# Check if version is provided
if [ "$#" -ne 1 ]; then
echo "Usage: $0 <version>"
exit 1
fi

VERSION=$1
DOCKER_REPO="autoraghq/autorag"

# Array of variants
variants=("all" "ko" "dev" "parsing" "test")

# Build and push for each variant
for variant in "${variants[@]}"
do
echo "Building $DOCKER_REPO:$VERSION-$variant"
docker build --build-arg TARGET_STAGE=$variant -t $DOCKER_REPO:$VERSION-$variant -f Dockerfile .

echo "Pushing $DOCKER_REPO:$VERSION-$variant"
docker push $DOCKER_REPO:$VERSION-$variant

# If it's a release build, also tag and push as latest for that variant
if [[ $VERSION =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "Tagging and pushing $DOCKER_REPO:$variant"
docker tag $DOCKER_REPO:$VERSION-$variant $DOCKER_REPO:$variant
docker push $DOCKER_REPO:$variant
fi
done

# Special handling for 'production' as 'all'
if [[ $VERSION =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "Tagging and pushing $DOCKER_REPO:all"
docker tag $DOCKER_REPO:$VERSION-production $DOCKER_REPO:all
docker push $DOCKER_REPO:all
fi

echo "Build and push complete for all variants"

0 comments on commit 5c4c0f2

Please sign in to comment.