개념

CI 파이프라인 전체 흐름

PR 생성 시
  └── 빌드 + 테스트 + hadolint (Dockerfile 검사)
      └── 실패하면 merge 못 하게 막음

main 머지 시 (dev 배포)
  └── Docker 빌드
      └── AWS OIDC로 인증 (Access Key 절대 사용 금지!)
          └── ECR push (SHA 태그)
              └── Config 레포 overlays/dev/ image tag 갱신
                  └── ArgoCD가 감지 → dev 자동 배포

tag 푸시 시 (prod 배포) → v* 형식 (예: v1.0.0)
  └── Docker 빌드
      └── AWS OIDC로 인증
          └── ECR push (SHA 태그)
              └── Config 레포 overlays/prod/ image tag 갱신
                  └── ArgoCD가 감지 → prod 자동 배포

OIDC 인증 개념

왜 Access Key를 안 쓰는지?

Access Key를 GitHub Secret에 넣으면
→ 키가 유출될 경우 AWS 계정 전체가 위험
→ 키 만료 관리도 번거로움

OIDC 방식은?
→ GitHub이 "나 team3-app 레포의 main 브랜치야" 라는
  토큰을 AWS에 제출
→ AWS IAM이 확인 후 임시 자격증명을 발급
→ 키를 저장할 필요가 없음

Terraform IAM 모듈에서 만든 Role ARN이 여기서 사용됨
→ terraform output github_actions_role_arn 으로 확인

워크플로 파일 위치

team3-app/
└── .github/
    └── workflows/
        ├── ci.yml        # PR 시 검증
        └── cd.yml        # main 머지 / tag 푸시 시 배포

ci.yml 구성

트리거 설정

ci.yml (PR 검증)
  on:
    pull_request:
      branches: [main]

cd.yml (배포)
  on:
    push:
      branches: [main]   # dev 배포
      tags: ['v*']       # prod 배포

배포 Job 안에서 환경 분기
  github.ref == 'refs/heads/main' → dev
  startsWith(github.ref, 'refs/tags/') → prod

필수 permissions

OIDC 토큰을 요청하려면 워크플로에
id-token: write 권한이 필요함
이게 없으면 AWS 인증이 아예 안됨

contents: read 도 함께 설정

Job 1 — PR 시 검증

실행 순서:
1. 코드 체크아웃
2. JDK 17 설정
3. Maven 빌드 + 테스트
4. hadolint로 Dockerfile 검사
   → Dockerfile 작성 규칙 위반 시 실패
   → 찾아볼 것: "hadolint github actions"

⚠️ 테스트 실패하면 ECR push 못 가게 막아야 함
   needs 키워드로 Job 의존성 설정

Job 2 — main 머지 시 배포