#!/bin/bash # Validate CI/CD workflow syntax and structure set -e echo "🔍 Validating CI/CD Workflow" echo "================================" # 1. Check workflow file exists if [ ! -f ".gitea/workflows/ci-cd.yaml" ]; then echo "❌ Workflow file not found: .gitea/workflows/ci-cd.yaml" exit 1 fi echo "✅ Workflow file found" # 2. Validate YAML syntax if command -v yq >/dev/null 2>&1; then if ! yq eval '.' .gitea/workflows/ci-cd.yaml > /dev/null 2>&1; then echo "❌ Invalid YAML syntax" yq eval '.' .gitea/workflows/ci-cd.yaml || true exit 1 fi echo "✅ YAML syntax valid" else echo "⚠️ yq not installed, skipping YAML validation" fi # 3. YAML Linting with custom config if command -v yamllint >/dev/null 2>&1; then if [ -f ".yamllint.yaml" ]; then yamllint -c .yamllint.yaml .gitea/workflows/ci-cd.yaml else yamllint .gitea/workflows/ci-cd.yaml fi elif docker info >/dev/null 2>&1; then if [ -f ".yamllint.yaml" ]; then docker run --rm -v $(pwd):/workspace -w /workspace pipelinecomponents/yamllint:latest \ yamllint -c .yamllint.yaml .gitea/workflows/ci-cd.yaml else docker run --rm -v $(pwd):/workspace -w /workspace pipelinecomponents/yamllint:latest \ yamllint .gitea/workflows/ci-cd.yaml fi else echo "⚠️ Neither yamllint nor docker available, skipping linting" fi # 3. Check required fields MISSING_FIELDS=() if command -v yq >/dev/null 2>&1; then if [ -z "$(yq eval '.name' .gitea/workflows/ci-cd.yaml 2>/dev/null)" ]; then MISSING_FIELDS+=("name") fi if [ -z "$(yq eval '.on' .gitea/workflows/ci-cd.yaml 2>/dev/null)" ]; then MISSING_FIELDS+=("on") fi if [ -z "$(yq eval '.jobs' .gitea/workflows/ci-cd.yaml 2>/dev/null)" ]; then MISSING_FIELDS+=("jobs") fi if [ ${#MISSING_FIELDS[@]} -gt 0 ]; then echo "❌ Missing required fields: ${MISSING_FIELDS[*]}" exit 1 fi echo "✅ All required fields present" else echo "⚠️ yq not installed, skipping field validation" fi # 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 "📁 Location: .gitea/workflows/ci-cd.yaml" if command -v yq >/dev/null 2>&1; then JOBS=$(yq eval '.jobs | keys | join(", ")' .gitea/workflows/ci-cd.yaml 2>/dev/null || echo 'Unable to parse') echo "🔧 Jobs: $JOBS" else echo "🔧 Jobs: yq not installed" fi echo "🎯 Ready for deployment"