카테고리

자동화 파이프라인

작은 스크립트를 반복 가능한 시스템으로 바꾸는 영상, 콘텐츠, 에셋 자동화 기록.

전체 글

71
왼쪽에는 국가와 언어를 인자로 받는 채널 세팅 스크립트, 오른쪽에는 세 앱 두 언어만 채워진 후크 데이터 격자
자동화 파이프라인6 분 읽기

내 채널은 스크립트 하나로 열렸고, 후크는 앱마다 손으로 채워야 했다

앱 다운로드 채널을 세팅하는 스크립트와 후크 번역 데이터를 한 커밋에 넣었습니다. 채널 쪽은 국가·언어를 인자로 받아 무한히 늘어나는데, 콘텐츠 쪽은 앱 하나당 언어 하나당 손으로 채운 항목이 있어야 렌더러가 무언가를 올릴 수 있었습니다. '다국어 지원'이 어느 층까지 내려가 있는지에 대한 기록입니다.

#localization#youtube#oauth#shorts
왼쪽은 영어 쇼츠에 한국어 기본 해시태그가 붙는 네이티브 앱 분기, 오른쪽은 웹과 네이티브 분기가 모두 언어별 basetags를 읽는 구조의 2패널 다이어그램
자동화 파이프라인6 분 읽기

내 영어 쇼츠가 한국어 해시태그를 달고 있었다

유튜브 업로더는 웹앱 영상의 해시태그를 이미 언어별로 나누고 있었습니다. 하지만 네이티브 앱 분기는 여전히 한국어 기본 태그 한 벌을 모든 언어에 붙이고 있었습니다. 같은 수정이 한쪽 분기에만 들어가 있던 문제와 20줄짜리 수정, 아직 모르는 부분을 정리했습니다.

#youtube-shorts#hashtags#i18n#localization
블로그 글 27편이 하나씩 영상 대본으로 바뀌고 마지막에 생성이 멈추는 흐름도
자동화 파이프라인7 분 읽기

내 영상 대본 자동 생성기는 27번째에서 멈추게 되어 있었습니다

블로그 글을 영상 대본으로 바꿔 매일 아침 발행 큐에 넣는 자동화를 붙였습니다. 이 자동화는 일부러 원본을 실제로 쓴 블로그 글 27편으로만 한정했습니다. 원본이 떨어지면 스스로 멈춥니다. 자동화를 어디서 멈추게 할지가 이번 작업의 진짜 결정이었습니다.

#automation#launchd#llm#video-pipeline
왼쪽은 서로 다른 앱들이 같은 해시태그 묶음을 공유하는 모습, 오른쪽은 앱마다 따로 생성되어 캐시된 해시태그 목록
자동화 파이프라인7 분 읽기

내 수면 앱과 K-pop 퀴즈가 같은 해시태그를 달고 있었다

인스타그램 자동 크로스포스트는 어떤 앱을 올리든 똑같은 기본 해시태그를 붙이고 있었습니다. 에러는 없었습니다. 태그가 붙었는지만 확인했고, 그 앱에 맞는 태그인지는 아무도 확인하지 않았기 때문입니다. 앱마다 태그를 한 번만 생성해 캐시하고 기본 태그는 폴백으로만 남긴 과정과, 아직 모르는 점을 정리했습니다.

#instagram#hashtags#claude-cli#automation
네 개 홍보 지면 중 Instagram 앱 카드 한 곳만 웹앱 매니페스트를 읽고 있음을 보여주는 비교 도식
자동화 파이프라인9 분 읽기

내 인스타 앱 카드가 아직 웹앱을 팔고 있었다

홍보 대상을 스토어 앱으로 좁히라는 지시를 받고 확인해 보니, 네 지면 가운데 한 곳만 웹앱을 밀고 있었습니다. 그런데 콘텐츠 풀만 바꿔서는 끝나지 않았습니다. 언어, 가격 주장, 말투가 모두 같이 걸려 있었고, 진행 중이던 실험 창까지 다시 열어야 했습니다.

