Skip to content

Latest commit

Β 

History

History
240 lines (159 loc) Β· 6.49 KB

File metadata and controls

240 lines (159 loc) Β· 6.49 KB

GitHub Actions CI/CD μ„€μ • κ°€μ΄λ“œ

Build-Up ν”„λ‘œμ νŠΈμ˜ GitHub Actions CI/CD νŒŒμ΄ν”„λΌμΈ μ„€μ • κ°€μ΄λ“œμž…λ‹ˆλ‹€.

πŸ“‹ λͺ©μ°¨

  1. CI νŒŒμ΄ν”„λΌμΈ κ°œμš”
  2. ν•„μˆ˜ μ„€μ •
  3. 선택적 μ„€μ •
  4. GitHub Secrets 등둝 방법
  5. CD νŒŒμ΄ν”„λΌμΈ μ„€μ •

CI νŒŒμ΄ν”„λΌμΈ κ°œμš”

μžλ™ μ‹€ν–‰ 쑰건

  • Pull Request: main, develop 브랜치둜의 PR 생성 μ‹œ
  • Push: main, develop λΈŒλžœμΉ˜μ— 직접 ν‘Έμ‹œ μ‹œ

CI μž‘μ—… 흐름

1. μ½”λ“œ 체크아웃
2. Java 21 μ„€μ •
3. ν…ŒμŠ€νŠΈ μ‹€ν–‰ (H2 λ©”λͺ¨λ¦¬ DB μ‚¬μš©)
4. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λΉŒλ“œ
5. JAR μ•„ν‹°νŒ©νŠΈ μ—…λ‘œλ“œ
6. Docker 이미지 λΉŒλ“œ (PR인 경우)
7. Docker μ»¨ν…Œμ΄λ„ˆ ν…ŒμŠ€νŠΈ (PR인 경우)
8. Discord μ•Œλ¦Ό (선택사항)

ν•„μˆ˜ μ„€μ •

βœ… μžλ™ μ œκ³΅λ˜λŠ” ν…ŒμŠ€νŠΈ ν™˜κ²½ λ³€μˆ˜

CI νŒŒμ΄ν”„λΌμΈμ€ λ³„λ„μ˜ GitHub Secrets μ„€μ • 없이도 정상 λ™μž‘ν•©λ‹ˆλ‹€.

ν…ŒμŠ€νŠΈ 및 λΉŒλ“œμ— ν•„μš”ν•œ ν™˜κ²½ λ³€μˆ˜λŠ” μžλ™μœΌλ‘œ μ œκ³΅λ©λ‹ˆλ‹€:

JWT_SECRET: test-secret-key-min-256-bits-long-for-hs256-algorithm-test
ENCRYPTION_KEY: 0123456789abcdef0123456789abcdef

⚠️ 주의: μœ„ 값듀은 ν…ŒμŠ€νŠΈ μ „μš©μ΄λ©°, μ ˆλŒ€ 운영 ν™˜κ²½μ—μ„œ μ‚¬μš©ν•˜λ©΄ μ•ˆ λ©λ‹ˆλ‹€.


선택적 μ„€μ •

1. Discord μ•Œλ¦Ό (ꢌμž₯)

λΉŒλ“œ κ²°κ³Όλ₯Ό Discord둜 λ°›κ³  싢은 경우 μ„€μ •ν•©λ‹ˆλ‹€.

μ„€μ •ν•˜μ§€ μ•Šμ•„λ„ CIλŠ” 정상 λ™μž‘ν•©λ‹ˆλ‹€.

Discord Webhook 생성

  1. Discord μ„œλ²„ μ„€μ • β†’ 연동 β†’ Webhooks
  2. "μƒˆ μ›Ήν›…" 클릭
  3. μ›Ήν›… 이름 μ„€μ • (예: "Build-Up CI")
  4. 채널 선택
  5. "μ›Ήν›… URL 볡사" 클릭

GitHub에 Webhook 등둝

