Cuando en nuestro flujo de trabajo tenemos el uso de contenedores, existe un momento a partir del cual la pereza se apodera de nosotros al existir una cantidad inhumana de versiones distintas.

En nuestro supuesto caso, cada vez que se acabe una historia de usuario se generará automáticamente un tag en DockerHub para que pueda pasar una serie de pruebas por los compañeros de calidad. En un entorno como este, es totalmente desmoralizador mantener limpio el listado de versiones de nuestro contenedor.

captura-de-pantalla-2017-01-22-a-las-16-44-17

¡¡Así que manos a la obra!!

Docker aporta una API (https://docs.docker.com/registry/spec/api/) para la comunicación entre el core de Docker y registry, siendo este último el servicio (como dockerhub) que nos facilita la gestión y distribución de nuestros contenedores. Y es usando esta API como vamos a conseguir limpiar nuestros repositorios en dockerhub.

Docker funciona con autenticación basada en JWT (Json Web Token), por lo que nuestro pasos en el proceso serán:

  • Solicitar el token JWT vía http con nuestras credenciales (línea 17).
  • Definir los repositorios sobre los que vamos a realizar la limpieza (línea 19).
  • Para cada repositorio solicitar, por http usando el token recibido en el paso 1, los tags existentes (línea 25).
  • Recorrer los tags, y eliminar aquellos que empiezan por “TAG-” mediante un http DELETE al tag (línea 31).

#!/bin/bash

# delete all User History tags starting with TAG-
# Requires 'jq': https://stedolan.github.io/jq/ (brew install jq)

# set username, password, and organization
UNAME=$1
UPASS=$2
ORG="cinfantes"
# -------

set -e
echo

# get token
echo "Retrieving token ..."
TOKEN=$(curl -s -H "Content-Type: application/json" -X POST -d '{"username": "'${UNAME}'", "password": "'${UPASS}'"}' https://hub.docker.com/v2/users/login/ | jq -r .token)

REPO_LIST=("test-repositorio another-repository")

for i in ${REPO_LIST}
do
 echo "${i}:"
 # tags
 IMAGE_TAGS=$(curl -s -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/${ORG}/${i}/tags/?page_size=100 | jq -r '.results|.[]|.name')
 for j in ${IMAGE_TAGS}
  do
   case "${j}" in
    TAG*)
     echo "Borrando tag: ${j}"
     curl -X DELETE -s -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/${ORG}/${i}/tags/${j}/ > /dev/null
    ;;
   esac
  done
 echo
done

Comentar que jq nos permite el manejo de json desde el terminal.

La forma de lanzar el script será tan sencilla como:

sh clean_docker.sh user password

¡Y podremos volver a respirar tranquilos!

Hasta el próximo sprint…

Anuncios