diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 051457a..9c1dd63 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,7 +1,7 @@ FROM mcr.microsoft.com/devcontainers/typescript-node:1-20-bullseye -LABEL org.opencontainers.image.source="https://github.com/acedanger/finance" -LABEL org.opencontainers.image.description="Dev container for Finance App" +LABEL org.opencontainers.image.source=https://github.com/acedanger/finance +LABEL org.opencontainers.image.description="Development container for Finance application with Node.js, TypeScript, and dev tools" # Install additional OS packages RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ diff --git a/.devcontainer/build-and-push.sh b/.devcontainer/build-and-push.sh index 721a0b9..09a85bf 100644 --- a/.devcontainer/build-and-push.sh +++ b/.devcontainer/build-and-push.sh @@ -8,6 +8,15 @@ GITHUB_USERNAME=$1 IMAGE_NAME="finance-devcontainer" IMAGE_TAG="latest" +# Load environment variables from .env file if it exists +ENV_FILE="$(cd "$(dirname "${BASH_SOURCE[0]}")" &> /dev/null && pwd)/.env" +if [ -f "$ENV_FILE" ]; then + echo "Loading environment from $ENV_FILE" + # Use grep to find the PAT line and extract the value, handling both Unix and Windows line endings + GITHUB_PERSONAL_ACCESS_TOKEN=$(grep -a "^GITHUB_PERSONAL_ACCESS_TOKEN=" "$ENV_FILE" | sed 's/^GITHUB_PERSONAL_ACCESS_TOKEN=//' | tr -d '\r') + export GITHUB_PERSONAL_ACCESS_TOKEN +fi + # Check for required username argument if [ -z "${GITHUB_USERNAME:-}" ]; then echo "Error: GitHub username is required" @@ -24,31 +33,41 @@ for cmd in docker gh; do fi done +# Verify PAT is loaded +if [ -z "${GITHUB_PERSONAL_ACCESS_TOKEN:-}" ]; then + echo "Error: GITHUB_PERSONAL_ACCESS_TOKEN is not set" + echo "Please ensure it is defined in $ENV_FILE" + exit 1 +fi + # Check GitHub authentication if ! gh auth status >/dev/null 2>&1; then echo "Error: Not authenticated with GitHub. Please run 'gh auth login' first" exit 1 fi +# Get absolute path to Dockerfile +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" &> /dev/null && pwd)" +DOCKERFILE_PATH="$SCRIPT_DIR/Dockerfile" + FULL_IMAGE_NAME="ghcr.io/$GITHUB_USERNAME/$IMAGE_NAME:$IMAGE_TAG" echo "=== Building Development Container ===" echo "Username: $GITHUB_USERNAME" echo "Image: $FULL_IMAGE_NAME" +echo "Dockerfile: $DOCKERFILE_PATH" +echo "Using PAT: ${GITHUB_PERSONAL_ACCESS_TOKEN:0:4}... (first 4 chars)" # Build the image echo -e "\n=> Building image..." -if ! docker build -t "$FULL_IMAGE_NAME" -f Dockerfile .; then +if ! docker build -t "$FULL_IMAGE_NAME" -f "$DOCKERFILE_PATH" "$SCRIPT_DIR"; then echo "Error: Docker build failed" exit 1 fi -# Ensure logged into GitHub Container Registry -echo -e "\n=> Ensuring GitHub Container Registry access..." -if ! docker login ghcr.io -u "$GITHUB_USERNAME"; then - echo "Error: Failed to authenticate with GitHub Container Registry" - exit 1 -fi +# Log in to GitHub Container Registry +echo -e "\n=> Logging into GitHub Container Registry..." +echo "$GITHUB_PERSONAL_ACCESS_TOKEN" | docker login ghcr.io -u "$GITHUB_USERNAME" --password-stdin # Push to GitHub Container Registry echo -e "\n=> Pushing image to GitHub Container Registry..." diff --git a/README.md b/README.md index bb2dbdf..20b3dc5 100644 --- a/README.md +++ b/README.md @@ -15,16 +15,7 @@ This app is currently deployed using Cloudflare Pages. The logs can be viewed wi ## Development Environment Setup -### Prerequisites -- VS Code with Remote Containers extension -- Docker and Docker Compose -- Git - -### Initial Setup -1. Clone the repository -2. Copy `.devcontainer/.env.example` to `.devcontainer/.env` -3. Update the environment variables in `.devcontainer/.env` -4. Open the project in VS Code and select "Reopen in Container" when prompted +For detailed setup instructions, including container building, environment configuration, and troubleshooting, see [ENVIRONMENT_SETUP.md](ENVIRONMENT_SETUP.md). ### GitHub MCP Server The project uses GitHub's MCP server for development tasks. The server runs in a Docker container and is automatically configured when you open the project in a devcontainer.