Settings β†’ Secrets and variables β†’ Actions β†’ New repository secret

  • Name: DISCORD_WEBHOOK
  • Value: λ³΅μ‚¬ν•œ Webhook URL

2. 운영 ν™˜κ²½ 배포 (CD νŒŒμ΄ν”„λΌμΈ μ‚¬μš© μ‹œ)

CD νŒŒμ΄ν”„λΌμΈμ„ μ‚¬μš©ν•˜μ—¬ μ‹€μ œ μ„œλ²„μ— λ°°ν¬ν•˜λ €λŠ” 경우 μ•„λž˜ Secretsκ°€ ν•„μš”ν•©λ‹ˆλ‹€.

ν•„μˆ˜ Secrets

Secret 이름 μ„€λͺ… μ˜ˆμ‹œ
JWT_SECRET 운영용 JWT λΉ„λ°€ν‚€ openssl rand -hex 32 κ²°κ³Ό
ENCRYPTION_KEY 운영용 μ•”ν˜Έν™” ν‚€ openssl rand -hex 32 κ²°κ³Ό
SPRING_DATASOURCE_URL 운영 DB URL jdbc:mysql://...
SPRING_DATASOURCE_USERNAME DB μ‚¬μš©μžλͺ… buildup_user
SPRING_DATASOURCE_PASSWORD DB λΉ„λ°€λ²ˆν˜Έ your_password
ADMIN_USERNAME κ΄€λ¦¬μž 계정λͺ… admin
ADMIN_PASSWORD κ΄€λ¦¬μž λΉ„λ°€λ²ˆν˜Έ your_password
AWS_S3_ENABLED S3 ν™œμ„±ν™” μ—¬λΆ€ true
AWS_S3_BUCKET S3 버킷 이름 buildup-files
AWS_REGION AWS 리전 ap-northeast-2
AWS_ACCESS_KEY_ID AWS μ•‘μ„ΈμŠ€ ν‚€ AKIA...
AWS_SECRET_ACCESS_KEY AWS λΉ„λ°€ ν‚€ ...
DOCKERHUB_USERNAME Docker Hub μ‚¬μš©μžλͺ… your_username
DOCKERHUB_TOKEN Docker Hub 토큰 dckr_pat_...
AWS_EC2_HOST EC2 μ„œλ²„ IP 3.37.234.173
AWS_EC2_USERNAME SSH μ‚¬μš©μžλͺ… ubuntu
AWS_EC2_SSH_KEY SSH Private Key -----BEGIN...

GitHub Secrets 등둝 방법

1. Repository Settings 접속

GitHub Repository β†’ Settings β†’ Secrets and variables β†’ Actions

2. New repository secret 클릭

3. Secret 등둝

  • Name: Secret 이름 (μœ„ ν‘œ μ°Έκ³ )
  • Secret: μ‹€μ œ κ°’ μž…λ ₯

4. 반볡

ν•„μš”ν•œ λͺ¨λ“  Secret을 등둝할 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•©λ‹ˆλ‹€.


ν™˜κ²½ λ³€μˆ˜ 생성 방법

JWT Secret & Encryption Key 생성

# JWT Secret 생성 (32λ°”μ΄νŠΈ)
openssl rand -hex 32

# Encryption Key 생성 (32λ°”μ΄νŠΈ)
openssl rand -hex 32

Docker Hub Token 생성

  1. Docker Hub 둜그인
  2. Account Settings β†’ Security β†’ New Access Token
  3. Token 생성 ν›„ 볡사 (μž¬ν™•μΈ λΆˆκ°€ν•˜λ―€λ‘œ μ•ˆμ „ν•˜κ²Œ 보관)

AWS Credentials 확인

# AWS CLI둜 확인
aws configure list

# λ˜λŠ” ~/.aws/credentials 파일 확인
cat ~/.aws/credentials

CD νŒŒμ΄ν”„λΌμΈ μ„€μ •

CD νŒŒμ΄ν”„λΌμΈ(.github/workflows/cd.yml)은 λΈŒλžœμΉ˜μ— ν‘Έμ‹œλ  λ•Œ μžλ™μœΌλ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€.

