Skip to content
isdnetworks
Go back

GitHub 조직을 넘겨받는 일은 owner 를 바꾸는 것으로 끝나지 않았다

넘겨받는 커머스의 코드는 GitHub 조직 하나에 있다. 처음 계획은 단순했다. 우리 계정을 owner 로 올리고 기존 owner 를 내보내면 된다고 봤다. 조직을 실측해 보니 owner 교체는 이관의 마지막 단계일 뿐이고, 그 앞에 닫아야 할 층이 넷 있었다.

Table of contents

Open Table of contents

배경 — 조직의 실측 스냅샷

gh api 로 조직을 조회한 결과는 다음과 같다.

항목값
planenterprise
seats11 / 11
owned_private_repos288
total_private_repos265
public_repos2
멤버11명(사람 9명 + 우리 계정 1 + Machine User 1)
owner4명(사람 3명 + Machine User 1)

우리 계정은 member 이고, 토큰 스코프는 gist·read:org·repo 라 admin:org 가 없다. 변경 API 는 하나도 부를 수 없는 상태다. 그리고 지금도 코드가 푸시되고 있다. 가장 최근 push 는 조회 당일이었다.

측정 — 보이지 않는 저장소 138~161개

우리 토큰으로 보이는 저장소는 129개다(private 102 · internal 25 · public 2, 그중 archived 19). 그런데 조직이 보고하는 private 저장소 수는 두 API 필드가 서로 다르다. owned_private_repos 는 288, total_private_repos 는 265 다. 어느 쪽을 기준으로 하든 private 저장소 138~161개가 우리 계정에 보이지 않는다. /orgs/{org}/repos 는 인증 주체가 접근할 수 있는 저장소만 돌려주기 때문이다.

보이지 않는 것이 무엇인지 표본 29개로 시험했다. 이름으로 짐작되는 관계사 쪽 저장소 16개 중 15개가 404 였고, 넘겨받는 서비스 쪽 저장소를 대조군으로 넣으면 200 이 나왔다. 문제는 그다음이었다. CI/CD 구성 요소인 common-devops-* 저장소 4개(alert · tekton-ci · helm · terraform-module)도 전부 404 였다. 넘겨받는 서비스의 배포에 필요한 자산인데 보이지 않는다. 「보이는 129개면 우리 것은 다 있다」고 볼 수 없다는 뜻이고, 이 4개는 우선 확보 목록에 올려야 한다. 보이는 129개는 전체 히스토리째 로컬에 받아 두었다(8.1GB).

원인 — owner 교체를 막는 네 층

네 층 가운데 실제 병목은 마지막 둘이다. 앞의 둘은 상대에게 요청하면 풀리지만, 2FA 가 한 사람의 휴대폰에 있으면 그 사람의 협조 없이는 owner 교체도 자격증명 회수도 할 수 없다. 이 계정의 PAT 와 비밀번호는 문서에 평문으로 적혀 있었으므로, 이관 시점에 전량 폐기하고 다시 발급해야 한다.

판단 — 조직째 옮길지, 저장소별로 옮길지

옮기는 단위는 두 가지였다.

  1. 조직째 옮긴다. 넘겨받는 서비스의 자산이 빠짐없이 넘어오는 대신 양수도 대상이 아닌 관계사 저장소 160여 개가 함께 넘어온다. 관계사의 동의와 분리 협의가 먼저 필요하다
  2. 저장소별로 transfer 한다. 우리 것만 골라 옮기지만, 어느 것이 우리 자산인지 목록이 아직 없고 Enterprise 층·팀 권한·Machine User 의존을 건별로 풀어야 한다

지금은 둘 중 하나를 고르지 않기로 했다. 보류한 이유는 두 안 모두 Enterprise 구조 확인과 전체 저장소 목록이 있어야 비교할 수 있는데, 둘 다 owner 로 승격된 뒤에야 확정되기 때문이다. 반면 owner 교체 순서는 어느 안이든 같으므로 지금 정해 둘 수 있다. 근거 없이 하나를 고르면 1번은 남의 저장소를 떠안고, 2번은 우리 저장소를 빠뜨릴 위험이 있다. 이 보류의 대가는 그동안 우리가 볼 수 없는 저장소가 계속 남는다는 점이다.

owner 교체 순서는 미리 정해 두었다. 대상 계정을 owner 로 초대하고, 초대가 수락됐는지 확인한 뒤에야 기존 owner 를 내보내거나 member 로 내린다. 초대는 수락 전까지 pending 이라, pending 상태에서 기존 owner 를 지우면 owner 가 0명에 가까워진다. GitHub 이 마지막 owner 의 제거는 막아 주지만, 그 안전장치에 기대지 않는다.

남은 의문 — 승격 전에 닫을 것

결과 — 이전 방식을 미룬 대가와 얻은 것

정리


Share this post on:

Previous Post
넘겨받을 시스템의 범위를 정책을 기다리는 과업과 기다리지 않는 과업으로 갈랐다
Next Post
넘겨받을 코드베이스를 세 축으로 판정하고, 운영 가능 축의 Red 는 거절 대신 계약 조건 넷으로 바꿨다