일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- querydls
- testcode
- 프로그래머스
- EC2
- aop
- 어노테이션
- rabbitmq
- docker
- algorithm
- Redis
- JWT
- springboot
- trouble shooting
- Kafka
- 아키텍처
- 객체지향원칙
- 테스트 코드
- JPA
- Til
- swagger
- Intellij
- 유효성 검사
- Github Actions
- spring boot
- 멀티 모듈
- CI/CD
- MSA
- AWS
- Java
- DevOps
- Today
- Total
개발노트
25.04.21 Github Container Registry 사용하기 본문
개요
팀 프로젝트에서 CI/CD를 진행할 때 Docker Hub의 무료 계정을 사용하면, 일부 이미지를 제외하고는 반드시 public으로 설정해야 해서 내 프로젝트 이미지가 외부에 노출되는 점이 다소 불안하게 느껴졌다.
그러다 검색 중에 GitHub Container Registry(GHCR)를 알게 되었고, 팀 리포지토리 내에서 private으로 이미지를 관리할 수 있다는 점이 마음에 들었다.
이번 프로젝트에서는 이미지 관리를 GitHub Container Registry를 통해 진행해보려 한다.
Github Container Registry 주요 특징
1. 리포지토리 기반 접근 제어 (권한 관리가 용이)
- GitHub 계정 또는 조직의 리포지토리와 연동되어 있어,
- 이미지에 대한 접근 권한을 GitHub 리포지토리 권한 기준으로 제어 가능.
- 팀 단위로 협업 시, 이미지 접근 제어를 따로 설정할 필요 없이 리포지토리 권한으로 통합 관리 가능.
- 예를 들어 private 리포지토리에 연결된 컨테이너 이미지는 외부에서 접근 불가.
2. Private 이미지 저장 무료
- Docker Hub는 무료 계정에서 private 이미지를 1개밖에 못 쓰거나 제한이 있지만,
- GHCR은 GitHub의 private 리포지토리에서 사용하는 한, private 이미지도 무료로 저장 가능.
3. GitHub Actions와의 자연스러운 연동
- CI/CD 파이프라인을 GitHub Actions로 구성할 경우,
- 빌드한 이미지를 바로 GHCR에 push 가능.
- 액세스 토큰 없이 GITHUB_TOKEN으로 인증 가능.
4. 도메인 구조
- 이미지 경로:
ghcr.io/<owner>/<image-name>- 예: ghcr.io/devteam10/backend-api
5. 다양한 컨테이너 포맷 지원
- Docker 이미지 외에도 OCI(Open Container Initiative) 이미지 포맷 지원.
세팅
https://github.com/settings/tokens/new?scopes=write:packages
GitHub · Build and ship software on a single, collaborative platform
Join the world's most widely adopted, AI-powered developer platform where millions of developers, businesses, and the largest open source community build software that advances humanity.
github.com
경로로 접속해 Packeages를 사용하기 위한 토큰을 발급받아야한다.
wokrflow, package를 사용예정이기 아리 그림 처럼 체크 항목을 체크해준다.
완려되면 ghp_ 로 시작하는 토큰을 발급받는다.
안 잃어버리게 잘 관리해주자
Docker 로그인 시도
package의 주소는 ghcr.io 이다.
아이디는 개인 깃허브 이메일이나 사용자명을 적어주면된다.
비밀번호는 위에서 발급받은 토큰이다.
이렇게되면 준비는 모두 끝났다!
ci 과정에 해당 ghcr로 이미지를 업로드하는 과정을 추가해보겠다.
CI 코드 변경
name: 이선좌 - Multi-Module CI
on:
push:
branches:
- master
- dev
- feature/#327
pull_request:
branches:
- master
- dev
jobs:
build:
name: Multi-Module Build & Docker Push
runs-on: ubuntu-latest
strategy: # 각 서비스 모듈에 대해 병렬로 빌드를 진행
matrix: # 여기서 정의된 모듈들에 대해 각각 빌드 작업을 실행
module:
- com.taken_seat.eureka-service
- com.taken_seat.common-service
- com.taken_seat.auth-service
- com.taken_seat.coupon-service
- com.taken_seat.queue-service
- com.taken_seat.booking-service
- com.taken_seat.performance-service
- com.taken_seat.payment-service
- com.taken_seat.review-service
- com.taken_seat.gateway-service
fail-fast: true # 하나의 작업이 실패하면 나머지 작업 취소
max-parallel: 5 # 최대 5개의 모듈을 병렬로 빌드 진행
steps:
- name: 소스 코드 체크아웃
uses: actions/checkout@v4 # GitHub Actions에서 제공하는 `checkout` 액션 사용
- name: JDK 17 설정
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '17'
- name: Gradle 실행 권한 부여
run: chmod +x ./gradlew
- name: 환경 변수 설정 # Docker 빌드 및 실행에 필요한 환경 변수 설정
run: |
echo "SPRING_DATASOURCE_URL=${{ secrets.SPRING_DATASOURCE_URL }}" >> $GITHUB_ENV
echo "SPRING_DATASOURCE_USERNAME=${{ secrets.SPRING_DATASOURCE_USERNAME }}" >> $GITHUB_ENV
echo "SPRING_DATASOURCE_PASSWORD=${{ secrets.SPRING_DATASOURCE_PASSWORD }}" >> $GITHUB_ENV
echo "SPRING_DATASOURCE_DRIVER_CLASS_NAME=${{ secrets.SPRING_DATASOURCE_DRIVER_CLASS_NAME }}" >> $GITHUB_ENV
echo "JWT_SECRET=${{ secrets.JWT_SECRET }}" >> $GITHUB_ENV
echo "LOKI_URL=${{ secrets.LOKI_URL }}" >> $GITHUB_ENV
- name: Gradle 빌드 (서비스 모듈) # 각 모듈에 대해 Gradle 빌드를 실행
run: ./gradlew :${{ matrix.module }}:build --parallel --no-daemon # 병렬로 빌드 실행
- name: Docker 로그인 (GitHub Container Registry) # GitHub Container Registry에 로그인
uses: docker/login-action@v2 # `docker/login-action` 사용
with:
registry: ghcr.io # GitHub Container Registry URL
username: ${{ secrets.MY_GITHUB_USERNAME }}
password: ${{ secrets.MY_GITHUB_TOKEN }}
- name: Docker 이미지 빌드 및 푸시
run: |
ORG_NAME=toolatebro # Docker 이미지의 조직 이름 설정
MODULE_NAME=$(basename "${{ matrix.module }}" | sed 's/com.taken_seat.//') # 모듈 이름에서 접두어 제거
MODULE_PATH=${{ matrix.module }}
IMAGE_NAME=ghcr.io/${ORG_NAME}/${MODULE_NAME}:latest # Docker 이미지 이름 설정
# Docker 이미지 빌드 명령어 실행
docker build -t $IMAGE_NAME -f $MODULE_PATH/Dockerfile $MODULE_PATH
# Docker 이미지를 GitHub Container Registry에 푸시
docker push $IMAGE_NAME
이번 프로젝트는 MSA 아키텍처 기반으로 구성되어있다.
하나의 루트 Gradle 프로젝트 아래에 각 서비스들을 하위 모듈로 구성해뒀다.
auth-service, payment-service, booking-service 등 다양한 도메인 서비스들이 각각의 하위 모듈로 존재한다.
이러한 구조에서는 모든 모듈을 하나의 워크플로우에서 순차적으로 빌드하는 방식은 시간이 너무 오래걸리고 비효율적인 거 같다고 생각 해서 GitHub Actions의 matrix 전략과 병렬 빌드 기능을 활용해, 각 하위 모듈을 병렬로 최대 5개까지 빌드하도록 설정했다.
빌드가 완료된 모듈은 Dockerfile을 기준으로 Docker 이미지로 빌드한 뒤, GitHub Container Registry(GHCR)에 푸시한다.
병렬 진행 좋은듯
이제 정상적으로 푸시되었는지 확인해보자
결과 확인
정상적으로 Packages 에 컨테이너들이 등록되었다!
이제 배포 환경을 구성해 가져오게 해보겠다.
'DevOps' 카테고리의 다른 글
25.03.31 Spring Boot Acturator , Prometheus, Grafana (0) | 2025.03.31 |
---|---|
25.03.30 모니터링 시스템 (0) | 2025.03.30 |
Github Actions 와 CI/CD 란? (0) | 2025.03.04 |
25.03.03 GitHub Actions(CI / CD)와 Docker로 AWS에 자동 배포하기 (2) (0) | 2025.03.03 |
25.02.28 GitHub Actions(CI / CD)와 Docker로 AWS에 자동 배포하기 (1) (0) | 2025.02.28 |