Day 3 - GitHub Actions CI
코드 push → 테스트 → 이미지 빌드 → ECR push → 매니페스트 갱신
목차
학습 목표
- PR 시 테스트, main 머지 시 이미지 배포 파이프라인을 구성한다
- GitHub OIDC로 AWS ECR에 푸시한다
- 이미지 태그 변경을 GitOps 저장소에 커밋한다
CI 단계 설계
| 이벤트 | 동작 |
|---|---|
pull_request | 빌드·테스트 (이미지 push 생략 가능) |
push to main | 테스트 → ECR push → GitOps 태그 업데이트 |
권한 · Secrets
| 이름 | 용도 |
|---|---|
AWS_ROLE_ARN | Day 1 OIDC Role ARN (Repository Variable/Secret) |
AWS_REGION | 예: ap-northeast-2 |
ECR_REPOSITORY | 예: spring-demo |
GITOPS_TOKEN | GitOps 저장소 쓰기용 PAT (또는 deploy key) |
GITOPS_REPO | org/spring-demo-gitops |
OIDC를 쓰면 장기 Access Key를 저장소에 넣지 않아도 됩니다.
워크플로 권한:
permissions:
id-token: write # OIDC
contents: read
워크플로 예시
.github/workflows/ci.yml:
name: ci
on:
pull_request:
push:
branches: [main]
env:
AWS_REGION: ${{ vars.AWS_REGION }}
ECR_REPOSITORY: ${{ vars.ECR_REPOSITORY }}
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
cache: gradle
- name: Test
run: ./gradlew test --no-daemon
build-and-push:
needs: test
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v4
- name: Configure AWS credentials (OIDC)
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
aws-region: ${{ env.AWS_REGION }}
- name: Login to Amazon ECR
id: ecr
uses: aws-actions/amazon-ecr-login@v2
- name: Set image meta
id: meta
run: |
echo "tag=${GITHUB_SHA::8}" >> "$GITHUB_OUTPUT"
echo "image=${{ steps.ecr.outputs.registry }}/${ECR_REPOSITORY}" >> "$GITHUB_OUTPUT"
- name: Build and push
uses: docker/build-push-action@v6
with:
context: .
push: true
tags: |
${{ steps.meta.outputs.image }}:${{ steps.meta.outputs.tag }}
${{ steps.meta.outputs.image }}:latest
- name: Update GitOps manifest
env:
GITOPS_TOKEN: ${{ secrets.GITOPS_TOKEN }}
GITOPS_REPO: ${{ secrets.GITOPS_REPO }}
IMAGE: ${{ steps.meta.outputs.image }}:${{ steps.meta.outputs.tag }}
run: |
git clone "https://x-access-token:${GITOPS_TOKEN}@github.com/${GITOPS_REPO}.git" gitops
cd gitops
# kustomize 사용 시
cd apps/spring-demo
kustomize edit set image "spring-demo=${IMAGE}"
# 또는 sed로 deployment image 라인 교체
git config user.name "github-actions"
git config user.email "actions@github.com"
git add .
git commit -m "chore: deploy spring-demo ${IMAGE}" || exit 0
git push
kustomization.yaml 예시:
resources:
- deployment.yaml
- service.yaml
images:
- name: spring-demo
newName: 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/spring-demo
newTag: "dev"
매니페스트 자동 갱신
핵심 원칙 (GitOps):
- CI는 클러스터에 직접 kubectl apply 하지 않는다 (가능하면)
- CI는 이미지 빌드 + GitOps 저장소의 이미지 태그 변경만 한다
- 실제 배포 동기화는 Argo CD (Day 4)
대안: CI가 kubectl set image 하는 방식은 빠르지만 드리프트·감사 추적이 약해집니다.
브랜치 전략
| 브랜치 | 용도 |
|---|---|
feature/* | 개발 · PR |
main | 프로덕션(또는 staging) 이미지 빌드 |
(선택) develop | 스테이징 클러스터용 |
PR 템플릿에 테스트·스크린샷·롤백 계획을 적도록 권장합니다. (Git Day 3)
실습 체크리스트
-
testjob이 PR에서 통과 - OIDC로 ECR 로그인 성공
-
mainpush 시:sha태그 이미지 푸시 - GitOps 저장소에 이미지 태그 커밋 확인
- Actions 로그에서 실패 시 원인 분류 (테스트 / 권한 / 네트워크)