본문으로 건너뛰기

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_ARNDay 1 OIDC Role ARN (Repository Variable/Secret)
AWS_REGION예: ap-northeast-2
ECR_REPOSITORY예: spring-demo
GITOPS_TOKENGitOps 저장소 쓰기용 PAT (또는 deploy key)
GITOPS_REPOorg/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):

  1. CI는 클러스터에 직접 kubectl apply 하지 않는다 (가능하면)
  2. CI는 이미지 빌드 + GitOps 저장소의 이미지 태그 변경만 한다
  3. 실제 배포 동기화는 Argo CD (Day 4)

대안: CI가 kubectl set image 하는 방식은 빠르지만 드리프트·감사 추적이 약해집니다.


브랜치 전략

브랜치용도
feature/*개발 · PR
main프로덕션(또는 staging) 이미지 빌드
(선택) develop스테이징 클러스터용

PR 템플릿에 테스트·스크린샷·롤백 계획을 적도록 권장합니다. (Git Day 3)


실습 체크리스트

  1. test job이 PR에서 통과
  2. OIDC로 ECR 로그인 성공
  3. main push 시 :sha 태그 이미지 푸시
  4. GitOps 저장소에 이미지 태그 커밋 확인
  5. Actions 로그에서 실패 시 원인 분류 (테스트 / 권한 / 네트워크)

관련 문서

그래프 뷰

그래프 데이터 로딩 중…
현재: Day 3 - GitHub Actions CI
노드 클릭 → 이동 · 드래그 → 위치 조정