#!/bin/bash # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # # Remove tvm-related docker images from the local system which # are not used by the currently-checked-out branch in this git # repository plus any linked worktrees. set -euo pipefail dry_run=0 repositories=( "$(cd $(dirname "$0") && git rev-parse --show-toplevel)" ) skip_confirm=0 verbose=0 while [ "${1+x}" == "x" ]; do case "$1" in --help|-h) echo "usage: $0 [-n] [-v] [-y] [ ...]" echo "" echo "Remove tvm-related docker images from the local system which" echo "are not used by the currently-checked-out branch in this git" echo "repository plus any linked worktrees." echo "" echo 'This command should remove only docker images beginning with "tlcpack"' echo "" echo "Options:" echo " -n Perform a dry-run and just print the docker rmi command" echo " -v Verbosely list the images kept and why" echo " -y Skip confirmation" echo " Additional git repositories to consult." exit 2 ;; -n) dry_run=1 ;; -v) verbose=1 ;; -y) skip_confirm=1 ;; *) repositories=( "${repositories[@]}" "$1" ) ;; esac shift done declare -a used_images for r in "${repositories[@]}"; do if [ -d "${r}/.git" ]; then worktree="${r}" else worktree="$(cat "${r}/.git")" worktree="${worktree##gitdir: }" fi worktree_list=$(cd "${worktree}" && git worktree list --porcelain | grep '^worktree ') while read wt; do d="${wt:9:${#wt}}" # strip "worktree " prefix for img in $(cat "${d}/Jenkinsfile" | grep -E '^ci_[a-z]+ = ' | sed -E "s/ci_[a-z]+ = '([^\"]*)'/\1/"); do used_images=( "${used_images[@]}" "${img}" ) done done < <(echo -n "${worktree_list}") done declare -a to_rm while read image; do if [ "${image}" == ":" ]; then continue fi grep -qE "^tlcpack" < <(echo "$image") && is_tlcpack=1 || is_tlcpack=0 if [ $is_tlcpack -eq 0 ]; then # non-tlcpack image if [ $verbose -ne 0 ]; then echo "skipping (non-tvm): $image" fi continue fi grep -q "$image" < <(echo "${used_images[@]}") && is_used=1 || is_used=0 if [ $is_used -eq 1 ]; then # Image was found in used_images if [ $verbose -ne 0 ]; then echo "skipping (image used): $image" fi continue fi to_rm=( "${to_rm[@]}" "${image}" ) done < <(docker images --format '{{.Repository}}:{{.Tag}}') docker_cmd=( docker rmi "${to_rm[@]}" ) if [ ${dry_run} -ne 0 ]; then echo "would run: ${docker_cmd[@]}" else if [ $skip_confirm -eq 0 ]; then echo "will run: ${docker_cmd[@]}" read -p "Proceed? [y/N] " proceed if [ "${proceed-}" != "y" -a "${proceed-}" != "Y" ]; then echo "Aborted." exit 2 fi fi "${docker_cmd[@]}" fi