콘텐츠로 이동

발행

발행은 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을 지어내지 않습니다.

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

Terminal window
./scripts/deploy.sh staging

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

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

같은 slug의 대기 글이 이미 있으면 새로 만들지 않고 그 파일에서 이어 갑니다. 사용자가 손본 글이나 관계없이 수정 중인 파일을 덮어쓰지 않습니다.

실제 업로드 전에 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 범위로 좁혀 실행하는 이유는 관계없는 대기 글이 같이 올라가는 사고를 막기 위해서입니다. publish-new를 slug 없이 실행하면 대기 중인 모든 글이 대상이 됩니다. 한 편만 올리려면 slug를 반드시 지정합니다.

업로드가 끝나면 보관 폴더로 옮겨졌는지와 메타데이터가 기록됐는지를 확인합니다.

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_id와 blogger_url이 frontmatter에 채워집니다. 이 두 필드는 대기 파일에 미리 적지 않습니다. 업로드에 성공한 뒤에 스크립트가 채웁니다.

한글본과 영문본은 짝으로 올립니다

섹션 제목: “한글본과 영문본은 짝으로 올립니다”

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

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

다음 섹션은 marketing입니다. 발행한 뒤에 marketing-director가 X와 Reddit, Hacker News로 글을 알리는 흐름, 그리고 AI-SEO가 Claude나 ChatGPT로 하여금 글을 인용하게 만드는 세 축을 봅니다.