#instagram#localization#itunes-lookup#automation
왼쪽은 App Store 문구가 붙은 웹앱 쇼츠 설명, 오른쪽은 매니페스트 스키마별로 분기하는 업로더 구조의 2패널 다이어그램
자동화 파이프라인6 분 읽기

내 웹앱 쇼츠가 앱스토어로 안내하고 있었다

업로더는 앱 매니페스트 하나만 알았고, 웹앱 영상에도 App Store와 아이폰앱 문구를 붙일 수 있는 구조였습니다. 게다가 쇼츠 설명과 댓글에 넣은 링크는 클릭이 막혀 있었습니다. 스키마 대응, 프로필 CTA, dry-run을 추가한 기록입니다.

#youtube-shorts#upload-automation#metadata#dry-run
왼쪽은 업로드 버튼으로만 확인되는 인증 상태, 오른쪽은 업로드 없이 채널만 출력하는 짧은 스크립트
자동화 파이프라인7 분 읽기

내 인증 상태를 확인하는 유일한 방법이 업로드였다

브랜드 채널 자동 업로드 파이프라인에서 토큰이 살아 있는지 확인하려면 영상을 한 편 올려보는 수밖에 없었습니다. 확인 행위 자체가 되돌릴 수 없는 공개 행위였다는 뜻입니다. 업로드 없이 인증과 연결 채널만 확인하는 22줄짜리 스크립트를 따로 떼어냈습니다.

#oauth#automation#data-api#publishing
왼쪽: 감시 대상을 손목록과 이름 규칙으로 만들면 관례를 안 지킨 패키지 다섯 개가 후보에조차 없다. 오른쪽: 같은 날 아무도 안 건드렸는데 맞아 있던 배지는 매 렌더마다 스토어를 실제로 눌러서 판정한다
자동화 파이프라인12 분 읽기

제 감시판은 앱 패키지 이름을 추측하고 있었습니다

스토어에 공개된 앱은 25개인데 감시판은 22개만 보고 있었습니다. 빠진 다섯 개의 공통점은 버그가 아니라 작명이었습니다 — 제가 정한 관례를 안 지킨 앱들이었고, 목록에도 패턴에도 걸리지 않아 조용히 밖에 서 있었습니다.

#monitoring#automation-pipeline#reality-check#gotchas
왼쪽: 같은 전파 지연에서 조회 호출에는 가드가 있고 쓰기 호출은 맨몸이라 409가 난다. 오른쪽: 포크 두 개 모두 읽기 절반만 고쳐져 있어 서로 diff를 떠도 아무 차이가 안 보인다
자동화 파이프라인10 분 읽기

전파 지연을 막아뒀는데, 막아둔 쪽은 읽기였습니다

방금 만든 플레이리스트를 조회하면 404가 온다는 건 8월에 고쳤습니다. 그런데 4개월 뒤 같은 자리에서 409로 회차가 죽었습니다. 원인은 같고 호출만 달랐습니다 — 가드가 '전파가 끝나기 전'이 아니라 '조회'에 걸려 있었고, 포크 두 개가 정확히 같은 반쪽을 들고 있었습니다.

#automation-pipeline#youtube#gotchas#api
Left: insert playlist returns an id, then listing its items immediately returns 404 playlistNotFound. Right: the crash lands before the state file is saved, so next week the bot creates the same playlist again.
자동화 파이프라인6 분 읽기

방금 만든 플레이리스트를 조회했더니, 존재하지 않는다고 했습니다

YouTube API로 플레이리스트를 만들고 그 자리에서 목록을 조회하면 404가 옵니다. 진짜 사고는 그다음입니다 — 크래시가 상태 저장보다 먼저라서, 봇이 매주 같은 플레이리스트를 하나씩 더 만들 뻔했습니다. 고친 건 재시도가 아니라 '조회 안 하기'였습니다.

