Skip to content

Instantly share code, notes, and snippets.

@dainiax
Forked from pbabics/gitlab-gc.sh
Created October 17, 2018 09:42
Show Gist options
  • Save dainiax/ea9b7d311caf90c4d388442d095fb76a to your computer and use it in GitHub Desktop.
Save dainiax/ea9b7d311caf90c4d388442d095fb76a to your computer and use it in GitHub Desktop.
Manual garbage collector for gitlab registry, it removes old revisions that are not referenced by any tag
#!/bin/bash
BASE_PATH=/var/opt/gitlab/gitlab-rails/shared/registry/docker/registry/v2/repositories
DRY_RUN=0
KEEP_LAST_IMAGES=10
RUN_GARBAGE_COLLECTOR=0
GITLAB_CTL_COMMAND=`which gitlab-ctl`
if [ ! -x "${GITLAB_CTL_COMMAND}" ]; then
echo "Missing gitlab-ctl command"
exit 1
fi
while (( "$#" )); do
case "$1" in
"-b" | "--base-path")
BASE_PATH=$2
shift
;;
"-r" | "--run-gc")
RUN_GARBAGE_COLLECTOR=1
;;
"-d"|"--dry-run")
DRY_RUN=1
;;
"-k"|"--keep")
if ! ( echo $2 | grep -q '^[0-9]\+$') || [ $2 -eq 0 ]; then
echo "Invalid value for keep last images '$2'"
exit 1
fi
KEEP_LAST_IMAGES=$2
shift
;;
"-h"|"--help")
echo "Usage: ${0} [options]"
echo "Options:"
echo -e "\t-k NUM, --keep NUM"
echo -e "\t\tKeeps last NUM revisions, except current tags"
echo
echo -e "\t-d, --dry-run"
echo -e "\t\tEnables dry run, no changes will be made"
echo
echo -e "\t-b, --base-path"
echo -e "\t\tSets base path of Gitlab Registry repository storage"
echo
echo -e "\t-r, --run-gc"
echo -e "\t\tStarts garbage collector after revision removal"
exit 0
;;
*)
echo "Unknown argument: $1"
exit 1
;;
esac
shift
done
IFS=$'\n'
used_hashes=`mktemp`
marked_hashes=`mktemp`
for repository in `find ${BASE_PATH} -mindepth 2 -maxdepth 2 -type d | sed "s#${BASE_PATH}/##"`; do
for tag_hash in ${BASE_PATH}/${repository}/_manifests/tags/*/current/link; do
cat "${tag_hash}" | cut -d':' -f2;
done > "${used_hashes}"
echo "Removing revisions of $repository:"
ls -t ${BASE_PATH}/${repository}/_manifests/revisions/sha256 | fgrep -vf "${used_hashes}" | tail -n+${KEEP_LAST_IMAGES} | tee ${marked_hashes}
if [ ${DRY_RUN} -ne 1 ]; then
cat ${marked_hashes} | sed "s#^#${BASE_PATH}/${repository}/_manifests/revisions/sha256/#" | xargs rm -rf
fi
done
rm ${used_hashes}
rm ${marked_hashes}
if [ ${DRY_RUN} -eq 0 -a ${RUN_GARBAGE_COLLECTOR} -eq 1 ]; then
"${GITLAB_CTL_COMMAND}" registry-garbage-collect
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment