23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
매주 금요일, 이번 주에 뭘 했는지 정리하는 시간이 찾아옵니다.
여러 저장소를 돌아다니며 커밋 로그를 뒤지고, 그걸 문서로 정리하고, 다시 Confluence에 옮기는 작업. 매번 30분~1시간이 소요됩니다.
"Git에 이미 다 기록되어 있는데, 왜 손으로 다시 정리해야 하지?"
이 질문에서 시작해 14개 저장소의 커밋 로그를 자동 수집 → Obsidian 노트 생성 → Confluence 발행까지 이어지는 파이프라인을 구축했습니다.
이 글에서는 그 전체 과정을 공유합니다.
예상 소요 시간: 30분
난이도: 중급 (Python 기초, Git 사용 경험 필요)
[14개 Git 저장소]
│
▼ git log --after/--before
[Claude Code] ← 커밋 수집 + 프로젝트별 분류 + 요약
│
▼ Obsidian Flavored Markdown 생성
[Obsidian Vault]
주간 작업 정리/2026-W21 (05.18~05.24).md
│
▼ publish_weekly.py (MD → HTML 변환)
[Confluence]
REST API (PAT 인증) → 부모 페이지 하위에 생성/갱신
│
▼ crontab (매주 목요일 자동 실행)
[완전 자동화]핵심은 세 가지입니다:
Git 로그가 원본 데이터 — 별도 입력 없이 커밋 메시지에서 작업 내역을 추출합니다
Obsidian이 로컬 허브 — 마크다운 노트로 먼저 저장하고, 필요할 때 외부로 발행합니다
upsert 패턴 — 같은 제목의 페이지가 있으면 갱신, 없으면 생성합니다
# 이번 주(월~일) 커밋만 추출
git log --format="%ad %s" \
--date=format:"%m/%d(%a)" \
--after="2026-05-17" \
--before="2026-05-25" \
--all--all 플래그로 모든 브랜치의 커밋을 포함합니다. --format으로 날짜와 메시지만 깔끔하게 뽑습니다.
# 14개 저장소를 병렬로 조회하는 패턴
for repo in admin ax axms devocean; do
echo "=== $repo ==="
cd /path/to/gitlab/$repo
git log --format="%ad %s" \
--date=format:"%m/%d(%a)" \
--after="2026-05-17" \
--before="2026-05-25" \
--all 2>/dev/null
done팁: Claude Code를 사용하면 14개 저장소를 병렬로 조회하고, 커밋 메시지를 프로젝트별·날짜별로 자동 분류해줍니다.
수동으로 할 때와 비교하면 시간이 크게 단축됩니다.
일관된 형식을 유지하면 나중에 검색하거나 비교하기 쉽습니다. 실제 사용 중인 템플릿입니다.
---
tags:
- weekly-log
- 2026
period: 2026-05-18 ~ 2026-05-24
projects:
- 1on1 코칭
---
# 2026-W21 주간 작업 정리
## 1on1 코칭
> [!summary] AX 4.5 모델 전환 + AI Edit 모달 전면 개편 (5/18~5/19)
### 5/18 (월) — AX 4.5 전환 + 코칭 가이드 재생성
- **AX 4.5 모델 전환**
- 서버 기본 모델 AX 4.5 적용 + manager_id 백필
- 게이트웨이 700 오류 대응 + 캐싱 안정화
- **코칭 기능**: 챗봇 반영 버튼이 LLM에 가이드 재생성 요청
---
## 한 주 회고
> [!note] 핵심 성과
> - 프로젝트별 1줄 요약요소 | 이유 |
|---|---|
frontmatter의 projects | Obsidian Dataview로 프로젝트별 필터링 가능 |
날짜별 섹션 | 시간순 맥락 파악 용이 |
callout ( | 섹션 요약을 시각적으로 강조 |
한 주 회고 | 커밋 나열이 아닌 의미 부여 |
주간 작업 정리/
├── 2026-W19 (05.04~05.10).md
├── 2026-W20 (05.11~05.17).md
└── 2026-W21 (05.18~05.24).mdW{주차} (시작일~종료일) 형식으로 정렬과 검색 모두 편리합니다.
Obsidian 노트를 Confluence 페이지로 변환하는 Python 스크립트를 작성합니다.
Confluence는 자체 storage format을 사용합니다. 일반 HTML은 물론, Obsidian 고유 문법(callout, wikilink 등)도 변환해야 합니다.
# Obsidian callout → Confluence macro 매핑
CALLOUT_MAP = {
"note": "info",
"summary": "info",
"tip": "tip",
"warning": "warning",
"danger": "note", # Confluence의 'note' macro가 빨간색
}Obsidian의 > [!type] Title 문법을 Confluence의 <ac:structured-macro>로 변환합니다.
def convert_callouts(md_text: str) -> str:
"""Obsidian callout → Confluence structured-macro 변환."""
lines = md_text.split("\n")
result = []
i = 0
while i < len(lines):
m = re.match(r"^>\s*\[!(\w+)\][-+]?\s*(.*)?$", lines[i])
if m:
callout_type = m.group(1).lower()
title = (m.group(2) or "").strip()
macro = CALLOUT_MAP.get(callout_type, "info")
# callout 본문 수집
body_lines = []
i += 1
while i < len(lines) and lines[i].startswith(">"):
body_lines.append(re.sub(r"^>\s?", "", lines[i]))
i += 1
body_html = markdown.markdown("\n".join(body_lines))
# Confluence macro 생성
title_param = ""
if title:
title_param = f'<ac:parameter ac:name="title">{title}</ac:parameter>'
result.append(
f'<ac:structured-macro ac:name="{macro}">'
f"{title_param}"
f"<ac:rich-text-body>{body_html}</ac:rich-text-body>"
f"</ac:structured-macro>"
)
else:
result.append(lines[i])
i += 1
return "\n".join(result)def upsert_page(self, space_key, title, body_html, parent_id=None):
"""같은 제목이 있으면 update, 없으면 create."""
existing = self.find_page(space_key, title)
if existing is None:
return self.create_page(space_key, title, body_html, parent_id)
version = existing["version"]["number"]
return self.update_page(existing["id"], title, body_html, version)이 패턴 덕분에 스크립트를 여러 번 실행해도 안전합니다. 내용이 바뀌면 버전만 올라갑니다.
cd /path/to/confluence-api-test
source .venv/bin/activate
# 특정 노트 발행
python publish_weekly.py "주간 작업 정리/2026-W21 (05.18~05.24).md"
# 인자 없으면 가장 최근 노트 자동 선택
python publish_weekly.py실행 결과:
[*] 대상: 2026-W21 (05.18~05.24).md
[*] 제목: 2026-W21 (05.18~05.24)
[*] Space: ~1112022, Parent: 1052335068
[OK] page_id=1052335239, version=1마지막 단계입니다. 매주 목요일에 자동으로 전체 파이프라인이 실행되도록 합니다.
#!/bin/bash
# ~/.claude/scripts/weekly-summary.sh
set -euo pipefail
LOG_DIR="$HOME/.claude/scripts/logs"
mkdir -p "$LOG_DIR"
LOG_FILE="$LOG_DIR/weekly-$(date +%Y%m%d-%H%M%S).log"
# Claude Code CLI를 비대화형으로 호출
claude -p "이번 주 주간 작업 정리를 작성하고 \
Obsidian과 Confluence에 발행해줘. \
저장소 목록: ... (생략)" \
--allowedTools "Bash,Read,Write,Edit,Glob,Grep" \
>> "$LOG_FILE" 2>&1# 매주 목요일 11:47에 실행
chmod +x ~/.claude/scripts/weekly-summary.sh
(crontab -l 2>/dev/null; echo "47 11 * * 4 ~/.claude/scripts/weekly-summary.sh") | crontab -
# 확인
crontab -l주의: macOS에서 crontab이 실행되려면 시스템 설정 > 개인정보 보호 > 전체 디스크 접근에서 cron을 허용해야 합니다.
17주치(W02~W21) 주간 노트가 일관된 형식으로 쌓여 있습니다.
주간 작업 정리/
├── 2026-W02 (01.05~01.11).md
├── ...
├── 2026-W20 (05.11~05.17).md
└── 2026-W21 (05.18~05.24).md ← 최신부모 페이지 아래에 주차별 하위 페이지가 자동 생성됩니다. callout은 info/tip/warning 매크로로 깔끔하게 변환됩니다.
항목 | 수동 | 자동화 후 |
|---|---|---|
커밋 로그 수집 | 15분 | 0분 (자동) |
노트 작성 | 20분 | 0분 (자동) |
Confluence 발행 | 10분 | 0분 (자동) |
검토/수정 | 5분 | 5분 |
합계 | 50분/주 | 5분/주 |
주당 45분, 월 3시간을 절약합니다.
Git 커밋 메시지가 곧 업무 일지 — 커밋 메시지를 의미 있게 작성하는 습관이 자동화의 전제 조건입니다
Obsidian을 로컬 허브로 — 마크다운 파일로 먼저 저장하면 Confluence 외 다른 플랫폼으로도 발행할 수 있습니다
upsert 패턴 — 멱등성을 보장하여 중복 실행에도 안전합니다
점진적 구축 — 처음부터 완벽한 자동화를 목표로 하지 않았습니다. 수동 → 반자동 → 완전 자동 순서로 발전시켰습니다
"매주 반복하는 일은 자동화할 수 있다"는 당연한 원칙이지만, 실제로 실행하면 생각보다 큰 차이를 만듭니다.
특히 여러 저장소에 걸쳐 작업하는 환경에서는 커밋 로그 수집만 자동화해도 체감 효과가 큽니다.
이 글에서 소개한 구조는 저장소 목록이나 노트 형식을 팀 상황에 맞게 바꿔서 활용할 수 있습니다.
핵심은 Git이 이미 기록하고 있는 데이터를 재활용한다는 점입니다.
질문이나 개선 아이디어가 있다면 댓글로 남겨주세요.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.