Skip to content

fix(ci): use latest stable tools and preserve the release lockfile - #883

Merged
owjs3901 merged 1 commit into
mainfrom
fix/ci-stable-node
Oct 31, 2026
Merged

owjs3901 merged 1 commit into
mainfrom
fix/ci-stable-node

Conversation

@owjs3901

@owjs3901 owjs3901 commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

Refs #683 (테스트/CI). main 33e1e1d15 기반의 독립 PR이며, 공통 CI와 릴리스 검증을 복구합니다.

요약

  • actions/setup-node@v7의 latest가 안정판이 아닌 Node 27.0.0-alpha.0.0.0을 선택해 Storybook이 실패하던 경로를 수정합니다. 9개 설정 모두 node-version: '*'와 check-latest: true로 안정판 매니페스트의 최신 버전을 선택합니다.
  • jetli/wasm-pack-action@v0.4.0이 GitHub API 응답에 tag_name이 없으면 latest 요청을 조용히 v0.9.1로 바꾸던 경로를 제거합니다. 모든 9개 작업이 버전 고정 없는 cargo-binstall 설치와 crates.io 최신 안정판 일치 검사를 공유합니다.
  • 릴리스 작업에서만 bun install --frozen-lockfile을 사용해, workspace 버전만 올린 Update Versions PR 뒤에 설치기가 bun.lock을 다시 써서 깨끗한 배포 체크아웃 검사를 실패시키지 않게 합니다. 실제 외부 의존성 변경에 따른 잠금 파일 불일치는 계속 거부합니다.
  • 패키지 코드, 의존성, 잠금 파일, WASM 크기 예산, 기존 잠금 빌드 명령은 바꾸지 않습니다. 배포 내용이 없는 workflow-only 변경이므로 changepack은 없습니다.

동작

Node의 latest/current/node는 dist 인덱스의 prerelease를 선택할 수 있습니다. setup-node v7 구현의 매니페스트 우선 경로를 사용하며, 조사 당시 최신 안정판은 26.13.0입니다. 실제 실패 로그에서 alpha 설치와 Storybook의 거부를 확인했습니다. 관련 upstream 이슈는 actions/setup-node#1657입니다.

WASM 실패의 원인은 최신 wasm-pack 0.15.1이 --locked를 거부하는 것이 아니었습니다. 기존 설치기 소스는 인증 없는 releases/latest 응답에 버전이 없으면 v0.9.1을 선택하며, 실패 작업 로그에 실제로 Installing wasm-pack v0.9.1이 남아 있습니다. 공식 0.15.1 바이너리에서는 기존 --locked 명령이 정상 빌드되므로 그 명령과 기록 문자열을 그대로 유지합니다.

새 설치기는 cargo-binstall의 crates.io 안정판 해석을 사용합니다. GitHub 다운로드에는 작업 토큰을 전달하고, 설치 후 wasm-pack --version을 crates.io의 max_stable_version과 정확히 비교합니다. API 실패, 잘못된 응답, 오래된 실행 파일은 성공으로 처리하지 않습니다. 별도 단계에서 실행되는 tarpaulin/bindgen 다운로드에도 토큰을 전달합니다.

릴리스 단계의 기존 Verify clean publish checkout 검사는 그대로 유지합니다. 버전 변경만 있는 workspace에서 일반 설치가 잠금 파일의 workspace 버전을 다시 쓰는 문제를 설치 시점에 방지하며, 다른 작업의 설치 방식은 바꾸지 않습니다.

고정된 Node major/LTS, wasm-pack 버전, 이전 도구로의 대체 경로는 없습니다. 최신 cargo-binstall과 최신 안정판 wasm-pack을 매 실행 시 다시 선택하고, 최신판이 실제로 설치됐는지 확인합니다.

새로 생기는 오류

라이브러리의 사용자 빌드 오류/API 변경은 없습니다. CI에서는 설치 실패, crates.io 조회 실패·잘못된 응답, 설치 버전과 최신 안정판의 불일치를 빌드 전에 실패로 처리합니다.

남는 한계

actions/node-versions 매니페스트는 새 안정판 공개 직후 nodejs.org보다 잠시 늦을 수 있으므로, 짧은 동안 직전 안정판이 선택될 수 있습니다.

레지스트리 인덱스와 API가 신규 릴리스를 서로 다른 시점에 반영하거나 외부 서비스가 실패하면 이전 버전으로 우회하지 않고 작업이 실패합니다. 기존 WASM 크기 비교와 예산은 그대로 유지합니다.

