From fb8833b66e9630abbaac5b4159dced9cac1b51cb Mon Sep 17 00:00:00 2001 From: kjh2064 Date: Sat, 13 Jun 2026 22:12:48 +0900 Subject: [PATCH 1/2] =?UTF-8?q?ci:=20node=5Fmodules=20=EC=98=81=EA=B5=AC?= =?UTF-8?q?=20=EC=BA=90=EC=8B=9C=20=EC=B6=94=EA=B0=80=20(package-lock.json?= =?UTF-8?q?=20=ED=95=B4=EC=8B=9C=20=EA=B8=B0=EB=B0=98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 매 CI 실행마다 npm install 5분 소요 문제 해결: - /volume1/gitea/node_cache//node_modules 에 캐시 저장 - 캐시 히트 시 symlink로 즉시 연결 (~1초) - package-lock.json 변경 시에만 재설치 - 오래된 캐시 자동 정리 (최근 3개 유지) Co-Authored-By: Claude Sonnet 4.6 --- .gitea/workflows/ci.yml | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index f9a0792..bbe4c3e 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -64,7 +64,28 @@ jobs: echo "$VENV/bin" >> $GITHUB_PATH - name: Install Node Dependencies - run: npm install --quiet + run: | + # package-lock.json 해시로 캐시 유효성 판단 + CACHE_BASE=/volume1/gitea/node_cache + LOCK_HASH=$(md5sum package-lock.json 2>/dev/null | cut -d' ' -f1 || echo "no-lock") + CACHE_DIR="$CACHE_BASE/$LOCK_HASH" + + if [ -d "$CACHE_DIR/node_modules" ]; then + echo "=== node_modules 캐시 히트: $LOCK_HASH ===" + # 캐시에서 심볼릭 링크로 연결 (복사 대신 즉시) + rm -rf node_modules + ln -s "$CACHE_DIR/node_modules" node_modules + else + echo "=== npm install (최초 or lock 변경) ===" + npm install --quiet + # 캐시 저장 + mkdir -p "$CACHE_DIR" + cp -r node_modules "$CACHE_DIR/node_modules" + echo "캐시 저장 완료: $CACHE_DIR" + # 오래된 캐시 정리 (최근 3개만 유지) + ls -dt "$CACHE_BASE"/*/ 2>/dev/null | tail -n +4 | xargs rm -rf 2>/dev/null || true + fi + node --version && npm --version - name: Validate Specs run: python3 tools/validate_specs.py From 4aa8f542791a2216039534d8a0ab1cfded7dd66a Mon Sep 17 00:00:00 2001 From: kjh2064 Date: Sat, 13 Jun 2026 22:24:16 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20build=5Fyaml=5Fcode=5Fcoverage=5Fv1?= =?UTF-8?q?=20Temp=20=EB=94=94=EB=A0=89=ED=86=A0=EB=A6=AC=20=EC=97=86?= =?UTF-8?q?=EC=9D=84=20=EB=95=8C=20FileNotFoundError=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI checkout에 Temp/ 디렉토리가 없어서 json 출력 실패. write_text 전에 mkdir(parents=True) 추가. Co-Authored-By: Claude Sonnet 4.6 --- tools/build_yaml_code_coverage_v1.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/build_yaml_code_coverage_v1.py b/tools/build_yaml_code_coverage_v1.py index 9041f50..bffcb29 100644 --- a/tools/build_yaml_code_coverage_v1.py +++ b/tools/build_yaml_code_coverage_v1.py @@ -161,6 +161,7 @@ def main() -> int: "rows": rows, } + out_path.parent.mkdir(parents=True, exist_ok=True) out_path.write_text(json.dumps(result, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") print( f"[YAML_TO_CODE_COVERAGE_V1] total={len(all_spec_ids)} "