μžλ™ 배포 브랜치

브랜치 ν™˜κ²½ Docker νƒœκ·Έ Spring ν”„λ‘œνŒŒμΌ
main Production latest prod
develop Staging develop dev

배포 흐름

1. μ½”λ“œ 체크아웃
2. Java 21 μ„€μ •
3. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λΉŒλ“œ
4. Docker 이미지 λΉŒλ“œ 및 Push
5. .env 파일 생성
6. EC2 μ„œλ²„μ— .env 파일 전솑
7. EC2μ—μ„œ Docker Compose둜 배포
8. ν—¬μŠ€μ²΄ν¬
9. Discord μ•Œλ¦Ό

μˆ˜λ™ 배포

GitHub Actions νƒ­μ—μ„œ CD Pipeline β†’ Run workflowλ₯Ό 톡해 μˆ˜λ™μœΌλ‘œ 배포할 수 μžˆμŠ΅λ‹ˆλ‹€.


νŠΈλŸ¬λΈ”μŠˆνŒ…

1. ν…ŒμŠ€νŠΈ μ‹€νŒ¨: "JWT_SECRET is required"

원인: ν™˜κ²½ λ³€μˆ˜κ°€ μ „λ‹¬λ˜μ§€ μ•ŠμŒ

ν•΄κ²°: CI 파일의 ν™˜κ²½ λ³€μˆ˜ μ„€μ • 확인 (μžλ™μœΌλ‘œ μ„€μ •λ˜μ–΄μ•Ό 함)

2. Docker λΉŒλ“œ μ‹€νŒ¨

원인: Docker Hub 자격 증λͺ… 문제

ν•΄κ²°:

  • CD νŒŒμ΄ν”„λΌμΈμ—μ„œλ§Œ Docker Hub 둜그인 ν•„μš”
  • CI νŒŒμ΄ν”„λΌμΈμ€ 둜컬 λΉŒλ“œλ§Œ μˆ˜ν–‰

3. Discord μ•Œλ¦Όμ΄ μ˜€μ§€ μ•ŠμŒ

원인: DISCORD_WEBHOOK Secret λ―Έμ„€μ •

ν•΄κ²°:

  • Discord Webhook URL을 GitHub Secrets에 등둝
  • λ˜λŠ” μ•Œλ¦Ό 없이 CI 계속 μ‚¬μš© (선택사항)

4. 배포 μ‹€νŒ¨: SSH μ—°κ²° 였λ₯˜

원인: EC2 SSH ν‚€ λ˜λŠ” 호슀트 정보 였λ₯˜

ν•΄κ²°:

  • AWS_EC2_HOST: μ •ν™•ν•œ IP μ£Όμ†Œ 확인
  • AWS_EC2_SSH_KEY: Private Key 전체 λ‚΄μš© 볡사 (BEGIN/END 포함)
  • EC2 λ³΄μ•ˆ κ·Έλ£Ήμ—μ„œ GitHub Actions IP ν—ˆμš© (λ˜λŠ” 전체 ν—ˆμš©)

참고 자료


μš”μ•½

βœ… CI만 μ‚¬μš© (PR ν…ŒμŠ€νŠΈ)

  • ν•„μš”ν•œ μ„€μ •: μ—†μŒ (μžλ™ λ™μž‘)
  • 선택적 μ„€μ •: DISCORD_WEBHOOK

πŸš€ CDκΉŒμ§€ μ‚¬μš© (μžλ™ 배포)

  • ν•„μš”ν•œ μ„€μ •: μœ„μ˜ λͺ¨λ“  운영 ν™˜κ²½ Secrets
  • μΆ”κ°€ μ„€μ •: Docker Hub, AWS EC2, SSH ν‚€

μ²˜μŒμ—λŠ” CI만 μ„€μ •ν•˜κ³ , 배포가 ν•„μš”ν•  λ•Œ CDλ₯Ό μΆ”κ°€ν•˜λŠ” 것을 ꢌμž₯ν•©λ‹ˆλ‹€.