#automation-pipeline#youtube#gotchas#api
두 패널 도식. 왼쪽은 로그 한 줄 'ensure_home failed -> app reset, retry'와 '복구, 무해함'이라는 해석, 220번의 전환에 240번 찍혔다는 표기. 오른쪽은 각 행 오른쪽에 작은 x 버튼이 달린 목록과 '여덟 번 탭, 화면은 그대로', '뒤로가기 0회'.
자동화 파이프라인12 분 읽기

매번 찍히던 '리셋 후 재시도'가 복구가 아니라 원인이었습니다

실기기를 조종하는 봇의 계정 전환이 3주 동안 8~19% 실패했습니다. 원인을 세 번 고쳤는데 실패율이 안 떨어졌습니다. 진짜 범인은 모든 로그에 있던 '앱 리셋 재시도' 한 줄 — 봇이 화면을 빠져나가는 대신 목록 행의 'Dismiss' 버튼을 여덟 번 누르고 있었습니다.

#automation#android#adb#debugging
가로 타임라인에 '변경' 세로선, 왼쪽 구간은 점선 상자와 물음표(기준선 없음), 오른쪽 구간은 실선 막대. 아래엔 같은 문서가 두 갈래 화살표로 서로 다른 호스트 이름표에 연결되고 노출 숫자는 아래쪽 이름표에만 붙어 있음
자동화 파이프라인8 분 읽기

재측정 날짜만 잡고 기준선을 안 잡았으면, 그 실험은 시작도 안 한 겁니다

2주 전 콘텐츠 클러스터 여섯 개에 구조화 데이터를 넣고 '2주 뒤 재측정'이라 적어 뒀습니다. 정작 기준선은 안 잡혀 있었고, 일별 스냅샷은 이동창이라 못 쓰고, 노출은 제가 작업한 주소가 아니라 다른 호스트에 붙어 있었으며, 두 번째 검색 채널은 창구 자체가 없었습니다.

#seo#measurement#reality-check#gotchas
개념 도식: token 칸에 경로·밴드·카드 슬러그·공유 토큰 네 가지 뜻이 섞여 있어 고유 token 수가 콘텐츠 종류 수가 된다. token을 항상 방문자 id로 두고 공유 토큰은 src 라벨로 옮기면 해결된다.
자동화 파이프라인12 분 읽기

내 대시보드는 방문자 대신 카드 이름을 세고 있었다

후원 버튼을 붙일지 계산하려고 실측을 뽑다가, 게이트의 분모가 사람이 아니라는 걸 알았습니다. token 칸에 경로·밴드·카드 슬러그·공유 토큰이 앱마다 다르게 들어가 있었고, 진범은 호출자가 방문자 토큰을 덮어쓸 수 있게 열어둔 물음표 두 개였습니다.

#analytics#instrumentation#first-principles#reality-check
개념 도식: 같은 실험을 목록 엔드포인트와 단건 엔드포인트로 조회했을 때 startDate가 null과 실제 시각으로 갈린다
자동화 파이프라인10 분 읽기

목록 API는 "시작 안 됨"이라고 했지만, 실험은 전날부터 돌고 있었습니다

감시 스크립트가 실험 4건을 "시작 필요"로 보고하고 start를 시도해 전부 409로 실패했습니다. 목록 엔드포인트가 startDate를 언제나 null로 주기 때문이었고, 애초에 start는 플랫폼이 자동으로 하고 있었습니다. 서로 다른 에러 세 개가 같은 사실을 말하는데 마지막 하나를 시도조차 안 한 이야기.

#automation#api#app-store-connect#data-quality
28개 인스턴스 중 하나가 4월 21일부터의 백필을 담고 있어, 28일이라고 적힌 열이 실제로는 118일을 합산했다. 행의 Date로 창을 자르지 않으면 노출 50,141·PPV 1.7%, 자르면 1,036·7.3%
자동화 파이프라인15 분 읽기

28일이라고 적힌 열은 118일이었습니다

