From 013fd6dc8890f7624dbbeabbd1cf09f52aa3bdcb Mon Sep 17 00:00:00 2001 From: htlee Date: Fri, 6 Mar 2026 14:21:04 +0900 Subject: [PATCH] =?UTF-8?q?chore:=20content=5Fhashes=20=EA=B0=B1=EC=8B=A0?= =?UTF-8?q?=20+=20update-hash.sh=20bash3=20=ED=98=B8=ED=99=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 3개 타입별 SHA256 해시 계산 완료 - declare -A → 파일 기반 방식으로 bash3(macOS) 호환 수정 - sha256sum 폴백 추가 (Linux 서버 호환) --- update-hash.sh | 67 +++++++++++++++++++++++++++---------------- workflow-version.json | 6 ++-- 2 files changed, 45 insertions(+), 28 deletions(-) diff --git a/update-hash.sh b/update-hash.sh index 8dcf8a5..01d0492 100644 --- a/update-hash.sh +++ b/update-hash.sh @@ -9,10 +9,20 @@ # 사용법: # cd template-common && bash update-hash.sh # -# 의존성: curl, python3, shasum +# 의존성: curl, python3, shasum (macOS) 또는 sha256sum (Linux) #============================================================================== set -e +# shasum 호환 (macOS: shasum, Linux: sha256sum) +if command -v shasum &>/dev/null; then + SHA_CMD="shasum -a 256" +elif command -v sha256sum &>/dev/null; then + SHA_CMD="sha256sum" +else + echo "ERROR: shasum 또는 sha256sum이 필요합니다." + exit 1 +fi + # Gitea URL 읽기 GITEA_URL=$(python3 -c "import json; print(json.load(open('workflow-version.json')).get('gitea_url', 'https://gitea.gc-si.dev'))" 2>/dev/null) if [ -z "$GITEA_URL" ]; then @@ -20,12 +30,12 @@ if [ -z "$GITEA_URL" ]; then exit 1 fi -TYPES=("java-maven" "java-gradle" "react-ts") -TYPE_SPECIFIC_FILES=(".claude/rules/code-style.md" ".claude/rules/naming.md" ".claude/rules/testing.md" ".githooks/pre-commit") +TYPES="java-maven java-gradle react-ts" +TYPE_SPECIFIC_FILES=".claude/rules/code-style.md .claude/rules/naming.md .claude/rules/testing.md .githooks/pre-commit" # 임시 디렉토리 -TMPDIR=$(mktemp -d) -trap "rm -rf $TMPDIR" EXIT +WORK_TMPDIR=$(mktemp -d) +trap "rm -rf $WORK_TMPDIR" EXIT echo "=== 팀 워크플로우 해시 갱신 ===" echo "Gitea URL: $GITEA_URL" @@ -35,33 +45,35 @@ echo "" MANAGED_DIRS=".claude/rules .claude/agents .claude/scripts .githooks" MANAGED_SKILLS=".claude/skills/push .claude/skills/mr .claude/skills/create-mr .claude/skills/release .claude/skills/version .claude/skills/fix-issue" -mkdir -p "$TMPDIR/common" +mkdir -p "$WORK_TMPDIR/common" for dir in $MANAGED_DIRS $MANAGED_SKILLS; do if [ -d "$dir" ]; then - mkdir -p "$TMPDIR/common/$dir" - find "$dir" -type f -exec sh -c 'cp "$1" "'"$TMPDIR/common"'/$1"' _ {} \; + mkdir -p "$WORK_TMPDIR/common/$dir" + find "$dir" -type f -exec sh -c 'cp "$1" "'"$WORK_TMPDIR/common"'/$1"' _ {} \; fi done -COMMON_COUNT=$(cd "$TMPDIR/common" && find . -type f | wc -l | tr -d ' ') +COMMON_COUNT=$(cd "$WORK_TMPDIR/common" && find . -type f | wc -l | tr -d ' ') echo "Common 파일: ${COMMON_COUNT}개" -# 2. 각 타입별 해시 계산 -declare -A HASHES +# 2. 각 타입별 해시 계산 → 파일로 저장 +HASH_FILE="$WORK_TMPDIR/hashes.json" +echo "{" > "$HASH_FILE" -for TYPE in "${TYPES[@]}"; do +FIRST=true +for TYPE in $TYPES; do echo "" echo "--- $TYPE ---" # common 파일 복사 - rm -rf "$TMPDIR/combined" - cp -r "$TMPDIR/common" "$TMPDIR/combined" + rm -rf "$WORK_TMPDIR/combined" + cp -r "$WORK_TMPDIR/common" "$WORK_TMPDIR/combined" # 타입별 파일 다운로드 TYPE_COUNT=0 - for FILE in "${TYPE_SPECIFIC_FILES[@]}"; do + for FILE in $TYPE_SPECIFIC_FILES; do URL="${GITEA_URL}/gc/template-${TYPE}/raw/branch/develop/${FILE}" - TARGET="$TMPDIR/combined/$FILE" + TARGET="$WORK_TMPDIR/combined/$FILE" mkdir -p "$(dirname "$TARGET")" if curl -sf --max-time 10 "$URL" -o "$TARGET" 2>/dev/null; then @@ -73,29 +85,34 @@ for TYPE in "${TYPES[@]}"; do done # 해시 계산 (find | sort | xargs cat | shasum — 로컬 계산과 동일한 방식) - HASH=$(cd "$TMPDIR/combined" && find .claude/rules .claude/agents .claude/scripts .githooks \ + HASH=$(cd "$WORK_TMPDIR/combined" && find .claude/rules .claude/agents .claude/scripts .githooks \ .claude/skills/push .claude/skills/mr .claude/skills/create-mr \ .claude/skills/release .claude/skills/version .claude/skills/fix-issue \ - -type f 2>/dev/null | sort | xargs cat 2>/dev/null | shasum -a 256 | cut -d' ' -f1) + -type f 2>/dev/null | sort | xargs cat 2>/dev/null | $SHA_CMD | cut -d' ' -f1) + + if [ "$FIRST" = true ]; then + FIRST=false + else + echo "," >> "$HASH_FILE" + fi + printf ' "%s": "%s"' "$TYPE" "$HASH" >> "$HASH_FILE" - HASHES[$TYPE]=$HASH echo " 타입별 파일: ${TYPE_COUNT}개 추가" echo " 해시: $HASH" done +echo "" >> "$HASH_FILE" +echo "}" >> "$HASH_FILE" + # 3. workflow-version.json 갱신 echo "" echo "=== workflow-version.json 갱신 ===" -# Python으로 직접 갱신 (bash 변수 전달) python3 -c " import json -hashes = { -$(for TYPE in "${TYPES[@]}"; do - echo " '${TYPE}': '${HASHES[$TYPE]}'," -done) -} +with open('$HASH_FILE', 'r') as f: + hashes = json.load(f) with open('workflow-version.json', 'r') as f: data = json.load(f) diff --git a/workflow-version.json b/workflow-version.json index d2baa10..863448e 100644 --- a/workflow-version.json +++ b/workflow-version.json @@ -4,9 +4,9 @@ "gitea_url": "https://gitea.gc-si.dev", "nexus_url": "https://nexus.gc-si.dev", "content_hashes": { - "java-maven": "", - "java-gradle": "", - "react-ts": "" + "java-maven": "1456f972fb250ba60fa6331d5fad81155c9992bf80947867e34a7178293513db", + "java-gradle": "0f7afc70942888cd2f98e01ef2eef0fcb815c0a68704d27b970a528081710d22", + "react-ts": "2a3a5b6ce9e2c6080c79b78be92c4967ed2418c3efff6082038b3f270c3b7e18" }, "changes": [ { -- 2.45.2