diff --git a/.github/workflows/docker-cd-production.yml b/.github/workflows/docker-cd-production.yml index 0a8cd2b..f408d6b 100644 --- a/.github/workflows/docker-cd-production.yml +++ b/.github/workflows/docker-cd-production.yml @@ -1,60 +1,63 @@ -# ============================================================================ -# Docker Images CD Pipeline - Production Deployment -# Runs on: Push to production branch (merge from main) -# Purpose: Build, test, scan, and deploy to Docker Hub -# ============================================================================ -name: Docker CD - Production Deploy +################################################################################ +# Docker CD - Production Layered Build +# Builds all 4 layers separately (base โ†’ languages โ†’ vscode โ†’ ai-tools) +# Only uploads the final workspace container to Docker Hub +################################################################################ +name: Docker CD - Production on: push: - branches: [production] + branches: + - main + - production + paths: + - 'docker/**' + - 'apps/supervisor/**' + - '.github/workflows/docker-cd-production.yml' + pull_request: + branches: + - main + - production paths: - 'docker/**' - 'apps/supervisor/**' - '.github/workflows/docker-cd-production.yml' workflow_dispatch: inputs: - environment: - description: 'Deployment environment' + push_to_dockerhub: + description: 'Push to Docker Hub' required: true - default: 'production' + default: 'true' type: choice options: - - production - - staging - force_rebuild: - description: 'Force rebuild all layers' - required: false - default: false - type: boolean + - 'true' + - 'false' env: + DOCKERHUB_IMAGE: vaibhavsing/dev8-workspace DOCKER_BUILDKIT: 1 - COMPOSE_DOCKER_CLI_BUILD: 1 - DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} concurrency: - group: docker-cd-production - cancel-in-progress: false + group: docker-cd-production-${{ github.ref }} + cancel-in-progress: true jobs: - # Setup and versioning - setup: + build-and-push: + name: Build Layered Docker Images runs-on: ubuntu-latest - outputs: - version: ${{ steps.version.outputs.version }} - short_sha: ${{ steps.version.outputs.short_sha }} - dockerhub_username: ${{ steps.version.outputs.dockerhub_username }} - build_base: ${{ steps.changes.outputs.build_base }} - build_languages: ${{ steps.changes.outputs.build_languages }} - build_vscode: ${{ steps.changes.outputs.build_vscode }} - build_ai_tools: ${{ steps.changes.outputs.build_ai_tools }} + + permissions: + contents: read + packages: write + security-events: write + steps: - name: Checkout code uses: actions/checkout@v4 - with: - fetch-depth: 2 - + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Generate version id: version run: | @@ -62,433 +65,264 @@ jobs: VERSION="v$(date +%Y%m%d)-${SHORT_SHA}" echo "version=${VERSION}" >> $GITHUB_OUTPUT echo "short_sha=${SHORT_SHA}" >> $GITHUB_OUTPUT - echo "dockerhub_username=${{ env.DOCKERHUB_USERNAME }}" >> $GITHUB_OUTPUT echo "Generated version: ${VERSION}" - - - name: Detect changes - id: changes - run: | - if [ "${{ inputs.force_rebuild }}" = "true" ]; then - echo "Force rebuild enabled - building all layers" - echo "build_base=true" >> "$GITHUB_OUTPUT" - echo "build_languages=true" >> "$GITHUB_OUTPUT" - echo "build_vscode=true" >> "$GITHUB_OUTPUT" - echo "build_ai_tools=true" >> "$GITHUB_OUTPUT" - else - # Detect changes in the last commit - if git diff --name-only HEAD~1 HEAD | grep -q "docker/images/00-base/\|apps/supervisor/"; then - echo "Base layer changed - rebuilding all" - echo "build_base=true" >> "$GITHUB_OUTPUT" - echo "build_languages=true" >> "$GITHUB_OUTPUT" - echo "build_vscode=true" >> "$GITHUB_OUTPUT" - echo "build_ai_tools=true" >> "$GITHUB_OUTPUT" - elif git diff --name-only HEAD~1 HEAD | grep -q "docker/images/10-languages/"; then - echo "Languages layer changed" - echo "build_base=false" >> "$GITHUB_OUTPUT" - echo "build_languages=true" >> "$GITHUB_OUTPUT" - echo "build_vscode=true" >> "$GITHUB_OUTPUT" - echo "build_ai_tools=true" >> "$GITHUB_OUTPUT" - elif git diff --name-only HEAD~1 HEAD | grep -q "docker/images/20-vscode/"; then - echo "VS Code layer changed" - echo "build_base=false" >> "$GITHUB_OUTPUT" - echo "build_languages=false" >> "$GITHUB_OUTPUT" - echo "build_vscode=true" >> "$GITHUB_OUTPUT" - echo "build_ai_tools=true" >> "$GITHUB_OUTPUT" - elif git diff --name-only HEAD~1 HEAD | grep -q "docker/images/30-ai-tools/"; then - echo "AI tools layer changed" - echo "build_base=false" >> "$GITHUB_OUTPUT" - echo "build_languages=false" >> "$GITHUB_OUTPUT" - echo "build_vscode=false" >> "$GITHUB_OUTPUT" - echo "build_ai_tools=true" >> "$GITHUB_OUTPUT" - else - echo "No specific changes detected - building all layers" - echo "build_base=true" >> "$GITHUB_OUTPUT" - echo "build_languages=true" >> "$GITHUB_OUTPUT" - echo "build_vscode=true" >> "$GITHUB_OUTPUT" - echo "build_ai_tools=true" >> "$GITHUB_OUTPUT" - fi - fi - - # Build and push base image - build-base: - runs-on: ubuntu-latest - needs: setup - if: needs.setup.outputs.build_base == 'true' - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to Docker Hub + + - name: Log in to Docker Hub + if: github.event_name != 'pull_request' uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Build base image + + - name: Build all Docker layers run: | - echo "Building base image..." - docker build \ - --cache-from ${{ secrets.DOCKERHUB_USERNAME }}/dev8-base:latest \ - --tag ${{ secrets.DOCKERHUB_USERNAME }}/dev8-base:${{ needs.setup.outputs.version }} \ - --tag ${{ secrets.DOCKERHUB_USERNAME }}/dev8-base:latest \ - --tag dev8-base:latest \ - --file ./docker/images/00-base/Dockerfile \ - --build-arg BUILDKIT_INLINE_CACHE=1 \ - . - - - name: Test base image - run: | - echo "Testing base image..." - docker run --rm dev8-base:latest bash -c "git --version && ssh -V && workspace-supervisor --version" - echo "โœ… Base image tests passed!" - - - name: Scan base image for vulnerabilities - uses: aquasecurity/trivy-action@master - with: - image-ref: dev8-base:latest - format: 'sarif' - output: 'trivy-base-results.sarif' - severity: 'CRITICAL,HIGH' - - - name: Upload Trivy results to GitHub Security - uses: github/codeql-action/upload-sarif@v3 - if: always() - with: - sarif_file: 'trivy-base-results.sarif' - category: docker-base-production - - - name: Push base image to Docker Hub + echo "๐Ÿ—๏ธ Building all Docker layers (base โ†’ languages โ†’ vscode โ†’ ai-tools)..." + + # Build Layer 1: Base + echo "Building base layer..." + docker build -t dev8-base:latest -f ./docker/images/00-base/Dockerfile . + + # Build Layer 2: Languages + echo "Building languages layer..." + docker build -t dev8-languages:latest -f ./docker/images/10-languages/Dockerfile . + + # Build Layer 3: VS Code + echo "Building vscode layer..." + docker build -t dev8-vscode:latest -f ./docker/images/20-vscode/Dockerfile . + + # Build Layer 4: Workspace (Final) + echo "Building workspace layer..." + docker build -t dev8-workspace:latest -f ./docker/images/30-ai-tools/Dockerfile . + + echo "โœ… All layers built successfully!" + + - name: Tag final workspace image for Docker Hub run: | - echo "Pushing base image to Docker Hub..." - docker push ${{ secrets.DOCKERHUB_USERNAME }}/dev8-base:${{ needs.setup.outputs.version }} - docker push ${{ secrets.DOCKERHUB_USERNAME }}/dev8-base:latest - echo "โœ… Base image pushed successfully!" - - - name: Image details - run: | - docker images | grep dev8-base - echo "Image size: $(docker inspect dev8-base:latest --format='{{.Size}}' | numfmt --to=iec-i --suffix=B)" - - # Build and push languages image - build-languages: - runs-on: ubuntu-latest - needs: [setup, build-base] - if: | - always() && - needs.setup.outputs.build_languages == 'true' && - (needs.setup.outputs.build_base == 'false' || needs.build-base.result == 'success') - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Pull or build base image - run: | - if [ "${{ needs.setup.outputs.build_base }}" = "true" ]; then - echo "Pulling newly built base image..." - docker pull ${{ secrets.DOCKERHUB_USERNAME }}/dev8-base:latest - docker tag ${{ secrets.DOCKERHUB_USERNAME }}/dev8-base:latest dev8-base:latest - else - echo "Building base image locally..." - docker build \ - -t dev8-base:latest \ - -f ./docker/images/00-base/Dockerfile \ - . + echo "๐Ÿท๏ธ Tagging final workspace image..." + docker tag dev8-workspace:latest ${{ env.DOCKERHUB_IMAGE }}:${{ steps.version.outputs.version }} + docker tag dev8-workspace:latest ${{ env.DOCKERHUB_IMAGE }}:latest + if [ "${{ github.ref }}" = "refs/heads/production" ]; then + docker tag dev8-workspace:latest ${{ env.DOCKERHUB_IMAGE }}:production fi - - - name: Build languages image - run: | - echo "Building languages image..." - docker build \ - --cache-from ${{ secrets.DOCKERHUB_USERNAME }}/dev8-languages:latest \ - --tag ${{ secrets.DOCKERHUB_USERNAME }}/dev8-languages:${{ needs.setup.outputs.version }} \ - --tag ${{ secrets.DOCKERHUB_USERNAME }}/dev8-languages:latest \ - --tag dev8-languages:latest \ - --file ./docker/images/10-languages/Dockerfile \ - --build-arg BUILDKIT_INLINE_CACHE=1 \ - . - - - name: Test languages image - run: | - echo "Testing language runtimes..." - docker run --rm dev8-languages:latest bash -c " - node --version && - python --version && - go version && - rustc --version && - bun --version - " - echo "โœ… Languages image tests passed!" - - - name: Push languages image to Docker Hub - run: | - echo "Pushing languages image to Docker Hub..." - docker push ${{ secrets.DOCKERHUB_USERNAME }}/dev8-languages:${{ needs.setup.outputs.version }} - docker push ${{ secrets.DOCKERHUB_USERNAME }}/dev8-languages:latest - echo "โœ… Languages image pushed successfully!" - - # Build and push VS Code image - build-vscode: - runs-on: ubuntu-latest - needs: [setup, build-base, build-languages] - if: | - always() && - needs.setup.outputs.build_vscode == 'true' && - (needs.setup.outputs.build_languages == 'false' || needs.build-languages.result == 'success') - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Pull or build prerequisite images - run: | - if [ "${{ needs.setup.outputs.build_languages }}" = "true" ]; then - echo "Pulling newly built languages image..." - docker pull ${{ secrets.DOCKERHUB_USERNAME }}/dev8-languages:latest - docker tag ${{ secrets.DOCKERHUB_USERNAME }}/dev8-languages:latest dev8-languages:latest - else - echo "Building prerequisite images locally..." - docker build -t dev8-base:latest -f ./docker/images/00-base/Dockerfile . - docker build -t dev8-languages:latest -f ./docker/images/10-languages/Dockerfile . + if [ "${{ github.event_name }}" = "pull_request" ]; then + docker tag dev8-workspace:latest ${{ env.DOCKERHUB_IMAGE }}:pr-${{ github.event.pull_request.number }} fi - - - name: Build VS Code image + echo "โœ… Images tagged" + + - name: Test final workspace container run: | - echo "Building VS Code image..." - docker build \ - --cache-from ${{ secrets.DOCKERHUB_USERNAME }}/dev8-vscode:latest \ - --tag ${{ secrets.DOCKERHUB_USERNAME }}/dev8-vscode:${{ needs.setup.outputs.version }} \ - --tag ${{ secrets.DOCKERHUB_USERNAME }}/dev8-vscode:latest \ - --tag dev8-vscode:latest \ - --file ./docker/images/20-vscode/Dockerfile \ - --build-arg BUILDKIT_INLINE_CACHE=1 \ - . - - - name: Test VS Code image - run: | - echo "Testing VS Code Server..." - docker run --rm dev8-vscode:latest code-server --version - echo "โœ… VS Code image tests passed!" - - - name: Push VS Code image to Docker Hub - run: | - echo "Pushing VS Code image to Docker Hub..." - docker push ${{ secrets.DOCKERHUB_USERNAME }}/dev8-vscode:${{ needs.setup.outputs.version }} - docker push ${{ secrets.DOCKERHUB_USERNAME }}/dev8-vscode:latest - echo "โœ… VS Code image pushed successfully!" - - # Build and push AI tools image (final) - build-ai-tools: - runs-on: ubuntu-latest - needs: [setup, build-base, build-languages, build-vscode] - if: | - always() && - needs.setup.outputs.build_ai_tools == 'true' && - (needs.setup.outputs.build_vscode == 'false' || needs.build-vscode.result == 'success') - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Pull or build prerequisite images - run: | - if [ "${{ needs.setup.outputs.build_vscode }}" = "true" ]; then - echo "Pulling newly built VS Code image..." - docker pull ${{ secrets.DOCKERHUB_USERNAME }}/dev8-vscode:latest - docker tag ${{ secrets.DOCKERHUB_USERNAME }}/dev8-vscode:latest dev8-vscode:latest - else - echo "Building prerequisite images locally..." - docker build -t dev8-base:latest -f ./docker/images/00-base/Dockerfile . - docker build -t dev8-languages:latest -f ./docker/images/10-languages/Dockerfile . - docker build -t dev8-vscode:latest -f ./docker/images/20-vscode/Dockerfile . - fi - - - name: Build AI tools image (final workspace) - run: | - echo "Building AI tools image..." - docker build \ - --cache-from ${{ secrets.DOCKERHUB_USERNAME }}/dev8-workspace:latest \ - --tag ${{ secrets.DOCKERHUB_USERNAME }}/dev8-workspace:${{ needs.setup.outputs.version }} \ - --tag ${{ secrets.DOCKERHUB_USERNAME }}/dev8-workspace:latest \ - --tag ${{ secrets.DOCKERHUB_USERNAME }}/dev8-workspace:production \ - --tag dev8-workspace:latest \ - --file ./docker/images/30-ai-tools/Dockerfile \ - --build-arg BUILDKIT_INLINE_CACHE=1 \ - --label "git.commit=${{ github.sha }}" \ - --label "git.branch=${{ github.ref_name }}" \ - --label "build.date=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" \ - --label "version=${{ needs.setup.outputs.version }}" \ - . - - - name: Test AI tools image - run: | - echo "Testing AI tools and services..." + echo "=== Testing Final Workspace Container ===" docker run --rm dev8-workspace:latest bash -c " - gh --version && - az version && + echo '--- Testing Workspace Supervisor ---' && + workspace-supervisor --version && + echo '--- Testing Node.js ---' && + node --version && + npm --version && + pnpm --version && + echo '--- Testing Python ---' && + python --version && + pip --version && + echo '--- Testing Go ---' && + go version && + echo '--- Testing Rust ---' && + rustc --version && + echo '--- Testing Bun ---' && + bun --version && + echo '--- Testing VS Code Server ---' && + code-server --version && + echo '--- Testing GitHub CLI ---' && + gh --version && + echo '--- Testing Azure CLI ---' && + az version && + echo '--- Testing yq ---' && yq --version && - code-server --version + echo '' && + echo '=== All Tests Passed Successfully! ===' " - echo "โœ… AI tools image tests passed!" - - - name: Comprehensive security scan + + - name: Security scan with Trivy uses: aquasecurity/trivy-action@master with: image-ref: dev8-workspace:latest format: 'sarif' - output: 'trivy-workspace-results.sarif' - severity: 'CRITICAL,HIGH,MEDIUM' + output: 'trivy-results.sarif' + severity: 'CRITICAL,HIGH' vuln-type: 'os,library' - timeout: '10m' - + timeout: '15m' + - name: Upload Trivy results to GitHub Security uses: github/codeql-action/upload-sarif@v3 if: always() with: - sarif_file: 'trivy-workspace-results.sarif' + sarif_file: 'trivy-results.sarif' category: docker-workspace-production - - - name: Push AI tools image to Docker Hub + + - name: Image size and details run: | - echo "Pushing AI tools (workspace) image to Docker Hub..." - docker push ${{ secrets.DOCKERHUB_USERNAME }}/dev8-workspace:${{ needs.setup.outputs.version }} - docker push ${{ secrets.DOCKERHUB_USERNAME }}/dev8-workspace:latest - docker push ${{ secrets.DOCKERHUB_USERNAME }}/dev8-workspace:production - echo "โœ… Workspace image pushed successfully!" - - - name: Final image details - run: | - echo "=== Final Workspace Image Details ===" - docker images | grep dev8-workspace + echo "=== Final Workspace Container Information ===" + docker images | grep -E "(dev8-base|dev8-languages|dev8-vscode|dev8-workspace)" echo "" - echo "Image size: $(docker inspect dev8-workspace:latest --format='{{.Size}}' | numfmt --to=iec-i --suffix=B)" + echo "Final workspace size:" + SIZE=$(docker inspect dev8-workspace:latest --format='{{.Size}}') + SIZE_HUMAN=$(echo $SIZE | numfmt --to=iec-i --suffix=B) + echo " ${SIZE_HUMAN}" echo "" - echo "Image labels:" - docker inspect dev8-workspace:latest --format='{{json .Config.Labels}}' | jq + echo "Docker Hub tags:" + docker images | grep "${{ env.DOCKERHUB_IMAGE }}" + + - name: Push final workspace container to Docker Hub + if: | + github.event_name != 'pull_request' && + (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/production' || + (github.event_name == 'workflow_dispatch' && github.event.inputs.push_to_dockerhub == 'true')) + run: | + echo "๐Ÿš€ Pushing final workspace container to Docker Hub..." + docker push ${{ env.DOCKERHUB_IMAGE }}:${{ steps.version.outputs.version }} + docker push ${{ env.DOCKERHUB_IMAGE }}:latest + if [ "${{ github.ref }}" = "refs/heads/production" ]; then + docker push ${{ env.DOCKERHUB_IMAGE }}:production + fi + echo "โœ… Container pushed successfully to Docker Hub!" echo "" - echo "Image layers:" - docker history dev8-workspace:latest --no-trunc - - # Post-deployment tasks - post-deployment: - runs-on: ubuntu-latest - needs: [setup, build-base, build-languages, build-vscode, build-ai-tools] - if: always() - steps: - - name: Generate deployment summary + echo "Images available:" + echo " - ${{ env.DOCKERHUB_IMAGE }}:latest" + echo " - ${{ env.DOCKERHUB_IMAGE }}:${{ steps.version.outputs.version }}" + + - name: Deployment summary + if: github.event_name != 'pull_request' run: | { echo "# ๐Ÿš€ Docker Production Deployment Summary" echo "" echo "## ๐Ÿ“ฆ Deployment Information" - echo "- **Version**: \`${{ needs.setup.outputs.version }}\`" + echo "- **Version**: \`${{ steps.version.outputs.version }}\`" echo "- **Commit**: \`${{ github.sha }}\`" echo "- **Branch**: \`${{ github.ref_name }}\`" echo "- **Timestamp**: $(date -u +'%Y-%m-%d %H:%M:%S UTC')" echo "" - echo "## ๐Ÿ—๏ธ Build Status" + echo "## ๐Ÿ—๏ธ Build Approach" + echo "" + echo "Built using **layered Docker images**:" + echo "1. ๏ฟฝ dev8-base (Ubuntu + SSH + Supervisor)" + echo "2. ๐Ÿ”น dev8-languages (Node.js, Python, Go, Rust, Bun)" + echo "3. ๐Ÿ”น dev8-vscode (VS Code Server)" + echo "4. ๐Ÿ”น **dev8-workspace** (AI Tools - Final Container)" echo "" - echo "| Image | Status | Pushed to Docker Hub |" - echo "|-------|--------|----------------------|" - echo "| dev8-base | ${{ needs.build-base.result }} | ${{ needs.build-base.result == 'success' && 'โœ…' || 'โŒ' }} |" - echo "| dev8-languages | ${{ needs.build-languages.result }} | ${{ needs.build-languages.result == 'success' && 'โœ…' || 'โŒ' }} |" - echo "| dev8-vscode | ${{ needs.build-vscode.result }} | ${{ needs.build-vscode.result == 'success' && 'โœ…' || 'โŒ' }} |" - echo "| dev8-workspace | ${{ needs.build-ai-tools.result }} | ${{ needs.build-ai-tools.result == 'success' && 'โœ…' || 'โŒ' }} |" + echo "## ๏ฟฝ๐Ÿณ Docker Hub - Final Container Only" echo "" - echo "## ๐Ÿ”— Docker Hub Images" + echo "**Image**: \`${{ env.DOCKERHUB_IMAGE }}\`" echo "" - echo "Pull commands:" + echo "### Pull Commands:" echo "\`\`\`bash" - echo "# Base image" - echo "docker pull ${{ needs.setup.outputs.dockerhub_username }}/dev8-base:${{ needs.setup.outputs.version }}" + echo "# Latest version" + echo "docker pull ${{ env.DOCKERHUB_IMAGE }}:latest" echo "" - echo "# Languages image" - echo "docker pull ${{ needs.setup.outputs.dockerhub_username }}/dev8-languages:${{ needs.setup.outputs.version }}" + echo "# Specific version" + echo "docker pull ${{ env.DOCKERHUB_IMAGE }}:${{ steps.version.outputs.version }}" + echo "\`\`\`" echo "" - echo "# VS Code image" - echo "docker pull ${{ needs.setup.outputs.dockerhub_username }}/dev8-vscode:${{ needs.setup.outputs.version }}" + echo "## ๐Ÿƒ Run Container (Production)" echo "" - echo "# Workspace image (recommended)" - echo "docker pull ${{ needs.setup.outputs.dockerhub_username }}/dev8-workspace:${{ needs.setup.outputs.version }}" - echo "docker pull ${{ needs.setup.outputs.dockerhub_username }}/dev8-workspace:latest" - echo "docker pull ${{ needs.setup.outputs.dockerhub_username }}/dev8-workspace:production" + echo "\`\`\`bash" + echo "# Run workspace container with volume support" + echo "docker run -d \\" + echo " --name dev8-workspace \\" + echo " -p 8080:8080 \\" + echo " -p 2222:2222 \\" + echo " -p 9000:9000 \\" + echo " -e GITHUB_TOKEN=\${GITHUB_TOKEN} \\" + echo " -e ENVIRONMENT_ID=dev8-prod-001 \\" + echo " -v dev8-home:/home/dev8 \\" + echo " -v dev8-workspace:/workspace \\" + echo " ${{ env.DOCKERHUB_IMAGE }}:latest" echo "\`\`\`" echo "" - echo "## ๐Ÿ” Security Scans" + echo "## ๐Ÿงช Test Results" echo "" - echo "Trivy vulnerability scans completed. Check GitHub Security tab for detailed results." + echo "โœ… All component tests passed:" + echo "- Workspace Supervisor" + echo "- Node.js (with npm, pnpm)" + echo "- Python (with pip, poetry)" + echo "- Go" + echo "- Rust" + echo "- Bun" + echo "- VS Code Server" + echo "- GitHub CLI" + echo "- Azure CLI" + echo "- yq" echo "" - echo "## ๐Ÿ“ Next Steps" + echo "## ๐Ÿ” Security Scan" echo "" - echo "1. Review security scan results in GitHub Security" - echo "2. Update production deployments to use version \`${{ needs.setup.outputs.version }}\`" - echo "3. Test in staging environment before full rollout" - echo "4. Monitor application logs after deployment" + echo "Trivy vulnerability scan completed. Check GitHub Security tab for detailed results." echo "" - echo "---" + echo "## ๐Ÿ“ Local Development" echo "" + echo "\`\`\`bash" + echo "# Build all layers locally" + echo "cd docker && make build-all" + echo "" + echo "# Run with docker-compose" + echo "docker compose up -d" + echo "\`\`\`" + echo "" + echo "---" echo "**Deployment completed at**: $(date -u +'%Y-%m-%d %H:%M:%S UTC')" } >> "$GITHUB_STEP_SUMMARY" + + - name: Comment PR with container info + if: github.event_name == 'pull_request' + uses: actions/github-script@v7 + with: + script: | + const output = `#### Docker Build Summary ๐Ÿณ + + **Status**: โœ… Build successful (not pushed to Docker Hub) + + **Build Approach**: Layered Docker Images + - ๐Ÿ”น Layer 1: \`dev8-base\` (Ubuntu + SSH + Supervisor) + - ๐Ÿ”น Layer 2: \`dev8-languages\` (Node.js, Python, Go, Rust, Bun) + - ๐Ÿ”น Layer 3: \`dev8-vscode\` (VS Code Server) + - ๐Ÿ”น Layer 4: \`dev8-workspace\` (**Final Container** - AI Tools) + + **Final Container**: \`vaibhavsing/dev8-workspace\` + + **Note**: Only the final \`dev8-workspace\` container is pushed to Docker Hub (when merged to \`main\` or \`production\` branch). + + ### Local Development + \`\`\`bash + # Build all layers locally + cd docker && make build-all + + # Run with docker-compose + docker compose up -d + + # Access VS Code Server + open http://localhost:8080 + \`\`\` + + ### Production Deployment (After Merge) + \`\`\`bash + # Pull from Docker Hub + docker pull vaibhavsing/dev8-workspace:latest + + # Run with volume support (for ACI deployment) + docker run -d \\ + --name dev8-workspace \\ + -p 8080:8080 -p 2222:2222 -p 9000:9000 \\ + -e GITHUB_TOKEN=\${GITHUB_TOKEN} \\ + -v dev8-home:/home/dev8 \\ + -v dev8-workspace:/workspace \\ + vaibhavsing/dev8-workspace:latest + \`\`\` + + ### Test Results + โœ… All component tests passed + `; + + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: output + }); - - name: Check for failures - if: | - needs.build-base.result == 'failure' || - needs.build-languages.result == 'failure' || - needs.build-vscode.result == 'failure' || - needs.build-ai-tools.result == 'failure' - run: | - echo "โŒ One or more builds failed!" - echo "Please check the logs and security scan results." - exit 1 - - # Notify on completion - notify-success: - runs-on: ubuntu-latest - needs: [setup, post-deployment] - if: success() - steps: - - name: Success notification - run: | - echo "โœ… Docker images successfully deployed to Docker Hub!" - echo "Version: ${{ needs.setup.outputs.version }}" - echo "Username: ${{ needs.setup.outputs.dockerhub_username }}" - echo "" - echo "Images are ready for deployment to production environments." - - notify-failure: - runs-on: ubuntu-latest - needs: [setup, post-deployment] - if: failure() - steps: - - name: Failure notification - run: | - echo "โŒ Docker deployment failed!" - echo "Please check the build logs and fix the issues before redeploying." - exit 1