diff --git a/.gitea/workflows/pr-docker-deploy.yml b/.gitea/workflows/pr-docker-deploy.yml index 400c035..3f507bb 100644 --- a/.gitea/workflows/pr-docker-deploy.yml +++ b/.gitea/workflows/pr-docker-deploy.yml @@ -69,64 +69,32 @@ jobs: notification_title: "GITEA: Services TBD" notification_message: "Generating list of services to deploy..." + - name: Save both versions of docker-compose.yml + run: | + git show origin/main:docker-compose.yml > docker-compose-main.yml || touch docker-compose-main.yml + cp docker-compose.yml docker-compose-head.yml + - name: Detect added, deleted, and modified services id: detect_services run: | echo "Getting services from main and ${{ github.ref_name }}" - - # Dynamically find all docker-compose YAML files (root + compose folder) - COMPOSE_FILES=($(find . -maxdepth 2 -type f -name 'docker-compose*.yml' | sort)) - - echo "Found Compose files:" - printf '%s\n' "${COMPOSE_FILES[@]}" - - # Temp files to store all services - touch services_main_all.txt services_head_all.txt - - for f in "${COMPOSE_FILES[@]}"; do - echo "Processing $f" - - # Create a safe filename by replacing slashes with underscores - safe_f=$(echo "$f" | sed 's|[./]|_|g') - - # Fetch main version - git show origin/main:"$f" > "main_${safe_f}" 2>/dev/null || touch "main_${safe_f}" - cp "$f" "head_${safe_f}" - - # Extract services and append to global list - yq '.services | keys | .[]' "main_${safe_f}" >> services_main_all.txt 2>/dev/null || true - yq '.services | keys | .[]' "head_${safe_f}" >> services_head_all.txt 2>/dev/null || true - done - - # Sort and deduplicate - sort -u services_main_all.txt -o services_main_all.txt - sort -u services_head_all.txt -o services_head_all.txt + yq '.services | keys | .[]' docker-compose-main.yml | sort > services_main.txt + yq '.services | keys | .[]' docker-compose-head.yml | sort > services_head.txt echo "Creating list of modified services..." touch service_changes.txt - # Added services - comm -13 services_main_all.txt services_head_all.txt | while read service; do + comm -13 services_main.txt services_head.txt | while read service; do echo "$service: added" >> service_changes.txt done - # Modified services (parallelized) - comm -12 services_main_all.txt services_head_all.txt | xargs -n1 -P4 -I{} bash -c ' - service="{}" - modified=0 - for f in "${COMPOSE_FILES[@]}"; do - safe_f=$(echo "$f" | sed "s|[./]|_|g") - yq ".services[\"$service\"]" "main_${safe_f}" > tmp_main.yml 2>/dev/null || continue - yq ".services[\"$service\"]" "head_${safe_f}" > tmp_head.yml 2>/dev/null || continue - if ! diff -q tmp_main.yml tmp_head.yml > /dev/null; then - modified=1 - break - fi - done - if [[ $modified -eq 1 ]]; then + comm -12 services_main.txt services_head.txt | while read service; do + yq ".services[\"$service\"]" docker-compose-main.yml > tmp_main.yml + yq ".services[\"$service\"]" docker-compose-head.yml > tmp_head.yml + if ! diff -q tmp_main.yml tmp_head.yml > /dev/null; then echo "$service: modified" >> service_changes.txt fi - ' + done echo "Detected service changes:" cat service_changes.txt diff --git a/.gitea/workflows/renovate-pr-deploy.yml b/.gitea/workflows/renovate-pr-deploy.yml index dbc4ce8..e39bd01 100644 --- a/.gitea/workflows/renovate-pr-deploy.yml +++ b/.gitea/workflows/renovate-pr-deploy.yml @@ -27,91 +27,47 @@ jobs: with: fetch-depth: 0 - - name: Get changed services from all Compose files. - id: services + - name: Save docker-compose.yml after merge (new) run: | - echo "Getting services from main and ${{ github.ref_name }}" + git show origin/main:docker-compose.yml > docker-compose-new.yml - # Dynamically find all docker-compose YAML files (root + compose folder) - COMPOSE_FILES=($(find . -type f -name 'docker-compose*.yml' | sort)) + - name: Detect services with image tag/digest changes + id: detect_services + run: | + set -euo pipefail - echo "Found Compose files:" - printf '%s\n' "${COMPOSE_FILES[@]}" + echo "Flattening docker-compose files..." + yq eval '... comments=""' docker-compose-old.yml > docker-compose-old-flat.yml + yq eval '... comments=""' docker-compose-new.yml > docker-compose-new-flat.yml - # Temp files to store all services - touch services_main_all.txt services_head_all.txt + echo "Getting service names..." + yq eval '.services | keys | .[]' docker-compose-old-flat.yml | sort > services_old.txt + yq eval '.services | keys | .[]' docker-compose-new-flat.yml | sort > services_new.txt - for f in "${COMPOSE_FILES[@]}"; do - echo "Processing $f" + echo "Checking for image changes..." + : > service_changes.txt - # Create a safe filename by replacing slashes with underscores - safe_f=$(echo "$f" | sed 's|[./]|_|g') + comm -12 services_old.txt services_new.txt | while read service; do + old_image=$(yq eval-all --yaml-fix-merge-anchor-to-spec=true ".services[\"$service\"].image // \"\"" docker-compose-old-flat.yml) + new_image=$(yq eval-all --yaml-fix-merge-anchor-to-spec=true ".services[\"$service\"].image // \"\"" docker-compose-new-flat.yml) - # Fetch main version - git show origin/main:"$f" > "main_${safe_f}" 2>/dev/null || touch "main_${safe_f}" - cp "$f" "head_${safe_f}" - - # Extract services and append to global list - yq '.services | keys | .[]' "main_${safe_f}" >> services_main_all.txt 2>/dev/null || true - yq '.services | keys | .[]' "head_${safe_f}" >> services_head_all.txt 2>/dev/null || true - done - - # Sort and deduplicate - sort -u services_main_all.txt -o services_main_all.txt - sort -u services_head_all.txt -o services_head_all.txt - - echo "Creating list of modified services..." - touch service_changes.txt - - # Added services - comm -13 services_main_all.txt services_head_all.txt | while read service; do - echo "$service: added" >> service_changes.txt - done - - # Modified services (parallelized) - comm -12 services_main_all.txt services_head_all.txt | xargs -n1 -P4 -I{} bash -c ' - service="{}" - modified=0 - for f in "${COMPOSE_FILES[@]}"; do - safe_f=$(echo "$f" | sed "s|[./]|_|g") - yq ".services[\"$service\"]" "main_${safe_f}" > tmp_main.yml 2>/dev/null || continue - yq ".services[\"$service\"]" "head_${safe_f}" > tmp_head.yml 2>/dev/null || continue - if ! diff -q tmp_main.yml tmp_head.yml > /dev/null; then - modified=1 - break - fi - done - if [[ $modified -eq 1 ]]; then - echo "$service: modified" >> service_changes.txt + if [ "$old_image" != "$new_image" ]; then + echo "$service" >> service_changes.txt fi - ' + done - echo "Detected service changes:" - cat service_changes.txt + echo "Detected services with changed images:" + cat service_changes.txt || true - mod_svcs=$(cut -d':' -f1 service_changes.txt | sort | uniq | tr '\n' ' ' | sed 's/ *$//') + # Prepare multiline output for GitHub Actions echo "docker_svc_list<> "$GITHUB_OUTPUT" - echo "$mod_svcs" >> "$GITHUB_OUTPUT" + sort -u service_changes.txt >> "$GITHUB_OUTPUT" echo "EOF" >> "$GITHUB_OUTPUT" - name: List of Services for (Re)Deployment run: | echo -e "${{ steps.services.outputs.docker_svc_list }}" - - name: Get list of Compose files - id: compose_file_list - run: | - compose_list=$(find . -type f -name "docker-compose*.yml" \ - -a ! -name "*windows*" \ - -a ! -name "*gui*" \ - -a ! -name "*macos*" \ - -a ! -name "*hivemind*" \ - -a ! -name "*server*" \ - | sed -e ':a;N;$!ba;s/[\r\n]/ /g') - - echo "compose_list=$compose_list" >> "$GITHUB_OUTPUT" - echo "Compose files: $compose_list" - - name: Login to Docker Hub uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0 env: