Кросплатформний 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 у п'ятницю.

І чесне питання наостанок: скільки токенів у ваших пайплайнах може протухнути завтра — і чи знаєте ви це насправді?