2주 전에 저는 '숫자가 3배로 부풀었지만 비율은 무사했다'고 썼습니다. 대부분의 앱에서는 맞는 말이었습니다. 한 앱에서는 노출이 48배로 실려 있었고, 저는 그 숫자 위에서 A/B 테스트를 돌릴 앱을 고르고 있었습니다.

#app-store#analytics#data-quality#reality-check
개념 도식: landing 7,531건의 실제 구성과, 분모를 로드에서 저장 토큰으로 바꿨을 때의 차이
자동화 파이프라인17 분 읽기

게이트를 통과시킨 방문자는 제 스크린샷이었습니다

2주 전에 저는 헤드리스 Chrome으로 앱 화면을 자동 캡처하는 파이프라인을 자랑하는 글을 썼습니다. 그 캡처가 매일 저녁 제 계측에 방문자를 적립하고 있었습니다. user-agent도 IP도 저장하지 않는 원장에서 그걸 어떻게 잡아냈는지, 그리고 필터를 정교하게 짜는 대신 세는 대상을 바꾼 이야기.

#analytics#data-quality#reality-check#gotchas
왼쪽은 지연으로 표시된 세 행이 전부 실제 스케줄과 맞지 않는 기대 주기 설정 때문에 생긴 오탐이라는 것, 오른쪽은 무산출로 표시돼 영구히 보이지 않던 세 행 중 하나가 토큰 갱신을 조용히 건너뛰고 있었다는 것
자동화 파이프라인9 분 읽기

감시판의 빨간불 3개가 전부 오탐이었고, 진짜 사각은 회색 칸이었습니다

봇 감시판이 지연 3건을 띄웠습니다. 셋 다 거짓이었습니다 — 기대 주기가 실제 스케줄과 달랐을 뿐입니다. 그런데 같은 화면의 '무산출' 3칸은 아무도 안 보고 있었고, 그중 하나는 60일짜리 토큰 갱신을 통째로 건너뛰고 있었습니다.

#automation-pipeline#monitoring#reality-check#first-principles
왼쪽 패널은 파이프라인이 매일 계산하는 성과 점수로 띠 주제가 1390으로 1위, 오른쪽 패널은 실제 발행 결과로 상위 2편이 띠 주제인데도 궁합 트랙은 MBTI만 내보내고 있음
자동화 파이프라인10 분 읽기

파이프라인은 이긴 주제를 알고 있었습니다 — 그리고 절반을 지는 주제에 썼습니다

쇼츠 자동 생성 봇은 매일 성과 점수를 계산합니다. 1위가 2위의 4배였습니다. 그런데 트랙 하나가 그 점수를 읽지 않고 하드코딩된 순서대로 돌고 있었습니다. 한국어·영어는 몇 달치 분량을 지는 주제에 쓸 예정이었습니다.

#automation-pipeline#distribution#first-principles#reality-check
개념 도식: 가입 1건이 화살표로 갈라져 앱 스키마 20개에 각각 +1을 찍고, 아래에 앱별 신규가 264로 나열됨.
자동화 파이프라인9 분 읽기

모든 앱의 신규 유저 수가 똑같이 264명이었다

앱 20여 개가 Supabase 프로젝트 하나를 나눠 씁니다. 앱별 신규 가입자를 세니 전부 264명이었습니다. auth 트리거가 가입 한 건을 모든 앱 스키마로 팬아웃하고 있었고, 저는 그 분모로 이미 판단을 내려놓은 상태였습니다.

#supabase#analytics#postgres#reality-check
개념 도식: 버킷 이름 두 줄이 위아래로 있고 `_rev_`에만 취소선. 위 줄에 404, 아래 줄에 200.
자동화 파이프라인8 분 읽기

몇 달간 막혀 있던 건 이름 네 글자였다

Android 지표를 몇 달째 못 보고 있었습니다. Reporting API가 403이고 리포트 버킷은 404였으니까요. 버킷 이름에서 `_rev_` 네 글자를 빼자 200이 떨어졌습니다. 권한 문제가 아니라 제가 메모에 틀린 상수를 적어둔 것이었습니다.

