# gitlab-janitor
[![Gem Version](https://badge.fury.io/rb/gitlab-janitor.svg)](https://rubygems.org/gems/gitlab-janitor)
[![Gem](https://img.shields.io/gem/dt/gitlab-janitor.svg)](https://rubygems.org/gems/gitlab-janitor/versions)
[![YARD](https://badgen.net/badge/YARD/doc/blue)](http://www.rubydoc.info/gems/gitlab-janitor)
[![Docker Pulls](https://badgen.net/docker/pulls/rnds/gitlab-janitor?icon=docker&label=pulls)](https://hub.docker.com/r/rnds/gitlab-janitor/)
[![Docker Stars](https://badgen.net/docker/stars/rnds/gitlab-janitor?icon=docker&label=stars)](https://hub.docker.com/r/rnds/gitlab-janitor/)
Gitlab Janitor это утилита для автоматической очистки зависших и брошенных ресурсов при использовании Docker в `Gitlab` CI/CD. Проект вдохновлён утилитой [GitLab Runner Docker Cleanup](https://gitlab.com/gitlab-org/gitlab-runner-docker-cleanup).
---
GitLab Janitor is a tool to automatically manage stalled and dangling resources when using Docker in `Gitlab` CI/CD. Project inpired by [GitLab Runner Docker Cleanup](https://gitlab.com/gitlab-org/gitlab-runner-docker-cleanup).
Возможности / Features
- Удаление повисших контейнеров / Remove dangling containers
- Удаление неиспользуемых хранилищ / Remove unused anonymous volumes
- Удаление неиспользуемых образов / Remove unused images
- Отслеживание вререни использвоания образов / Track image usage timestamp
- Очистка кешей Docker (build cache) / Cleanup docker build cache
- Готовый [docker-образ](https://hub.docker.com/r/rnds/gitlab-janitor) / Production ready [docker image](https://hub.docker.com/r/rnds/gitlab-janitor)
## Установка / Installation
```sh
$ gem install gitlab-janitor
```
При установке `Gitlab Janitor` через bundler добавте следующую строку в `Gemfile`, установив `require` параметр в `false`:
---
If you'd rather install `Gitlab Janitor` using bundler, add a line for it in your `Gemfile` (but set the `require` option to `false`, as it is a standalone tool):
```sh
gem 'rubocop', require: false
```
Для установки с помощью docker контейнера [скачайте образ](https://hub.docker.com/r/rnds/gitlab-janitor):
---
To install as docker container just [pull the image](https://hub.docker.com/r/rnds/gitlab-janitor):
```sh
docker pull rnds/gitlab-janitor:latest
```
## Быстрый запуск / Quickstart
Запустите `gitlab-janitor` и смотрите за процессом или запустите docker:
---
Just type `gitlab-janitor` and watch the magic happen or run in docker:
```sh
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock rnds/gitlab-janitor:latest
```
## Документация / Documentation
Параметры командной строки, переменные окружения и занчения по-умолчанию:
Commain line options, environment variables and default values:
```sh
$ gitlab-janitor --help
Usage: gitlab-janitor [options]
--clean-delay=30m ENV[CLEAN_DELAY] Delay between clean operation.
--include=*units* ENV[INCLUDE] Include container for removal.
--exclude=*gitlab* ENV[EXCLUDE] Exclude container from removal by name.
--container-deadline=1h10m ENV[CONTAINER_DEADLINE] Maximum container run duration.
--volume-include=runner*cache*
ENV[VOLUME_INCLUDE] Include volumes for removal.
--volume-deadline=2d6h ENV[VOLUME_DEADLINE] Maximum volume life duration.
--image-deadline=20d ENV[IMAGE_DEADLINE] Maximum image life duration.
--image-store=./images.txt ENV[IMAGE_STORE] File to store images timestamps.
--cache-size=10G ENV[CACHE_SIZE] Size of docker cache to keep.
--remove ENV[REMOVE] Real remove instead of dry run.
--docker=unix:///tmp/mysock ENV[DOCKER_HOST] Docker api endpoint.
--debug ENV[LOG_LEVEL] Verbose logs. ENV values: debug, info, warn, error
```
### Удаление зависших контейнеров / Removing stalled containers
Порядок определения контейнреов для удаления:
- `include=[*units*]` - в список на удаление включаются контейнеры удовлетворябющие шаблону;
- `exclude=[*gitlab*]` - из спсика исключаются контейнеры по шаблону;
- `container-deadline=[1h10m]` - результирующий список проверяется на длительность запуска контенйра;
---
Containers deleted when:
- `include=[*units*]` - select containers by matching name by pattern;
- `exclude=[*gitlab*]` - **reject** containers by matching name by pattern;
- `container-deadline=[1h10m]` - when container lifetime exceeding the deadline it is removed;
### Удаление ненужных volumes / Removing unused volumes
Порядок определения вольюмов для удаления:
- на удаление попадают вольюмы, не являющиеся именованными;
- `volume-include=[runner*cache*]`- дополнительные волюмы для удаления;
- `volume-deadline=[2d6h]` - результирующий список проверяется на длительность существования вольюма;
---
Volumes deleted when:
- select all anonymous volumes;
- `volume-include=[runner*cache*]`- add volumes by matching name by pattern;
- `volume-deadline=[2d6h]` - when volume lifetime exceeding the deadline it is removed;
### Removing images / Удаление образов
Docker не сохраняет временную метку образа при скачивании (pull), таким образом используя средства `Docker API` невозможно понять как давно образ был скачан и когда его пора удалять. Для решения этой задачи сервис сохраняет информацию о скачанных образах, отслеживая таким образом интервалы устаревания.
Порядок определения образов для удаления:
- При первой встрече нового образа врменная метка сохраняется в локальное хранилище (файл);
- При достижении лимита хранения образ удаляется;
- При обнаружении запущенного контейнера временная метка для соответствующего образа обнуляется;
- `image-deadline=[20d]` - результирующий список проверяется на длительность существования образа;
---
Docker don't track timestamp when puling image, so there is impossible track lifetime through `Docker API`. To solve this problem, the service saves information about downloaded images, thus keeping track of lifetime deadline.
Images deleted when:
- When a new image is first encountered, the timestamp is stored in local storage (file);
- When a running container is found, the timestamp for the corresponding image is reset to zero;
- `image-deadline=[20d]` - when lifetime exceeding the deadline image it is removed (`docker rmi `);
## Приеры / Examples
Конфиг для продуктового режима / Production ready config:
```sh
REMOVE=true INCLUDE="*integr*, *units*" EXCLUDE="*gitlab*" CONTAINER_DEADLINE="1h10m" VOLUME_DEADLINE="3d" IMAGE_DEADLINE="20d" gitlab-janitor
```
## Запуск в докере / Running in docker
```sh
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
-e REMOVE=true \
-e INCLUDE="*integr*, *units*" \
-e EXCLUDE="*gitlab*" \
-e CONTAINER_DEADLINE="1h10m" \
-e VOLUME_DEADLINE="3d" \
-e IMAGE_DEADLINE="20d" \
rnds/gitlab-janitor:latest
```
## Лицензия / License
[MIT](./LICENSE)