인계받고 나서 이 기능 코드가 어디 있느냐를 매번 물어봤고 물어볼 사람이 없으면 그 자리에서 작업이 멈췄다.
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 으로 목록에 없는 저장소가 생기면 나오게 했다.
목록은 만든 순간부터 낡기 시작한다. 유지하는 장치가 없으면 다시 처음으로 돌아간다.
정리
- 저장소가 몇 개고 무엇인지부터 적는다
- 마지막 커밋 날짜와 최상위 파일만 봐도 대부분 갈린다
- 표에 운영에 나가는지와 담당을 적는다
- 안 쓰는 것을 보관과 폐기로 나눈다
- 폐기도 파일로 내려 두고 지운다
- 의존을 따라가면 목록에 없던 저장소가 나온다
- 스크립트와 문서에서도 주소를 뽑는다
- 개인 계정에 있는 것은 옮긴다
- 이름 규칙을 정하고 임시라는 이름을 금지한다
- 목록에 없는 것이 생기면 알게 한다