#google-play#gcs#analytics#automation
개념 도식: 왼쪽은 배포한 되읽기 검증과 합성 테스트 3/3 통과, 오른쪽은 실전 드릴에서 드러난 쓰기 직후 옛 값 반환과 오탐
자동화 파이프라인10 분 읽기

검증을 붙였더니, 그 검증이 거짓말을 했다

쓰기 후 되읽기 검증을 봇 여섯 개에 넣고 합성 테스트도 통과했습니다. 못 믿겠어서 실제 채널에 진짜 쓰기를 걸어 봤더니, 쓰기 직후 읽기가 옛 값을 돌려줬습니다. 제 검증은 멀쩡한 쓰기를 실패로 신고할 상태였습니다.

#gotchas#verification#automation#alerting
개념 도식: processingDate 인스턴스가 직전 3일을 다시 실어 합산하면 3배. 비율은 분자·분모 둘 다 3배라 정확, 절대값만 부풀고, 정확한 소스÷3배 소스가 그럴듯한 거짓 지표를 만든다.
자동화 파이프라인11 분 읽기

3배 부풀려진 숫자로 두 달을 판단했다

ASC 분석 리포트로 앱 퍼널을 몇 달 뽑고 있었습니다. 매출을 처음 대조하다 결제 건수가 6배 안 맞았습니다. 원인은 리포트가 직전 3일을 매번 다시 싣는 정정 구조였고, 저는 그걸 전부 합산하고 있었습니다. 비율은 멀쩡했는데, 두 소스를 섞은 값 하나가 썩어 있었습니다.

#app-store#analytics#first-principles#reality-check
개념 도식: 왼쪽은 로그에 [shorts] 접두가 매일 하나씩 붙어 누적되는 거짓 알림, 오른쪽은 실제 장애가 단 1회였다는 사실
자동화 파이프라인9 분 읽기

내 에러 모니터가 3일 전에 끝난 장애를 매일 신고하고 있었다

'매일 같은 시각 500 에러' 알림을 추적했더니, 진짜 장애는 딱 한 번이었습니다. 나머지는 모니터가 자기 알림을 다시 로그에 쓰고, 그 로그를 다시 스캔하면서 만든 메아리였습니다. 같은 날 대시보드도 4/4인데 대기라고 자기모순을 부렸습니다. 관측 도구가 거짓말을 하는 두 가지 방식에 대한 기록입니다.

#monitoring#observability#feedback-loop#reality-check
개념 도식: 배포 파이프라인 끝 검증 단계에 Cloudflare 방패. curl은 200을 받지만 5.4KB 챌린지 페이지라 튕겨나오고, SSH md5 대조만 방패를 우회해 서버 디스크에 닿는다.
자동화 파이프라인7 분 읽기

배포된 건 다른 앱이었다

한 앱의 정책·지원 페이지 네 개가 나흘 동안 다른 앱의 스텁이었습니다. 아무도 몰랐습니다. 이 도메인은 Cloudflare 뒤라 비브라우저 요청에 200과 함께 챌린지 페이지를 줍니다. 즉 curl로는 배포 성공을 판정할 수 없었습니다. 권위 있는 검증은 SSH로 파일 해시를 대조하는 것뿐이었습니다.

#deployment#cloudflare#shipping-infra#gotchas
개념 도식: ffmpeg 함정
자동화 파이프라인4 분 읽기

나를 몇 시간 잡아먹은 ffmpeg 함정들

영상 파이프라인을 만들며 만난 ffmpeg·툴체인 함정 넷: overlay엔 alpha가 없다, drawtext는 비ASCII 폰트 경로에서 깨진다, 조용히 망가진 시스템 바이너리, 그리고 최신 파이썬에선 static ffmpeg에 걸어라.

#ffmpeg#python#video#debugging