Skip to content

Instantly share code, notes, and snippets.

@pbabics
Created November 11, 2016 13:13
Show Gist options
  • Select an option

  • Save pbabics/32840a15ed3ce4dea13a53713aaf94a2 to your computer and use it in GitHub Desktop.

Select an option

Save pbabics/32840a15ed3ce4dea13a53713aaf94a2 to your computer and use it in GitHub Desktop.

Revisions

  1. @NtX NtX revised this gist Nov 11, 2016. No changes.
  2. @NtX NtX created this gist Nov 11, 2016.
    87 changes: 87 additions & 0 deletions gitlab-gc.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,87 @@
    #!/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