diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml index 86da3d0..11fd3de 100644 --- a/.gitea/workflows/build.yaml +++ b/.gitea/workflows/build.yaml @@ -15,6 +15,13 @@ jobs: - name: Checkout uses: actions/checkout@v3 + - name: Checkout schwab-scraper + uses: actions/checkout@v3 + with: + repository: b3nw/schwab-scraper + path: vendor/schwab-scraper + token: ${{ secrets.CR_PAT }} + - name: Login to Gitea Container Registry uses: docker/login-action@v2 with: @@ -28,5 +35,3 @@ jobs: context: . push: true tags: gitea.ext.ben.io/${{ gitea.repository }}:latest - build-args: | - GIT_TOKEN=${{ secrets.CR_PAT }} diff --git a/.gitignore b/.gitignore index efc1a35..bf1c2ce 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ config.json cookies.json .pytest_cache/ .ruff_cache/ +vendor/ diff --git a/Dockerfile b/Dockerfile index ce4dc84..c9830df 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,39 +2,31 @@ FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim AS builder ENV UV_COMPILE_BYTECODE=1 UV_LINK_MODE=copy -RUN apt-get update && apt-get install -y --no-install-recommends git && rm -rf /var/lib/apt/lists/* - WORKDIR /app -ARG GIT_TOKEN="" -RUN if [ -n "$GIT_TOKEN" ]; then \ - git config --global url."https://gitea.ext.ben.io/".insteadOf "ssh://gitea@git.local.ben.io/" && \ - git config --global --add url."https://gitea.ext.ben.io/".insteadOf "ssh://git.local.ben.io/" && \ - echo "machine gitea.ext.ben.io login b3nw password ${GIT_TOKEN}" > /root/.netrc && \ - chmod 600 /root/.netrc; \ - fi - COPY pyproject.toml uv.lock ./ -RUN uv sync --frozen --no-dev --no-install-project +COPY vendor/schwab-scraper /tmp/schwab-scraper + +# Install schwab-scraper from vendored source, then all other deps. +# We strip the git dependency from pyproject.toml so uv doesn't try to fetch it. +RUN uv venv && \ + uv pip install /tmp/schwab-scraper && \ + sed -i '/schwab-scraper/d' pyproject.toml && \ + uv pip install -r pyproject.toml && \ + uv pip install --upgrade playwright && \ + rm -rf /tmp/schwab-scraper COPY . . -RUN uv sync --frozen --no-dev FROM python:3.12-slim-bookworm RUN apt-get update && apt-get install -y --no-install-recommends curl && rm -rf /var/lib/apt/lists/* WORKDIR /app - -# Copy the environment from the builder COPY --from=builder /app /app -# Set up environment variables ENV PATH="/app/.venv/bin:$PATH" ENV PORT=8000 -# Expose the port EXPOSE 8000 - -# Run the server CMD ["python", "server.py"] diff --git a/pyproject.toml b/pyproject.toml index e737f82..c0ec360 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,7 @@ dependencies = [ "fastapi>=0.136.1", "greenlet>=3.2.3", "pdfplumber>=0.11.4", - "playwright==1.54.0", + "playwright>=1.54.0", "pyee>=13.0.0", "typing-extensions>=4.14.0", ] diff --git a/scripts/build.sh b/scripts/build.sh new file mode 100755 index 0000000..df614ad --- /dev/null +++ b/scripts/build.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PROJECT_DIR="$(dirname "$SCRIPT_DIR")" +SCRAPER_DIR="/home/b3nw/projects/financial/schwab-scraper" +IMAGE="gitea.ext.ben.io/b3nw/schwab-mcp-custom:latest" +BUILD_HOST="${BUILD_HOST:-docker-test}" + +cd "$PROJECT_DIR" + +echo "==> Preparing vendor directory..." +rm -rf vendor/schwab-scraper +mkdir -p vendor/schwab-scraper +git -C "$SCRAPER_DIR" archive HEAD | tar -x -C vendor/schwab-scraper + +echo "==> Syncing build context to $BUILD_HOST..." +rsync -az --delete \ + --exclude '.venv' \ + --exclude '.git' \ + --exclude '__pycache__' \ + --exclude 'cookies.json' \ + --exclude 'config.json' \ + --exclude '.env' \ + "$PROJECT_DIR/" "$BUILD_HOST:/tmp/schwab-mcp-build/" + +echo "==> Building Docker image on $BUILD_HOST..." +ssh "$BUILD_HOST" "cd /tmp/schwab-mcp-build && docker build -t $IMAGE ." + +echo "==> Pushing image to registry..." +ssh "$BUILD_HOST" "docker push $IMAGE" + +echo "==> Cleaning up..." +rm -rf vendor/schwab-scraper +ssh "$BUILD_HOST" "rm -rf /tmp/schwab-mcp-build" + +echo "==> Done! Image pushed: $IMAGE"