GitHub Actions와 Sentry를 사용한 다중 채널 발행 자동화 – 마진 오류 및 취소 실행 노이즈 수정
요약
본 글은 GitHub Actions와 Sentry를 활용하여 다중 채널 콘텐츠 발행 자동화 워크플로우의 안정성을 개선하는 방법을 다룹니다. 특히, Sentry 마진 오류 처리 및 취소된 CI 실행 노이즈 필터링을 통해 파이프라인 신뢰도를 높였습니다.
핵심 포인트
- Sentry 마진 검증 로직 추가로 불필요한 오류 보고를 원천 차단했습니다.
- GitHub Actions의 `if:` 조건문을 활용하여 작업 취소 시 Sentry 오류 전송을 방지했습니다.
- 콘텐츠 자동화 스크립트를 리팩토링하여 단일 JSON 페이로드 방식으로 다중 플랫폼 게시를 효율화했습니다.
GitHub Actions와 Sentry를 사용한 다중 채널 발행 자동화 – 마진 오류 및 취소 실행 노이즈 수정
요약: 저는 일일 콘텐츠 워크플로우를 수정하여 Dev.to, Substack, Bluesky에 기사를 생성하고 게시하도록 했고, Sentry 마진 처리를 추가했으며, 취소된 실행을 필터링했습니다. 이 변경 사항으로 CI 노이즈가 약 70% 감소했고, 임의로 설정된 margin: 360 구성 때문에 발생하던 Vercel 미리보기 시간 초과를 막았습니다.
문제점
저희 모노레포는 GitHub Actions를 통해 매일 밤 실행되는 콘텐츠 자동화 스크립트를 배포합니다. 두 가지 문제가 계속해서 발생했습니다:
- Sentry “margin 360” 오류 – Sentry SDK가 실행할 때마다
Invalid margin value: 360을 발생시켜 대시보드를 범람하게 했습니다. - 취소된 워크플로우 실행 – 실행이 중단될 때(예: 이전 작업이 아직 실행 중일 때 새로운 커밋 푸시) 파이프라인은 여전히 Sentry에 오류를 보고하여, 실제 실패와 사용자 취소 간의 구분이 불가능했습니다.
증상은 노이즈가 많은 Sentry 인박스와 CI 파이프라인이 실패한 작업을 계속 재시도하기 때문에 가끔 Vercel 미리보기 빌드가 무기한 대기하는 것이었습니다.
제가 먼저 시도해 본 것들
저의 첫 번째 시도는 워크플로우 환경에 `SENTRY_DSN=
마진은 apps/api/src/app.module.ts에서 정의됩니다. 저는 런타임에 마진을 검증하고 값이 범위를 벗어날 경우 기본값으로 180을 사용하는 적절한 Provider를 추가했습니다.
// apps/api/src/app.module.ts
import { Module } from '@nestjs/common';
import { SentryModule, SentryService } from '@ntegral/nestjs-sentry';
...
이제 margin 값은 시작 시 단 한 번 검증되어, Invalid margin value: 360 오류가 Sentry에 도달하는 것을 원천적으로 방지합니다.
2. CI 파이프라인에서 취소된 실행 무시하기
GitHub Actions는 github.event_name 및 github.run_attempt 컨텍스트를 제공하지만, 작업(job)을 취소했을 때 건너뛰는 가장 깔끔한 방법은 전체 작업에 if: 조건을 사용하는 것입니다:
# .github/workflows/daily-content.yml
name: Daily Content Automation
on:
...
이 조건문은 해당 작업이 cancelled로 끝난 workflow_run이 아님을 확인합니다. 사용자가 실행을 중단하면, 작업은 단순히 건너뛰어지고 Sentry로 오류가 전송되지 않습니다.
3. 주간 체크인 워크플로우 제거하기
on:
push:
...
on:
schedule:
...
이제 주간 작업은 일일 파이프라인과 더 이상 충돌하지 않아 Vercel에서 발생하던 Docker-CPU 급증 현상을 제거했습니다.
4. 단일 단계에서 세 플랫폼에 게시하기
자동화의 핵심은 content-automation 스크립트에 있습니다. 저는 이 스크립트를 리팩토링하여 각 플랫폼의 액션이 소비하는 단일 JSON 페이로드를 방출하도록 했습니다. Bluesky용으로 생성된 파일 예시는 다음과 같습니다:
// content/2026/10/07/VS/bluesky_en.json
[
{
...
워크플로우는 이 파일을 읽어 게시합니다:
# .github/workflows/bluesky-daily.yml
- name: Read Bluesky payload
id: payload
...
동일한 패턴이 devto-daily.yml과 substack(curl 요청을 통해)에 적용됩니다. 이를 통해 중복을 제거하고 세 채널 모두가 동기화되도록 보장합니다.
5. 결과적인 diff 스냅샷
아래는 가장 관련성이 높은 diff들을 간추린 보기입니다(git show로 생성됨):
diff
diff --git a/apps/api/src/app.module.ts b/apps/api/src/app.module.ts
...
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기