Skip to content

Commit b7bdbe2

Browse files
committed
fix(ci): only update Docker versions when runner has newer version
Prevent back-and-forth version update PRs caused by different GitHub Actions runners having different Docker/Compose versions installed. Both the workflow and updatecli scripts now compare versions using sort -V and only update when the new version is strictly newer.
1 parent 0c9ee23 commit b7bdbe2

3 files changed

Lines changed: 72 additions & 7 deletions

File tree

.github/workflows/github-docker-registry-push.yml

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,44 @@ jobs:
6363
BRANCH_NAME="docker-versions-update-$(date +%s)"
6464
git checkout -b "$BRANCH_NAME"
6565
66-
# Write Docker versions to file
67-
echo "- $(docker --version)" > docker-versions.txt
68-
echo "- $(docker compose version)" >> docker-versions.txt
66+
# Helper: compare two semver strings, return 0 if $1 > $2
67+
version_gt() {
68+
# Use sort -V to compare versions; if the greater one is $1, it's newer
69+
[ "$(printf '%s\n%s' "$1" "$2" | sort -V | tail -n1)" = "$1" ] && [ "$1" != "$2" ]
70+
}
71+
72+
# Extract current versions from docker-versions.txt
73+
CURRENT_DOCKER=$(grep "Docker version" docker-versions.txt | cut -d ' ' -f 4 | cut -d ',' -f 1)
74+
CURRENT_COMPOSE=$(grep "Docker Compose version" docker-versions.txt | cut -d ' ' -f 5 | tr -d 'v')
75+
76+
# Get runner versions
77+
RUNNER_DOCKER=$(docker --version | cut -d ' ' -f 3 | cut -d ',' -f 1)
78+
RUNNER_COMPOSE=$(docker compose version | cut -d ' ' -f 4 | tr -d 'v')
79+
80+
echo "Current: Docker $CURRENT_DOCKER, Compose $CURRENT_COMPOSE"
81+
echo "Runner: Docker $RUNNER_DOCKER, Compose $RUNNER_COMPOSE"
82+
83+
# Only update if runner version is strictly newer
84+
DOCKER_VERSION="${CURRENT_DOCKER}"
85+
COMPOSE_VERSION="${CURRENT_COMPOSE}"
86+
87+
if version_gt "$RUNNER_DOCKER" "$CURRENT_DOCKER"; then
88+
echo "Docker version $RUNNER_DOCKER is newer than $CURRENT_DOCKER, updating"
89+
DOCKER_VERSION="$RUNNER_DOCKER"
90+
else
91+
echo "Docker version $RUNNER_DOCKER is not newer than $CURRENT_DOCKER, keeping current"
92+
fi
93+
94+
if version_gt "$RUNNER_COMPOSE" "$CURRENT_COMPOSE"; then
95+
echo "Docker Compose version $RUNNER_COMPOSE is newer than $CURRENT_COMPOSE, updating"
96+
COMPOSE_VERSION="$RUNNER_COMPOSE"
97+
else
98+
echo "Docker Compose version $RUNNER_COMPOSE is not newer than $CURRENT_COMPOSE, keeping current"
99+
fi
100+
101+
# Write versions to file
102+
echo "- Docker version ${DOCKER_VERSION}, build unknown" > docker-versions.txt
103+
echo "- Docker Compose version v${COMPOSE_VERSION}" >> docker-versions.txt
69104
70105
# Only add the specific file we want
71106
git add docker-versions.txt

updatecli/scripts/docker-compose-version.sh

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,22 @@ file_content=$(cat docker-versions.txt)
77
# Then, use cut to split the line by spaces and get the 5th field (the version)
88
docker_compose_version=$(echo "$file_content" | grep -- "- Docker Compose version" | cut -d ' ' -f 5)
99

10-
# Print the Docker Compose version
11-
echo $docker_compose_version
10+
# Get the current version from README.md (strip leading 'v' if present for comparison)
11+
current_version=$(grep -oP 'Docker Compose version `\K[^`]+' README.md)
12+
13+
# Strip leading 'v' for comparison (updatecli trimprefix transformer handles the output)
14+
new_clean=$(echo "$docker_compose_version" | sed 's/^v//')
15+
current_clean=$(echo "$current_version" | sed 's/^v//')
16+
17+
# Compare versions: only output the new version if it's strictly newer
18+
if [ -n "$current_clean" ] && [ -n "$new_clean" ]; then
19+
newer=$(printf '%s\n%s' "$new_clean" "$current_clean" | sort -V | tail -n1)
20+
if [ "$newer" = "$current_clean" ] || [ "$new_clean" = "$current_clean" ]; then
21+
# Current version is same or newer, output it unchanged to avoid a downgrade
22+
echo "$docker_compose_version"
23+
exit 0
24+
fi
25+
fi
26+
27+
# Print the Docker Compose version (new or when no current version found)
28+
echo "$docker_compose_version"

updatecli/scripts/docker-version.sh

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,18 @@ docker_version=$(echo "$file_content" | grep -- "- Docker version" | cut -d ' '
1010
# Cut the version string at the comma to get only the semver part
1111
docker_version=$(echo "$docker_version" | cut -d ',' -f 1)
1212

13-
# Print the Docker version
14-
echo $docker_version
13+
# Get the current version from README.md
14+
current_version=$(grep -oP 'Docker version `\K[^`]+' README.md)
15+
16+
# Compare versions: only output the new version if it's strictly newer
17+
if [ -n "$current_version" ] && [ -n "$docker_version" ]; then
18+
newer=$(printf '%s\n%s' "$docker_version" "$current_version" | sort -V | tail -n1)
19+
if [ "$newer" = "$current_version" ] || [ "$docker_version" = "$current_version" ]; then
20+
# Current version is same or newer, output it unchanged to avoid a downgrade
21+
echo "$current_version"
22+
exit 0
23+
fi
24+
fi
25+
26+
# Print the Docker version (new or when no current version found)
27+
echo "$docker_version"

0 commit comments

Comments
 (0)