GitLab
платформа сховищ, яку можна запустити самому
Що це таке
GitLab — це єдиний застосунок, побудований довкола git-репозиторіїв: він зберігає код і додає до нього merge request для рев’ю, issues для планування та вбудовану систему CI/CD, яка збирає, тестує й розгортає з того самого місця. Від інших його відрізняє вибір того, де він працює. Той самий продукт доступний як GitLab.com, сервіс, який GitLab веде сам; як GitLab Self-Managed, який встановлюють на власні сервери; і як GitLab Dedicated, окремий екземпляр для одного клієнта, який GitLab розміщує й обслуговує в регіоні AWS, обраному цим клієнтом.
Під усім цим лежить звичайний git. Кожен проєкт — це git-репозиторій, який можна клонувати, надсилати в нього зміни й отримувати їх звичними командами, а історія в клоні повна. Усе, що GitLab додає зверху, від обговорень під час рев’ю та issues до результатів конвеєрів і прав доступу, зберігає сам GitLab поза репозиторієм, і клон нічого з цього не несе.
Merge request — це назва, яку GitLab дає запропонованій зміні, що чекає на злиття; інші платформи називають ту саму ідею pull request. Документація описує його як центральне місце, де переглядають код, ведуть обговорення і відстежують зміну. На одній сторінці видно опис, зміни в коді з коментарями до окремих рядків, стан конвеєрів CI/CD, звіти про те, чи можна зміну злити, і список комітів. Merge request можна пов’язати з issue, і тоді він автоматично закриє це issue під час злиття. Усталено основну гілку проєкту, зазвичай main, захищено, і зливати в неї можуть лише люди з роллю Maintainer або вищою.
Систему CI/CD налаштовують у файлі .gitlab-ci.yml у корені проєкту. Він
визначає етапи, завдання та скрипти, з яких складається конвеєр: етапи задають
порядок, наприклад збирання, потім тести, потім розгортання, а завдання — це
роботи, які виконуються на кожному етапі. Завдання виконує GitLab Runner, окрема
програма, написана мовою Go й поширювана як один бінарний файл. Runner
під’єднується до екземпляра GitLab, чекає на завдання, виконує кожне просто на
машині, у контейнері Docker або на віддаленому сервері через SSH і повідомляє
результат назад.
Чому це важливо
Більшість того, що команда розробників робить між написанням коду та його випуском, може відбуватися в одному екземплярі GitLab: код, рев’ю, конвеєр, що його тестує, issue, у якому про нього попросили, і запис про те, хто що схвалив. Один застосунок означає один набір облікових записів і прав, одне місце для пошуку і зв’язки, які тримаються між issue, merge request, що його закрив, і конвеєром, що зміну перевірив.
Можливість вести GitLab самостійно — причина, через яку багато організацій узагалі його обирають. Коли код має лишатися на власній інфраструктурі компанії через договір, регулятора чи внутрішні правила, хостинговий сервіс відпадає, а GitLab можна встановити всередині тієї мережі, яка має цей код берегти. Документація вважає це повноцінним сценарієм: вона публікує еталонні архітектури для встановлень на 1 000–50 000 користувачів, поруч із пакетом для Linux і Helm-чартом для Kubernetes.
Цей контроль має ціну, і платять її роботою з експлуатації, а не лише ліцензіями. Вести GitLab самостійно означає підібрати для нього сервер, підтримувати в доброму стані базу PostgreSQL і сховище Redis або Valkey, виділити машини для runner-ів, робити резервні копії, з яких справді можна відновитися, і проходити оновлення в тому порядку, якого вимагає проєкт. Хостингові варіанти передають цю роботу GitLab; самостійний лишає її вам.
Як це виглядає на практиці
Робота компанії стикалася з GitLab з обох боків.
Протягом кількох років роботи з даними практики CI/CD на основі GitHub і GitLab, де саму автоматизацію забезпечували Bash і Python, замінили ручні кроки і в аналізі даних, і в розробці. Шлях роботи від розробки до постачання стандартизували, щоб він щоразу був однаковим, а не вигадувався заново для кожного проєкту, а аналітичний напрям, який довго вважали окремим і більш ручним світом, увійшов у той самий конвеєр, що й розробка. Сторінка називає приблизно 4 000 заощаджених годин і більш узгоджені результати постачання, бо роботу більше не виконували щоразу трохи по-різному.
Власний код компанії показує інший бік самостійного хостингу. Коли код переїхав зі стороннього хостингового сервісу, він потрапив на форджу, яку компанія веде сама: один бінарний файл, насамперед SSH і без адміністративного вебінтерфейсу. Її обрали за принципом: що менше інтерфейсу, то менше треба захищати. Ця форджа ділить робочий сервер із 512 МБ пам’яті, з яких придатні до використання близько 464 МБ, з вебсервером для семи доменів, onion-сервісом Tor, сервером Gemini, сервером Gopher, зашифрованими резервними копіями та блокуванням спроб вторгнення.
Жодна з цих двох сторінок не згадує GitLab, і подальше порівняння — власна арифметика цієї статті. GitLab називає 8 ГБ пам’яті мінімумом, з яким може працювати встановлення на одному вузлі; увесь той сервер має шістнадцяту частину цього обсягу. Вести GitLab самостійно означає мати сервер, розрахований на GitLab, а невелика форджа з однією метою — інший шлях тримати код на власних машинах.
Мінімальний файл конвеєра показує форму налаштувань CI/CD: два етапи, що виконуються по черзі, і по одному завданню в кожному:
stages:
- build
- test
build-site:
stage: build
script:
- make build
run-tests:
stage: test
script:
- make test
Де виникають проблеми
- Малий сервер сповільнює весь екземпляр. Документація GitLab називає 16 ГБ пам’яті базовим рівнем для встановлення на одному вузлі, а 8 ГБ — найменшим обсягом, з яким воно може працювати в середовищі з обмеженою пам’яттю. Вона також попереджає, що swap може суттєво знизити продуктивність під навантаженням, і просить вимикати swap, де це можливо, або дати стільки пам’яті, щоб GitLab ніколи ним не користувався.
- Резервна копія відновлюється в екземпляр, що не може прочитати власні
дані. Команда резервного копіювання не включає каталог конфігурації
/etc/gitlab, а з ним іgitlab-secrets.json— ключі, що розшифровують зашифровані значення в базі даних. Без цього файлу ці значення у відновленій базі лишаються замкненими. Документація просить робити резервну копію конфігурації окремо, щонайменшеgitlab-secrets.jsonіgitlab.rb. - Оновлення перескакує через обов’язкову зупинку. Шляхи оновлення містять обов’язкові зупинки, тобто версії, які треба встановити перед будь-якою пізнішою, і починаючи з GitLab 17.5 вони припадають на x.2, x.5, x.8 і x.11. Фонові міграції кожної зупинки мають завершитися до початку наступного оновлення, тож екземпляр, що відстав на кілька версій, наздоганяє їх по одній зупинці за раз.
- Кероване сховище даних виявляється непідтримуваним. PostgreSQL — єдина підтримувана база даних. Redis або Valkey зберігає сесії та фонові задачі й має бути окремим самостійним екземпляром: Redis Cluster і serverless-варіанти Redis і Valkey не підтримуються. Керований хмарний сервіс дозволено, якщо він саме самостійного типу.
- Конвеєри чекають на машини, які ніхто не запланував. GitLab.com надає готові runner-и, а на самостійному екземплярі адміністратор сам забезпечує й обслуговує інфраструктуру, де виконуються завдання CI/CD, зокрема стежить, щоб runner-и мали достатньо потужності для навантаження організації. Завантажена команда з одним малим runner-ом стоїть за ним у черзі.
Що почитати далі
- GitLab Docs — повна документація про використання, встановлення та адміністрування GitLab.
- Installation requirements — пам’ять, процесор, сховище та підтримувані версії PostgreSQL і Redis.
- Back up GitLab — що містить резервна копія, чого в ній немає і як зберігати секрети поруч із нею.
- Upgrade paths — обов’язкові зупинки оновлення і чому фонові міграції мають завершитися між ними.
- Get started with GitLab CI/CD — файл
.gitlab-ci.yml, етапи, завдання й конвеєри. - GitLab Runner — програма, що виконує завдання, і способи, якими вона може їх виконувати.