Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Merged
merged 3 commits into from
Oct 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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/checkout@v4.2.0

- name: Get changed files
id: changed-files
uses: tj-actions/changed-files@v45.0.3

- 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/checkout@v4.2.0

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

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3.7.1

- name: Login to Docker Hub
uses: docker/login-action@v3.3.0
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}

- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5.5.1
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/build-push-action@v6.9.0
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"