Если вы запускаете агенты macOS Jenkins или Buildkite на выделенных удалённых Mac в Сингапуре, Японии, Корее, Гонконге, восточном и западном побережье США и уже используете runner GitHub Actions или GitLab, развёрнутые на вашей инфраструктуре, боль в бюджете и аудите редко в vCPU — чаще это радиус поражения учётных данных от второго контроллера: кто держит 90-дневный PAT, какой контекст пользователя владеет связкой match и сессией ASC, и не застывают ли секреты в образах при пересборке burst-хостов. Статья задаёт три регистра — топология учётных данных, правила мьютексов, учёт аренды — и дополняет runbook поэтапной аренды Jenkins/Buildkite и чеклист меток и секретов runner: там очереди, здесь личности, OIDC и отзыв.
~/.ssh для Jenkins, buildkite-agent и actions-runner под одним входом превращают безлюдную CI в нестабильно «зелёные» сборки, как только git credential-osxkeychain запрашивает ввод.Ценность шести регионов — предсказуемая колокация и выделенный IO; расплывчатая топология учётных данных масштабирует только путаницу. Если параллельно гоняете гибридный CI Xcode Cloud, явно укажите, какая личность может трогать ASC против внутренних регистров — иначе гибридная матрица станет гибридным инцидентом.
Введите RACI по учётным данным: платформа владеет машинными пользователями и привязками OIDC, репозитории — областями workflow, безопасность — учениями на отзыв. Любая щель взрывается при включении второго контроллера.
| Измерение | Предпочесть долгоживущий PAT / deploy keys | Предпочесть OIDC / короткие токены |
|---|---|---|
| Аренда | Только на хостах с базовой линией от месяца и дольше с внеобразовой инъекцией секретов | Подходит для ежедневного/недельного burst, если условия доверия жёсткие |
| Зернистость аудита | Нужны дополнительные логи «кто положил PAT на какой хост»; ротация часто следует за финансовыми кварталами | Облако может связать репозиторий, среду, пул — проще атрибуция на задачу |
| Экосистема плагинов Jenkins | Многие плагины предполагают статические файлы учётных данных | Требует явных правок пайплайнов; выше разовые затраты |
| Buildkite | Хуки могут тихо экспортировать секреты | Хуки только собирают; секреты из коротких токенов после обмена OIDC |
| GHA/GitLab runner | Self-hosted runner часто хранят длинные файлы .credentials |
OIDC к облачному STS — мейнстрим; сначала выровняйтесь здесь |
Красная черта: не выпускайте долгоживущие PAT организации или корневые ключи развёртывания на ежедневных burst-хостах. Если бизнес настаивает, привяжите время жизни секретов к потолкам аренды в том же тикете согласования.
jenkins, buildkite, runner; запретите общие интерактивные входы для CI.ROUTING.md и комментариях пайплайна.# Example mutex (replace flock backend with your coordination service)
exec 9>/var/lock/match-decrypt.lock
flock -n 9 || { echo "match decrypt busy"; exit 42; }
# Example split users (LaunchDaemon sketch—do not copy paths blindly)
# UserName=buildkite vs UserName=runner — each HOME keeps its own git credential helper config
.env в образе хуже, чем не вводить второй контроллерРучная работа со связкой не аудируется: кто последним разблокировал, осталась ли интерактивная сессия — это не доказательство для SOC2. Универсальный .env расширяет поражение от одного репозитория до любого, кто может запустить контейнер — противоположность принципу минимальных прав OIDC на задачу.
Когда Jenkins/Buildkite и runner должны сосуществовать на выделенном Apple Silicon со стабильным региональным egress и разделимыми арендами базовой линии и всплесков, облачный Mac mini MACCOME часто лучший физический якорь: узлы в Сингапуре, Японии, Корее, Гонконге, на восточном и западном побережье США с гибкими ежедневными/еженедельными/месячными/квартальными арендами. Зафиксируйте в регистре кто может сколько жить на каком хосте, прежде чем гнаться за пропускной способностью компиляции — не замораживайте 90-дневный PAT на ежедневном хосте с пятью симуляторами и тремя загрузками нотариуса.
Отгрузите три таблицы: машинный пользователь ↔ карта HOME, ресурсы мьютекса ↔ имена блокировок, доверие OIDC ↔ области STS. Новый сотрудник в первый день должен ответить, какую личность использует задача, какой класс токенов отзывать при сбое и почему на burst нет 90-дневного PAT.
Вместе с чеклистом секретов runner объедините «OIDC на стороне GitHub» и «партиции связки ключей macOS» в одном изменении — иначе политики доверия идеальны в облаке, а партиции на железе пусты.
FAQ
Могут ли Jenkins, Buildkite и runner GitHub Actions сосуществовать на одном хосте?
Да при разделении пользователей, партиций связки ключей и сериализации исключительных шагов; избегайте одного долгоживущего PAT на все стеки. Подробности очередей — в runbook поэтапной аренды. Публичные уровни аренды: цены аренды.
Зачем закреплять долгоживущие секреты на месячных хостах базовой линии?
Ежедневные хосты часто пересобираются; статические секреты утекают в образы или бэкапы. Baseline закрепляет аудиторскую идентичность. Контекст стоимости и операций снова: цены аренды Mac mini.