Кросплатформний package registry на дошці має цілком безневинний вигляд: NuGet-пакети лежать в одному місці, пайплайни тягнуть їх з іншого, усі задоволені. А потім токен протухає в найгірший момент, три пайплайни лягають на цілий день — і команда на власній шкурі дізнається, який невидимий податок вона платила з кожного деплою. Це історія про той день і про прибирання, що за ним настало.
Пакети в Azure, пайплайни в GitLab
Таку схему ніхто не проєктує навмисне — вона наростає сама. NuGet-пакети жили в Azure DevOps. CI/CD крутився в GitLab. Між ними сидів personal access token, PAT, що тихо відлічував дні до свого протухання, і дату цю ніхто не виписав у календар.
Кожен білд тягнувся через цю щілину. dotnet restore автентифікувався в Azure за PAT, забирав пакети й сподівався, що креди ще живі. Майже завжди живі. Доки одного разу не виявилися мертвими. Токен протух посеред спринту, і три пайплайни разом почервоніли, бо всі вони спиралися на один і той самий секрет. Цілий день пішов на те, що не дало жодної фічі й жодного фіксу.
Zero trust, тільки не той, що хороший
Найгіршою була культура, що виросла навколо цієї крихкості. Ніхто нічому не довіряв.
- PAT-токени протухали посеред спринту — без попередження і без господаря.
- CI/CD-змінні були розкидані по проєктах без жодного рядка документації.
- Розробники реально боялися чіпати NuGet-конфіг: минулого разу хтось його підправив — і три пайплайни лягли на цілий день.
Ось цей страх і є справжня ціна. Коли люди перестають чіпати систему зі страху, що вона рвоне, система перестає покращуватися. Вона костеніє. Лишається племінне знання про те, який токен куди йде, — і єдина людина, яка в цьому розбиралася, іде у відпустку рівно того тижня, коли все ламається.
Міграція: одна платформа для коду, пакетів і пайплайнів
Фікс був не геніальним. Він був структурним. Я переніс усе в GitLab Package Registry — на ту саму платформу, де вже жив код і крутилися пайплайни. Ті самі стіни, ті самі двері.
Ключовою була автентифікація. Кожен personal access token замінили на CI_JOB_TOKEN. Він вбудований у GitLab CI, обмежений рамками конкретного job'а і не потребує жодної ротації. Відстежувати нічого: токен живе рівно стільки, скільки триває job. Календар ротації кредів і сюрпризи посеред спринту просто перестали бути класом проблем.
Кладовище змінних
Перенести пакети — лише половина роботи. CI/CD-змінні були окремим цирком, і саме їхній розбір вимагав голови.
Відкрити список змінних було як відкрити шухляду з усяким мотлохом:
- Старі Azure DevOps PAT, які ніхто не пам'ятав, коли створював.
- Дублі NuGet source URL з трішки різними іменами — тож ніколи не збагнеш, який із них реально використовує job.
- Змінні, що пережили тих, хто їх завів.
Я переревізив кожну. По кожній питання було пряме: це взагалі хтось іще читає? Якщо ні — у топку. Якщо дві роблять те саме — в одну. Робота нудна, невдячна — і рівно така, яку ніхто не робить, доки нудьга не перетворюється на аварію.
Який вигляд має пайплайн тепер
Коли пакети переїхали в GitLab, а змінні вичистили, пайплайн склався в те, що пояснюється на одному видиху:
dotnet restoreтягне з GitLab Package Registry.- Build і pack.
- Push пакета назад у той самий registry.
Кожен крок автентифікується автоматично job-токеном. Жодного PAT у якійсь змінній. Жодного кросплатформного рукостискання. Жодного нагадування в календарі «проротувати секрет, поки він не уронив три пайплайни в п'ятницю під вечір».
Висновок: не давайте пакетам і пайплайнам жити в різних світах
Якщо ваші пакети живуть в одному світі, а пайплайни — в іншому, ви платите податок з кожного деплою. Він проявляється як оверхед на автентифікацію, як configuration drift, як племінне знання про те, який кред куди йде, — а час від часу як цілий втрачений день, коли забутий токен нарешті протухає.
Консолідуйте. Заберіть код, пакети й пайплайни за одну стіну, щоб платформа сама роздавала короткоживучі обмежені креди, а не ви вручну панькалися з довгоживучими. Один registry. Один потік автентифікації. Однією причиною менше для пайплайна впасти о 17:00 у п'ятницю.
І чесне питання наостанок: скільки токенів у ваших пайплайнах може протухнути завтра — і чи знаєте ви це насправді?