ci(deps): bump actions/checkout from 4 to 6 #673
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: E2E Tests | |
| on: | |
| pull_request: | |
| branches: [ main, master ] | |
| paths: | |
| - 'components/**' | |
| - '.github/workflows/e2e.yml' | |
| - 'e2e/**' | |
| - 'scripts/**' | |
| - '.specify/**' | |
| - 'agents/**' | |
| push: | |
| branches: [ main, master ] | |
| paths: | |
| - 'components/**' | |
| - '.github/workflows/e2e.yml' | |
| - 'e2e/**' | |
| - 'scripts/**' | |
| - '.specify/**' | |
| - 'agents/**' | |
| workflow_dispatch: # Allow manual trigger | |
| concurrency: | |
| group: e2e-tests-${{ github.event.pull_request.number || github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| detect-changes: | |
| runs-on: ubuntu-latest | |
| outputs: | |
| frontend: ${{ steps.filter.outputs.frontend }} | |
| backend: ${{ steps.filter.outputs.backend }} | |
| operator: ${{ steps.filter.outputs.operator }} | |
| claude-runner: ${{ steps.filter.outputs.claude-runner }} | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v6 | |
| - name: Check for component changes | |
| uses: dorny/paths-filter@v3 | |
| id: filter | |
| with: | |
| filters: | | |
| frontend: | |
| - 'components/frontend/**' | |
| backend: | |
| - 'components/backend/**' | |
| operator: | |
| - 'components/operator/**' | |
| claude-runner: | |
| - 'components/runners/**' | |
| e2e: | |
| name: End-to-End Tests | |
| runs-on: ubuntu-latest | |
| needs: detect-changes | |
| timeout-minutes: 20 # Increased to account for builds | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v6 | |
| - name: Validate AGENTS.md symlink | |
| run: | | |
| echo "Validating AGENTS.md → CLAUDE.md symlink..." | |
| [ -L AGENTS.md ] || (echo "❌ AGENTS.md is not a symlink" && exit 1) | |
| [ "$(readlink AGENTS.md)" = "CLAUDE.md" ] || (echo "❌ AGENTS.md points to wrong target" && exit 1) | |
| [ -f CLAUDE.md ] || (echo "❌ CLAUDE.md does not exist" && exit 1) | |
| diff -q AGENTS.md CLAUDE.md > /dev/null || (echo "❌ AGENTS.md content differs from CLAUDE.md" && exit 1) | |
| echo "✅ AGENTS.md symlink is valid" | |
| - name: Set up Node.js | |
| uses: actions/setup-node@v6 | |
| with: | |
| node-version: '20' | |
| cache: 'npm' | |
| cache-dependency-path: e2e/package-lock.json | |
| - name: Install Cypress dependencies | |
| working-directory: e2e | |
| run: npm ci | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| with: | |
| driver-opts: network=host | |
| - name: Build component images from PR code | |
| run: | | |
| echo "======================================" | |
| echo "Building images from PR code..." | |
| echo "======================================" | |
| # Build frontend image (if changed or use latest) | |
| if [ "${{ needs.detect-changes.outputs.frontend }}" == "true" ]; then | |
| echo "Building frontend (changed)..." | |
| docker build -t quay.io/ambient_code/vteam_frontend:e2e-test \ | |
| -f components/frontend/Dockerfile \ | |
| components/frontend | |
| else | |
| echo "Frontend unchanged, pulling latest..." | |
| docker pull quay.io/ambient_code/vteam_frontend:latest | |
| docker tag quay.io/ambient_code/vteam_frontend:latest quay.io/ambient_code/vteam_frontend:e2e-test | |
| fi | |
| # Build backend image (if changed or use latest) | |
| if [ "${{ needs.detect-changes.outputs.backend }}" == "true" ]; then | |
| echo "Building backend (changed)..." | |
| docker build -t quay.io/ambient_code/vteam_backend:e2e-test \ | |
| -f components/backend/Dockerfile \ | |
| components/backend | |
| else | |
| echo "Backend unchanged, pulling latest..." | |
| docker pull quay.io/ambient_code/vteam_backend:latest | |
| docker tag quay.io/ambient_code/vteam_backend:latest quay.io/ambient_code/vteam_backend:e2e-test | |
| fi | |
| # Build operator image (if changed or use latest) | |
| if [ "${{ needs.detect-changes.outputs.operator }}" == "true" ]; then | |
| echo "Building operator (changed)..." | |
| docker build -t quay.io/ambient_code/vteam_operator:e2e-test \ | |
| -f components/operator/Dockerfile \ | |
| components/operator | |
| else | |
| echo "Operator unchanged, pulling latest..." | |
| docker pull quay.io/ambient_code/vteam_operator:latest | |
| docker tag quay.io/ambient_code/vteam_operator:latest quay.io/ambient_code/vteam_operator:e2e-test | |
| fi | |
| # Build claude-code-runner image (if changed or use latest) | |
| if [ "${{ needs.detect-changes.outputs.claude-runner }}" == "true" ]; then | |
| echo "Building claude-code-runner (changed)..." | |
| docker build -t quay.io/ambient_code/vteam_claude_runner:e2e-test \ | |
| -f components/runners/claude-code-runner/Dockerfile \ | |
| components/runners | |
| else | |
| echo "Claude-runner unchanged, pulling latest..." | |
| docker pull quay.io/ambient_code/vteam_claude_runner:latest | |
| docker tag quay.io/ambient_code/vteam_claude_runner:latest quay.io/ambient_code/vteam_claude_runner:e2e-test | |
| fi | |
| echo "" | |
| echo "✅ All images ready" | |
| docker images | grep e2e-test | |
| - name: Install kind | |
| run: | | |
| # Install kind | |
| curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64 | |
| chmod +x ./kind | |
| sudo mv ./kind /usr/local/bin/kind | |
| kind version | |
| - name: Setup kind cluster | |
| working-directory: e2e | |
| run: | | |
| chmod +x scripts/*.sh | |
| ./scripts/setup-kind.sh | |
| - name: Load images into kind cluster | |
| run: | | |
| echo "======================================" | |
| echo "Loading images into kind cluster..." | |
| echo "======================================" | |
| kind load docker-image quay.io/ambient_code/vteam_frontend:e2e-test --name vteam-e2e | |
| kind load docker-image quay.io/ambient_code/vteam_backend:e2e-test --name vteam-e2e | |
| kind load docker-image quay.io/ambient_code/vteam_operator:e2e-test --name vteam-e2e | |
| kind load docker-image quay.io/ambient_code/vteam_claude_runner:e2e-test --name vteam-e2e | |
| echo "✅ All images loaded into kind cluster" | |
| - name: Update kustomization to use e2e-test images | |
| run: | | |
| # Update image tags to use locally built images | |
| sed -i 's/newTag: latest/newTag: e2e-test/g' components/manifests/overlays/e2e/kustomization.yaml | |
| echo "Updated kustomization.yaml to use e2e-test tag" | |
| - name: Deploy vTeam | |
| working-directory: e2e | |
| run: ./scripts/deploy.sh | |
| - name: Verify deployment | |
| run: | | |
| echo "Checking pods..." | |
| kubectl get pods -n ambient-code | |
| echo "" | |
| echo "Checking services..." | |
| kubectl get svc -n ambient-code | |
| echo "" | |
| echo "Checking ingress..." | |
| kubectl get ingress -n ambient-code | |
| - name: Run Cypress tests | |
| working-directory: e2e | |
| run: ./scripts/run-tests.sh | |
| - name: Upload test results | |
| if: failure() | |
| uses: actions/upload-artifact@v5 | |
| with: | |
| name: cypress-screenshots | |
| path: e2e/cypress/screenshots | |
| if-no-files-found: ignore | |
| retention-days: 7 | |
| - name: Upload test videos | |
| if: failure() | |
| uses: actions/upload-artifact@v5 | |
| with: | |
| name: cypress-videos | |
| path: e2e/cypress/videos | |
| if-no-files-found: ignore | |
| retention-days: 7 | |
| - name: Debug logs on failure | |
| if: failure() | |
| run: | | |
| echo "=== Frontend logs ===" | |
| kubectl logs -n ambient-code -l app=frontend --tail=100 || true | |
| echo "" | |
| echo "=== Backend logs ===" | |
| kubectl logs -n ambient-code -l app=backend-api --tail=100 || true | |
| echo "" | |
| echo "=== Operator logs ===" | |
| kubectl logs -n ambient-code -l app=agentic-operator --tail=100 || true | |
| - name: Cleanup | |
| if: always() | |
| working-directory: e2e | |
| run: | | |
| # Clean up cluster and artifacts in CI | |
| CLEANUP_ARTIFACTS=true ./scripts/cleanup.sh || true | |