mirror of
https://github.com/claude-did-this/claude-hub.git
synced 2026-02-14 19:30:02 +01:00
feat: optimize Docker with multi-stage builds and container-based testing
This commit is contained in:
@@ -1,34 +1,75 @@
|
|||||||
|
# Dependencies
|
||||||
node_modules
|
node_modules
|
||||||
npm-debug.log
|
npm-debug.log
|
||||||
|
dist
|
||||||
|
|
||||||
|
# Git
|
||||||
.git
|
.git
|
||||||
.gitignore
|
.gitignore
|
||||||
|
.gitattributes
|
||||||
|
|
||||||
|
# Environment
|
||||||
.env
|
.env
|
||||||
.env.*
|
.env.*
|
||||||
|
!.env.example
|
||||||
|
|
||||||
|
# OS
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# Testing
|
||||||
coverage
|
coverage
|
||||||
.nyc_output
|
.nyc_output
|
||||||
test-results
|
test-results
|
||||||
*.log
|
*.log
|
||||||
logs
|
logs
|
||||||
|
|
||||||
|
# Development
|
||||||
.husky
|
.husky
|
||||||
.github
|
|
||||||
.vscode
|
.vscode
|
||||||
.idea
|
.idea
|
||||||
*.swp
|
*.swp
|
||||||
*.swo
|
*.swo
|
||||||
*~
|
*~
|
||||||
CLAUDE.local.md
|
|
||||||
secrets
|
# Documentation
|
||||||
k8s
|
|
||||||
docs
|
|
||||||
test
|
|
||||||
*.test.js
|
|
||||||
*.spec.js
|
|
||||||
README.md
|
README.md
|
||||||
*.md
|
*.md
|
||||||
!CLAUDE.md
|
!CLAUDE.md
|
||||||
|
!README.dockerhub.md
|
||||||
|
|
||||||
|
# CI/CD
|
||||||
|
.github
|
||||||
|
!.github/workflows
|
||||||
|
|
||||||
|
# Secrets
|
||||||
|
secrets
|
||||||
|
CLAUDE.local.md
|
||||||
|
|
||||||
|
# Kubernetes
|
||||||
|
k8s
|
||||||
|
|
||||||
|
# Docker
|
||||||
docker-compose*.yml
|
docker-compose*.yml
|
||||||
|
!docker-compose.test.yml
|
||||||
Dockerfile*
|
Dockerfile*
|
||||||
|
!Dockerfile
|
||||||
|
!Dockerfile.claudecode
|
||||||
.dockerignore
|
.dockerignore
|
||||||
|
|
||||||
|
# Scripts - exclude all by default for security, then explicitly include needed runtime scripts
|
||||||
*.sh
|
*.sh
|
||||||
!scripts/runtime/*.sh
|
!scripts/runtime/*.sh
|
||||||
|
|
||||||
|
# Test files (keep for test stage)
|
||||||
|
# Removed test exclusion to allow test stage to access tests
|
||||||
|
|
||||||
|
# Build artifacts
|
||||||
|
*.tsbuildinfo
|
||||||
|
tsconfig.tsbuildinfo
|
||||||
|
|
||||||
|
# Cache
|
||||||
|
.cache
|
||||||
|
.buildx-cache*
|
||||||
|
tmp
|
||||||
|
temp
|
||||||
126
Dockerfile
126
Dockerfile
@@ -1,9 +1,69 @@
|
|||||||
FROM node:24-slim
|
# syntax=docker/dockerfile:1
|
||||||
|
|
||||||
|
# Build stage - compile TypeScript and prepare production files
|
||||||
|
FROM node:24-slim AS builder
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy package files first for better caching
|
||||||
|
COPY package*.json tsconfig.json babel.config.js ./
|
||||||
|
|
||||||
|
# Install all dependencies (including dev)
|
||||||
|
RUN npm ci
|
||||||
|
|
||||||
|
# Copy source code
|
||||||
|
COPY src/ ./src/
|
||||||
|
|
||||||
|
# Build TypeScript
|
||||||
|
RUN npm run build
|
||||||
|
|
||||||
|
# Copy remaining application files
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
# Production dependency stage - smaller layer for dependencies
|
||||||
|
FROM node:24-slim AS prod-deps
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy package files
|
||||||
|
COPY package*.json ./
|
||||||
|
|
||||||
|
# Install only production dependencies
|
||||||
|
RUN npm ci --omit=dev && npm cache clean --force
|
||||||
|
|
||||||
|
# Test stage - includes dev dependencies and test files
|
||||||
|
FROM node:24-slim AS test
|
||||||
|
|
||||||
|
# Set shell with pipefail option
|
||||||
|
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy package files and install all dependencies
|
||||||
|
COPY package*.json tsconfig*.json babel.config.js jest.config.js ./
|
||||||
|
RUN npm ci
|
||||||
|
|
||||||
|
# Copy source and test files
|
||||||
|
COPY src/ ./src/
|
||||||
|
COPY test/ ./test/
|
||||||
|
COPY scripts/ ./scripts/
|
||||||
|
|
||||||
|
# Copy built files from builder
|
||||||
|
COPY --from=builder /app/dist ./dist
|
||||||
|
|
||||||
|
# Set test environment
|
||||||
|
ENV NODE_ENV=test
|
||||||
|
|
||||||
|
# Run tests by default in this stage
|
||||||
|
CMD ["npm", "test"]
|
||||||
|
|
||||||
|
# Production stage - minimal runtime image
|
||||||
|
FROM node:24-slim AS production
|
||||||
|
|
||||||
# Set shell with pipefail option for better error handling
|
# Set shell with pipefail option for better error handling
|
||||||
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
||||||
|
|
||||||
# Install git, Claude Code, Docker, and required dependencies with pinned versions and --no-install-recommends
|
# Install runtime dependencies with pinned versions
|
||||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
git=1:2.39.5-0+deb12u2 \
|
git=1:2.39.5-0+deb12u2 \
|
||||||
curl=7.88.1-10+deb12u12 \
|
curl=7.88.1-10+deb12u12 \
|
||||||
@@ -23,56 +83,60 @@ RUN curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /
|
|||||||
&& apt-get install -y --no-install-recommends docker-ce-cli=5:27.* \
|
&& apt-get install -y --no-install-recommends docker-ce-cli=5:27.* \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
# Install Claude Code (latest version)
|
|
||||||
# hadolint ignore=DL3016
|
|
||||||
RUN npm install -g @anthropic-ai/claude-code
|
|
||||||
|
|
||||||
# Create docker group first, then create a non-root user for running the application
|
# Create docker group first, then create a non-root user for running the application
|
||||||
RUN groupadd -g 999 docker 2>/dev/null || true \
|
RUN groupadd -g 999 docker 2>/dev/null || true \
|
||||||
&& useradd -m -u 1001 -s /bin/bash claudeuser \
|
&& useradd -m -u 1001 -s /bin/bash claudeuser \
|
||||||
&& usermod -aG docker claudeuser 2>/dev/null || true
|
&& usermod -aG docker claudeuser 2>/dev/null || true
|
||||||
|
|
||||||
# Create claude config directory and copy config
|
# Create npm global directory for claudeuser and set permissions
|
||||||
|
RUN mkdir -p /home/claudeuser/.npm-global \
|
||||||
|
&& chown -R claudeuser:claudeuser /home/claudeuser/.npm-global
|
||||||
|
|
||||||
|
# Configure npm to use the user directory for global packages
|
||||||
|
USER claudeuser
|
||||||
|
ENV NPM_CONFIG_PREFIX=/home/claudeuser/.npm-global
|
||||||
|
ENV PATH=/home/claudeuser/.npm-global/bin:$PATH
|
||||||
|
|
||||||
|
# Install Claude Code (latest version) as non-root user
|
||||||
|
# hadolint ignore=DL3016
|
||||||
|
RUN npm install -g @anthropic-ai/claude-code
|
||||||
|
|
||||||
|
USER root
|
||||||
|
|
||||||
|
# Create claude config directory
|
||||||
RUN mkdir -p /home/claudeuser/.config/claude
|
RUN mkdir -p /home/claudeuser/.config/claude
|
||||||
COPY claude-config.json /home/claudeuser/.config/claude/config.json
|
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
# Copy package files and install dependencies
|
# Copy production dependencies from prod-deps stage
|
||||||
COPY package*.json ./
|
COPY --from=prod-deps /app/node_modules ./node_modules
|
||||||
COPY tsconfig.json ./
|
|
||||||
COPY babel.config.js ./
|
|
||||||
|
|
||||||
# Install all dependencies (including dev for build)
|
# Copy built application from builder stage
|
||||||
RUN npm ci
|
COPY --from=builder /app/dist ./dist
|
||||||
|
|
||||||
# Copy source code
|
# Copy configuration and runtime files
|
||||||
COPY src/ ./src/
|
COPY package*.json tsconfig.json babel.config.js ./
|
||||||
|
COPY claude-config.json /home/claudeuser/.config/claude/config.json
|
||||||
|
COPY scripts/ ./scripts/
|
||||||
|
COPY docs/ ./docs/
|
||||||
|
COPY cli/ ./cli/
|
||||||
|
|
||||||
# Build TypeScript
|
# Set permissions
|
||||||
RUN npm run build
|
|
||||||
|
|
||||||
# Remove dev dependencies to reduce image size
|
|
||||||
RUN npm prune --omit=dev && npm cache clean --force
|
|
||||||
|
|
||||||
# Copy remaining application files
|
|
||||||
COPY . .
|
|
||||||
|
|
||||||
# Consolidate permission changes into a single RUN instruction
|
|
||||||
RUN chown -R claudeuser:claudeuser /home/claudeuser/.config /app \
|
RUN chown -R claudeuser:claudeuser /home/claudeuser/.config /app \
|
||||||
&& chmod +x /app/scripts/runtime/startup.sh
|
&& chmod +x /app/scripts/runtime/startup.sh
|
||||||
|
|
||||||
# Note: Docker socket will be mounted at runtime, no need to create it here
|
|
||||||
|
|
||||||
# Expose the port
|
# Expose the port
|
||||||
EXPOSE 3002
|
EXPOSE 3002
|
||||||
|
|
||||||
# Set default environment variables
|
# Set default environment variables
|
||||||
ENV NODE_ENV=production \
|
ENV NODE_ENV=production \
|
||||||
PORT=3002
|
PORT=3002 \
|
||||||
|
NPM_CONFIG_PREFIX=/home/claudeuser/.npm-global \
|
||||||
|
PATH=/home/claudeuser/.npm-global/bin:$PATH
|
||||||
|
|
||||||
# Stay as root user to run Docker commands
|
# Switch to non-root user for running the application
|
||||||
# (The container will need to run with Docker socket mounted)
|
# Docker commands will work via docker group membership when socket is mounted
|
||||||
|
USER claudeuser
|
||||||
|
|
||||||
# Run the startup script
|
# Run the startup script
|
||||||
CMD ["bash", "/app/scripts/runtime/startup.sh"]
|
CMD ["bash", "/app/scripts/runtime/startup.sh"]
|
||||||
68
docker-compose.test.yml
Normal file
68
docker-compose.test.yml
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
# Test runner service - runs tests in container
|
||||||
|
test:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
target: test
|
||||||
|
cache_from:
|
||||||
|
- ${DOCKER_HUB_ORGANIZATION:-intelligenceassist}/claude-hub:test-cache
|
||||||
|
environment:
|
||||||
|
- NODE_ENV=test
|
||||||
|
- CI=true
|
||||||
|
- GITHUB_TOKEN=${GITHUB_TOKEN:-test-token}
|
||||||
|
- GITHUB_WEBHOOK_SECRET=${GITHUB_WEBHOOK_SECRET:-test-secret}
|
||||||
|
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-test-key}
|
||||||
|
volumes:
|
||||||
|
- ./coverage:/app/coverage
|
||||||
|
# Run only unit tests in CI (no e2e tests that require Docker)
|
||||||
|
command: npm run test:unit
|
||||||
|
|
||||||
|
# Integration test service
|
||||||
|
integration-test:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
target: test
|
||||||
|
environment:
|
||||||
|
- NODE_ENV=test
|
||||||
|
- CI=true
|
||||||
|
- TEST_SUITE=integration
|
||||||
|
volumes:
|
||||||
|
- ./coverage:/app/coverage
|
||||||
|
command: npm run test:integration
|
||||||
|
depends_on:
|
||||||
|
- webhook
|
||||||
|
|
||||||
|
# Webhook service for integration testing
|
||||||
|
webhook:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
target: production
|
||||||
|
environment:
|
||||||
|
- NODE_ENV=test
|
||||||
|
- PORT=3002
|
||||||
|
- GITHUB_TOKEN=${GITHUB_TOKEN:-test-token}
|
||||||
|
- GITHUB_WEBHOOK_SECRET=${GITHUB_WEBHOOK_SECRET:-test-secret}
|
||||||
|
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-test-key}
|
||||||
|
ports:
|
||||||
|
- "3002:3002"
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:3002/health"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
start_period: 40s
|
||||||
|
|
||||||
|
# E2E test service - removed from CI, use for local development only
|
||||||
|
# To run e2e tests locally with Docker access:
|
||||||
|
# docker compose -f docker-compose.test.yml run --rm -v /var/run/docker.sock:/var/run/docker.sock e2e-test
|
||||||
|
|
||||||
|
# Networks
|
||||||
|
networks:
|
||||||
|
default:
|
||||||
|
name: claude-hub-test
|
||||||
|
driver: bridge
|
||||||
214
docs/docker-optimization.md
Normal file
214
docs/docker-optimization.md
Normal file
@@ -0,0 +1,214 @@
|
|||||||
|
# Docker Build Optimization Guide
|
||||||
|
|
||||||
|
This document describes the optimizations implemented in our Docker CI/CD pipeline for faster builds and better caching.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Our optimized Docker build pipeline includes:
|
||||||
|
- Self-hosted runner support with automatic fallback
|
||||||
|
- Multi-stage builds for efficient layering
|
||||||
|
- Advanced caching strategies
|
||||||
|
- Container-based testing
|
||||||
|
- Parallel builds for multiple images
|
||||||
|
- Security scanning integration
|
||||||
|
|
||||||
|
## Self-Hosted Runners
|
||||||
|
|
||||||
|
### Configuration
|
||||||
|
- **Labels**: `self-hosted, linux, x64, docker`
|
||||||
|
- **Usage**: All Docker builds use self-hosted runners for improved performance and caching
|
||||||
|
- **Local Cache**: Self-hosted runners maintain Docker layer cache between builds
|
||||||
|
- **Fallback**: Manual fallback to GitHub-hosted runners if self-hosted are unavailable
|
||||||
|
|
||||||
|
### Runner Setup
|
||||||
|
Self-hosted runners provide:
|
||||||
|
- Persistent Docker layer cache
|
||||||
|
- Faster builds (no image pull overhead)
|
||||||
|
- Better network throughput for pushing images
|
||||||
|
- Cost savings on GitHub Actions minutes
|
||||||
|
|
||||||
|
### Fallback Strategy
|
||||||
|
If self-hosted runners are unavailable:
|
||||||
|
1. Workflow will queue waiting for runners
|
||||||
|
2. Can be manually cancelled and re-run with modified workflow
|
||||||
|
3. Consider implementing automatic fallback in future iterations
|
||||||
|
|
||||||
|
## Multi-Stage Dockerfile
|
||||||
|
|
||||||
|
Our Dockerfile uses multiple stages for optimal caching and smaller images:
|
||||||
|
|
||||||
|
1. **Builder Stage**: Compiles TypeScript
|
||||||
|
2. **Prod-deps Stage**: Installs production dependencies only
|
||||||
|
3. **Test Stage**: Includes dev dependencies and test files
|
||||||
|
4. **Production Stage**: Minimal runtime image
|
||||||
|
|
||||||
|
### Benefits
|
||||||
|
- Parallel builds of independent stages
|
||||||
|
- Smaller final image (no build tools or dev dependencies)
|
||||||
|
- Test stage can run in CI without affecting production image
|
||||||
|
- Better layer caching between builds
|
||||||
|
|
||||||
|
## Caching Strategies
|
||||||
|
|
||||||
|
### 1. GitHub Actions Cache (GHA)
|
||||||
|
```yaml
|
||||||
|
cache-from: type=gha,scope=${{ matrix.image }}-prod
|
||||||
|
cache-to: type=gha,mode=max,scope=${{ matrix.image }}-prod
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Registry Cache
|
||||||
|
```yaml
|
||||||
|
cache-from: type=registry,ref=${{ org }}/claude-hub:nightly
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Inline Cache
|
||||||
|
```yaml
|
||||||
|
build-args: BUILDKIT_INLINE_CACHE=1
|
||||||
|
outputs: type=inline
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Layer Ordering
|
||||||
|
- Package files copied first (changes less frequently)
|
||||||
|
- Source code copied after dependencies
|
||||||
|
- Build artifacts cached between stages
|
||||||
|
|
||||||
|
## Container-Based Testing
|
||||||
|
|
||||||
|
Tests run inside Docker containers for:
|
||||||
|
- Consistent environment
|
||||||
|
- Parallel test execution
|
||||||
|
- Isolation from host system
|
||||||
|
- Same environment as production
|
||||||
|
|
||||||
|
### Test Execution
|
||||||
|
```bash
|
||||||
|
# Unit tests in container
|
||||||
|
docker run --rm claude-hub:test npm test
|
||||||
|
|
||||||
|
# Integration tests with docker-compose
|
||||||
|
docker-compose -f docker-compose.test.yml run integration-test
|
||||||
|
|
||||||
|
# E2E tests against running services
|
||||||
|
docker-compose -f docker-compose.test.yml run e2e-test
|
||||||
|
```
|
||||||
|
|
||||||
|
## Build Performance Optimizations
|
||||||
|
|
||||||
|
### 1. BuildKit Features
|
||||||
|
- `DOCKER_BUILDKIT=1` for improved performance
|
||||||
|
- `--mount=type=cache` for package manager caches
|
||||||
|
- Parallel stage execution
|
||||||
|
|
||||||
|
### 2. Docker Buildx
|
||||||
|
- Multi-platform builds (amd64, arm64)
|
||||||
|
- Advanced caching backends
|
||||||
|
- Build-only stages that don't ship to production
|
||||||
|
|
||||||
|
### 3. Context Optimization
|
||||||
|
- `.dockerignore` excludes unnecessary files
|
||||||
|
- Minimal context sent to Docker daemon
|
||||||
|
- Faster uploads and builds
|
||||||
|
|
||||||
|
### 4. Dependency Caching
|
||||||
|
- Separate stage for production dependencies
|
||||||
|
- npm ci with --omit=dev for smaller images
|
||||||
|
- Cache mount for npm packages
|
||||||
|
|
||||||
|
## Workflow Features
|
||||||
|
|
||||||
|
### PR Builds
|
||||||
|
- Build and test without publishing
|
||||||
|
- Single platform (amd64) for speed
|
||||||
|
- Container-based test execution
|
||||||
|
- Security scanning with Trivy
|
||||||
|
|
||||||
|
### Main Branch Builds
|
||||||
|
- Multi-platform builds (amd64, arm64)
|
||||||
|
- Push to registry with :nightly tag
|
||||||
|
- Update cache images
|
||||||
|
- Full test suite execution
|
||||||
|
|
||||||
|
### Version Tag Builds
|
||||||
|
- Semantic versioning tags
|
||||||
|
- :latest tag update
|
||||||
|
- Multi-platform support
|
||||||
|
- Production-ready images
|
||||||
|
|
||||||
|
## Security Scanning
|
||||||
|
|
||||||
|
### Integrated Scanners
|
||||||
|
1. **Trivy**: Vulnerability scanning for Docker images
|
||||||
|
2. **Hadolint**: Dockerfile linting
|
||||||
|
3. **npm audit**: Dependency vulnerability checks
|
||||||
|
4. **SARIF uploads**: Results visible in GitHub Security tab
|
||||||
|
|
||||||
|
## Monitoring and Metrics
|
||||||
|
|
||||||
|
### Build Performance
|
||||||
|
- Build time per stage
|
||||||
|
- Cache hit rates
|
||||||
|
- Image size tracking
|
||||||
|
- Test execution time
|
||||||
|
|
||||||
|
### Health Checks
|
||||||
|
```yaml
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:3002/health"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
```
|
||||||
|
|
||||||
|
## Local Development
|
||||||
|
|
||||||
|
### Building locally
|
||||||
|
```bash
|
||||||
|
# Build with BuildKit
|
||||||
|
DOCKER_BUILDKIT=1 docker build -t claude-hub:local .
|
||||||
|
|
||||||
|
# Build specific stage
|
||||||
|
docker build --target test -t claude-hub:test .
|
||||||
|
|
||||||
|
# Run tests locally
|
||||||
|
docker-compose -f docker-compose.test.yml run test
|
||||||
|
```
|
||||||
|
|
||||||
|
### Cache Management
|
||||||
|
```bash
|
||||||
|
# Clear builder cache
|
||||||
|
docker builder prune
|
||||||
|
|
||||||
|
# Use local cache
|
||||||
|
docker build --cache-from claude-hub:local .
|
||||||
|
```
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
1. **Order Dockerfile commands** from least to most frequently changing
|
||||||
|
2. **Use specific versions** for base images and dependencies
|
||||||
|
3. **Minimize layers** by combining RUN commands
|
||||||
|
4. **Clean up** package manager caches in the same layer
|
||||||
|
5. **Use multi-stage builds** to reduce final image size
|
||||||
|
6. **Leverage BuildKit** features for better performance
|
||||||
|
7. **Test in containers** for consistency across environments
|
||||||
|
8. **Monitor build times** and optimize bottlenecks
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Slow Builds
|
||||||
|
- Check cache hit rates in build logs
|
||||||
|
- Verify .dockerignore is excluding large files
|
||||||
|
- Use `--progress=plain` to see detailed timings
|
||||||
|
- Consider parallelizing independent stages
|
||||||
|
|
||||||
|
### Cache Misses
|
||||||
|
- Ensure consistent base image versions
|
||||||
|
- Check for unnecessary file changes triggering rebuilds
|
||||||
|
- Use cache mounts for package managers
|
||||||
|
- Verify registry cache is accessible
|
||||||
|
|
||||||
|
### Test Failures in Container
|
||||||
|
- Check environment variable differences
|
||||||
|
- Verify volume mounts are correct
|
||||||
|
- Ensure test dependencies are in test stage
|
||||||
|
- Check for hardcoded paths or ports
|
||||||
@@ -14,11 +14,15 @@
|
|||||||
"typecheck": "tsc --noEmit",
|
"typecheck": "tsc --noEmit",
|
||||||
"test": "jest --testPathPattern='test/(unit|integration).*\\.test\\.(js|ts)$'",
|
"test": "jest --testPathPattern='test/(unit|integration).*\\.test\\.(js|ts)$'",
|
||||||
"test:unit": "jest --testMatch='**/test/unit/**/*.test.{js,ts}'",
|
"test:unit": "jest --testMatch='**/test/unit/**/*.test.{js,ts}'",
|
||||||
|
"test:integration": "jest --testMatch='**/test/integration/**/*.test.{js,ts}'",
|
||||||
"test:chatbot": "jest --testMatch='**/test/unit/providers/**/*.test.{js,ts}' --testMatch='**/test/unit/controllers/chatbotController.test.{js,ts}'",
|
"test:chatbot": "jest --testMatch='**/test/unit/providers/**/*.test.{js,ts}' --testMatch='**/test/unit/controllers/chatbotController.test.{js,ts}'",
|
||||||
"test:e2e": "jest --testMatch='**/test/e2e/**/*.test.{js,ts}'",
|
"test:e2e": "jest --testMatch='**/test/e2e/**/*.test.{js,ts}'",
|
||||||
"test:coverage": "jest --coverage",
|
"test:coverage": "jest --coverage",
|
||||||
"test:watch": "jest --watch",
|
"test:watch": "jest --watch",
|
||||||
"test:ci": "jest --ci --coverage --testPathPattern='test/(unit|integration).*\\.test\\.(js|ts)$'",
|
"test:ci": "jest --ci --coverage --testPathPattern='test/(unit|integration).*\\.test\\.(js|ts)$'",
|
||||||
|
"test:docker": "docker-compose -f docker-compose.test.yml run --rm test",
|
||||||
|
"test:docker:integration": "docker-compose -f docker-compose.test.yml run --rm integration-test",
|
||||||
|
"test:docker:e2e": "docker-compose -f docker-compose.test.yml run --rm e2e-test",
|
||||||
"pretest": "./scripts/utils/ensure-test-dirs.sh",
|
"pretest": "./scripts/utils/ensure-test-dirs.sh",
|
||||||
"lint": "eslint src/ test/ --fix",
|
"lint": "eslint src/ test/ --fix",
|
||||||
"lint:check": "eslint src/ test/",
|
"lint:check": "eslint src/ test/",
|
||||||
|
|||||||
Reference in New Issue
Block a user