Skip to content
Open
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
83 changes: 83 additions & 0 deletions .github/workflows/goose.yml
Original file line number Diff line number Diff line change
@@ -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:
<filename/path (wrapped in backticks)>
- 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
54 changes: 54 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -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"]