🗑️ chore: remove unused files and update ADR with cleanup information
This commit is contained in:
57
Dockerfile
57
Dockerfile
@@ -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"]
|
|
||||||
@@ -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
|
|
||||||
@@ -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"]
|
|
||||||
@@ -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"]
|
|
||||||
@@ -446,13 +446,35 @@ echo "Hash: $DEPS_HASH"
|
|||||||
docker run --rm -i hadolint/hadolint < Dockerfile.prod
|
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
|
## 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
|
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
|
4. **Faster CI execution**: Reduced build times compared to previous approach
|
||||||
5. **No certificate errors**: No TLS certificate verification failures
|
5. **No certificate errors**: No TLS certificate verification failures
|
||||||
|
6. **Clean organization**: No clutter in root directory
|
||||||
|
|
||||||
## References
|
## References
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
|
||||||
@@ -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.
|
|
||||||
@@ -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"
|
|
||||||
@@ -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!"
|
|
||||||
@@ -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!"
|
|
||||||
@@ -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"
|
|
||||||
@@ -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"
|
|
||||||
@@ -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"
|
|
||||||
@@ -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"
|
|
||||||
Reference in New Issue
Block a user