콘텐츠로 이동

발행

글이 준비됐으면 Blogger에 올립니다. 발행 전에 두 게이트(AI-smell, AdSense)가 글을 한 번 더 거르고, 통과한 글만 업로드됩니다. 실제로 올리기 전에 dry-run으로 먼저 확인하는 편이 안전합니다.

실제 발행에는 세 가지가 필요합니다.

  • .env에 적은 BLOG_ID_KO와 BLOG_ID_EN
  • scripts/credentials.json (Google OAuth 클라이언트)
  • scripts/token.json (첫 발행 때 자동으로 생성됩니다)

블로그 ID를 모르면 list-blogs 명령으로 본인 계정의 블로그 목록과 ID를 확인할 수 있습니다. 확인한 ID를 .env에 적습니다.

BLOG_ID_KO=1234567890
BLOG_ID_EN=9876543210

token.json은 미리 만들 필요가 없습니다. 첫 발행 때 브라우저에서 Google 동의를 한 번 하면 자동으로 생깁니다.

올라갈 준비가 된 글을 먼저 봅니다. Claude Code에 “발행 대기 글 보여줘”라고 하거나 직접 명령을 입력합니다.

Terminal window
./scripts/deploy.sh staging

정상 화면: _workspace/posts/new/ 아래에서 대기 중인 글 목록이 뜹니다. 방금 쓴 글의 slug가 보이면 정상입니다.

실제로 올리기 전에 결과를 미리 봅니다.

Terminal window
./scripts/deploy.sh publish-new --slug {slug} --dry-run

{slug}는 방금 쓴 글의 slug로 바꿉니다. dry-run은 어떤 글이 어느 블로그에 올라갈지 보여 주기만 하고 실제로는 올리지 않습니다. 두 게이트도 이 단계에서 다시 확인합니다.

막힌 화면:

  • AI-smell 게이트에서 불합격하면 글이 차단됩니다. AI가 쓴 티가 강하다는 뜻이라서, “AI 티 줄여서 다시 써줘”라고 하면 오케스트레이터가 Phase 2로 돌아가 고칩니다.
  • 자격증명이 없으면 dry-run과 사전 점검까지만 진행하고 멈춥니다. 어느 파일이 없는지 알려 주니, prerequisites의 OAuth 항목으로 돌아갑니다.

dry-run에 문제가 없으면 실제로 올립니다.

Terminal window
./scripts/deploy.sh publish-new --slug {slug}

첫 발행이면 여기서 브라우저가 열리면서 Google 동의를 묻습니다. 동의하면 token.json이 생기고 업로드가 진행됩니다.

slug는 반드시 지정합니다. slug 없이 실행하면 대기 중인 모든 글이 대상이 되어서, 아직 올리지 않을 글까지 같이 올라갈 수 있습니다.

업로드가 끝나면 글이 보관 폴더로 옮겨지고 메타데이터가 기록됐는지 봅니다.

Terminal window
find _workspace/posts/ko _workspace/posts/en -iname "{slug}.md" -print

정상 화면: 글이 posts/new/에서 posts/로 옮겨지고, frontmatter에 blogger_url이 채워집니다. 그 URL을 열면 실제로 발행된 글이 보입니다. 한글본과 영문본을 둘 다 올렸다면 두 파일 경로가 떠야 합니다.

발행한 글을 고쳐서 다시 올리면 base가 이전 버전을 먼저 백업합니다. 재발행은 AI-smell 게이트를 우회해야 하는 경우가 있어 --skip-gate 플래그가 있지만, 새 글의 첫 발행에는 쓰지 않습니다. 첫 발행은 게이트를 정상적으로 통과해야 합니다.

첫 글이 올라갔으면 automated-safety-net에서 발행 전에 무엇이 자동으로 걸러졌는지를 봅니다. 발행한 글을 널리 알리고 싶으면 promote로 갑니다.