Skip to content

deploy.yml Improvement Plan

This content is not available in your language yet.

2026-01-28


  • 총 라인 수: 428줄
  • Job 수: 4개 (validate, provision, deploy, deploy-production)
  • 중복된 Step 패턴: 4곳에서 반복

문제: 다음 5개 step이 모든 job에서 반복됨

- name: Checkout
- name: Setup Environment
- name: Setup pnpm
- name: Setup Node.js
- name: Install dependencies

반복 횟수: 4번 (validate, provision, deploy, deploy-production)

영향:

  • 코드 중복: ~100줄 중복
  • 유지보수 어려움: 한 곳 수정 시 4곳 모두 수정 필요
  • 실수 가능성: 한 곳만 수정하고 나머지 놓칠 수 있음

문제 A: Debug 환경 변수 중복

env:
ACTIONS_STEP_DEBUG: true
ACTIONS_RUNNER_DEBUG: true

반복 횟수: 4번 (모든 job)

문제 B: GitHub Context 환경 변수 중복

env:
GITHUB_SHA: ${{ github.sha }}
GITHUB_REPOSITORY: ${{ github.repository }}
GITHUB_RUN_ID: ${{ github.run_id }}
GITHUB_RUN_NUMBER: ${{ github.run_number }}

반복 횟수: 4번 (모든 job)

문제 C: Cloudflare 인증 정보 중복

env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}

반복 횟수: 8번 이상 (여러 step에서)


3. 중복된 “Determine environment” 로직 (Medium)

섹션 제목: “3. 중복된 “Determine environment” 로직 (Medium)”

문제: 같은 로직이 provision과 deploy에서 반복됨

- name: Determine environment
id: env
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
echo "environment=${{ github.event.inputs.environment }}" >> $GITHUB_OUTPUT
else
echo "environment=staging" >> $GITHUB_OUTPUT
fi

반복 횟수: 2번 (provision, deploy)

문제점:

  • deploy-production에서는 하드코딩된 “production” 사용
  • 일관성 부족

문제: tmate 설정이 모든 job에서 반복됨

- name: Setup tmate session (on failure)
if: failure()
uses: mxschmitt/action-tmate@v3
with:
limit-access-to-actor: true
connect-timeout-seconds: 1800

반복 횟수: 4번


5. deploy-production Job의 중복 작업 (High)

섹션 제목: “5. deploy-production Job의 중복 작업 (High)”

문제: deploy-production job에서 이미 완료된 작업을 다시 실행

중복 작업:

  1. Provision Cloudflare Resources (이미 provision job에서 완료)
  2. Verify Resources (이미 provision job에서 완료)
  3. Validate wrangler.jsonc (이미 provision job에서 완료)

문제점:

  • 불필요한 시간 소비
  • 리소스 낭비
  • deploy job에서 이미 배포했는데 다시 프로비저닝

현재 로직:

validate → provision → deploy → deploy-production
└─ 이미 배포 완료

deploy-production이 다시 하는 일:

  • Provision (불필요 - 이미 provision job에서 완료)
  • Verify (불필요 - 이미 provision job에서 완료)
  • Validate (불필요 - 이미 provision job에서 완료)
  • Deploy (필요 - production 환경으로 배포)

문제: 같은 환경 변수를 여러 step에서 반복 설정

예시:

# Deploy step
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
DEPLOY_ENV: ${{ steps.env.outputs.environment }}
GITHUB_SHA: ${{ github.sha }}
GITHUB_REPOSITORY: ${{ github.repository }}
GITHUB_RUN_ID: ${{ github.run_id }}
GITHUB_RUN_NUMBER: ${{ github.run_number }}
BUILD_VERSION: $(date -u +%Y-%m-%dT%H%M%SZ)
BUILD_TIMESTAMP: $(date -u +%Y-%m-%dT%H:%M:%SZ)
GIT_COMMIT: ${{ github.sha }}
CF_ENV: ${{ steps.env.outputs.environment }}
# Post-deployment Log Check step
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}

문제점:

  • GIT_COMMIT과 GITHUB_SHA 중복
  • CF_ENV와 DEPLOY_ENV 중복
  • 같은 인증 정보를 여러 step에서 반복

