2026 여섯 리전 원격 Mac: Jenkins·Buildkite 에이전트 자격 증명(머신 사용자, OIDC, PAT)과 GitHub Actions·GitLab runner 공존—뮤텍스·리스 FinOps 체크리스트

약 17분 읽기 · MACCOME

싱가포르, 일본, 한국, 홍콩, 미국 동부, 미국 서부에 걸친 전용 원격 Mac 호스트에서 Jenkins 또는 Buildkite macOS 에이전트를 돌리면서 이미 GitHub Actions 또는 GitLab 셀프호스트 runner를 운영한다면, 예산과 감사에서 가장 아픈 지점은 종종 vCPU가 아니라 두 번째 컨트롤러가 만든 자격 증명 폭발 반경입니다. 90일 PAT를 누가 쥐는지, 어떤 사용자 컨텍스트가 match 복호화 키체인과 ASC 세션을 소유하는지, 버스트 호스트 재구축 시 비밀이 이미지에 고정되는지 여부입니다. 이 글은 자격 증명 토폴로지, 뮤텍스 규칙, 리스 회계 세 가지 원장을 제공하며 Jenkins·Buildkite 단계적 리스 런북runner 라벨·시크릿 체크리스트와 보완적입니다. 후자가 큐를 다루면 본문은 신원, OIDC, 폐기 경로를 다룹니다.

같은 여섯 리전 호스트에 “두 번째 CI 컨트롤러”가 올라올 때의 여섯 가지 자격 증명 실패 모드

  1. 모든 에이전트가 하나의 대화형 macOS 사용자 HOME 공유: Jenkins용 ~/.ssh, buildkite-agent, actions-runner가 같은 로그인 아래에 있으면 git credential-osxkeychain 프롬프트만 나와도 무인 CI가 들쭉날쭉한 그린 빌드가 됩니다.
  2. 조직 전역 PAT가 일일 버스트 이미지에 구워짐: 주간 호스트 교체와 얼어붙은 조직 토큰이 맞물리면 단일 빌더를 넘는 영향 반경이 생깁니다.
  3. match 복호화·공증 업로드에 뮤텍스 없음: 동일 match 저장소나 ASC API 세션을 동시 파이프라인이 건드리면 간헐적 401·403이 “Apple 쪽 노이즈”로 오해됩니다.
  4. 클라우드 관제면 OIDC audience 불일치: 저장소·환경까지 좁히지 않은 Buildkite나 GitHub 신뢰 정책은 에이전트가 작업에 필요한 것보다 넓은 토큰 표면으로 바꿀 수 있습니다.
  5. 키체인 파티션과 LaunchDaemon 순서가 미기재: 재부팅 후 Jenkins가 runner보다 먼저 뜨면 누군가 재시도할 때까지 빈 파티션만 읽습니다.
  6. FinOps가 코어만 세고 “자격 증명 수명 × 리스”를 안 봄: 일일 호스트의 장수명 키는 청구서에선 싸 보여도 보안 일정에선 받아들이기 어렵습니다.

여섯 리전의 가치는 예측 가능한 코로케이션과 전용 IO입니다. 자격 증명 토폴로지가 불명확하면 혼란만 스케일합니다. Xcode Cloud 하이브리드 CI까지 돌린다면 ASC와 내부 레지스트리 중 무엇을 어떤 신원이 건드릴 수 있는지 적시하지 않으면 하이브리드 매트릭스가 하이브리드 사고가 됩니다.

자격 증명 RACI를 두십시오. 플랫폼은 머신 사용자와 OIDC 바인딩을, 저장소는 워크플로 범위를, 보안은 폐기 드릴을 소유합니다. 두 번째 컨트롤러가 라이브가 되면 여기 빈틈이 곧 사고로 번집니다.

차원 장수명 PAT·배포 키 선호 OIDC·단명 토큰 선호
리스 월 단위 이상 베이스라인 호스트에 한정하고 이미지 밖 비밀 주입 신뢰 조건이 빡세면 일일·주간 버스트에 적합
감사 입도 “누가 어떤 호스트에 PAT를 올렸는지” 추가 로깅 필요, 로테이션은 회계 분기에 종종 묶임 클라우드가 저장소·환경·풀까지 묶어 작업 단위 귀속이 쉬움
Jenkins 플러그인 생태계 많은 플러그인이 정적 자격 증명 파일을 전제 명시적 파이프라인 리팩터 필요, 일회 비용 큼
Buildkite 훅이 비밀을 조용히 내보낼 수 있음 훅은 조립만 하고 비밀은 OIDC로 교환한 단명 토큰에서
GHA·GitLab runner 셀프호스트 runner가 긴 .credentials 파일을 흔히 유지 클라우드 STS로의 OIDC가 주류—먼저 정렬
warning

금지선: 일일 버스트 호스트에 조직 전역 장수명 PAT나 루트급 배포 키를 만들지 마십시오. 사업이 고집하면 같은 승인 티켓에서 비밀 수명을 리스 상한에 묶으십시오.

