Slimming workflows.

This commit is contained in:
2025-12-10 09:14:55 -05:00
parent fc35ea3f7c
commit ce1fa32ab9
2 changed files with 37 additions and 113 deletions
+13 -45
View File
@@ -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
+24 -68
View File
@@ -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<<EOF" >> "$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: