Add section for verifying the test docker compose file works correctly
Some checks are pending
CI/CD Pipeline (Fully Isolated DinD) / Run Tests (DinD) (push) Waiting to run
CI/CD Pipeline (Fully Isolated DinD) / Build and Push Docker Images (DinD) (push) Blocked by required conditions
CI/CD Pipeline (Fully Isolated DinD) / Deploy to Production (push) Blocked by required conditions

This commit is contained in:
continuist 2025-06-29 23:46:24 -04:00
parent cde0024c0a
commit 080bb12630

View file

@ -1135,13 +1135,17 @@ sudo journalctl -u forgejo-runner.service -f --no-pager
#### 8.1 Create Containerized CI/CD Environment
```bash
# Start DinD container using the repository's CI/CD Docker Compose file
cd /opt/APP_NAME
docker compose -f ci-cd-compose.yml up -d
# Start DinD container for isolated Docker operations
docker run -d \
--name ci-cd-dind \
--privileged \
-p 2375:2375 \
-e DOCKER_TLS_CERTDIR="" \
docker:dind
# Wait for DinD to be ready
echo "Waiting for DinD container to be ready..."
timeout 60 bash -c 'until docker compose -f ci-cd-compose.yml ps | grep -q "healthy"; do sleep 2; done'
timeout 60 bash -c 'until docker exec ci-cd-dind docker version; do sleep 2; done'
# Test DinD connectivity
docker exec ci-cd-dind docker version
@ -1149,9 +1153,8 @@ docker exec ci-cd-dind docker version
**What this does**:
- **Creates isolated DinD environment**: Provides isolated Docker environment for all CI/CD operations
- **Persistent storage**: `ci-cd-data` volume preserves data between restarts
- **Health checks**: Ensures DinD is fully ready before proceeding
- **Configuration management**: Uses the repository's `ci-cd-compose.yml` file
- **Simple setup**: Direct Docker commands for maximum flexibility
#### 8.2 Configure DinD for Harbor Registry
@ -1179,21 +1182,44 @@ docker exec ci-cd-dind docker rmi localhost:5000/test/alpine:latest
- **Tests connectivity**: Verifies DinD can pull, tag, and push images to Harbor
- **Validates setup**: Ensures the complete CI/CD pipeline will work
#### 8.3 DinD Environment Management
#### 8.3 CI/CD Workflow Architecture
The DinD container is managed as an isolated environment where all CI/CD operations run inside the DinD container, providing complete isolation from the host system.
The CI/CD pipeline uses a three-stage approach with dedicated environments for each stage:
**Job 1 (Testing) - `docker-compose.test.yml`:**
- **Purpose**: Comprehensive testing with multiple containers
- **Environment**: DinD with PostgreSQL, Rust, and Node.js containers
- **Services**:
- PostgreSQL database for backend tests
- Rust toolchain for backend testing and migrations
- Node.js toolchain for frontend testing
- **Network**: All containers communicate through `ci-cd-test-network`
- **Cleanup**: `docker compose -f docker-compose.test.yml down`
**Job 2 (Building) - Direct Docker Commands:**
- **Purpose**: Isolated image building and pushing to Harbor
- **Environment**: Single DinD container for Docker operations
- **Process**:
- Uses Docker Buildx for efficient building
- Builds backend and frontend images separately
- Pushes images to Harbor registry
- **Cleanup**: Simple container stop/remove
**Job 3 (Deployment) - `docker-compose.prod.yml`:**
- **Purpose**: Production deployment with pre-built images
- **Environment**: Production runner on Production Linode
- **Process**:
- Pulls images from Harbor registry
- Deploys complete application stack
- Verifies all services are healthy
- **Services**: PostgreSQL, backend, frontend, Nginx
**Key Benefits:**
- **🧹 Complete Isolation**: All testing and building runs inside DinD
- **🚫 No Host Contamination**: No containers run directly on host Docker
- **⚡ Consistent Environment**: Same isolation level for all operations
- **🎯 Resource Isolation**: CI/CD operations can't interfere with host services
- **🔄 Parallel Safety**: Multiple operations can run safely
**How it works:**
- **Job 1 (Testing)**: Creates PostgreSQL, Rust, and Node.js containers inside DinD
- **Job 2 (Building)**: Uses DinD directly for building and pushing Docker images to Harbor
- **Job 3 (Deployment)**: Production runner pulls images from Harbor and deploys using `docker-compose.prod.yml`
- **🧹 Complete Isolation**: Each job has its own dedicated environment
- **🚫 No Resource Contention**: Testing and building don't interfere with Harbor
- **⚡ Consistent Environment**: Same setup every time
- **🎯 Purpose-Specific**: Each Docker Compose file serves a specific purpose
- **🔄 Parallel Safety**: Jobs can run safely in parallel
**Testing DinD Setup:**
@ -2105,3 +2131,56 @@ You have successfully set up a complete CI/CD pipeline with:
- ✅ **Zero resource contention** between CI/CD and Harbor
Your application is now ready for continuous deployment with proper security, monitoring, and maintenance procedures in place!
### Step 8.6 CI/CD Workflow Summary Table
| Stage | What Runs | How/Where |
|---------|--------------------------|--------------------------|
| Test | All integration/unit tests| `docker-compose.test.yml`|
| Build | Build & push images | Direct Docker commands |
| Deploy | Deploy to production | `docker-compose.prod.yml`|
**How it works:**
- **Test:** The workflow spins up a full test environment using `docker-compose.test.yml` (Postgres, backend, frontend, etc.) and runs all tests inside containers.
- **Build:** If tests pass, the workflow uses direct Docker commands (no compose file) to build backend and frontend images and push them to Harbor.
- **Deploy:** The production runner pulls images from Harbor and deploys the stack using `docker-compose.prod.yml`.
**Expected Output:**
- Each stage runs in its own isolated environment.
- Test failures stop the pipeline before any images are built or deployed.
- Only tested images are deployed to production.
### Manual Testing with docker-compose.test.yml
You can use the same test environment locally that the CI pipeline uses for integration testing. This is useful for debugging, development, or verifying your setup before pushing changes.
#### Start the Test Environment
```bash
docker compose -f docker-compose.test.yml up -d
```
This will start all services needed for integration tests (PostgreSQL, backend, frontend, etc.) in the background.
#### Check Service Health
```bash
docker compose -f docker-compose.test.yml ps
```
Look for the `healthy` status in the output to ensure all services are ready.
#### Run Tests Manually
You can now exec into the containers to run tests or commands as needed. For example:
```bash
# Run backend tests
docker exec ci-cd-test-rust cargo test --all
# Run frontend tests
docker exec ci-cd-test-node npm run test
```
#### Cleanup
When you're done, stop and remove all test containers:
```bash
docker compose -f docker-compose.test.yml down
```
**Tip:** This is the same environment and process used by the CI pipeline, so passing tests here means they should also pass in CI.