Разбираем, как правильно очищать pipelines, jobs, artifacts и историю коммитов в актуальных версиях GitLab (PostgreSQL 16, partitioned CI schema). Без устаревших DELETE FROM ci_builds; и без поломки инстанса.

Кратко: не лезем слепо в SQL → используем Rails console или TRUNCATE CASCADE → учитываем partitioned tables → после очистки делаем vacuum.



Как теперь устроен CI в GitLab

Актуальные основные таблицы:

  • ci_pipelines
  • ci_running_builds
  • ci_pending_builds
  • ci_pipeline_artifacts
  • ci_pipeline_metadata
  • ci_build_trace_chunks

Многие из них — partitioned. Это значит, что обычный DELETE не всегда корректен.


Безопасная очистка через Rails Console (рекомендуется)

Самый правильный способ — через встроенные модели GitLab.

sudo gitlab-rails console

Удалить пайплайны конкретного проекта


project = Project.find_by_full_path('group/project')
project.ci_pipelines.destroy_all

Удалить все job artifacts


Ci::JobArtifact.destroy_all

Удалить все CI build записи


Ci::Build.destroy_all

Это безопасно, потому что GitLab сам корректно обработает связи и каскады.


Очистка через psql (если очень нужно)

Подключаемся:

sudo gitlab-psql

Сначала смотрим актуальные таблицы:

\dt ci_*

Если нужно очистить вручную:


DELETE FROM ci_pipeline_artifacts;
DELETE FROM ci_pipeline_metadata;
DELETE FROM ci_pipeline_messages;
DELETE FROM ci_build_trace_chunks;
DELETE FROM ci_running_builds;
DELETE FROM ci_pending_builds;
DELETE FROM ci_pipelines;

Порядок важен. Иначе FK не даст удалить записи.


TRUNCATE для partitioned таблиц

Если таблицы partitioned — лучше использовать:

TRUNCATE ci_pipelines CASCADE;

Проверить partition:


SELECT relname 
FROM pg_class 
WHERE relkind = 'p';

TRUNCATE быстрее и безопаснее для полной очистки CI.

После очистки:

VACUUM FULL ANALYZE;

Очистка artifacts и CI через rake

Самый продовый способ:


gitlab-rake gitlab:artifacts:cleanup
gitlab-rake gitlab:ci:cleanup

Для удаления всех pipelines:

gitlab-rake gitlab:ci:delete_all_pipelines

Этот способ не ломает внутренние зависимости.


Очистка коммитов (полный ресет истории)

Если нужно начать историю проекта "с нуля":


git checkout --orphan clean-branch
git add .
git commit -m "Initial clean commit"
git branch -D main
git branch -m main
git push -f origin main

Важно: это перепишет историю. Все старые commit SHA исчезнут.


Рекомендации и подводные камни

  • Не удаляйте CI таблицы по одной без понимания зависимостей.
  • Partitioned tables требуют TRUNCATE.
  • После массовой очистки всегда делайте VACUUM.
  • В проде лучше использовать Rails console или rake.
  • Force-push коммитов ломает fork'и и MR.

GitLab последних версий сильно усложнил CI-схему. Старые методы 2018–2021 годов больше не актуальны.

Если цель — уменьшить размер базы, сначала используйте встроенные cleanup-механизмы, а не прямой SQL.

Popular Posts

Advertisement

Headlines