Skip to content

chore(deps): bump github.com/Azure/go-ntlmssp from 0.0.0-20221128193559-754e69321358 to 0.1.1 in /components/backend in the go_modules group across 1 directory #2968

chore(deps): bump github.com/Azure/go-ntlmssp from 0.0.0-20221128193559-754e69321358 to 0.1.1 in /components/backend in the go_modules group across 1 directory

chore(deps): bump github.com/Azure/go-ntlmssp from 0.0.0-20221128193559-754e69321358 to 0.1.1 in /components/backend in the go_modules group across 1 directory #2968

Workflow file for this run

name: E2E Tests
# Runs automatically on PRs. Uses mock SDK (no real API key needed).
on:
pull_request:
branches: [ main, master ]
push:
branches: [ main ]
env:
KIND_VERSION: "v0.27.0"
permissions:
contents: read
actions: write
concurrency:
group: e2e-tests-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: true
jobs:
detect-changes:
# Only run for same-repo PRs (not forks) and pushes to main.
# Fork PRs build and execute untrusted code in the CI runner environment.
if: github.event.pull_request.head.repo.full_name == github.repository || github.event_name == 'push'
runs-on: ubuntu-latest
outputs:
e2e-relevant: ${{ steps.filter.outputs.e2e-relevant }}
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 PR code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: Check for component changes
uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4
id: filter
with:
filters: |
e2e-relevant:
- 'components/**'
- 'e2e/**'
- '.github/workflows/e2e.yml'
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]
if: |
(github.event.pull_request.head.repo.full_name == github.repository || github.event_name == 'push')
&& needs.detect-changes.outputs.e2e-relevant == 'true'
timeout-minutes: 25
steps:
- name: Checkout PR code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: Cleanup Diskspace
run: |
sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc /opt/hostedtoolcache/CodeQL
sudo docker image prune -af 2>/dev/null || true
- 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@53b83947a5a98c8d113130e565377fae1a50d02f # 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@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3
with:
driver-opts: network=host
- name: Build or pull frontend image
if: needs.detect-changes.outputs.frontend == 'true'
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7
with:
context: components/frontend
file: components/frontend/Dockerfile
load: true
tags: quay.io/ambient_code/vteam_frontend:e2e-test
cache-from: |
type=gha,scope=frontend-amd64
type=gha,scope=e2e-frontend
cache-to: type=gha,mode=max,scope=e2e-frontend
- name: Pull unchanged images (parallel)
run: |
pull_pids=()
PULL_FRONTEND="${{ needs.detect-changes.outputs.frontend }}"
PULL_BACKEND="${{ needs.detect-changes.outputs.backend }}"
PULL_OPERATOR="${{ needs.detect-changes.outputs.operator }}"
PULL_RUNNER="${{ needs.detect-changes.outputs.claude-runner }}"
if [ "$PULL_FRONTEND" != "true" ]; then
(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) &
pull_pids+=($!)
fi
if [ "$PULL_BACKEND" != "true" ]; then
(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) &
pull_pids+=($!)
fi
if [ "$PULL_OPERATOR" != "true" ]; then
(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) &
pull_pids+=($!)
fi
if [ "$PULL_RUNNER" != "true" ]; then
(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) &
pull_pids+=($!)
fi
for pid in "${pull_pids[@]}"; do
wait "$pid" || exit 1
done
echo "All unchanged images pulled"
- name: Build changed backend image
if: needs.detect-changes.outputs.backend == 'true'
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7
with:
context: components/backend
file: components/backend/Dockerfile
load: true
tags: quay.io/ambient_code/vteam_backend:e2e-test
cache-from: |
type=gha,scope=backend-amd64
type=gha,scope=e2e-backend
cache-to: type=gha,mode=max,scope=e2e-backend
- name: Build changed operator image
if: needs.detect-changes.outputs.operator == 'true'
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7
with:
context: components/operator
file: components/operator/Dockerfile
load: true
tags: quay.io/ambient_code/vteam_operator:e2e-test
cache-from: |
type=gha,scope=operator-amd64
type=gha,scope=e2e-operator
cache-to: type=gha,mode=max,scope=e2e-operator
- name: Build changed ambient-runner image
if: needs.detect-changes.outputs.claude-runner == 'true'
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7
with:
context: components/runners/ambient-runner
file: components/runners/ambient-runner/Dockerfile
load: true
tags: quay.io/ambient_code/vteam_claude_runner:e2e-test
cache-from: |
type=gha,scope=ambient-runner-amd64
type=gha,scope=e2e-ambient-runner
cache-to: type=gha,mode=max,scope=e2e-ambient-runner
- name: Show built images
run: docker images | grep e2e-test
- name: Cache kind binary
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
with:
path: ~/k8s-tools/kind
key: kind-${{ runner.os }}-${{ env.KIND_VERSION }}
- name: Install kind
run: |
mkdir -p ~/k8s-tools
if [[ ! -f ~/k8s-tools/kind ]]; then
echo "Downloading kind $KIND_VERSION..."
curl -sLo ~/k8s-tools/kind "https://kind.sigs.k8s.io/dl/${KIND_VERSION}/kind-linux-amd64"
chmod +x ~/k8s-tools/kind
else
echo "Using cached kind"
fi
sudo cp ~/k8s-tools/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 "Saving and loading all images into kind via archive..."
docker save \
quay.io/ambient_code/vteam_frontend:e2e-test \
quay.io/ambient_code/vteam_backend:e2e-test \
quay.io/ambient_code/vteam_operator:e2e-test \
quay.io/ambient_code/vteam_claude_runner:e2e-test \
| kind load image-archive /dev/stdin --name ambient-local
echo "All images loaded into kind cluster"
- name: Deploy vTeam (mock SDK mode)
working-directory: e2e
env:
IMAGE_FRONTEND: quay.io/ambient_code/vteam_frontend:e2e-test
IMAGE_BACKEND: quay.io/ambient_code/vteam_backend:e2e-test
IMAGE_OPERATOR: quay.io/ambient_code/vteam_operator:e2e-test
IMAGE_RUNNER: quay.io/ambient_code/vteam_claude_runner:e2e-test
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
- name: Run Cypress E2E tests
working-directory: e2e
run: ./scripts/run-tests.sh
- name: Upload test results
if: failure()
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
with:
name: cypress-screenshots-pr-${{ github.event.pull_request.number }}
path: e2e/cypress/screenshots
if-no-files-found: ignore
retention-days: 7
- name: Upload test videos
if: failure()
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
with:
name: cypress-videos-pr-${{ github.event.pull_request.number }}
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: |
CLEANUP_ARTIFACTS=true ./scripts/cleanup.sh || true