v1.2.1 — 설치된 명령이 실제로 실행된다
v1.2.0으로 설치했다면 이 버전으로 올려야 한다. 설치된 guide·exam·shoot 세 명령이 전부 동작하지 않았다.
$ exam
can't open file '~/.local/bin/scripts/exam.py': [Errno 2] No such file or directory
이미 v1.2.0을 설치한 경우, 설치 명령을 그대로 다시 실행하면 고쳐진다.
curl -fsSL https://raw.githubusercontent.com/Ahngbeom/dba-guide/main/install.sh | bash저장소를 클론해 ./guide로 쓰던 사람은 영향이 없다. 깨진 것은 심볼릭 링크 경유 호출뿐이었다.
무엇이 깨졌나
세 런처가 자기 위치를 dirname "${BASH_SOURCE[0]}"로 찾았다. 그 값은 심볼릭 링크를 따라가지 않고 링크 자신의 경로다. install.sh가 런처를 ~/.local/bin에 링크하므로, 링크로 부르면 있지도 않은 ~/.local/bin/scripts/exam.py를 찾았다.
결함은 인스톨러가 아니라 런처에 있었다. 런처는 v1.0.0부터 ./exam 형태로만 불렸기에 이 가정이 드러날 일이 없었고, v1.2.0이 처음으로 링크 경유 호출을 만들면서 잠재 결함을 실제 결함으로 바꿨다. 새 기능이 손대지 않은 옛 코드의 미검증 가정을 활성화한 경우다 — 바뀐 파일은 install.sh인데 깨진 파일은 exam이었다.
readlink -f는 이식성이 없어 링크 사슬을 직접 따라간다. 상대 대상은 링크가 있던 디렉터리 기준으로 푼다.
왜 592개 테스트가 놓쳤나
이번 릴리스가 남길 가치가 있는 건 수정보다 이쪽이다. 구멍이 두 겹이었다.
self.assertEqual(os.readlink(link), str(self.install_dir / name))링크가 가리키는 문자열만 보고 그 명령을 한 번도 실행하지 않았다. 링크의 모양을 검사했지 링크가 동작한다는 사실을 검사하지 않았다.
그리고 테스트 픽스처가 런처를 echo guide 스텁으로 대신하고 있었다. 진짜 런처의 경로 해석이 애초에 테스트의 사정거리 밖이었다는 뜻이다 — 첫 번째 구멍만 메우고 스텁을 그대로 뒀다면 여전히 통과했을 것이다.
v1.2.0 노트에 "통과하는 테스트 수는 커버리지가 아니다"라고 적어 두고 그 아래에서 같은 실수를 하고 있었다.
이제 픽스처는 저장소의 진짜 런처를 복사하고, LinkedCommandTest가 설치된 명령을 심볼릭 링크로 실제 실행한다. cwd는 일부러 설치 경로 바깥에 둔다. 인자가 그대로 넘어가는지도 함께 본다. 수정 전에 이 테스트가 정확히 그 이유로 실패하는 것을 확인했다.
AssertionError: 2 != 0 : exam: can't open file '.../.local/bin/scripts/exam.py'
그 밖에
CLAUDE.md에 이 제약을 기록했다 — 런처를 고칠 다음 사람이 같은 자리를 다시 밟지 않도록.postgresql/mysql/oracle세 브랜치를 이 릴리스 시점의main에서 재생성해 push했다. 세 브랜치 모두Ran 592 tests … OK (skipped=1), 챕터 마커 잔여 0.
알려진 한계
v1.2.0의 「알려진 한계」가 그대로 유효하다 — 인스톨러의 curl | bash 신뢰 모델과 --purge의 tty 요구, MySQL 판정 회피, PostgreSQL 판정의 두 구멍, Oracle 스테이지 부재, CI 부재. 이번 릴리스에서 새로 늘거나 준 것은 없다.
한 가지 덧붙인다. 이 결함은 자동 검증이 아니라 발행 직후 손 점검에서 잡혔다. docs/release-policy.md가 요구하는 그 점검이다. CI가 없는 저장소에서 그 목록이 실제로 무엇을 막고 있는지를 보여준 사례로 남긴다.
요약
| v1.2.0 | v1.2.1 | |
|---|---|---|
| 챕터 | 31 | 31 |
| 문제은행 / 문항 | 23 / 216 | 23 / 216 |
| 스테이지 | 14 | 14 |
| 설치 후 명령 동작 | 깨짐 | 동작 |
| 테스트 | 590 | 592 |
커밋 1개. 전체 변경 이력: v1.2.0...v1.2.1
호환성: 고치기만 했다. CLI 인자·스키마·기록 형식·챕터 경로 변경이 없다.