7. 불필요한 “Run Tests” Step (Low)

섹션 제목: “7. 불필요한 “Run Tests” Step (Low)”

문제: validate job에서 테스트를 스킵하는 step이 있음

- name: Run Tests
run: |
echo "⏭️ Tests skipped in CI (optimization)"
echo "💡 Please run 'pnpm test' locally before pushing"
echo "💡 Or run 'pnpm run validate:local' for complete validation"
echo "✅ Assuming tests passed locally"
continue-on-error: true

문제점:

  • 실제로 아무것도 하지 않음
  • CI 시간만 소비
  • 주석으로 대체 가능

Phase 1: Composite Actions로 Setup Steps 통합 (High Priority)

섹션 제목: “Phase 1: Composite Actions로 Setup Steps 통합 (High Priority)”

목적: 반복되는 setup steps를 재사용 가능한 composite action으로 추출

구조:

.github/actions/setup-project/action.yml

내용:

name: 'Setup Project'
description: 'Setup Node.js, pnpm, and install dependencies'
inputs:
node-version:
description: 'Node.js version'
required: false
default: '20'
pnpm-version:
description: 'pnpm version'
required: false
default: '9'
runs:
using: 'composite'
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Environment
shell: bash
run: |
chmod +x .github/scripts/setup.sh
./.github/scripts/setup.sh
env:
GITHUB_SHA: ${{ github.sha }}
GITHUB_REPOSITORY: ${{ github.repository }}
GITHUB_RUN_ID: ${{ github.run_id }}
GITHUB_RUN_NUMBER: ${{ github.run_number }}
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: ${{ inputs.pnpm-version }}
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ inputs.node-version }}
cache: "pnpm"
- name: Install dependencies
shell: bash
run: pnpm install --frozen-lockfile

사용법:

- name: Setup Project
uses: ./.github/actions/setup-project

효과:

  • 중복 코드 제거: ~100줄 → 1줄
  • 유지보수성 향상: 한 곳만 수정
  • 일관성 보장: 모든 job에서 동일한 setup

Phase 2: Workflow-level 환경 변수 설정 (High Priority)

섹션 제목: “Phase 2: Workflow-level 환경 변수 설정 (High Priority)”

목적: 공통 환경 변수를 workflow 레벨에서 한 번만 설정

구조:

env:
# Debug mode (모든 job에 적용)
ACTIONS_STEP_DEBUG: true
ACTIONS_RUNNER_DEBUG: true
# GitHub Context (모든 job에 적용)
GITHUB_SHA: ${{ github.sha }}
GITHUB_REPOSITORY: ${{ github.repository }}
GITHUB_RUN_ID: ${{ github.run_id }}
GITHUB_RUN_NUMBER: ${{ github.run_number }}
# Cloudflare 인증 (보안 주의 - secrets는 job 레벨에서만)
# CLOUDFLARE_API_TOKEN은 secrets이므로 job 레벨에서만 설정
jobs:
validate:
# env는 상속됨
steps: ...

효과:

  • 중복 제거: 4곳 → 1곳
  • 유지보수성 향상
  • 일관성 보장

주의사항:

  • Secrets는 workflow-level env에 설정 불가 (GitHub 제한)
  • Secrets는 각 job/step에서 개별 설정 필요

Phase 3: “Determine environment” 로직 통합 (Medium Priority)

섹션 제목: “Phase 3: “Determine environment” 로직 통합 (Medium Priority)”

방안 A: Workflow-level output 사용 (불가능 - GitHub Actions 제한)

방안 B: Reusable workflow 사용 (복잡함)

방안 C: Composite Action으로 추출

구조:

.github/actions/determine-environment/action.yml

내용:

name: 'Determine Environment'
description: 'Determine deployment environment from workflow inputs'
outputs:
environment:
description: 'Deployment environment'
value: ${{ steps.env.outputs.environment }}
runs:
using: 'composite'
steps:
- id: env
shell: bash
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
echo "environment=${{ github.event.inputs.environment }}" >> $GITHUB_OUTPUT
else
echo "environment=staging" >> $GITHUB_OUTPUT
fi

사용법:

- name: Determine environment
id: env
uses: ./.github/actions/determine-environment
- name: Some step
env:
DEPLOY_ENV: ${{ steps.env.outputs.environment }}