검증

  • 최신 actionlint 1.7.12: 진단 없이 통과했습니다. YAML alias를 전개해 Node 설정 9개와 설치/검사 단계 9개를 모두 검사했습니다.
  • 최신 cargo-binstall 1.26.1로 사설 경로에 실제 설치: wasm-pack 0.15.1, crates.io 최신 안정판 0.15.1과 일치했습니다.
  • workflow에서 추출한 동일 Bash 검사: 정상 버전 exit 0, 오래된 0.9.1 exit 1, 조회 실패·최신판 필드 누락·잘못된 JSON은 모두 실패했습니다.
  • crates.io는 일반 curl User-Agent 요청을 403으로 거절하고 프로젝트/연락처를 명시한 요청은 200을 반환하는 것을 확인해, 검사 요청에 해당 User-Agent를 명시했습니다.
  • 공식 최신 wasm-pack으로 기존 잠금 명령 빌드 및 루트 패키지 빌드가 통과했습니다. Cargo.lock은 변경되지 않았고, 오래된 잠금 파일은 기존 cargo metadata --locked 사전 검사에서 exit 101로 거부됐습니다.
  • 최신 Bun 1.4.4의 작은 workspace 재현: 버전만 1.0.0 → 1.0.1로 올리면 일반 설치는 잠금 파일을 다시 쓰고, frozen 설치는 exit 0으로 기존 파일을 보존합니다. 실제 tarball의 workspace 의존성은 올바른 ^1.0.1이며, 새 외부 의존성 변경은 frozen에서 exit 1, 일반 설치에서는 exit 0입니다.
  • 새 main 33e1e1d15에서 의존성 설치와 루트 패키지 재빌드가 통과했습니다.
  • 승인된 정상 커밋 훅 1회 통과: bun lint, Rust 테스트/커버리지, Bun 루트 6762 pass / 0 fail, Vite 870 pass / 0 fail; 두 Bun 커버리지의 함수/라인은 모두 100.00%입니다. 테스트한 index tree와 커밋 tree가 일치하며 체크아웃도 깨끗합니다.
  • 로컬 Windows tarpaulin 관측값은 97.79% (31832/32553)이며 종료 코드는 0입니다. 이를 로컬 Rust 100%라고 표현하지 않습니다. Linux CI에서는 필수 --fail-under 100을 통과했고 실제 Rust 커버리지는 **100% (22268/22268 lines covered)**입니다. Linux의 두 Bun 커버리지도 함수/라인 모두 100.00%입니다.

PR CI 최종 결과

실행 41049931485는 첫 시도에 success, 재실행 없이 실행 대상 8개 작업이 모두 통과했습니다. 각 작업 로그에서 node: v26.13.0과 Installed wasm-pack 0.15.1; crates.io latest stable: 0.15.1을 확인했습니다.

작업 Node 실측 wasm-pack / crates.io 최신 안정판 결과
publish v26.13.0 0.15.1 / 0.15.1 통과, Linux Rust/Bun 커버리지 100%
landing-next-e2e v26.13.0 0.15.1 / 0.15.1 통과
react-18 v26.13.0 0.15.1 / 0.15.1 통과
vinext-rsc-css-e2e v26.13.0 0.15.1 / 0.15.1 통과
webpack-extends-theme v26.13.0 0.15.1 / 0.15.1 통과
release-compat v26.13.0 0.15.1 / 0.15.1 통과, finding 0, prerender 생략 없음
benchmark v26.13.0 0.15.1 / 0.15.1 no regression beyond the measured noise
wasm-size v26.13.0 0.15.1 / 0.15.1 실제 빌드와 비교 완료, PASS

WASM 비교는 PR 테스트 merge 03a71805와 실제 첫 부모 3485d1f4를 빌드했으며, merge의 다른 부모가 이 PR head 47fdfbecf인 것도 확인했습니다. wasm raw 6,647,333 B, wasm gzip 2,397,077 B, glue raw 43,765 B, glue gzip 7,343 B로 base/candidate가 모두 같아 네 지표의 증가량은 **0 B / 0%**입니다. 도구 실패나 비교 생략이 아닙니다.

release와 deploy-pages는 기존 main-push 전용 조건 때문에 PR에서만 정상적으로 생략됐습니다. 아홉 번째 Node/설치 설정은 release 작업에 있으며, frozen 설치의 동작은 위 Bun 재현으로 검증했습니다.

Refs #683

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
@codecov

codecov Bot commented Oct 30, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
see 34 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@owjs3901
owjs3901 merged commit 7af8166 into main Oct 31, 2026
11 checks passed
@owjs3901
owjs3901 deleted the fix/ci-stable-node branch October 31, 2026 17:58
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