본문 바로가기
C.W.K.
Stream
Lesson 03 of 04 · published

자기 완결이 핵심이야

~11 min · backup, resilience, review, doctrine

Level 0흩어진 부품
0 XP0/48 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete

백업이기도 한 저장소

이 저장소들은 사설이고 교리를 하나 지고 있어. 각각이 그 안의 작업에 대한 자기 완결 척추라는 것. 체크아웃이 있는 곳이면 어디서든 빌드되고 돌아가. 레지스트리 계정도, 5년 뒤에 있을지 없을지 모르는 서비스에 대고 하는 락파일 해석도, 누가 시작하기 전에 세워야 하는 내부 패키지 서버도 없이.

복사본은 그 성질을 정확히 지켜. 패키지는 과소평가되기 쉬운 방식으로 그걸 부숴. 체크아웃이 더 이상 코드가 아니게 되거든. 코드에서 의존성을 뺀 것 더하기 의존성을 가져올 수 있다는 약속이야. 그 약속은 보통 지켜져. 그 문장에서 무게를 다 지고 있는 건 "보통"이야. 그리고 내다보는 기간이 스프린트가 아니라 몇 년 단위인 아카이브한텐 틀린 베팅이지.

diff 가 기능이야

두 번째 성질은 없이 살아본 다음에야 알아채는 종류야. 공용 층이 바뀌면 소비자 히스토리에 그 변경이 코드로 떠. 커밋을 열고, diff 를 읽고, 공용 클라이언트의 어느 줄이 움직였는지 정확히 봐.

패키지면 같은 사건이 소비자한텐 한 줄로 떠. 버전 번호가 어떤 값에서 어떤 값이 됐다. 실제로 벌어진 건 전부 다른 저장소, 태그 뒤에 살고, 찾아 나서야만 닿아. 일상적인 업그레이드엔 그 간접이 괜찮아. 동작 변화를 이등분으로 쫓는 중인데 소비자 히스토리엔 숫자 하나뿐인 순간엔, 5분이랑 반나절의 차이야.

한 번도 안 건너는 간접은 한 번도 안 읽는 문서야. 변경과 그게 효력을 내는 자리 사이의 간접 층 하나하나가 독자가 멈출 수 있는 자리야. 버전 올림은 누군가 그걸 걸어서 통과할 의향이 있는 한 아주 좋은 추상이고, 정직한 질문은 그게 가능하냐가 아니라 새벽 두 시에 실제로 그러냐야.

이 가족이 이미 쓰고 있던 선례

이 모형은 키트를 위해 발명된 게 아냐. 같은 가족이 이미 기계 여러 대에 공용 지시 파일 묶음을 똑같은 방식으로 배포하고 있었어. 정식 출처, 체크섬을 붙여 복사하는 배달 단계, 그리고 안 맞게 된 복사본을 잡아내는 검사. 부품 셋 그대로, 내용만 다른 거지.

결정할 때 그게 중요했어. 이 모형이 가설이 아니라는 뜻이었으니까. 실패 방식이 이미 알려져 있었어. 빠뜨린 기계, 누가 제자리에서 고친 복사본. 완화책도 이미 갖춰져 있었고. 이걸 코드에 고르는 건 새 관행을 수입하는 게 아니라 돌아가는 관행을 한 영역 넓히는 거였어.

Code

자기 완결 시험, 그리고 그게 진짜 묻는 것·bash
# The only honest way to check the property: clone into a scratch
# directory with the network off and see whether it stands up.

git clone --no-local ./consumer-repo ./cold-checkout
cd ./cold-checkout

# No install step. No registry. No lockfile resolution.
python -m pytest tests/ -q

# What this proves for a VENDORED consumer: the shared code is in
# the tree, so the suite runs. The drift test skips when the kit repo
# is absent AND this is not a fleet machine, and says why - a cold
# clone off the fleet must not fail because a SIBLING repository is
# missing. On a fleet machine the same absence FAILS (track 4).
#
# What it would prove for a PACKAGED consumer: nothing, because the
# first import fails until a registry is reachable.


# The mirror question, which is the one people forget to ask:
# can the shared repo be rebuilt from a consumer if the kit is lost?
#
#   grep -rl "GENERATED FROM" consumer-repo/
#
# Every vendored file names its source path, so the tree can be
# reassembled by hand. Not a backup strategy - but it is the reason
# the header carries a PATH and not just a commit.

External links

Exercise

네 저장소 하나를 네트워크 끊고 새 디렉터리에 클론해서 테스트를 돌려봐. 실패한 단계마다 뭘 네트워크에서 필요로 했는지 적어. 그다음 각각에 대해 그 의존이 네가 실제로 쓰는 뭔가를 사주고 있는지 판단하고, 그중 어느 게 5년 뒤에도 풀릴지 표시해.
Hint
대부분의 프로젝트는 첫 설치 단계에서 죽고, 그건 재밌는 걸 아무것도 안 알려줘. 쓸모 있는 목록은 로컬 패키지 캐시를 허용한 *다음에* 실패하는 것들이야. 그게 코드가 아니라 서비스에 대한 의존이고, 유통기한이 제일 짧은 것들이지.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인 — 댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.