- push/mr/release: SHA256 해시 체크 Step 0.5 추가 - sync-team-workflow: 전면 재작성 (항상 서버 기준 동기화) - init-project: 마지막에 sync 자동 호출 + .gitignore 팀 관리 경로 - .claude/scripts/ 파일 template-common에 분리 저장 - update-hash.sh: 관리자용 해시 갱신 스크립트 - workflow-version.json: v1.6.0 + content_hashes 필드
116 lines
3.5 KiB
Bash
116 lines
3.5 KiB
Bash
#!/bin/bash
|
|
#==============================================================================
|
|
# update-hash.sh — 팀 워크플로우 content_hashes 갱신 스크립트
|
|
#
|
|
# template-common 리포 루트에서 실행한다.
|
|
# common 파일 + 각 타입별 파일을 결합하여 SHA256 해시를 계산하고
|
|
# workflow-version.json의 content_hashes 필드를 갱신한다.
|
|
#
|
|
# 사용법:
|
|
# cd template-common && bash update-hash.sh
|
|
#
|
|
# 의존성: curl, python3, shasum
|
|
#==============================================================================
|
|
set -e
|
|
|
|
# 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
|
|
echo "ERROR: workflow-version.json에서 gitea_url을 읽을 수 없습니다."
|
|
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")
|
|
|
|
# 임시 디렉토리
|
|
TMPDIR=$(mktemp -d)
|
|
trap "rm -rf $TMPDIR" EXIT
|
|
|
|
echo "=== 팀 워크플로우 해시 갱신 ==="
|
|
echo "Gitea URL: $GITEA_URL"
|
|
echo ""
|
|
|
|
# 1. common 관리 파일을 임시 디렉토리에 복사
|
|
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"
|
|
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"' _ {} \;
|
|
fi
|
|
done
|
|
|
|
COMMON_COUNT=$(cd "$TMPDIR/common" && find . -type f | wc -l | tr -d ' ')
|
|
echo "Common 파일: ${COMMON_COUNT}개"
|
|
|
|
# 2. 각 타입별 해시 계산
|
|
declare -A HASHES
|
|
|
|
for TYPE in "${TYPES[@]}"; do
|
|
echo ""
|
|
echo "--- $TYPE ---"
|
|
|
|
# common 파일 복사
|
|
rm -rf "$TMPDIR/combined"
|
|
cp -r "$TMPDIR/common" "$TMPDIR/combined"
|
|
|
|
# 타입별 파일 다운로드
|
|
TYPE_COUNT=0
|
|
for FILE in "${TYPE_SPECIFIC_FILES[@]}"; do
|
|
URL="${GITEA_URL}/gc/template-${TYPE}/raw/branch/develop/${FILE}"
|
|
TARGET="$TMPDIR/combined/$FILE"
|
|
mkdir -p "$(dirname "$TARGET")"
|
|
|
|
if curl -sf --max-time 10 "$URL" -o "$TARGET" 2>/dev/null; then
|
|
echo " ✓ $FILE"
|
|
TYPE_COUNT=$((TYPE_COUNT + 1))
|
|
else
|
|
echo " ✗ $FILE (다운로드 실패, 건너뜀)"
|
|
fi
|
|
done
|
|
|
|
# 해시 계산 (find | sort | xargs cat | shasum — 로컬 계산과 동일한 방식)
|
|
HASH=$(cd "$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)
|
|
|
|
HASHES[$TYPE]=$HASH
|
|
echo " 타입별 파일: ${TYPE_COUNT}개 추가"
|
|
echo " 해시: $HASH"
|
|
done
|
|
|
|
# 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('workflow-version.json', 'r') as f:
|
|
data = json.load(f)
|
|
|
|
data['content_hashes'] = hashes
|
|
|
|
with open('workflow-version.json', 'w') as f:
|
|
json.dump(data, f, indent=2, ensure_ascii=False)
|
|
f.write('\n')
|
|
|
|
print('content_hashes 갱신 완료:')
|
|
for t, h in hashes.items():
|
|
print(f' {t}: {h}')
|
|
"
|
|
|
|
echo ""
|
|
echo "✅ 완료. workflow-version.json을 커밋하세요."
|