# Tekton Task to Detect Changed Services # This task analyzes git changes to determine which services need to be built apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: detect-changed-services namespace: {{ .Values.namespace }} labels: app.kubernetes.io/name: {{ .Values.labels.app.name }} app.kubernetes.io/component: detection spec: workspaces: - name: source description: Workspace containing the source code results: - name: changed-services description: Comma-separated list of changed services steps: - name: detect-changes image: alpine/git script: | #!/bin/bash set -e cd $(workspaces.source.path) # Get the list of changed files CHANGED_FILES=$(git diff --name-only HEAD~1 HEAD 2>/dev/null || git diff --name-only $(git rev-parse --abbrev-ref HEAD)@{upstream} HEAD 2>/dev/null || echo "") if [ -z "$CHANGED_FILES" ]; then # No changes detected, assume all services need building echo "No git changes detected, building all services" echo "all" > $(results.changed-services.path) exit 0 fi # Initialize an array to collect changed services declare -a changed_services=() # Check for changes in services/ directory while IFS= read -r service_dir; do if [ -n "$service_dir" ]; then service_name=$(basename "$service_dir") if [[ ! " ${changed_services[@]} " =~ " ${service_name} " ]]; then changed_services+=("$service_name") fi fi done < <(echo "$CHANGED_FILES" | grep '^services/' | cut -d'/' -f2 | sort -u) # Check for changes in gateway/ directory if echo "$CHANGED_FILES" | grep -q '^gateway/'; then if [[ ! " ${changed_services[@]} " =~ " gateway " ]]; then changed_services+=("gateway") fi fi # Check for changes in frontend/ directory if echo "$CHANGED_FILES" | grep -q '^frontend/'; then if [[ ! " ${changed_services[@]} " =~ " frontend " ]]; then changed_services+=("frontend") fi fi # Check for changes in shared/ directory (might affect multiple services) if echo "$CHANGED_FILES" | grep -q '^shared/'; then if [[ ! " ${changed_services[@]} " =~ " shared " ]]; then changed_services+=("shared") fi fi # Convert array to comma-separated string CHANGED_SERVICES="" for service in "${changed_services[@]}"; do if [ -z "$CHANGED_SERVICES" ]; then CHANGED_SERVICES="$service" else CHANGED_SERVICES="$CHANGED_SERVICES,$service" fi done if [ -z "$CHANGED_SERVICES" ]; then # Changes are in infrastructure or other non-service files echo "infrastructure" > $(results.changed-services.path) else echo "$CHANGED_SERVICES" > $(results.changed-services.path) fi