name: Docker Testing
on:
push:
paths:
- 'Dockerfile'
- 'docker-compose.yml'
- '.github/workflows/docker.yml'
- 'scripts/docker-setup.sh'
- 'scripts/ci-test.sh'
pull_request:
paths:
- 'Dockerfile'
- 'docker-compose.yml'
workflow_dispatch:
schedule:
# Run Docker tests every day at 2 AM UTC
- cron: '0 2 * * *'
env:
DOCKER_BUILDKIT: 1
COMPOSE_DOCKER_CLI_BUILD: 1
permissions:
contents: read
jobs:
docker-build-matrix:
name: π³ Docker Build Matrix
runs-on: ubuntu-latest
strategy:
matrix:
target: [development, testing, production]
include:
- target: development
image_tag: dev-latest
test_command: "npm run dev --version"
- target: testing
image_tag: test-latest
test_command: "npm test"
- target: production
image_tag: latest
test_command: "node --version"
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build ${{ matrix.target }} image
run: |
docker build --target ${{ matrix.target }} \
-t lc-browser-mcp:${{ matrix.image_tag }} .
- name: Test ${{ matrix.target }} image
run: |
if [ "${{ matrix.target }}" = "testing" ]; then
# Run unit tests in testing image
docker run --rm lc-browser-mcp:${{ matrix.image_tag }} unit
else
# Basic smoke test
docker run --rm lc-browser-mcp:${{ matrix.image_tag }} ${{ matrix.test_command }}
fi
- name: Analyze image size
run: |
echo "Image size for ${{ matrix.target }}:"
docker images lc-browser-mcp:${{ matrix.image_tag }} --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
docker-compose-test:
name: π³ Docker Compose Test
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Test Docker Compose configuration
run: |
# Validate docker-compose file
docker compose config
- name: Test development environment
run: |
docker compose build app-dev
docker compose run --rm app-dev npm --version
- name: Test testing environment
run: |
docker compose --profile testing build app-test
docker compose --profile testing run --rm app-test unit
- name: Test production environment
run: |
docker compose --profile production build app-prod
docker compose --profile production run --rm app-prod node --version
- name: Cleanup
if: always()
run: |
docker compose down -v
docker system prune -f
make-commands-test:
name: π¨ Make Commands Test
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Test Make help
run: make help
- name: Test Make build commands
run: |
make build-test
make build-prod
- name: Test Make test commands
run: |
make test-unit
- name: Test Make info commands
run: |
make info
make status || echo "Status command completed"
- name: Test Make clean commands
run: |
make clean-containers
make clean-images
ci-scripts-test:
name: π§ CI Scripts Test
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Make scripts executable
run: |
chmod +x scripts/docker-setup.sh
chmod +x scripts/ci-test.sh
- name: Test Docker setup script
run: |
./scripts/docker-setup.sh || echo "Setup script completed with status $?"
- name: Test CI script - unit only
run: |
./scripts/ci-test.sh --unit-only --no-coverage || echo "CI script completed"
- name: Test CI script - help
run: |
./scripts/ci-test.sh --help
security-scan:
name: π Docker Security Scan
runs-on: ubuntu-latest
if: github.event_name == 'push'
permissions:
contents: read
security-events: write
actions: read
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build production image for scanning
run: make build-prod
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@master
with:
image-ref: 'lc-browser-mcp:latest'
format: 'sarif'
output: 'trivy-results.sarif'
- name: Upload Trivy scan results
if: always()
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: 'trivy-results.sarif'
- name: Run Docker Scout (if available)
continue-on-error: true
run: |
docker scout cves lc-browser-mcp:latest || echo "Docker Scout not available"
performance-test:
name: β‘ Performance Test
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build test image
run: make build-test
- name: Measure build time
run: |
echo "Measuring Docker build performance..."
time make build-test
- name: Measure test execution time
run: |
echo "Measuring test execution performance..."
time make test-unit
- name: Memory usage test
run: |
echo "Testing memory usage..."
docker run --rm --memory=1g lc-browser-mcp:test-latest unit
- name: Image size analysis
run: |
echo "Analyzing image sizes..."
docker images lc-browser-mcp --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedAt}}"
multiarch-test:
name: ποΈ Multi-Architecture Test
runs-on: ubuntu-latest
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Test multi-arch build (amd64 only for now)
run: |
docker buildx build \
--platform linux/amd64 \
--target testing \
-t lc-browser-mcp:test-multiarch \
--load .
- name: Test multi-arch image
run: |
docker run --rm lc-browser-mcp:test-multiarch unit
notification:
name: π’ Notification
runs-on: ubuntu-latest
needs: [docker-build-matrix, docker-compose-test, make-commands-test, ci-scripts-test]
if: always()
steps:
- name: Determine overall status
run: |
if [ "${{ needs.docker-build-matrix.result }}" = "success" ] && \
[ "${{ needs.docker-compose-test.result }}" = "success" ] && \
[ "${{ needs.make-commands-test.result }}" = "success" ] && \
[ "${{ needs.ci-scripts-test.result }}" = "success" ]; then
echo "OVERALL_STATUS=success" >> $GITHUB_ENV
echo "π All Docker tests passed!"
else
echo "OVERALL_STATUS=failure" >> $GITHUB_ENV
echo "β Some Docker tests failed"
fi
- name: Create summary
run: |
echo "## π³ Docker Testing Summary" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| Test Category | Status |" >> $GITHUB_STEP_SUMMARY
echo "|---------------|--------|" >> $GITHUB_STEP_SUMMARY
echo "| Docker Build Matrix | ${{ needs.docker-build-matrix.result }} |" >> $GITHUB_STEP_SUMMARY
echo "| Docker Compose | ${{ needs.docker-compose-test.result }} |" >> $GITHUB_STEP_SUMMARY
echo "| Make Commands | ${{ needs.make-commands-test.result }} |" >> $GITHUB_STEP_SUMMARY
echo "| CI Scripts | ${{ needs.ci-scripts-test.result }} |" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Overall Status: ${{ env.OVERALL_STATUS }}**" >> $GITHUB_STEP_SUMMARY