효과:

  • 중복 제거: 2곳 → 1곳 (재사용)
  • 일관성 보장

Phase 4: deploy-production Job 최적화 (High Priority)

섹션 제목: “Phase 4: deploy-production Job 최적화 (High Priority)”

현재 구조:

validate → provision → deploy → deploy-production
└─ 이미 staging/production 배포 완료

deploy-production의 불필요한 작업:

  1. ❌ Provision Cloudflare Resources (이미 provision job에서 완료)
  2. ❌ Verify Resources (이미 provision job에서 완료)
  3. ❌ Validate wrangler.jsonc (이미 provision job에서 완료)
  4. ✅ Deploy to Production (필요)

방안 A: deploy-production 단순화

deploy-production:
name: Deploy to Production
runs-on: ubuntu-latest
needs: [validate, provision, deploy]
if: github.event.inputs.environment == 'production'
environment: production
steps:
- name: Setup Project
uses: ./.github/actions/setup-project
- name: Deploy to Production
run: |
chmod +x .github/scripts/steps/deploy.sh
./.github/scripts/steps/deploy.sh
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
DEPLOY_ENV: production
# ... 기타 환경 변수
- name: Post-deployment Log Check
# ...
- name: Production Deployment Summary
# ...

효과:

  • 불필요한 작업 제거: Provision, Verify, Validate 제거
  • 시간 단축: ~5-10분 절약
  • 리소스 절약

주의사항:

  • deploy job이 staging으로 배포했을 수도 있음
  • production 배포는 별도로 필요

Phase 5: tmate Session 설정 통합 (Low Priority)

섹션 제목: “Phase 5: tmate Session 설정 통합 (Low Priority)”

구조:

.github/actions/setup-tmate/action.yml

내용:

name: 'Setup tmate Session'
description: 'Setup tmate session for debugging on failure'
runs:
using: 'composite'
steps:
- name: Setup tmate session (on failure)
if: failure()
uses: mxschmitt/action-tmate@v3
with:
limit-access-to-actor: true
connect-timeout-seconds: 1800

사용법:

- name: Setup tmate session
uses: ./.github/actions/setup-tmate

효과:

  • 중복 제거: 4곳 → 1곳
  • 유지보수성 향상

Phase 6: 환경 변수 그룹화 (Medium Priority)

섹션 제목: “Phase 6: 환경 변수 그룹화 (Medium Priority)”

현재: 각 step마다 개별 설정

env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}

개선: Job-level env로 설정

jobs:
deploy:
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
steps:
- name: Deploy
# env는 상속됨
run: ...

효과:

  • 중복 제거
  • 보안: secrets를 한 곳에서만 관리

현재: 중복된 환경 변수

BUILD_VERSION: $(date -u +%Y-%m-%dT%H%M%SZ)
BUILD_TIMESTAMP: $(date -u +%Y-%m-%dT%H:%M:%SZ)
GIT_COMMIT: ${{ github.sha }} # GITHUB_SHA와 중복
CF_ENV: ${{ steps.env.outputs.environment }} # DEPLOY_ENV와 중복

개선: 중복 제거 및 통합

env:
DEPLOY_ENV: ${{ steps.env.outputs.environment }}
GITHUB_SHA: ${{ github.sha }}
# BUILD_VERSION, BUILD_TIMESTAMP는 deploy.sh에서 생성
# GIT_COMMIT 제거 (GITHUB_SHA 사용)
# CF_ENV 제거 (DEPLOY_ENV 사용)

Phase 7: 불필요한 Step 제거 (Low Priority)

섹션 제목: “Phase 7: 불필요한 Step 제거 (Low Priority)”

현재:

- name: Run Tests
run: |
echo "⏭️ Tests skipped in CI (optimization)"
# ... 메시지만 출력
continue-on-error: true

개선: 완전 제거 또는 주석으로 대체