여섯 단계 런북: “돌아간다”에서 “폐기하고 원장에 남긴다”까지

  1. 비밀 표면 재고: Jenkinsfile, Buildkite 파이프라인, GitHub 워크플로 전반의 환경 변수와 파일을 조직 전역 대 저장소 한정으로 라벨링합니다.
  2. 별도 머신 사용자와 HOME 트리 할당—예: jenkins, buildkite, runner. CI에 대화형 로그인 공유 금지.
  3. 배타 리소스 뮤텍스: match 복호화, 공증 업로드, ASC 브라우저 세션은 직렬화하고 잠금 이름은 ROUTING.md와 파이프라인 주석에 둡니다.
  4. OIDC 신뢰 조건을 리뷰 가능한 텍스트로: audience, 저장소, ref 접두, 환경 이름을 적고 IAM 또는 내부 STS와 교차 검증합니다.
  5. 분기별 폐기 드릴: 토큰 클래스 하나를 무작위로 폐기하고 세 에이전트가 기대대로 저하되는지 말없이 계속되는지 확인합니다.
  6. 자격 증명 수명을 리스 FinOps 시트에 넣기: 장수명은 베이스라인만, 버스트는 단명 STS만—단계적 리스 표와 같은 페이지에 둡니다.
bash
# 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

Grafana나 리뷰 메모에 적을 세 가지 메트릭(베이스라인은 각자 조정)

  • 버스트 호스트에서 여전히 30일 넘게 PAT를 읽는 작업: 목표 0%. 주간 샘플링이 >3%면 보안 예외 티켓을 엽니다.
  • match·공증 단계만의 뮤텍스 대기 P95(초): P95가 >600s로 유지되는데 큐 깊이만 오르면 컴파일 병렬을 늘리기 전에 직렬 내보내기 호스트를 추가합니다(임계는 예시).
  • OIDC 토큰 교환 실패율을 관제면과 리전으로 분할하고, 여섯 리전 발 중 하나만 STS RTT가 나쁘면 runner 동시성을 올리기 전에 네트워크 토폴로지를 고칩니다.

2026년에 “SSH로 들어가 키체인을 손으로 고치거나” 이미지 속 만능 frozen .env가 두 번째 컨트롤러를 안 두는 것보다 나쁜 이유

수동 키체인 작업은 감사 불가입니다. 마지막으로 잠금 해제한 사람, 대화 세션이 열린 채인지는 SOC2 증빙으로 못 팝니다. 만능 .env는 한 저장소에서 컨테이너를 시작할 수 있는 모든 사람에게 표면을 넓혀 작업 단위 OIDC 최소 권한과 정반대입니다.

Jenkins·Buildkite와 runner를 공존시키면서 전용 Apple Silicon에서 안정적인 리전 egress와 베이스라인 대 버스트 리스 분리가 필요하면 MACCOME 클라우드 Mac mini가 물리 앵커로 더 나은 경우가 많으며, 싱가포르·일본·한국·홍콩·미 동·서 해안에서 일·주·월·분기 리스를 선택할 수 있습니다. 컴파일 처리량을 쫓기 전에 어떤 신원이 어떤 호스트에 얼마나 머물 수 있는지를 원장에 올리십시오—시뮬레이터 다섯과 공증 업로드 세 개를 돌리면서 일일 호스트에 90일 PAT를 얼리지 마십시오.

마무리: CREDENTIAL_ROUTING.md를 CLONE_POLICY의 형제로 둔다

세 표를 내보냅니다: 머신 사용자 ↔ HOME 맵, 뮤텍스 리소스 ↔ 잠금 이름, OIDC 신뢰 ↔ STS 범위. 입사 첫날 신입이 어떤 신원을 쓰는지, 실패 시 어떤 토큰 클래스를 폐기하는지, 버스트에 90일 PAT가 없는 이유를 말할 수 있어야 합니다.

runner 시크릿 체크리스트와 짝을 이룰 때는 “GitHub 쪽 OIDC”와 “macOS 키체인 파티션”을 같은 변경 티켓에 합치지 않으면 클라우드 신뢰 정책은 완벽한데 베어 메탈 파티션은 비어 있는 모순이 남습니다.

FAQ

Jenkins, Buildkite, GitHub Actions runner가 한 호스트에 공존할 수 있나요?

사용자 분할, 키체인 파티션, 배타 단계 직렬화가 있으면 가능합니다. 스택 전체에 장수명 PAT 하나를 공유하지 마십시오. 큐 세부는 단계적 리스 런북을 보십시오. 공개 리스 단계: 대여 요금.

장수명 비밀을 월간 베이스라인 호스트에 고정하는 이유는?

일일 호스트는 교체가 잦고 정적 비밀이 이미지·백업으로 새어 나갑니다. 베이스라인이 감사 정체성을 고정합니다. 운영 맥락은 요금·가격 페이지도 함께 참고하십시오.