Skip to content

Instantly share code, notes, and snippets.

@tomfun
Created April 17, 2019 06:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tomfun/df691262191045920761a3b163f505c8 to your computer and use it in GitHub Desktop.
Save tomfun/df691262191045920761a3b163f505c8 to your computer and use it in GitHub Desktop.
Gitlab CI docker registry cleaner
stages:
- clean
- build
- check
variables:
## docker image names inside the YML file to use
CI_REGISTRY_IMAGE_c: $CI_REGISTRY_IMAGE/dev:${CI_COMMIT_SHORT_SHA}
CI_REGISTRY_IMAGE_l: $CI_REGISTRY_IMAGE/dev:latest
CI_REGISTRY_IMAGE_i: services_${CI_BUILD_ID}_api_v2
build:
tags:
- dind
stage: build
image: tmaier/docker-compose
script:
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
- docker pull ${CI_REGISTRY_IMAGE_l} || true
- docker build --cache-from ${CI_REGISTRY_IMAGE_l} -f docker/app/Dockerfile -t ${CI_REGISTRY_IMAGE_i} -t ${CI_REGISTRY_IMAGE_c} -t ${CI_REGISTRY_IMAGE_l} .
- docker push ${CI_REGISTRY_IMAGE_c}
- docker push ${CI_REGISTRY_IMAGE_l}
# some job that uses the docker
tslint:
tags:
- dind
stage: check
image: tmaier/docker-compose
script:
# pull docker image from registry, about 30sec
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY && docker pull ${CI_REGISTRY_IMAGE_c} || true
# normaly should take 10sec and just use cache
- docker build --cache-from ${CI_REGISTRY_IMAGE_c} -f docker/app/Dockerfile . -t services_${CI_BUILD_ID}_api_v2
# some useful command inside the docker
- docker run --rm services_${CI_BUILD_ID}_api_v2 npm --silent run lint
allow_failure: true
## Clear by scheduled tasks
clear_docker_images:
stage: clean
only:
- schedules
image: everpeace/curl-jq:latest
variables:
# Name of image to clean tags
IMAGE_TO_CLEAN: $CI_PROJECT_PATH/dev
GIT_STRATEGY: none
script:
# just show information
- |
echo -e "\x1b[36m repositories:\x1b[0m"
curl --cacert $CI_SERVER_TLS_CA_FILE --header "PRIVATE-TOKEN: ${CLEAR_DOCKER_TOKEN}" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/registry/repositories" | jq --color-output .
export IMAGE_TO_CLEAN_ID=$(curl --cacert $CI_SERVER_TLS_CA_FILE --header "PRIVATE-TOKEN: ${CLEAR_DOCKER_TOKEN}" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/registry/repositories" | jq ".[] | select(.path == \"$IMAGE_TO_CLEAN\") | .id")
echo -e "\x1b[36m $IMAGE_TO_CLEAN (id = $IMAGE_TO_CLEAN_ID) tags:\x1b[0m"
curl --cacert $CI_SERVER_TLS_CA_FILE --header "PRIVATE-TOKEN: ${CLEAR_DOCKER_TOKEN}" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/registry/repositories/$IMAGE_TO_CLEAN_ID/tags" | jq --color-output '[.[] | .location]'
# remove all tags
- |
remove_tag_="curl --cacert $CI_SERVER_TLS_CA_FILE --request DELETE --header 'PRIVATE-TOKEN: ${CLEAR_DOCKER_TOKEN}' ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/registry/repositories/$IMAGE_TO_CLEAN_ID/tags/"
curl --cacert $CI_SERVER_TLS_CA_FILE --header "PRIVATE-TOKEN: ${CLEAR_DOCKER_TOKEN}" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/registry/repositories/$IMAGE_TO_CLEAN_ID/tags" \
| jq -r '.[] | select(.name != "latest") | .name' \
| while read -r TAG; do sh -c "$remove_tag_$TAG"; done
curl --cacert $CI_SERVER_TLS_CA_FILE --header "PRIVATE-TOKEN: ${CLEAR_DOCKER_TOKEN}" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/registry/repositories/$IMAGE_TO_CLEAN_ID/tags" | jq --color-output '[.[] | .location]'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment