Skip to content
isdnetworks
Go back

저장소가 몇 개인지부터 적었다

(수정됨)

인계받고 나서 이 기능 코드가 어디 있느냐를 매번 물어봤고 물어볼 사람이 없으면 그 자리에서 작업이 멈췄다.

Table of contents

Open Table of contents

증상 — 어디 있는지 몰랐다

저장소가 몇 개인지도 몰랐다.

$ ssh git-server 'ls /srv/git/'

스무 개 남짓이 나왔는데 이름만 봐서는 무엇인지 모르는 것이 섞여 있었다.

elearn-web.git
elearn-api.git
elearn-batch.git
lms-old.git
lms-new.git
test-repo.git
backup-2017.git
...

lms-old 와 lms-new 가 무엇이고 elearn 과 어떤 관계인지 알 수 없었다.

이것은 기억력의 문제가 아니라 저장소 목록이 없다는 문제였다. 전부 파악하지 못하더라도 지금 아는 것을 적어 두면 그것부터는 안 물어봐도 된다.

검증 — 하나씩 열어 봤다

전부 읽을 필요는 없었다.

$ for r in $(ssh git-server 'ls /srv/git/'); do
    echo "=== $r"
    git ls-remote "git@git-server:/srv/git/$r" HEAD 2>/dev/null | head -1
    git clone --depth 1 --quiet "git@git-server:/srv/git/$r" /tmp/chk 2>/dev/null
    ls /tmp/chk | head -5
    git -C /tmp/chk log -1 --format='%ci %s'
    rm -rf /tmp/chk
  done

마지막 커밋 날짜와 최상위 파일만 봐도 대부분 갈렸다.

elearn-web    2019-08-30  PHP·Moodle 프로젝트     현재 쓰는 것
lms-old       2016-04-11  CodeIgniter 프로젝트 안 씀
test-repo     2015-02-03  빈 저장소            안 씀

마지막 커밋이 3년 넘게 안 바뀐 것이 아홉 개였다.

결과 — 표로 만든 것

확인한 것을 표로 정리했다.

저장소          내용                    상태   배포 대상        담당
elearn-web      학습 화면               운영   web01,web02      ...
elearn-api      외부 연동 API           운영   api01            ...
elearn-batch    배치                    운영   batch01          ...
lms-old         2016년 이전 시스템      보관   없음             -
test-repo       빈 저장소               폐기   없음             -

무엇이 운영에 나가고 무엇이 안 나가는지가 갈렸다.

이 표가 있으니 어디 있느냐에 바로 답이 됐고 배포 대상 과 담당 이 나중에 가장 자주 참조된 열이었다.

판단 기준 — 보관과 폐기

안 쓰는 아홉 개를 어떻게 할지 정했다.

보관   나중에 볼 수 있다. 읽기 전용으로 두고 목록에 남긴다
폐기   아무도 안 본다. 마지막 상태를 파일로 내리고 저장소를 없앤다

보관 으로 정한 것은 지우는 것 대신 쓰기만 막는 쪽을 골랐다. 이유는 옛 시스템의 계산 규칙을 나중에 대조할 일이 있어서다.

폐기하기로 한 셋도 바로 안 지우고 파일로 내려 뒀다.

$ git clone --mirror "git@...:test-repo.git"
$ tar czf test-repo-20190831.tar.gz test-repo.git

--mirror 로 이력까지 통째로 남겨 나중에 되살릴 수 있게 했다.

주의 — 목록에 없던 저장소

저장소끼리 서로 참조하고 있는 것이 있었다.

$ grep -rn "git@\|https://git" --include=composer.json --include=package.json .

elearn-web 이 다른 저장소를 의존으로 걸고 있었다.

"repositories": [{"type": "vcs", "url": "git@git-server:/srv/git/elearn-common.git"}]

elearn-common 이 서버 목록에 없었고 다른 자리에 있었다.

의존을 따라가니 목록에 없던 저장소가 나왔으니 서버 목록만으로는 전부가 아니었다.

$ grep -rhn "git clone\|git@" scripts/ docs/ 2>/dev/null | grep -oE "git@[^ ']+" | sort -u

배포 스크립트와 문서에서도 주소를 뽑으니 셋이 더 나왔다.

하나는 외부 서비스에 있었고 둘은 개인 계정에 있었다. 개인 계정에 있는 것은 그 사람이 없어지면 못 받으므로 전부 회사 서버로 옮겼다.

재발 방지 — 이름 규칙과 목록 유지

새 저장소를 만들 때의 이름 규칙도 정했다.

<제품>-<역할>
  elearn-web
  elearn-api
  elearn-batch
  elearn-common

test 와 temp 와 backup 같은 이름은 금지했는데 그런 이름이 영구히 남는다.

목록이 낡지 않게 하는 장치도 뒀다.

#!/bin/sh
# 월 1회
known=$(awk -F'|' 'NR>2 {print $2}' docs/repositories.md | tr -d ' ')
actual=$(ssh git-server 'ls /srv/git/' | sed 's/\.git$//')
comm -13 <(echo "$known" | sort) <(echo "$actual" | sort)

comm 으로 목록에 없는 저장소가 생기면 나오게 했다.

목록은 만든 순간부터 낡기 시작한다. 유지하는 장치가 없으면 다시 처음으로 돌아간다.

정리


Share this post on:

Previous Post
문서에 없는 실제 경로를 찾아 적었다
Next Post
예외를 던지니 호출처가 롤백한다