diff --git a/scripts/docker-utils.ps1 b/scripts/docker-utils.ps1 new file mode 100644 index 00000000..59c94636 --- /dev/null +++ b/scripts/docker-utils.ps1 @@ -0,0 +1,139 @@ +# Docker utilities for Swarms project (PowerShell version) +# Usage: .\scripts\docker-utils.ps1 [command] + +param( + [Parameter(Position=0)] + [string]$Command = "help" +) + +# Configuration +$ImageName = "swarms" +$Registry = "kyegomez" +$FullImageName = "$Registry/$ImageName" + +# Functions +function Write-Usage { + Write-Host "Docker Utilities for Swarms" -ForegroundColor Blue + Write-Host "" + Write-Host "Usage: .\scripts\docker-utils.ps1 [command]" + Write-Host "" + Write-Host "Commands:" + Write-Host " build Build the Docker image locally" + Write-Host " test Test the Docker image" + Write-Host " run Run the Docker image interactively" + Write-Host " push Push to DockerHub (requires login)" + Write-Host " clean Clean up Docker images and containers" + Write-Host " logs Show logs from running containers" + Write-Host " shell Open shell in running container" + Write-Host " compose-up Start services with docker-compose" + Write-Host " compose-down Stop services with docker-compose" + Write-Host " help Show this help message" + Write-Host "" +} + +function Build-Image { + Write-Host "Building Docker image..." -ForegroundColor Green + docker build -t "$ImageName`:latest" . + Write-Host "✅ Image built successfully!" -ForegroundColor Green +} + +function Test-Image { + Write-Host "Testing Docker image..." -ForegroundColor Green + docker run --rm "$ImageName`:latest" python test_docker.py + Write-Host "✅ Image test completed!" -ForegroundColor Green +} + +function Run-Interactive { + Write-Host "Running Docker image interactively..." -ForegroundColor Green + docker run -it --rm -v "${PWD}:/app" -w /app "$ImageName`:latest" bash +} + +function Push-ToDockerHub { + Write-Host "⚠️ Make sure you're logged into DockerHub first!" -ForegroundColor Yellow + Write-Host "Pushing to DockerHub..." -ForegroundColor Green + + # Tag the image + docker tag "$ImageName`:latest" "$FullImageName`:latest" + + # Push to DockerHub + docker push "$FullImageName`:latest" + + Write-Host "✅ Image pushed to DockerHub!" -ForegroundColor Green +} + +function Clean-Docker { + Write-Host "Cleaning up Docker resources..." -ForegroundColor Yellow + + # Stop and remove containers + docker ps -aq | ForEach-Object { docker rm -f $_ } + + # Remove images + docker images "$ImageName" -q | ForEach-Object { docker rmi -f $_ } + + # Remove dangling images + docker image prune -f + + Write-Host "✅ Docker cleanup completed!" -ForegroundColor Green +} + +function Show-Logs { + Write-Host "Showing logs from running containers..." -ForegroundColor Green + docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" + Write-Host "" + + # Show logs for swarms containers + $containers = docker ps --filter "name=swarms" --format "{{.Names}}" + foreach ($container in $containers) { + Write-Host "Logs for $container:" -ForegroundColor Blue + docker logs $container --tail 20 + Write-Host "" + } +} + +function Open-Shell { + Write-Host "Opening shell in running container..." -ForegroundColor Green + + # Find running swarms container + $container = docker ps --filter "name=swarms" --format "{{.Names}}" | Select-Object -First 1 + + if (-not $container) { + Write-Host "❌ No running swarms container found!" -ForegroundColor Red + Write-Host "Start a container first with: .\scripts\docker-utils.ps1 run" + exit 1 + } + + Write-Host "Opening shell in $container..." -ForegroundColor Blue + docker exec -it $container bash +} + +function Compose-Up { + Write-Host "Starting services with docker-compose..." -ForegroundColor Green + docker-compose up -d + Write-Host "✅ Services started!" -ForegroundColor Green + Write-Host "Use 'docker-compose logs -f' to view logs" +} + +function Compose-Down { + Write-Host "Stopping services with docker-compose..." -ForegroundColor Yellow + docker-compose down + Write-Host "✅ Services stopped!" -ForegroundColor Green +} + +# Main script logic +switch ($Command.ToLower()) { + "build" { Build-Image } + "test" { Test-Image } + "run" { Run-Interactive } + "push" { Push-ToDockerHub } + "clean" { Clean-Docker } + "logs" { Show-Logs } + "shell" { Open-Shell } + "compose-up" { Compose-Up } + "compose-down" { Compose-Down } + "help" { Write-Usage } + default { + Write-Host "❌ Unknown command: $Command" -ForegroundColor Red + Write-Usage + exit 1 + } +} \ No newline at end of file diff --git a/scripts/docker-utils.sh b/scripts/docker-utils.sh new file mode 100644 index 00000000..5b86e7dd --- /dev/null +++ b/scripts/docker-utils.sh @@ -0,0 +1,167 @@ +#!/bin/bash + +# Docker utilities for Swarms project +# Usage: ./scripts/docker-utils.sh [command] + +set -e + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Configuration +IMAGE_NAME="swarms" +REGISTRY="kyegomez" +FULL_IMAGE_NAME="${REGISTRY}/${IMAGE_NAME}" + +# Functions +print_usage() { + echo -e "${BLUE}Docker Utilities for Swarms${NC}" + echo "" + echo "Usage: $0 [command]" + echo "" + echo "Commands:" + echo " build Build the Docker image locally" + echo " test Test the Docker image" + echo " run Run the Docker image interactively" + echo " push Push to DockerHub (requires login)" + echo " clean Clean up Docker images and containers" + echo " logs Show logs from running containers" + echo " shell Open shell in running container" + echo " compose-up Start services with docker-compose" + echo " compose-down Stop services with docker-compose" + echo " help Show this help message" + echo "" +} + +build_image() { + echo -e "${GREEN}Building Docker image...${NC}" + docker build -t "${IMAGE_NAME}:latest" . + echo -e "${GREEN}✅ Image built successfully!${NC}" +} + +test_image() { + echo -e "${GREEN}Testing Docker image...${NC}" + docker run --rm "${IMAGE_NAME}:latest" python test_docker.py + echo -e "${GREEN}✅ Image test completed!${NC}" +} + +run_interactive() { + echo -e "${GREEN}Running Docker image interactively...${NC}" + docker run -it --rm \ + -v "$(pwd):/app" \ + -w /app \ + "${IMAGE_NAME}:latest" bash +} + +push_to_dockerhub() { + echo -e "${YELLOW}⚠️ Make sure you're logged into DockerHub first!${NC}" + echo -e "${GREEN}Pushing to DockerHub...${NC}" + + # Tag the image + docker tag "${IMAGE_NAME}:latest" "${FULL_IMAGE_NAME}:latest" + + # Push to DockerHub + docker push "${FULL_IMAGE_NAME}:latest" + + echo -e "${GREEN}✅ Image pushed to DockerHub!${NC}" +} + +clean_docker() { + echo -e "${YELLOW}Cleaning up Docker resources...${NC}" + + # Stop and remove containers + docker ps -aq | xargs -r docker rm -f + + # Remove images + docker images "${IMAGE_NAME}" -q | xargs -r docker rmi -f + + # Remove dangling images + docker image prune -f + + echo -e "${GREEN}✅ Docker cleanup completed!${NC}" +} + +show_logs() { + echo -e "${GREEN}Showing logs from running containers...${NC}" + docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" + echo "" + + # Show logs for swarms containers + for container in $(docker ps --filter "name=swarms" --format "{{.Names}}"); do + echo -e "${BLUE}Logs for $container:${NC}" + docker logs "$container" --tail 20 + echo "" + done +} + +open_shell() { + echo -e "${GREEN}Opening shell in running container...${NC}" + + # Find running swarms container + container=$(docker ps --filter "name=swarms" --format "{{.Names}}" | head -1) + + if [ -z "$container" ]; then + echo -e "${RED}❌ No running swarms container found!${NC}" + echo "Start a container first with: $0 run" + exit 1 + fi + + echo -e "${BLUE}Opening shell in $container...${NC}" + docker exec -it "$container" bash +} + +compose_up() { + echo -e "${GREEN}Starting services with docker-compose...${NC}" + docker-compose up -d + echo -e "${GREEN}✅ Services started!${NC}" + echo "Use 'docker-compose logs -f' to view logs" +} + +compose_down() { + echo -e "${YELLOW}Stopping services with docker-compose...${NC}" + docker-compose down + echo -e "${GREEN}✅ Services stopped!${NC}" +} + +# Main script logic +case "${1:-help}" in + build) + build_image + ;; + test) + test_image + ;; + run) + run_interactive + ;; + push) + push_to_dockerhub + ;; + clean) + clean_docker + ;; + logs) + show_logs + ;; + shell) + open_shell + ;; + compose-up) + compose_up + ;; + compose-down) + compose_down + ;; + help|--help|-h) + print_usage + ;; + *) + echo -e "${RED}❌ Unknown command: $1${NC}" + print_usage + exit 1 + ;; +esac \ No newline at end of file diff --git a/scripts/setup-dockerhub-secrets.md b/scripts/setup-dockerhub-secrets.md new file mode 100644 index 00000000..ac4dd691 --- /dev/null +++ b/scripts/setup-dockerhub-secrets.md @@ -0,0 +1,113 @@ +# Setting up DockerHub Secrets for GitHub Actions + +This guide will help you set up the required secrets for the Docker workflow to automatically build and push images to DockerHub. + +## Prerequisites + +1. A DockerHub account +2. Admin access to the GitHub repository +3. DockerHub access token + +## Step 1: Create a DockerHub Access Token + +1. Log in to [DockerHub](https://hub.docker.com/) +2. Go to your account settings +3. Navigate to "Security" → "Access Tokens" +4. Click "New Access Token" +5. Give it a name (e.g., "GitHub Actions") +6. Set the permissions to "Read & Write" +7. Copy the generated token (you won't be able to see it again!) + +## Step 2: Add Secrets to GitHub Repository + +1. Go to your GitHub repository +2. Navigate to "Settings" → "Secrets and variables" → "Actions" +3. Click "New repository secret" +4. Add the following secrets: + +### Required Secrets + +| Secret Name | Value | Description | +|-------------|-------|-------------| +| `DOCKERHUB_USERNAME` | Your DockerHub username | Your DockerHub username (e.g., `kyegomez`) | +| `DOCKERHUB_TOKEN` | Your DockerHub access token | The access token you created in Step 1 | + +## Step 3: Verify Setup + +1. Push a commit to the `main` branch +2. Go to the "Actions" tab in your GitHub repository +3. You should see the "Docker Build and Publish" workflow running +4. Check that it completes successfully + +## Troubleshooting + +### Common Issues + +1. **Authentication Failed** + - Double-check your DockerHub username and token + - Ensure the token has "Read & Write" permissions + - Make sure the token hasn't expired + +2. **Permission Denied** + - Verify you have admin access to the repository + - Check that the secrets are named exactly as shown above + +3. **Workflow Not Triggering** + - Ensure you're pushing to the `main` branch + - Check that the workflow file is in `.github/workflows/` + - Verify the workflow file has the correct triggers + +### Testing Locally + +You can test the Docker build locally before pushing: + +```bash +# Build the image locally +docker build -t swarms:test . + +# Test the image +docker run --rm swarms:test python test_docker.py + +# If everything works, push to GitHub +git add . +git commit -m "Add Docker support" +git push origin main +``` + +## Security Notes + +- Never commit secrets directly to your repository +- Use repository secrets for sensitive information +- Regularly rotate your DockerHub access tokens +- Consider using organization-level secrets for team repositories + +## Additional Configuration + +### Custom Registry + +If you want to use a different registry (not DockerHub), update the workflow file: + +```yaml +env: + REGISTRY: your-registry.com + IMAGE_NAME: your-org/your-repo +``` + +### Multiple Tags + +The workflow automatically creates tags based on: +- Git branch name +- Git commit SHA +- Version tags (v*.*.*) +- Latest tag for main branch + +You can customize this in the workflow file under the "Extract Docker metadata" step. + +## Support + +If you encounter issues: + +1. Check the GitHub Actions logs for detailed error messages +2. Verify your DockerHub credentials +3. Ensure the workflow file is properly configured +4. Open an issue in the repository with the error details \ No newline at end of file