Skip to content

docs: add a release runbook and a roadmap - #24

Merged
jlc488 merged 1 commit into
mainfrom
docs/releasing-and-roadmap
Aug 9, 2026
Merged

docs: add a release runbook and a roadmap#24
jlc488 merged 1 commit into
mainfrom
docs/releasing-and-roadmap

Conversation

@jlc488

@jlc488 jlc488 commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator

메인테이너가 이 repo를 건드리기 전에 알아야 할 두 가지가 여기 없었습니다: 릴리스를 어떻게 내는지, 그리고 뭐가 남았는지. 둘 다 사람 머릿속에만 있었고, 그래서 어제 3.2.0 사고가 났습니다.

런북이 맨 앞에 놓는 것

VERSION=3.2.0-SNAPSHOT"3.2.0 미출시" 로 읽었는데, 실제 뜻은 "3.2.0은 나갔고 3.3.0을 만드는 중" 이었습니다. 보안 수정 2건이 이미 Maven Central에 있는 번호 아래로 main에 올라갔습니다. 태그를 옮기지 않았기 때문에만 잘못 나간 게 없었습니다.

그래서 문서가 파일 대신 레지스트리에 물어보는 명령으로 시작합니다:

git ls-remote --tags origin 'refs/tags/v*' | tail -5
curl -s https://repo1.maven.org/maven2/.../maven-metadata.xml | grep -oE '<version>[^<]+</version>' | tail -5

그리고 복구가 의존했던 규칙을 명시합니다 — 출시된 버전은 불변이니 태그를 옮기지도, 그 버전의 changelog를 고치지도 말고, 섹션을 태그에서 복원하고 새 버전을 열 것.

그다음 릴리스 6표면, 그리고 devslab-examples에서 동작 변경은 버전 범프만으로 부족할 수 있다는 메모 — 3.3.0의 Redirect.NEVER 요구 때문에 jdkhttp 데모는 컴파일은 되는데 주석이 거짓이 됐던 실제 사례입니다.

로드맵은 "이제 뭐 하지"에 답합니다

오늘 기준 항목은 하나 — OkHttp 리다이렉트 홉 — 인데, 작업 목록이 아니라 근거와 함께 적었습니다. 다음 사람이 제 실수를 반복하지 않도록:

network interceptor는 이음매처럼 보이지만 아닙니다. OkHttp는 연결이 맺어진 뒤에 호출합니다. 그 수정은 리뷰를 통과했을 것이고 틀렸을 것입니다.

그리고 잔여 위험이 좁다는 것(Dns 계층이 홉마다 호스트·사설 IP는 여전히 검사)도 함께 적어서, 급한 일로 오해되지 않게 했습니다.

상시 관행

두 문서 다 정합성 포인터를 답니다 — 여기서 코어 로직이 바뀌면 자매의 체크리스트를 훑고, 소스가 아니라 동작을 대조할 것. 두 구현을 나란히 읽는 건 애초에 3.1.1 우회가 양쪽에서 동시에 리뷰를 통과한 방식입니다.

형태

양어(.md + .ko.md), mkdocs nav 등록, 양쪽 README에서 링크.

검증

./gradlew build BUILD SUCCESSFUL, 239 tests, failures=0.

Two things a maintainer needs before touching this repo did not exist
here: how to cut a release, and what is left to do. Both lived only in
people's heads, which is how the 3.2.0 mistake happened on 2026-08-09 —
`VERSION=3.2.0-SNAPSHOT` was read as "3.2.0 is unreleased", when it means
"3.2.0 shipped and 3.3.0 is being built". Two security fixes went onto
main under a number already on Maven Central. Nothing shipped wrongly
only because the tag was never moved.

docs/releasing.md opens with that trap, and with the commands that answer
it from the registry instead of the file. It also states the rule the
recovery depended on: a published version is immutable, so do not move
the tag and do not edit its changelog section — restore the section from
the tag and open a new version. Then the six release surfaces, with the
note that a BEHAVIOUR change can need more than a version bump in
devslab-examples: 3.3.0's Redirect.NEVER requirement left the jdkhttp
demo compiling but its comment false.

docs/roadmap.md answers "what now". Today that is one item — OkHttp
redirect hops — written up with the reasoning rather than as a task, so
the next attempt does not repeat mine: a network interceptor looks like
the seam and is not one, because OkHttp invokes it AFTER the connection
is established. That fix would have passed review and been wrong.

Both carry a Standing practice / parity pointer: walk the sibling's
parity checklist whenever core logic changes here, and compare behaviour
rather than source — reading the two implementations side by side is how
the 3.1.1 bypass survived review in both libraries at once.

Bilingual, in the mkdocs nav, and linked from both READMEs.

Verified: ./gradlew build BUILD SUCCESSFUL, 239 tests, failures=0.
@jlc488
jlc488 merged commit 79a6a41 into main Aug 9, 2026
1 check passed
@jlc488
jlc488 deleted the docs/releasing-and-roadmap branch August 9, 2026 09:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant