작업 공간이 둘이라 오가는 것이 번거로워서 합칠지를 고민하게 됐다. 같은 tools/ 스크립트를 두 곳에 나눠 두고 하나를 고치면 다른 쪽에도 cp 로 복사하는 상태였다.
Table of contents
Open Table of contents
문제 — 둘로 나뉜 상태
합쳤을 때 좋아지는 것과 나빠지는 것을 두 목록으로 나란히 적어 봤다. 도구를 한 벌만 두게 되고 설정을 한 번만 하며 grep -r 전체 검색이 되는 것이 좋아지는 쪽이다.
나빠지는 쪽은 고객사 자료가 한 git 저장소에 섞이고 저장소가 커지며 실수로 다른 고객사 자료를 건드릴 수 있다는 것이었다. 두 번째 목록의 첫 항목이 결정적이었고 고객사 자료를 섞는 것은 받아들일 수 없었다.
판단 기준 — 무엇을 합칠지의 구분
전부 합치거나 전부 나누는 두 선택지만 놓고 보니 어느 쪽도 맞지 않았는데 항목별로 갈라 보니 답이 나왔다.
tools/ 와 설정과 문서 틀은 합치고 고객사 자료와 저장소와 자격 증명은 나눈다. 뒤쪽 셋을 나누는 쪽을 골랐다. 이유는 고객사 자료를 섞는 것은 어떤 편의로도 받아들일 수 없어서다. 대신 두 작업 공간을 오가는 번거로움 자체는 남는 것을 감수했다. 도구는 한 자리에 두고 각 작업 공간에서 그것을 참조하는 형태로 만들었다. 합칠지 나눌지가 아니라 무엇을 합칠지로 물음을 바꾸니 두 목록의 좋은 점만 남았다.
조치 — 참조 방법과 실수 방지
도구는 ln -s 심볼릭 링크로 이어서 한 벌만 두고 양쪽에서 보이게 했다. 링크가 저장소에 들어가면 다른 환경에서 깨질 수 있어 .gitignore 에 넣고 각 환경의 setup.sh 가 만들게 했다.
한 자리에 있으니 실수할 여지가 있어서 각 작업 공간에 .workspace 표시 파일을 하나씩 뒀다. 도구가 그 파일을 읽어 지금 어느 작업 공간에 있는지를 명령마다 출력하게 했다.
$ ./tools/deploy.sh
작업 공간: customer-a
정말 배포합니까? (yes)
되돌릴 수 없는 명령 앞에서 한 번 물어보게 한 것이 다른 곳인 줄 알고 돌리는 것을 막았다.
자격 증명의 분리
고객사마다 SSH 키를 나누고 ~/.ssh/config 의 Host 별칭으로 갈라 두었다. 저장소 주소에 어느 쪽인지가 들어가므로 별도 지정 없이 맞는 IdentityFile 을 쓰게 된다.
키를 나눠 두면 하나가 새더라도 다른 쪽은 그대로 안전하고, 도구를 합치면서도 이것만은 합치지 않은 이유가 거기 있었다.
나중에 떼어 낼 수 있는 형태로도 만들어 뒀다. 고객사별 폴더 하나로 모아 두니 그 고객사가 끝났을 때 폴더만 tar 로 압축해 보관하고 지우면 됐고 도구는 그대로 남았다.
주의 — 도구가 한쪽에 묶이지 않게
도구를 합치고 나니 한 작업 공간에만 맞는 코드가 섞여 들어가는 문제가 생겼다. 배포 대상 호스트가 도구 안에 박혀 있어서 다른 작업 공간에서 쓰면 틀린 곳으로 나갔다.
DEPLOY_HOST=$(grep '^deploy_host=' .workspace | cut -d= -f2)
[ -n "$DEPLOY_HOST" ] || { echo ".workspace 에 deploy_host 가 없습니다"; exit 1; }
그래서 .workspace 에서 읽게 하고 그 값이 없으면 exit 1 로 멈추게 했다. 기본값을 두면 설정이 빠졌을 때 조용히 엉뚱한 곳으로 나가므로 여기서는 멈추는 쪽이 맞았다. 도구를 합치는 조건은 그 도구가 어느 쪽에도 안 묶이는 것이었다.
정리
- 합칠지 나눌지는 무엇을 같이 하는지에 달렸다
- 전부 합치거나 전부 나누는 대신 무엇을 합칠지 가른다
tools/는 합치고 자료와 자격 증명은 나눈다- 한 자리에 있으면 실수할 수 있으니
.workspace로 어디인지 보이게 한다 - 되돌릴 수 없는 명령은 한 번 물어본다
- 자격 증명을 나눠 하나가 새도 다른 쪽이 안전하게 한다
- 나중에 떼어 낼 수 있게 폴더로 모아 둔다
- 합친 도구에 설정이 빠지면 기본값 대신 멈추게 한다