- Designed trunk-based development workflow with branch protection - Added workflow validation job to prevent main branch breaks - Integrated act (GitHub Actions runner) for local Gitea workflow testing - Created unified CI/CD script interface (scripts/cicd.sh) - Added YAML lint configuration with practical limits (400 chars) - Organized all CI/CD scripts under scripts/cicd/ directory - Confirmed Gitea/GitHub Actions compatibility via local testing - Updated ADR 0017 with implementation details and test results - Enhanced documentation with local development workflow See ADR-0017 for complete trunk-based development workflow documentation. See ADR-0016 for CI/CD pipeline design.
128 lines
4.0 KiB
Bash
Executable File
128 lines
4.0 KiB
Bash
Executable File
#!/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" |