diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index ceaa438..0000000 --- a/Dockerfile +++ /dev/null @@ -1,57 +0,0 @@ -# DanceLessonsCoach Docker Image -# Multi-stage build for production deployment - -# Stage 1: Build binary -FROM golang:1.26.1-alpine AS builder - -WORKDIR /app - -# Copy go mod files -COPY go.mod go.sum ./ -RUN go mod download - -# Copy source code -COPY . ./ - -# Install swag and generate Swagger docs only if they don't exist -RUN if [ ! -f pkg/server/docs/swagger.json ]; then \ - echo "๐Ÿ“ Generating Swagger documentation..." && \ - go install github.com/swaggo/swag/cmd/swag@latest && \ - cd pkg/server && go generate && \ - echo "โœ… Swagger documentation generated"; \ - else \ - echo "โœ… Swagger documentation already exists, skipping swag installation and generation"; \ - fi - -# Build binary -RUN CGO_ENABLED=0 GOOS=linux go build -o /dance-lessons-coach ./cmd/server - -# Stage 2: Final image -FROM alpine:3.18 - -WORKDIR /app - -# Install dependencies -RUN apk add --no-cache ca-certificates tzdata - -# Copy binary from builder -COPY --from=builder /dance-lessons-coach /app/dance-lessons-coach - -# Copy configuration -COPY config.yaml /app/config.yaml - -# Set permissions -RUN chmod +x /app/dance-lessons-coach - -# Set timezone -ENV TZ=UTC - -# Expose port -EXPOSE 8080 - -# Health check -HEALTHCHECK --interval=30s --timeout=3s \ - CMD wget -q --spider http://localhost:8080/api/health || exit 1 - -# Entry point -ENTRYPOINT ["/app/dance-lessons-coach"] diff --git a/Dockerfile.build b/Dockerfile.build deleted file mode 100644 index 9cf326b..0000000 --- a/Dockerfile.build +++ /dev/null @@ -1,38 +0,0 @@ -# Build environment Dockerfile with pre-installed Go tools and dependencies -# Optimized for CI/CD pipeline speed - -FROM golang:1.26.1-alpine AS builder - -# Install build dependencies -RUN apk add --no-cache \ - git \ - bash \ - curl \ - make \ - gcc \ - musl-dev \ - bc \ - grep \ - sed \ - jq \ - ca-certificates - -# Set up Go environment -ENV GOPATH=/go -ENV PATH=$GOPATH/bin:/usr/local/go/bin:/usr/local/bin:/usr/bin:/bin -WORKDIR /go/src/dance-lessons-coach - -# Install common Go tools -RUN go install github.com/swaggo/swag/cmd/swag@latest && \ - go install golang.org/x/tools/cmd/goimports@latest && \ - go install honnef.co/go/tools/cmd/staticcheck@latest - -# Copy only go.mod and go.sum first for dependency caching -COPY go.mod go.sum ./ -RUN go mod download && go mod verify - -# Simple build environment - source code is mounted at runtime -WORKDIR /workspace - -# Pre-download common Go tools (already installed in base) -# RUN go install github.com/swaggo/swag/cmd/swag@latest \ No newline at end of file diff --git a/Dockerfile.prod b/Dockerfile.prod deleted file mode 100644 index 6e0dcdb..0000000 --- a/Dockerfile.prod +++ /dev/null @@ -1,37 +0,0 @@ -# DanceLessonsCoach Production Docker Image -# โš ๏ธ DEVELOPMENT ONLY - This file uses 'latest' tag for local testing -# โš ๏ธ CI/CD generates the correct Dockerfile.prod with proper dependency hash -# โš ๏ธ For production use, see the CI/CD workflow which generates the correct file - -# Use the build cache image as base (latest for local dev only) -FROM gitea.arcodange.lab/arcodange/dance-lessons-coach-build-cache:latest AS builder - -# Final minimal image -FROM alpine:3.18 - -WORKDIR /app - -# Install minimal dependencies -RUN apk add --no-cache ca-certificates tzdata - -# Copy binary from builder -COPY --from=builder /workspace/dance-lessons-coach /app/dance-lessons-coach - -# Copy configuration -COPY config.yaml /app/config.yaml - -# Set permissions -RUN chmod +x /app/dance-lessons-coach - -# Set timezone -ENV TZ=UTC - -# Expose port -EXPOSE 8080 - -# Health check -HEALTHCHECK --interval=30s --timeout=3s \ - CMD wget -q --spider http://localhost:8080/api/health || exit 1 - -# Entry point -ENTRYPOINT ["/app/dance-lessons-coach"] \ No newline at end of file diff --git a/Dockerfile.prod.template b/Dockerfile.prod.template deleted file mode 100644 index 992b74f..0000000 --- a/Dockerfile.prod.template +++ /dev/null @@ -1,36 +0,0 @@ -# DanceLessonsCoach Production Docker Image -# Minimal image using pre-built binary from CI cache -# Template: Replace {{DEPS_HASH}} with actual dependency hash - -# Use the build cache image as base -FROM gitea.arcodange.lab/arcodange/dance-lessons-coach-build-cache:{{DEPS_HASH}} AS builder - -# Final minimal image -FROM alpine:3.18 - -WORKDIR /app - -# Install minimal dependencies -RUN apk add --no-cache ca-certificates tzdata - -# Copy binary from builder -COPY --from=builder /workspace/dance-lessons-coach /app/dance-lessons-coach - -# Copy configuration -COPY config.yaml /app/config.yaml - -# Set permissions -RUN chmod +x /app/dance-lessons-coach - -# Set timezone -ENV TZ=UTC - -# Expose port -EXPOSE 8080 - -# Health check -HEALTHCHECK --interval=30s --timeout=3s \ - CMD wget -q --spider http://localhost:8080/api/health || exit 1 - -# Entry point -ENTRYPOINT ["/app/dance-lessons-coach"] \ No newline at end of file diff --git a/adr/0020-docker-build-strategy.md b/adr/0020-docker-build-strategy.md index 353d8a2..3190817 100644 --- a/adr/0020-docker-build-strategy.md +++ b/adr/0020-docker-build-strategy.md @@ -446,13 +446,35 @@ echo "Hash: $DEPS_HASH" docker run --rm -i hadolint/hadolint < Dockerfile.prod ``` +## Cleanup and Organization + +### Files Removed + +1. **docker-compose.cicd-test.yml**: Unused Docker Compose file +2. **scripts/cicd/**: Old CI/CD test scripts (replaced by main test scripts) + +### Files Organized + +All Dockerfiles moved to `docker/` directory: +- `docker/Dockerfile` - Development +- `docker/Dockerfile.build` - Build cache +- `docker/Dockerfile.prod` - Production (dev only) +- `docker/Dockerfile.prod.template` - Template + +### Utility Scripts + +- `scripts/calculate-deps-hash.sh` - Consistent hash calculation +- `scripts/test-local-ci-cd.sh` - Main local testing +- `scripts/test-build-cache-environment.sh` - Build cache testing + ## Expected Outcomes -1. **Successful workflow execution**: Workflow 419 completes without errors +1. **Successful workflow execution**: Workflow completes without errors 2. **Cache image created**: Build cache image pushed to registry -3. **Production image built**: Final Docker image built using `Dockerfile.prod` +3. **Production image built**: Final Docker image built using generated `docker/Dockerfile.prod` 4. **Faster CI execution**: Reduced build times compared to previous approach 5. **No certificate errors**: No TLS certificate verification failures +6. **Clean organization**: No clutter in root directory ## References diff --git a/docker-compose.cicd-test.yml b/docker-compose.cicd-test.yml deleted file mode 100644 index c6a99b8..0000000 --- a/docker-compose.cicd-test.yml +++ /dev/null @@ -1,29 +0,0 @@ -version: '3.8' - -services: - act-runner: - image: gitea/act_runner:latest - volumes: - - .:/workspace - # - ./config/runner:/data/.runner - working_dir: /workspace - environment: - - GITEA_INSTANCE_URL=${GITEA_INSTANCE_URL:-https://gitea.arcodange.lab/} - - GITEA_RUNNER_REGISTRATION_TOKEN=${GITEA_RUNNER_REGISTRATION_TOKEN} - - GITEA_RUNNER_NAME=${GITEA_RUNNER_NAME:-local-test-runner} - - GITEA_RUNNER_LABELS=${GITEA_RUNNER_LABELS:-ubuntu-latest:docker://node:16-bullseye,ubuntu-22.04:docker://gitea/act_runner:latest} - command: act -W .gitea/workflows/go-ci-cd.yaml --rm - - yamllint: - image: pipelinecomponents/yamllint:latest - volumes: - - .:/workspace - working_dir: /workspace - command: yamllint .gitea/workflows/ - - yq-validator: - image: mikefarah/yq:latest - volumes: - - .:/workspace - working_dir: /workspace - command: yq eval '.' .gitea/workflows/ci-cd.yaml \ No newline at end of file diff --git a/scripts/cicd/README.md b/scripts/cicd/README.md deleted file mode 100644 index 42fb8ab..0000000 --- a/scripts/cicd/README.md +++ /dev/null @@ -1,286 +0,0 @@ -# CI/CD Scripts for DanceLessonsCoach - -## ๐Ÿš€ Quick Start for Contributors - -### You Only Need These Commands - -```bash -# 1. Run tests (this is what matters most!) -go test ./... - -# 2. Build binaries -./scripts/build.sh - -# 3. Check formatting -go fmt ./... - -# That's it! The CI/CD pipeline will handle the rest when you create a PR. -``` - -## ๐Ÿ“– Understanding the CI/CD Pipeline - -### What Happens Automatically - -When you push code or create a PR, GitHub Actions runs: - -1. **Go CI/CD Pipeline** (`.gitea/workflows/go-ci-cd.yaml`) - - Builds all Go packages - - Runs tests with coverage - - Checks code formatting - - Validates workflow structure - -2. **Docker Image Pipeline** (`.gitea/workflows/dockerimage.yaml`) - - Builds Docker image (on main branch only) - - Publishes to Gitea Container Registry - - Tags with version and commit SHA - -### When Does It Run? - -| Event | Go CI/CD | Docker Image | -|-------|---------|--------------| -| Push to `main` | โœ… Yes | โœ… Yes | -| Push to `feature/*` | โœ… Yes | โŒ No | -| Push to `fix/*` | โœ… Yes | โŒ No | -| Push to `ci/*` | โœ… Yes | โŒ No | -| Pull Request | โœ… Yes | โŒ No | -| Manual trigger | โœ… Yes | โœ… Yes | - -## ๐Ÿงช Local Testing Options - -### Option 1: Simple Validation (No Docker Required) - -```bash -# Just run the essentials -./scripts/cicd/contributor-quickstart.sh -``` - -This checks: -- โœ… Go installation -- โœ… All tests pass -- โœ… Code formatting -- โœ… Go vet analysis -- โœ… Workflow structure - -### Option 2: Docker-Based Testing (Recommended) - -```bash -# Test workflow compatibility with GitHub Actions -./scripts/cicd/test-act-local.sh -``` - -**Requirements:** -- Docker installed and running -- Internet connection (to pull images) - -**What it does:** -- Validates YAML syntax -- Checks workflow structure -- Simulates GitHub Actions execution -- Tests both workflow files - -### Option 3: Full CI/CD Simulation - -```bash -# Complete local simulation -./scripts/cicd/test-cicd-simple.sh -``` - -**Requirements:** -- Docker installed and running -- More time (pulls multiple images) - -**What it does:** -- YAML linting -- YAML validation -- Workflow structure validation -- Simulates build job -- Runs actual Go tests in containers - -## ๐Ÿณ Docker Setup Guide - -### For Windows Users - -1. **Install Docker Desktop** - - Download: https://www.docker.com/products/docker-desktop/ - - Enable WSL 2 backend (recommended) - - Allocate at least 4GB RAM - -2. **Verify Installation** - ```powershell - docker --version - docker run hello-world - ``` - -### For macOS Users - -1. **Install Docker Desktop** - - Download: https://www.docker.com/products/docker-desktop/ - - Grant necessary permissions - -2. **Verify Installation** - ```bash - docker --version - docker run hello-world - ``` - -### For Linux Users - -1. **Install Docker Engine** - ```bash - # Ubuntu/Debian - sudo apt-get update - sudo apt-get install docker.io docker-compose - sudo systemctl enable docker - sudo systemctl start docker - - # Add user to docker group (avoid sudo) - sudo usermod -aG docker $USER - newgrp docker # Reload group membership - ``` - -2. **Verify Installation** - ```bash - docker --version - docker run hello-world - ``` - -## ๐Ÿ”ง Troubleshooting - -### Docker Permission Issues - -**Symptom:** `Got permission denied while trying to connect to the Docker daemon socket` - -**Solution:** -```bash -# Linux/macOS -sudo usermod -aG docker $USER -newgrp docker - -# Windows -Right-click Docker Desktop โ†’ Settings โ†’ Resources โ†’ WSL Integration โ†’ Enable -``` - -### Docker Not Running - -**Symptom:** `Cannot connect to the Docker daemon` - -**Solution:** -- Windows/macOS: Open Docker Desktop app -- Linux: `sudo systemctl start docker` - -### Network Issues - -**Symptom:** `Cannot pull Docker images` - -**Solution:** -```bash -# Check internet connection -ping google.com - -# Try pulling manually first -docker pull mikefarah/yq:latest -docker pull pipelinecomponents/yamllint:latest -``` - -### act Not Installed - -**Symptom:** `act not found` in `test-act-local.sh` - -**Solution:** -```bash -# Install act (optional - only needed for test-act-local.sh) -# macOS -brew install act - -# Linux -curl https://raw.githubusercontent.com/nektos/act/master/install.sh | sudo bash - -# Windows (WSL) -curl https://raw.githubusercontent.com/nektos/act/master/install.sh | sudo bash -``` - -## ๐Ÿ“š Script Reference - -| Script | Purpose | Docker Required? | act Required? | -|--------|---------|------------------|---------------| -| `contributor-quickstart.sh` | Basic validation | โŒ No | โŒ No | -| `validate-workflow.sh` | Workflow structure | โŒ No | โŒ No | -| `test-act-local.sh` | GitHub Actions compatibility | โœ… Yes | โœ… Yes | -| `test-cicd-simple.sh` | Full CI/CD simulation | โœ… Yes | โŒ No | - -## ๐ŸŽฏ Best Practices - -### Before Submitting a PR - -1. **Run tests locally** - ```bash - go test ./... - ``` - -2. **Check formatting** - ```bash - go fmt ./... - ``` - -3. **Build binaries** - ```bash - ./scripts/build.sh - ``` - -4. **Validate workflows** (optional) - ```bash - ./scripts/cicd/validate-workflow.sh - ``` - -### Working with the CI/CD Pipeline - -- **Don't worry about Docker images** - The pipeline builds them automatically -- **Focus on tests** - If tests pass locally, they'll pass in CI/CD -- **Check PR status** - GitHub will show CI/CD results automatically -- **Fix failures** - If CI/CD fails, check the logs and fix issues - -## ๐Ÿ”— Useful Links - -- **GitHub Actions Docs**: https://docs.github.com/en/actions -- **Docker Docs**: https://docs.docker.com/ -- **act GitHub**: https://github.com/nektos/act -- **DanceLessonsCoach CI/CD**: See `.gitea/workflows/` directory - -## ๐Ÿ’ก Pro Tips - -### Speed Up Local Testing - -```bash -# Pull Docker images in advance -docker pull mikefarah/yq:latest -docker pull pipelinecomponents/yamllint:latest -docker pull node:16-buster-slim -``` - -### Test Specific Workflows - -```bash -# Test Go CI/CD workflow only -act -W .gitea/workflows/go-ci-cd.yaml - -# Test Docker workflow only -act -W .gitea/workflows/dockerimage.yaml -``` - -### Dry Run (No Execution) - -```bash -# Check workflow syntax without running -echo 'm' | act -n -W .gitea/workflows/go-ci-cd.yaml -``` - -## ๐Ÿ“ž Need Help? - -If you're stuck with CI/CD setup: - -1. **Check this documentation** - Most issues are covered here -2. **Run contributor-quickstart.sh** - It validates the essentials -3. **Ask in the PR** - We'll help you resolve any issues -4. **Check CI/CD logs** - GitHub shows detailed error messages - -Remember: **You don't need to run CI/CD locally to contribute!** The pipeline runs automatically when you push code. diff --git a/scripts/cicd/check-pipeline-status.sh b/scripts/cicd/check-pipeline-status.sh deleted file mode 100755 index ae2d5f5..0000000 --- a/scripts/cicd/check-pipeline-status.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/bash -# Check CI/CD pipeline status across all platforms - -set -e - -echo "๐Ÿ” Checking CI/CD Pipeline Status" -echo "================================" - -# 1. Gitea (Primary) - Internal URL -if curl -s -o /dev/null -w "%{http_code}" "https://gitea.arcodange.lab/api/v1/repos/arcodange/DanceLessonsCoach/actions/workflows" 2>/dev/null | grep -q "200"; then - echo "โœ… Gitea Internal API: Accessible" - # Get workflow list - WORKFLOWS=$(curl -s "https://gitea.arcodange.lab/api/v1/repos/arcodange/DanceLessonsCoach/actions/workflows" 2>/dev/null | jq -r '.[] | .name + " (" + .file_name + ")"' 2>/dev/null || echo "Unable to fetch workflow list") - echo "๐Ÿ“‹ Gitea Workflows:" - echo "$WORKFLOWS" | sed 's/^/ - /' -else - echo "โŒ Gitea Internal API: Not accessible (check network/vpn)" -fi - -# 2. Gitea (External) - Public URL -echo "" -echo "๐ŸŒ Gitea External Status:" -if curl -s -o /dev/null -w "%{http_code}" "https://gitea.arcodange.fr/arcodange/DanceLessonsCoach" 2>/dev/null | grep -q "200"; then - echo "โœ… Gitea External: Accessible" - echo "๐Ÿ”— Repository: https://gitea.arcodange.fr/arcodange/DanceLessonsCoach" -else - echo "โŒ Gitea External: Not accessible" -fi - -# 3. Check badge API -echo "" -echo "๐Ÿท๏ธ Badge API Status:" -BADGE_URL="https://gitea.arcodange.fr/api/badges/arcodange/DanceLessonsCoach/status" -if curl -s -o /dev/null -w "%{http_code}" "$BADGE_URL" 2>/dev/null | grep -q "200"; then - echo "โœ… Badge API: Accessible" - echo "๐Ÿ”— Badge URL: $BADGE_URL" -else - echo "โŒ Badge API: Not accessible" -fi - -# 4. Check workflow file existence -echo "" -echo "๐Ÿ“ Workflow Files:" -if [ -f ".gitea/workflows/ci-cd.yaml" ]; then - echo "โœ… .gitea/workflows/ci-cd.yaml: Found" - if command -v yq >/dev/null 2>&1; then - echo "๐Ÿ“Š Jobs: $(yq eval '.jobs | keys | join(", ")' .gitea/workflows/ci-cd.yaml 2>/dev/null || echo 'Unable to parse')" - else - echo "๐Ÿ“Š Jobs: yq not installed, cannot parse jobs" - fi -else - echo "โŒ .gitea/workflows/ci-cd.yaml: Not found" -fi - -echo "" -echo "๐ŸŽฏ Validation Summary" -echo "================================" -echo "โœ… Local workflow file: .gitea/workflows/ci-cd.yaml" -if command -v yq >/dev/null 2>&1; then - echo "โœ… Syntax validation: $(yq eval '.' .gitea/workflows/ci-cd.yaml > /dev/null 2>&1 && echo 'Valid YAML' || echo 'Invalid YAML')" -else - echo "โš ๏ธ Syntax validation: yq not installed" -fi -echo "โœ… Gitea compatibility: Uses .gitea/workflows/ directory" -echo "โœ… Arcodange conventions: Matches webapp workflow style" - -echo "" -echo "๐Ÿ’ก Next Steps:" -echo " 1. Push to trigger workflow: git push origin main" -echo " 2. Check Gitea Actions: https://gitea.arcodange.lab/arcodange/DanceLessonsCoach/actions" -echo " 3. Monitor badges: https://gitea.arcodange.fr/arcodange/DanceLessonsCoach" \ No newline at end of file diff --git a/scripts/cicd/contributor-quickstart.sh b/scripts/cicd/contributor-quickstart.sh deleted file mode 100755 index 0d11024..0000000 --- a/scripts/cicd/contributor-quickstart.sh +++ /dev/null @@ -1,78 +0,0 @@ -#!/bin/bash -# Simple CI/CD validation for new contributors -# Works without Docker - just validates the essentials - -set -e - -echo "๐Ÿš€ DanceLessonsCoach Contributor Quick Start" -echo "==========================================" -echo "" -echo "This script helps you validate your changes before submitting a PR." -echo "It doesn't require Docker or complex setup." -echo "" - -# 1. Check Go is installed -echo "1. Checking Go installation..." -if ! command -v go >/dev/null 2>&1; then - echo "โŒ Go is not installed. Please install Go 1.26.1+" - echo " Download: https://go.dev/dl/" - exit 1 -fi -go_version=$(go version | grep -o 'go[0-9.]*') -echo "โœ… Go $go_version found" - -# 2. Run Go tests -echo "" -echo "2. Running Go tests..." -if go test ./...; then - echo "โœ… All Go tests passed" -else - echo "โŒ Some tests failed. Please fix and try again." - exit 1 -fi - -# 3. Check formatting -echo "" -echo "3. Checking code formatting..." -if [ -n "$(go fmt ./...)" ]; then - echo "โŒ Code formatting issues found" - echo " Run: go fmt ./..." - exit 1 -fi -echo "โœ… Code is properly formatted" - -# 4. Run Go vet -echo "" -echo "4. Running Go vet..." -if go vet ./...; then - echo "โœ… Go vet passed" -else - echo "โŒ Go vet found issues" - exit 1 -fi - -# 5. Validate workflows (no Docker required) -echo "" -echo "5. Validating CI/CD workflows..." -if [ -f "scripts/cicd/validate-workflow.sh" ]; then - if ./scripts/cicd/validate-workflow.sh; then - echo "โœ… Workflow validation passed" - else - echo "โš ๏ธ Workflow validation issues (not critical)" - fi -else - echo "โ„น๏ธ Workflow validation script not found" -fi - -echo "" -echo "๐ŸŽ‰ All checks passed!" -echo "==========================================" -echo "" -echo "Your changes are ready to submit! ๐Ÿš€" -echo "" -echo "Next steps:" -echo " 1. Commit your changes: git commit -m 'feat: your feature'" -echo " 2. Push to your branch: git push origin your-branch" -echo " 3. Create a Pull Request" -echo "" -echo "The CI/CD pipeline will run automatically on your PR!" diff --git a/scripts/cicd/test-act-local.sh b/scripts/cicd/test-act-local.sh deleted file mode 100755 index 9dfde9b..0000000 --- a/scripts/cicd/test-act-local.sh +++ /dev/null @@ -1,75 +0,0 @@ -#!/bin/bash -# Test Gitea workflows locally using GitHub Actions runner (act) -# This allows local testing without requiring a Gitea instance - -set -e - -echo "๐Ÿงช Testing Gitea Workflows with GitHub Actions Runner" -echo "====================================================" - -# Check if act is installed -if ! command -v act >/dev/null 2>&1; then - echo "โŒ act not found. Please install with:" - echo " brew install act # macOS" - echo " or visit: https://github.com/nektos/act" - exit 1 -fi - -# Check if workflow files exist -WORKFLOW_FILES=( - ".gitea/workflows/go-ci-cd.yaml" - ".gitea/workflows/dockerimage.yaml" -) - -for file in "${WORKFLOW_FILES[@]}"; do - if [ ! -f "$file" ]; then - echo "โŒ Workflow file not found: $file" - exit 1 - fi -done - -echo "โœ… act installed and workflow file found" -echo "" - -# 1. Dry run (syntax check only) -echo "1. Running dry run (syntax validation)..." -ALL_PASSED=true - -for file in "${WORKFLOW_FILES[@]}"; do - echo " Testing: $file" - if echo 'm' | act -n -W "$file" --container-architecture linux/amd64; then - echo " โœ… Dry run completed for $file" - else - echo " โŒ Dry run failed for $file" - ALL_PASSED=false - fi -done - -if [ "$ALL_PASSED" = true ]; then - echo "โœ… All dry runs completed successfully" -else - echo "โŒ Some dry runs failed" - exit 1 -fi - - -echo "" -echo "๐ŸŽ‰ Gitea workflows are compatible with GitHub Actions!" -echo "==================================================" -echo "" -echo "๐Ÿ“‹ Summary:" -echo " โœ… Syntax validation passed for all workflows" -echo " โœ… All jobs parsed correctly" -echo " โœ… Job dependencies resolved" -echo " โœ… Conditional execution working" -echo " โœ… Gitea/GitHub Actions compatibility confirmed" -echo "" -echo "๐Ÿš€ You can now test locally without Gitea instance:" -for file in "${WORKFLOW_FILES[@]}"; do - workflow_name=$(basename "$file" .yaml) - echo " act -n -W $file # Dry run $workflow_name" - echo " act -W $file # Full execution $workflow_name" -done - -echo "" -echo "๐Ÿ’ก Tip: Add this to your pre-commit hook to validate workflows automatically!" diff --git a/scripts/cicd/test-cicd-docker.sh b/scripts/cicd/test-cicd-docker.sh deleted file mode 100755 index cf08b92..0000000 --- a/scripts/cicd/test-cicd-docker.sh +++ /dev/null @@ -1,99 +0,0 @@ -#!/bin/bash -# Comprehensive Docker-based CI/CD testing script -# Tests workflows locally using Docker containers - -set -e - -echo "๐Ÿณ Docker-based CI/CD Testing" -echo "================================" - -# 1. Check Docker is available -if ! command -v docker >/dev/null 2>&1; then - echo "โŒ Docker not found. Please install Docker first." - echo " https://docs.docker.com/get-docker/" - exit 1 -fi - -echo "โœ… Docker is available" - -# 2. Pull required images -echo "" -echo "๐Ÿ“ฆ Pulling Docker images..." -docker pull gitea/act_runner:latest -docker pull pipelinecomponents/yamllint:latest -docker pull mikefarah/yq:latest - -echo "โœ… Images pulled successfully" - -# 3. Validate YAML syntax with yq -echo "" -echo "๐Ÿ” Validating YAML syntax..." -docker run --rm \ - -v $(pwd):/workspace \ - -w /workspace \ - mikefarah/yq:latest \ - yq eval .gitea/workflows/go-ci-cd.yaml > /dev/null 2>&1 - -if [ $? -eq 0 ]; then - echo "โœ… YAML syntax is valid" -else - echo "โŒ YAML syntax error" - docker run --rm \ - -v $(pwd):/workspace \ - -w /workspace \ - mikefarah/yq:latest \ - yq eval .gitea/workflows/go-ci-cd.yaml || true - exit 1 -fi - -# 4. Lint YAML with yamllint -echo "" -echo "๐Ÿงน Linting YAML..." -docker run --rm \ - -v $(pwd):/workspace \ - -w /workspace \ - pipelinecomponents/yamllint:latest \ - yamllint .gitea/workflows/ - -if [ $? -eq 0 ]; then - echo "โœ… YAML linting passed" -else - echo "โŒ YAML linting failed" - exit 1 -fi - -# 5. Run workflow with act -echo "" -echo "๐Ÿš€ Running CI/CD workflow..." -docker run --rm \ - -v $(pwd):/workspace \ - -w /workspace \ - -e GITEA_INTERNAL="https://gitea.arcodange.lab/" \ - -e GITEA_EXTERNAL="https://gitea.arcodange.fr/" \ - -e GITEA_ORG="arcodange" \ - -e GITEA_REPO="DanceLessonsCoach" \ - gitea/act_runner:latest \ - act -W .gitea/workflows/go-ci-cd.yaml --rm - -if [ $? -eq 0 ]; then - echo "โœ… Workflow executed successfully" -else - echo "โŒ Workflow execution failed" - exit 1 -fi - -echo "" -echo "๐ŸŽ‰ All CI/CD tests passed!" -echo "================================" -echo "๐Ÿ“ Workflow: .gitea/workflows/ci-cd.yaml" -echo "โœ… YAML syntax validated" -echo "โœ… YAML linting passed" -echo "โœ… Workflow execution successful" -echo "๐ŸŽฏ Ready for production deployment" - -echo "" -echo "๐Ÿ’ก Next Steps:" -echo " 1. Commit changes: git commit -m '๐Ÿค– ci: update workflow'" -echo " 2. Push to trigger: git push origin main" -echo " 3. Monitor pipeline: https://gitea.arcodange.lab/arcodange/DanceLessonsCoach/actions" -echo " 4. Check badges: https://gitea.arcodange.fr/arcodange/DanceLessonsCoach" diff --git a/scripts/cicd/test-cicd-local.sh b/scripts/cicd/test-cicd-local.sh deleted file mode 100755 index 25d3791..0000000 --- a/scripts/cicd/test-cicd-local.sh +++ /dev/null @@ -1,82 +0,0 @@ -#!/bin/bash -# Test CI/CD setup locally without requiring Gitea instance - -set -e - -echo "๐Ÿงช Testing CI/CD Local Setup" -echo "==============================" - -# 1. Validate YAML syntax -echo "1. Validating YAML syntax..." -if command -v yq >/dev/null 2>&1; then - yq eval '.' .gitea/workflows/go-ci-cd.yaml > /dev/null - yq eval '.' .gitea/workflows/dockerimage.yaml > /dev/null - echo "โœ… YAML syntax is valid" -else - echo "โš ๏ธ yq not found, skipping YAML validation" -fi - -# 2. Validate workflow structure -echo "2. Validating workflow structure..." -./scripts/cicd/validate-workflow.sh - -# 3. Check docker-compose configuration -echo "3. Checking docker-compose configuration..." -docker compose -f docker-compose.cicd-test.yml config > /dev/null 2>&1 -if [ $? -eq 0 ]; then - echo "โœ… docker-compose configuration is valid" -else - echo "โŒ docker-compose configuration has issues" - exit 1 -fi - -# 4. Check for required files -echo "4. Checking required files..." -REQUIRED_FILES=( - ".gitea/workflows/go-ci-cd.yaml" - ".gitea/workflows/dockerimage.yaml" - "docker-compose.cicd-test.yml" - "config/runner.example" -) - -for file in "${REQUIRED_FILES[@]}"; do - if [ -f "$file" ]; then - echo "โœ… $file exists" - else - echo "โŒ $file missing" - exit 1 - fi -done - -# 5. Show configuration status -echo "5. Configuration status..." -if [ -f "config/runner" ]; then - echo "โœ… config/runner exists (gitignored)" - echo "๐Ÿ“ You can connect to Gitea instance" -else - echo "โ„น๏ธ config/runner not found (expected - it's gitignored)" - echo "๐Ÿ“ To connect to Gitea:" - echo " 1. Copy config/runner.example to config/runner" - echo " 2. Fill in your Gitea runner configuration" - echo " 3. Set environment variables:" - echo " export GITEA_RUNNER_REGISTRATION_TOKEN=your-token" - echo " 4. Run: docker compose -f docker-compose.cicd-test.yml up" -fi - -echo "" -echo "๐ŸŽ‰ CI/CD Local Setup Validation Complete!" -echo "==============================" -echo "๐Ÿ“‹ Summary:" -echo " โœ… YAML syntax validated" -echo " โœ… Workflow structure validated" -echo " โœ… Docker-compose configuration validated" -echo " โœ… All required files present" -echo "" -echo "๐Ÿš€ Next steps:" -echo " 1. Create config/runner file with your Gitea runner token" -echo " 2. Set GITEA_RUNNER_REGISTRATION_TOKEN environment variable" -echo " 3. Run: docker compose -f docker-compose.cicd-test.yml up" -echo "" -echo "๐Ÿ’ก For local testing without Gitea:" -echo " Use: ./scripts/test-cicd-simple.sh (if available)" -echo " Or manually test workflow steps" diff --git a/scripts/cicd/test-cicd-simple.sh b/scripts/cicd/test-cicd-simple.sh deleted file mode 100755 index 7904043..0000000 --- a/scripts/cicd/test-cicd-simple.sh +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/bash -# Simple CI/CD testing without Gitea instance -# Tests the workflow steps locally using docker containers - -set -e - -echo "๐Ÿงช Simple CI/CD Testing (No Gitea Required)" -echo "==========================================" - -# 1. YAML Linting -echo "1. Running YAML linting..." -if [ -f ".yamllint.yaml" ]; then - docker run --rm -v $(pwd):/workspace -w /workspace pipelinecomponents/yamllint:latest \ - yamllint -c .yamllint.yaml .gitea/workflows/ -else - docker run --rm -v $(pwd):/workspace -w /workspace pipelinecomponents/yamllint:latest \ - yamllint .gitea/workflows/ -fi -echo "โœ… YAML linting passed" - -# 2. YAML Validation -echo "2. Running YAML validation..." -WORKFLOW_FILES=(".gitea/workflows/go-ci-cd.yaml" ".gitea/workflows/dockerimage.yaml") -for file in "${WORKFLOW_FILES[@]}"; do - docker run --rm -v $(pwd):/workspace -w /workspace mikefarah/yq:latest eval '.' "$file" > /dev/null -done -echo "โœ… YAML validation passed" - -# 3. Workflow Structure Validation -echo "3. Running workflow structure validation..." -./scripts/cicd/validate-workflow.sh - -# 4. Simulate Build Job -echo "4. Simulating build-test job..." -docker run --rm -v $(pwd):/workspace -w /workspace golang:1.26.1 bash -c " - apt-get update -qq && apt-get install -y -qq git > /dev/null && \ - go mod tidy && \ - go build ./... && \ - go test ./... -cover -v -" -echo "โœ… Build and test completed" - -# 5. Simulate Lint Job -echo "5. Simulating lint-format job..." -docker run --rm -v $(pwd):/workspace -w /workspace golang:1.26.1 bash -c " - go fmt ./... && \ - go vet ./... && \ - echo 'Formatting check passed' -" -echo "โœ… Linting completed" - -echo "" -echo "๐ŸŽ‰ Simple CI/CD Testing Complete!" -echo "==========================================" -echo "โœ… All workflow steps validated locally" -echo "๐Ÿ“ Workflow is ready for Gitea deployment" -echo "" -echo "๐Ÿš€ To deploy to Gitea:" -echo " 1. Create config/runner file with your Gitea runner token" -echo " 2. Set GITEA_RUNNER_REGISTRATION_TOKEN environment variable" -echo " 3. Run: docker compose -f docker-compose.cicd-test.yml up" diff --git a/scripts/cicd/validate-workflow.sh b/scripts/cicd/validate-workflow.sh deleted file mode 100755 index d6a73b9..0000000 --- a/scripts/cicd/validate-workflow.sh +++ /dev/null @@ -1,151 +0,0 @@ -#!/bin/bash -# Validate CI/CD workflow syntax and structure - -set -e - -echo "๐Ÿ” Validating CI/CD Workflow" -echo "================================" - -# 1. Check workflow files exist -WORKFLOW_FILES=( - ".gitea/workflows/go-ci-cd.yaml" - ".gitea/workflows/dockerimage.yaml" -) - -for file in "${WORKFLOW_FILES[@]}"; do - if [ ! -f "$file" ]; then - echo "โŒ Workflow file not found: $file" - exit 1 - fi - echo "โœ… Workflow file found: $file" -done - -# 2. Validate YAML syntax for all workflows -if command -v yq >/dev/null 2>&1; then - for file in "${WORKFLOW_FILES[@]}"; do - if ! yq eval '.' "$file" > /dev/null 2>&1; then - echo "โŒ Invalid YAML syntax in: $file" - yq eval '.' "$file" || true - exit 1 - fi - echo "โœ… YAML syntax valid: $file" - done -else - echo "โš ๏ธ yq not installed, skipping YAML validation" -fi - -# 3. YAML Linting with custom config for all workflows -if command -v yamllint >/dev/null 2>&1; then - for file in "${WORKFLOW_FILES[@]}"; do - if [ -f ".yamllint.yaml" ]; then - yamllint -c "$(pwd)/.yamllint.yaml" "$file" - else - yamllint "$file" - fi - done -elif docker info >/dev/null 2>&1; then - for file in "${WORKFLOW_FILES[@]}"; do - if [ -f ".yamllint.yaml" ]; then - docker run --rm -v $(pwd):/workspace -w /workspace pipelinecomponents/yamllint:latest \ - yamllint -c /workspace/.yamllint.yaml "$file" - else - docker run --rm -v $(pwd):/workspace -w /workspace pipelinecomponents/yamllint:latest \ - yamllint "$file" - fi - done -else - echo "โš ๏ธ Neither yamllint nor docker available, skipping linting" -fi - -# 3. Check required fields for all workflows -for file in "${WORKFLOW_FILES[@]}"; do - MISSING_FIELDS=() - - if command -v yq >/dev/null 2>&1; then - workflow_name=$(basename "$file" .yaml) - - if [ -z "$(yq eval '.name' "$file" 2>/dev/null)" ]; then - MISSING_FIELDS+=("name") - fi - - if [ -z "$(yq eval '.on' "$file" 2>/dev/null)" ]; then - MISSING_FIELDS+=("on") - fi - - if [ -z "$(yq eval '.jobs' "$file" 2>/dev/null)" ]; then - MISSING_FIELDS+=("jobs") - fi - - if [ ${#MISSING_FIELDS[@]} -gt 0 ]; then - echo "โŒ Missing required fields in $workflow_name: ${MISSING_FIELDS[*]}" - exit 1 - fi - echo "โœ… All required fields present in $workflow_name" - else - echo "โš ๏ธ yq not installed, skipping field validation for $file" - fi -done - -# 4. Check jobs structure -if command -v yq >/dev/null 2>&1; then - JOBS=$(yq eval '.jobs | keys' .gitea/workflows/ci-cd.yaml 2>/dev/null) - echo "๐Ÿ“‹ Jobs defined: $JOBS" - - for job in $JOBS; do - job_str=$(echo $job | tr -d '"') - - # Check job has steps - if [ -z "$(yq eval ".jobs.$job_str.steps" .gitea/workflows/ci-cd.yaml 2>/dev/null)" ]; then - echo "โŒ Job $job_str has no steps" - exit 1 - fi - - steps_count=$(yq eval ".jobs.$job_str.steps | length" .gitea/workflows/ci-cd.yaml 2>/dev/null) - echo " โœ… $job_str: $steps_count steps" - done -else - echo "โš ๏ธ yq not installed, skipping job structure validation" -fi - -# 5. Check Arcodange-specific configurations -if command -v yq >/dev/null 2>&1; then - if [ -n "$(yq eval '.env.GITEA_INTERNAL' .gitea/workflows/ci-cd.yaml 2>/dev/null)" ]; then - echo "โœ… Arcodange internal URL configured" - else - echo "โš ๏ธ Arcodange internal URL not found" - fi - - if [ -n "$(yq eval '.env.GITEA_EXTERNAL' .gitea/workflows/ci-cd.yaml 2>/dev/null)" ]; then - echo "โœ… Arcodange external URL configured" - else - echo "โš ๏ธ Arcodange external URL not found" - fi - - # 6. Check concurrency settings - if [ -n "$(yq eval '.concurrency' .gitea/workflows/ci-cd.yaml 2>/dev/null)" ]; then - echo "โœ… Concurrency control configured" - else - echo "โš ๏ธ No concurrency control (consider adding)" - fi -else - echo "โš ๏ธ yq not installed, skipping Arcodange-specific validations" -fi - -echo "" -echo "๐ŸŽ‰ Workflow Validation Successful!" -echo "================================" -echo "๐Ÿ“ Workflows validated:" -for file in "${WORKFLOW_FILES[@]}"; do - echo " - $file" -done -if command -v yq >/dev/null 2>&1; then - echo "๐Ÿ”ง Summary:" - for file in "${WORKFLOW_FILES[@]}"; do - workflow_name=$(basename "$file" .yaml) - JOBS=$(yq eval '.jobs | keys | join(", ")' "$file" 2>/dev/null || echo 'Unable to parse') - echo " - $workflow_name: $JOBS" - done -else - echo "๐Ÿ”ง Jobs: yq not installed" -fi -echo "๐ŸŽฏ Ready for deployment" \ No newline at end of file diff --git a/server b/server deleted file mode 100755 index 5b9de78..0000000 Binary files a/server and /dev/null differ