데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      Git 커밋 로그로 주간 업무 정리 자동화하기 — Obsidian + Confluence + Claude Code

      꼬마집사 26.05.22
      4,011 7 8
      DEVOTEE 요약
      본 블로그는 매주 Git 커밋 로그를 수동으로 정리하는 비효율을 해결하고자, 14개 저장소의 커밋을 자동 수집하여 Obsidian 노트로 만들고 Confluence에 발행하는 파이프라인 구축 과정을 소개합니다. 이 시스템은 Git 로그를 원본 데이터로 사용해 프로젝트별로 분류하고, Obsidian 마크다운 형식으로 정리하며, Python 스크립트와 Confluence REST API를 통해 웹 페이지로 변환하여 'upsert' 방식으로 안전하게 발행합니다. 결과적으로 매주 50분 걸리던 작업이 5분으로 단축되어 월 3시간의 시간을 절약하며, 커밋 메시지의 중요성과 점진적 자동화의 효용성을 보여줍니다.
      DEVOTEE 추천 블로그

      들어가며

      매주 금요일, 이번 주에 뭘 했는지 정리하는 시간이 찾아옵니다.

      여러 저장소를 돌아다니며 커밋 로그를 뒤지고, 그걸 문서로 정리하고, 다시 Confluence에 옮기는 작업. 매번 30분~1시간이 소요됩니다.

      "Git에 이미 다 기록되어 있는데, 왜 손으로 다시 정리해야 하지?"


      이 질문에서 시작해 14개 저장소의 커밋 로그를 자동 수집 → Obsidian 노트 생성 → Confluence 발행까지 이어지는 파이프라인을 구축했습니다.

      이 글에서는 그 전체 과정을 공유합니다.


      예상 소요 시간: 30분

      난이도: 중급 (Python 기초, Git 사용 경험 필요)


      전체 아키텍처

      image.png

      [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 (매주 목요일 자동 실행)
      [완전 자동화]

      핵심은 세 가지입니다:

      1. Git 로그가 원본 데이터 — 별도 입력 없이 커밋 메시지에서 작업 내역을 추출합니다

      2. Obsidian이 로컬 허브 — 마크다운 노트로 먼저 저장하고, 필요할 때 외부로 발행합니다

      3. upsert 패턴 — 같은 제목의 페이지가 있으면 갱신, 없으면 생성합니다


      1단계: Git 로그 수집 전략

      image.png

      날짜 범위로 커밋 필터링

      # 이번 주(월~일) 커밋만 추출
      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개 저장소를 병렬로 조회하고, 커밋 메시지를 프로젝트별·날짜별로 자동 분류해줍니다.

      수동으로 할 때와 비교하면 시간이 크게 단축됩니다.


      2단계: Obsidian 주간 노트 설계

      image.png

      노트 구조

      일관된 형식을 유지하면 나중에 검색하거나 비교하기 쉽습니다. 실제 사용 중인 템플릿입니다.

      ---
      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 (> [!summary])

      섹션 요약을 시각적으로 강조

      한 주 회고

      커밋 나열이 아닌 의미 부여

      파일 네이밍

      주간 작업 정리/
      ├── 2026-W19 (05.04~05.10).md
      ├── 2026-W20 (05.11~05.17).md
      └── 2026-W21 (05.18~05.24).md

      W{주차} (시작일~종료일) 형식으로 정렬과 검색 모두 편리합니다.


      3단계: Confluence 발행 스크립트

      Obsidian 노트를 Confluence 페이지로 변환하는 Python 스크립트를 작성합니다.

      image.png

      핵심 과제: Obsidian 마크다운 → Confluence HTML

      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가 빨간색
      }

      callout 변환 로직

      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)

      upsert 패턴으로 안전한 발행

      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


      4단계: crontab으로 매주 자동 실행

      마지막 단계입니다. 매주 목요일에 자동으로 전체 파이프라인이 실행되도록 합니다.

      image.png

      래퍼 스크립트 작성

      #!/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

      crontab 등록

      # 매주 목요일 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을 허용해야 합니다.


      실제 결과물

      image.png

      Obsidian에서 본 모습

      17주치(W02~W21) 주간 노트가 일관된 형식으로 쌓여 있습니다.

      주간 작업 정리/
      ├── 2026-W02 (01.05~01.11).md
      ├── ...
      ├── 2026-W20 (05.11~05.17).md
      └── 2026-W21 (05.18~05.24).md   ← 최신

      Confluence에서 본 모습

      부모 페이지 아래에 주차별 하위 페이지가 자동 생성됩니다. callout은 info/tip/warning 매크로로 깔끔하게 변환됩니다.

      투입 시간 비교

      항목

      수동

      자동화 후

      커밋 로그 수집

      15분

      0분 (자동)

      노트 작성

      20분

      0분 (자동)

      Confluence 발행

      10분

      0분 (자동)

      검토/수정

      5분

      5분

      합계

      50분/주

      5분/주

      주당 45분, 월 3시간을 절약합니다.


      핵심 포인트 정리

      1. Git 커밋 메시지가 곧 업무 일지 — 커밋 메시지를 의미 있게 작성하는 습관이 자동화의 전제 조건입니다

      2. Obsidian을 로컬 허브로 — 마크다운 파일로 먼저 저장하면 Confluence 외 다른 플랫폼으로도 발행할 수 있습니다

      3. upsert 패턴 — 멱등성을 보장하여 중복 실행에도 안전합니다

      4. 점진적 구축 — 처음부터 완벽한 자동화를 목표로 하지 않았습니다. 수동 → 반자동 → 완전 자동 순서로 발전시켰습니다


      마무리

      "매주 반복하는 일은 자동화할 수 있다"는 당연한 원칙이지만, 실제로 실행하면 생각보다 큰 차이를 만듭니다.

      특히 여러 저장소에 걸쳐 작업하는 환경에서는 커밋 로그 수집만 자동화해도 체감 효과가 큽니다.

      이 글에서 소개한 구조는 저장소 목록이나 노트 형식을 팀 상황에 맞게 바꿔서 활용할 수 있습니다.

      핵심은 Git이 이미 기록하고 있는 데이터를 재활용한다는 점입니다.


      질문이나 개선 아이디어가 있다면 댓글로 남겨주세요.


      참고) 실제 주간 업무 정리 결과 화면

      image.png

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      꼬마집사 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기