# Tekton Detect Changed Services Task for Bakery-IA CI/CD # This task identifies which services have changed in the repository apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: detect-changed-services namespace: tekton-pipelines labels: app.kubernetes.io/name: bakery-ia-cicd app.kubernetes.io/component: detect spec: workspaces: - name: source description: Source code workspace params: - name: base-ref type: string description: Base reference for comparison (default HEAD~1) default: "HEAD~1" results: - name: changed-services description: Comma-separated list of changed services - name: changed-files-count description: Number of files changed steps: - name: detect image: alpine/git:2.43.0 script: | #!/bin/sh set -e SOURCE_PATH="$(workspaces.source.path)" BASE_REF="$(params.base-ref)" cd "$SOURCE_PATH" echo "============================================" echo "Detect Changed Services" echo "============================================" echo "Base ref: $BASE_REF" echo "============================================" # Get list of changed files compared to base reference echo "" echo "Detecting changed files..." # Try to get diff, fall back to listing all files if this is the first commit CHANGED_FILES=$(git diff --name-only "$BASE_REF" HEAD 2>/dev/null || git ls-tree -r HEAD --name-only) FILE_COUNT=$(echo "$CHANGED_FILES" | grep -c "." || echo "0") echo "Found $FILE_COUNT changed files" echo "$FILE_COUNT" > $(results.changed-files-count.path) if [ "$FILE_COUNT" = "0" ]; then echo "No files changed" echo "none" > $(results.changed-services.path) exit 0 fi echo "" echo "Changed files:" echo "$CHANGED_FILES" | head -20 if [ "$FILE_COUNT" -gt 20 ]; then echo "... and $((FILE_COUNT - 20)) more files" fi # Map files to services using simple shell (no bash arrays) echo "" echo "Mapping files to services..." CHANGED_SERVICES="" # Process each file echo "$CHANGED_FILES" | while read -r file; do if [ -z "$file" ]; then continue fi # Check services directory if echo "$file" | grep -q "^services/"; then SERVICE=$(echo "$file" | cut -d'/' -f2) if [ -n "$SERVICE" ] && ! echo "$CHANGED_SERVICES" | grep -q "$SERVICE"; then if [ -z "$CHANGED_SERVICES" ]; then CHANGED_SERVICES="$SERVICE" else CHANGED_SERVICES="$CHANGED_SERVICES,$SERVICE" fi echo "$CHANGED_SERVICES" > /tmp/services.txt fi fi # Check frontend if echo "$file" | grep -q "^frontend/"; then if ! echo "$CHANGED_SERVICES" | grep -q "frontend"; then if [ -z "$CHANGED_SERVICES" ]; then CHANGED_SERVICES="frontend" else CHANGED_SERVICES="$CHANGED_SERVICES,frontend" fi echo "$CHANGED_SERVICES" > /tmp/services.txt fi fi # Check gateway if echo "$file" | grep -q "^gateway/"; then if ! echo "$CHANGED_SERVICES" | grep -q "gateway"; then if [ -z "$CHANGED_SERVICES" ]; then CHANGED_SERVICES="gateway" else CHANGED_SERVICES="$CHANGED_SERVICES,gateway" fi echo "$CHANGED_SERVICES" > /tmp/services.txt fi fi # Check infrastructure if echo "$file" | grep -q "^infrastructure/"; then if ! echo "$CHANGED_SERVICES" | grep -q "infrastructure"; then if [ -z "$CHANGED_SERVICES" ]; then CHANGED_SERVICES="infrastructure" else CHANGED_SERVICES="$CHANGED_SERVICES,infrastructure" fi echo "$CHANGED_SERVICES" > /tmp/services.txt fi fi done # Read the accumulated services if [ -f /tmp/services.txt ]; then CHANGED_SERVICES=$(cat /tmp/services.txt) fi echo "" echo "============================================" # Output result if [ -z "$CHANGED_SERVICES" ]; then echo "No service changes detected" echo "none" > $(results.changed-services.path) else echo "Detected changes in services: $CHANGED_SERVICES" echo "$CHANGED_SERVICES" > $(results.changed-services.path) fi echo "============================================" resources: limits: cpu: 200m memory: 128Mi requests: cpu: 50m memory: 64Mi