발행
발행은 scripts/deploy.sh가 맡습니다. 두 게이트를 통과한 글이 Blogger에 올라가는 마지막 단계입니다. 자격증명 세 파일이 갖춰져야 실제 업로드가 일어나고, 없으면 dry-run까지만 돌고 멈춥니다.
자격증명 세 파일
섹션 제목: “자격증명 세 파일”실제 발행에는 세 파일이 필요합니다.
test -f .env # BLOG_ID_KO, BLOG_ID_ENtest -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을 지어내지 않습니다.
발행 대기 목록 확인
섹션 제목: “발행 대기 목록 확인”발행 전에 발행 대기 상태를 먼저 봅니다.
./scripts/deploy.sh staging_workspace/posts/new/ 아래에서 발행을 기다리는 글 목록이 뜹니다. 어떤 slug가 올라갈 준비가 됐는지를 여기서 확인합니다. 새 slug를 만들기 전에는 충돌 검사를 먼저 합니다.
find _workspace/posts _workspace/briefs -iname "*{slug}*" -print같은 slug의 대기 글이 이미 있으면 새로 만들지 않고 그 파일에서 이어 갑니다. 사용자가 손본 글이나 관계없이 수정 중인 파일을 덮어쓰지 않습니다.
dry-run 먼저
섹션 제목: “dry-run 먼저”실제 업로드 전에 dry-run으로 결과를 미리 봅니다.
./scripts/deploy.sh publish-new --slug {slug} --dry-rundry-run은 어떤 글이 어느 블로그에 올라갈지, frontmatter가 어떻게 변환되는지를 보여 주기만 하고 실제 업로드는 하지 않습니다. 두 게이트(AI-smell, 품질)도 이 단계에서 다시 확인합니다. 불합격이면 dry-run 단계에서 막힙니다.
slug 범위 발행
섹션 제목: “slug 범위 발행”실제 발행은 slug를 명시해서 실행합니다.
./scripts/deploy.sh publish-new --slug {slug}slug 범위로 좁혀 실행하는 이유는 관계없는 대기 글이 같이 올라가는 사고를 막기 위해서입니다. publish-new를 slug 없이 실행하면 대기 중인 모든 글이 대상이 됩니다. 한 편만 올리려면 slug를 반드시 지정합니다.
발행 후 검증
섹션 제목: “발행 후 검증”업로드가 끝나면 보관 폴더로 옮겨졌는지와 메타데이터가 기록됐는지를 확인합니다.
./scripts/deploy.sh stagingfind _workspace/posts/ko _workspace/posts/en -iname "{slug}.md" -printrg -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로 하여금 글을 인용하게 만드는 세 축을 봅니다.