콘텐츠로 이동

발행

발행은 scripts/deploy.sh가 맡습니다. 두 게이트를 통과한 글이 Blogger에 올라가는 마지막 자리입니다. 자격증명 세 파일이 갖춰져야 실제 업로드가 일어나고, 없으면 dry-run 자리에서 멈춥니다.

실제 발행에는 세 파일이 필요합니다.

Terminal window
test -f .env # BLOG_ID_KO, BLOG_ID_EN
test -f scripts/credentials.json # Google OAuth 클라이언트
test -f scripts/token.json # 발급된 액세스 토큰

.env에는 한글 블로그와 영문 블로그의 ID가 들어갑니다. credentials.json은 Google Cloud 콘솔에서 받은 OAuth 클라이언트고, token.json은 첫 인증 후 발급된 토큰입니다. 셋 다 S1에 따라 .gitignore에 박혀 git 추적에서 빠집니다. 본문이나 로그에 토큰을 평문으로 남기지 않는 것이 S7입니다.

세 파일이 갖춰지지 않으면 발행 스크립트는 dry-run과 preflight까지만 돌고 멈춥니다. 누락된 파일을 보고하고, Blogger URL을 지어내지 않습니다.

발행 전에 staging 상태를 먼저 봅니다.

Terminal window
./scripts/deploy.sh staging

_workspace/posts/new/ 아래 발행 대기 중인 글 목록이 뜹니다. 어떤 slug가 올라갈 준비가 됐는지를 여기서 확인합니다. 새 slug를 만들기 전에는 충돌 검사를 먼저 합니다.

Terminal window
find _workspace/posts _workspace/briefs -iname "*{slug}*" -print

같은 slug의 staging 글이 이미 있으면 새로 만들지 않고 그 파일에서 이어 갑니다. 사용자가 손본 글이나 무관한 dirty 파일을 덮어쓰지 않습니다.

실제 업로드 전에 dry-run으로 결과를 미리 봅니다.

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

dry-run은 어떤 글이 어느 블로그에 올라갈지, frontmatter가 어떻게 변환되는지를 보여주되 실제 업로드는 하지 않습니다. 두 게이트(AI-smell, 품질)도 이 단계에서 다시 확인합니다. 불합격이면 dry-run 자리에서 막힙니다.

실제 발행은 slug를 명시해서 부릅니다.

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

slug 범위로 좁혀 부르는 이유는 무관한 staging 글이 같이 올라가는 사고를 막기 위해서입니다. publish-new를 slug 없이 부르면 staging의 모든 글이 대상이 됩니다. 한 편만 올리려면 slug를 박습니다.

업로드가 끝나면 archive로 옮겨졌는지와 메타데이터가 박혔는지를 확인합니다.

Terminal window
./scripts/deploy.sh staging
find _workspace/posts/ko _workspace/posts/en -iname "{slug}.md" -print
rg -n "blogger_post_id|blogger_url" _workspace/posts/ko _workspace/posts/en -g "{slug}.md"

발행에 성공하면 글이 posts/new/에서 posts/로 옮겨지고, blogger_post_idblogger_url이 frontmatter에 채워집니다. 이 두 필드는 staging 파일에 미리 박지 않습니다. 업로드 성공 후 스크립트가 채우는 자리입니다.

한 글은 한글 블로그(BLOG_ID_KO)와 영문 블로그(BLOG_ID_EN)에 각각 올라갑니다. frontmatter의 hreflang_enhreflang_ko가 두 글을 서로 가리키기 때문에, 한쪽만 발행되면 hreflang 상호 참조가 끊깁니다. Phase 3의 한영 정합 판정이 이 자리를 미리 봅니다. 양쪽 본문과 hreflang이 맞물려 있어야 PASS가 떨어집니다.

이미 발행된 글을 고쳐 다시 올릴 때는 S3에 따라 이전 버전을 먼저 백업합니다. 산출물을 덮어쓰기 전 백업이 발행 스크립트의 약속입니다. AI-smell 게이트를 우회해야 하는 재발행 상황에서만 --skip-gate를 씁니다. 새 글의 첫 발행에는 쓰지 않습니다.

다음 섹션은 marketing입니다. 발행 후 marketing-director가 X, Reddit, Hacker News로 글을 퍼뜨리는 자리, 그리고 AI-SEO가 Claude나 ChatGPT가 글을 인용하게 만드는 세 축을 봅니다.