효과:

  • CI 시간 절약: ~5초
  • 코드 간소화

  • 총 라인 수: 428줄
  • 중복 코드: ~150줄
  • Setup steps 반복: 4번
  • 환경 변수 반복: 10+ 곳
  • deploy-production 불필요 작업: 3개
  • 총 라인 수: ~250줄 (42% 감소)
  • 중복 코드: ~20줄 (87% 감소)
  • Setup steps: Composite action으로 1줄
  • 환경 변수: Workflow-level로 통합
  • deploy-production: 필수 작업만 수행

  1. Setup Composite Action 생성

    • 효과: 중복 코드 100줄 제거
    • 난이도: 낮음
    • 시간: 30분
  2. deploy-production Job 최적화

    • 효과: 불필요한 작업 제거, 시간 절약
    • 난이도: 낮음
    • 시간: 15분
  1. Workflow-level 환경 변수 설정

    • 효과: 중복 제거, 일관성 향상
    • 난이도: 낮음
    • 시간: 20분
  2. Job-level Cloudflare 인증 정보

    • 효과: 중복 제거, 보안 향상
    • 난이도: 낮음
    • 시간: 15분
  1. Determine environment Composite Action

    • 효과: 중복 제거, 재사용성 향상
    • 난이도: 중간
    • 시간: 20분
  2. 환경 변수 중복 제거

    • 효과: 코드 간소화
    • 난이도: 낮음
    • 시간: 15분
  1. tmate Session Composite Action

    • 효과: 중복 제거
    • 난이도: 낮음
    • 시간: 10분
  2. 불필요한 Step 제거

    • 효과: CI 시간 절약
    • 난이도: 매우 낮음
    • 시간: 5분

.github/
├── actions/
│ ├── setup-project/
│ │ └── action.yml
│ ├── determine-environment/
│ │ └── action.yml
│ └── setup-tmate/
│ └── action.yml
└── workflows/
└── deploy.yml

Before:

jobs:
validate:
steps:
- Checkout
- Setup Environment
- Setup pnpm
- Setup Node.js
- Install dependencies
# ... validation steps
provision:
steps:
- Checkout
- Setup Environment
- Setup pnpm
- Setup Node.js
- Install dependencies
# ... provision steps

After:

env:
ACTIONS_STEP_DEBUG: true
ACTIONS_RUNNER_DEBUG: true
GITHUB_SHA: ${{ github.sha }}
GITHUB_REPOSITORY: ${{ github.repository }}
GITHUB_RUN_ID: ${{ github.run_id }}
GITHUB_RUN_NUMBER: ${{ github.run_number }}
jobs:
validate:
steps:
- name: Setup Project
uses: ./.github/actions/setup-project
# ... validation steps
provision:
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
steps:
- name: Setup Project
uses: ./.github/actions/setup-project
- name: Determine environment
id: env
uses: ./.github/actions/determine-environment
# ... provision steps

현재 문제:

  • if: github.event.inputs.environment == 'production' 조건
  • 하지만 deploy job에서 이미 배포했을 수 있음

개선 방안:

  • deploy job은 staging만 배포
  • deploy-production job은 production만 배포
  • 또는 deploy job에서 환경에 따라 분기

현재:

  • DEPLOY_ENVCF_ENV 중복
  • GITHUB_SHAGIT_COMMIT 중복

개선:

  • 하나로 통일
  • 문서화

현재: 각 job마다 개별 설정

validate:
timeout-minutes: 10
provision:
timeout-minutes: 10
deploy:
timeout-minutes: 15
deploy-production:
timeout-minutes: 30

개선: 상수로 정의하거나 주석으로 명확화


  • Setup Composite Action 생성
  • deploy-production Job 최적화
  • Workflow-level 환경 변수 설정
  • Job-level Cloudflare 인증 정보
  • Determine environment Composite Action
  • 환경 변수 중복 제거
  • tmate Session Composite Action
  • 불필요한 Step 제거

  • ✅ 중복 코드: 150줄 → 20줄 (87% 감소)
  • ✅ 총 라인 수: 428줄 → 250줄 (42% 감소)
  • ✅ 유지보수성: 크게 향상
  • ✅ CI 시간: deploy-production에서 ~5-10분 절약
  • ✅ 리소스 사용: 불필요한 작업 제거
  • ✅ 코드 구조: 명확하고 간결
  • ✅ 재사용성: Composite Actions로 향상

작성 일시: 2026-01-28
우선순위: High
예상 소요 시간: 2-3시간 (단계별 구현)