|
#!/usr/bin/env bash |
|
|
|
set -e |
|
|
|
source ./images |
|
|
|
updated=false |
|
|
|
resolve() { |
|
image=$1 |
|
currentVersion=$2 |
|
latestVersion=$3 |
|
|
|
printf "%30s %s\n" "Currently detected version:" $currentVersion |
|
printf "%30s %s\n\n" "Latest version found:" $latestVersion |
|
|
|
if [ "$currentVersion" = "$latestVersion" ]; then |
|
echo "No new version detected. Skipping…" |
|
echo "====> Finished $image" |
|
return |
|
fi |
|
|
|
read -p "Is the above correct? Proceed with update? " -r |
|
|
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then |
|
echo "User aborted. Skipping…" |
|
echo "====> Finished $image" |
|
return |
|
fi |
|
|
|
currentImageId=$(dokku tags ${image} | grep dokku | grep latest | awk '{ print $3 }') |
|
imageName=$(docker image ls | grep -v latest | grep -v dokku | grep ${currentImageId} | awk '{ print $1 }') |
|
dokkuVersion=$(echo ${latestVersion} | awk -F '-' '{ print $1 }') |
|
|
|
docker image pull ${imageName}:${latestVersion} |
|
docker image tag ${imageName}:${latestVersion} dokku/${image}:${dokkuVersion} |
|
dokku tags:deploy ${image} ${dokkuVersion} |
|
updated=true |
|
|
|
echo "====> Finished $image" |
|
} |
|
|
|
for image in "${!privateImages[@]}"; do |
|
echo "====> Updating $image" |
|
|
|
IN=${privateImages[$image]} |
|
IFS=";" read -a parameters <<<"$IN" |
|
|
|
tokenUrl="${parameters[0]}" |
|
tagsUrl="${parameters[1]}" |
|
username="${parameters[2]}" |
|
password="${parameters[3]}" |
|
regex="${parameters[4]}" |
|
|
|
credentials=$(echo -n "${username}:${password}" | base64) |
|
token=$(curl -L -s -H "Authorization: Basic ${credentials}" ${tokenUrl} | jq -r '."token"') |
|
|
|
currentImageId=$(dokku tags ${image} | grep dokku | grep latest | awk '{ print $3 }') |
|
currentVersion=$(docker image ls | grep -v latest | grep -v dokku | grep ${currentImageId} | awk '{ print $2 }') |
|
latestVersion=$(curl -L -s -H "Authorization: Bearer ${token}" ${tagsUrl} | jq -r '."tags"[]' | grep $regex | sort --version-sort | tail -n 1) |
|
|
|
resolve "$image" "$currentVersion" "$latestVersion" |
|
done |
|
|
|
for image in "${!images[@]}"; do |
|
echo "====> Updating $image" |
|
|
|
IN=${images[$image]} |
|
IFS=";" read -a parameters <<<"$IN" |
|
|
|
registryUrl="${parameters[0]}tags?page_size=1024" |
|
regex="${parameters[1]}" |
|
|
|
currentImageId=$(dokku tags ${image} | grep dokku | grep latest | awk '{ print $3 }') |
|
currentVersion=$(docker image ls | grep -v latest | grep -v dokku | grep ${currentImageId} | awk '{ print $2 }') |
|
latestVersion=$(curl -L -s ${registryUrl} | jq -r '."results"[]["name"]' | sort --version-sort | grep $regex | tail -n 1) |
|
|
|
resolve "$image" "$currentVersion" "$latestVersion" |
|
done |
|
|
|
if [ "$updated" = true ]; then |
|
read -p "One or more apps were updated. Run \`docker system prune\`? " -n 1 -r |
|
|
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then |
|
echo -e "\nWaiting for old containers to stop…" |
|
sleep 60 |
|
docker system prune |
|
fi |
|
fi |