diff --git a/.github/workflows/goose.yml b/.github/workflows/goose.yml new file mode 100644 index 0000000..e8cd368 --- /dev/null +++ b/.github/workflows/goose.yml @@ -0,0 +1,83 @@ +name: Goose + +on: + pull_request: + types: [opened, synchronize, reopened, labeled] + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + issues: write + +env: + PROVIDER_API_KEY: ${{ secrets.GOOGLE_API_KEY }} + PR_NUMBER: ${{ github.event.pull_request.number }} + GH_TOKEN: ${{ github.token }} + +jobs: + goose-comment: + name: Goose Comment + runs-on: ubuntu-latest + steps: + - name: Check out repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Gather PR information + run: | + { + echo "# Files Changed" + gh pr view "$PR_NUMBER" --json files \ + -q '.files[] | "* " + .path + " (" + (.additions|tostring) + " additions, " + (.deletions|tostring) + " deletions)"' + echo "" + echo "# Changes Summary" + gh pr diff "$PR_NUMBER" + } > changes.txt + + - name: Install Goose CLI + run: | + mkdir -p /home/runner/.local/bin + curl -fsSL https://github.com/block/goose/releases/download/stable/download_cli.sh \ + | CONFIGURE=false INSTALL_PATH=/home/runner/.local/bin bash + echo "/home/runner/.local/bin" >> "$GITHUB_PATH" + + - name: Configure Goose + run: | + mkdir -p ~/.config/goose + cat > ~/.config/goose/config.yaml <<'EOF' + GOOSE_PROVIDER: google + GOOSE_MODEL: gemini-2.0-flash-exp + keyring: false + EOF + + - name: Create instructions for Goose + run: | + cat > instructions.txt <<'EOF' + Create a summary of the changes provided. Don't provide any session or logging details. + The summary for each file should be brief and structured as: + + - dot points of changes + You don't need any extensions, don't mention extensions at all. + The changes to summarise are: + EOF + cat changes.txt >> instructions.txt + + - name: Test + run: cat instructions.txt + + - name: Run Goose and filter output + run: | + goose run --instructions instructions.txt \ + | sed -E 's/\x1B\[[0-9;]*[mK]//g' \ + | grep -v "logging to /home/runner/.config/goose/sessions/" \ + | grep -v "^starting session" \ + | grep -v "^Closing session" \ + | sed 's/[[:space:]]*$//' \ + > pr_comment.txt + + - name: Post comment to PR + run: | + cat -A pr_comment.txt + gh pr comment "$PR_NUMBER" --body-file pr_comment.txt diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f9554ed --- /dev/null +++ b/Dockerfile @@ -0,0 +1,54 @@ +# Multi-stage Dockerfile for Tech Stack Advisor ML App +# +# Stage 1: Builder stage for training the model +FROM python:3.11-slim AS builder + +WORKDIR /app + +# Install build dependencies +RUN apt-get update && apt-get install -y \ + gcc \ + python3-dev \ + && rm -rf /var/lib/apt/lists/* + +# Copy requirements and install Python dependencies +COPY requirements.txt . +RUN pip install --no-cache-dir --user -r requirements.txt + +# Copy training script and train the model +COPY train.py . +RUN python train.py + +# Stage 2: Production runtime stage +FROM python:3.11-slim AS production + +# Create non-root user for security +RUN useradd --create-home --shell /bin/bash mluser + +WORKDIR /app + +# Copy Python packages from builder stage +COPY --from=builder /root/.local /home/mluser/.local + +# Copy application files +COPY app.py . +COPY requirements.txt . + +# Copy trained model from builder stage +COPY --from=builder /app/model.pkl . +COPY --from=builder /app/encoders.pkl . + +# Set ownership and switch to non-root user +RUN chown -R mluser:mluser /app +USER mluser + +# Make sure scripts in .local are usable +ENV PATH=/home/mluser/.local/bin:$PATH + +# Add health check +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ + CMD python -c "import requests; requests.get('http://localhost:7860', timeout=3)" || exit 1 + +EXPOSE 7860 + +CMD ["python", "app.py"]