서버를 어떻게 효율적으로 띄울까 하다가 여러 방식을 찾아보았는데
개발 서버와 운영 서버를 방식이 가장 일반적이었다
하지만 돈없는 가난한 대학생은 여러 서버를 띄울 형편이 안되니...
로컬에서 테스트 코드까지 빡세게 돌린 것들만
하나의 운영 서버에 띄우기로 결심했다
고로 프론트엔드, 백엔드, 배포 레포지토리 3개로 나누었고
아키텍쳐는 다음과 같다
📚 서비스 아키텍쳐
아직 프론트는 건들지 않아서 백엔드 서버와 배포 단계만 진행중이다
backend/main 브랜치에 push가 일어나면
깃헙 액션을 통해 스프링 도커 이미지를 빌드해 도커 허브에 push 한다
이후 deploy/main 브랜치에 push가 일어나거나, 직접 action 을 실행시키면
배포 쉘 스크립트 및 docker-compose를 통해 배포가 일어난다
그러니까 마지막에 결국 개발자의 승인이 필요한거니까
여기서는 Continuous Deployment 보다는 Continuous Delivery가 맞을 거 같다
AWS S3 나 Github Runner를 이용하면 승인없는 자동배포도 가능한데
이거랑 무중단 배포는 나중에 해봐야지
🚀 Github Actions 생성
📝 docker-image-publish.yml
name: Push Image to DockerHub
on:
push:
branches: [main]
# Publish semver tags as releases.
tags: ['v*.*.*']
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
#JDK Setting
- uses: actions/checkout@v3
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
#Gradle Caching
- name: Cache Gradle packages
uses: actions/cache@v2
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
restore-keys: ${{ runner.os }}-gradle-
#Grant gradlew Permission
- name: Grant execute permission for gradlew
run: chmod +x gradlew
#Create dotenv file
- name: Make env file
run: |
touch ./.env
echo "$ENV_PROPERTIES_DEV" > ./.env
env:
ENV_PROPERTIES_DEV: ${{ secrets.ENV_PROPERTIES_DEV }}
#Gradle Build
- name: Build with Gradle
run: ./gradlew build -x test
#Image Tagging
- name: Docker meta
id: docker_meta
uses: crazy-max/ghaction-docker-meta@v1
with:
images: ${{ secrets.DOCKER_REPOSITORY }}/hifi-dev
tag-semver: |
{{version}}
{{major}}.{{minor}}
#Docker Buildx Setup
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
#Login to DockerHub
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
#Docker Build and Push
- name: Docker build & push
uses: docker/build-push-action@v2
with:
context: .
file: ./Dockerfile
platforms: linux/amd64
push: true
tags: ${{ steps.docker_meta.outputs.tags }}
labels: ${{ steps.docker_meta.outputs.labels }}
전체 코드는 이렇다
📖 실행 과정
- JDK 11 버전으로 세팅을 시작한다
- Gradle Caching 이라는 과정이 있는데 반드시 필요한 것은 아니지만
캐싱 사용 시 성능이 2~30퍼센트 정도 빨라진다 - gradlew 빌더를 사용하기 위해 chmod 로 권한을 부여한다
- 환경변수 파일을 생성한다 secrets 는 레포지토리의 Settings 에서 설정 가능하다. 후술
- gradlew 빌드를 진행한다
- 도커 이미지에 태그를 붙힌다
- 도커 빌더 셋업
- 도커 이미지 푸시를 위해 도커 허브에 로그인한다, 비밀번호로 토큰을 사용하는 것을 권장한다
- 도커 파일을 통해 도커 이미지 빌드를 하고 이것을 내 레포지토리에 푸시한다
🚀 Github Actions 실행 및 로그
내 레포지토리 -> Settings -> Security(Secrets) -> Actions 탭에서
깃헙 액션 용 환경 변수를 설정할 수 있다
한번 설정하면 다시 못 보니까 내용을 잘 기억하거나 업데이트를 통해 덮어쓰기 해주어야 한다
가져다 쓸 때는 깃헙 액션 yml 에서 ${{secrets.환경변수이름}} 으로 가져와 쓸 수 있다
특히 EC2 서버 접속을 위한 pem 키 같은 것들을 여기다가 잘 입력해주자
실수로 노출시키면 서버가 공격 당할 수도 있다
main 브랜치에서 변화를 감지하면
이렇게 Actions 탭에서 액션이 실행되는 것을 볼 수 있다
실제 배포 액션 성공한 모습
도커 허브에도 잘 올라간 모습
깃헙 액션이 실행 도중 실패하면 에러 메세지 뜨니까 그것으로 확인 잘 하면 고치기 쉽다
보통 컴파일 에러, Docker hub 로그인 에러, 환경 변수 설정 안해서 생기는 에러 등등
잘 확인해보자
🔍 Series
- [Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 1 (깃헙 액션 사용법)
- [Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 2 (스프링 Gradle 빌드 + 도커 푸시)
- [Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 3 (AWS EC2 서버에서 배포)
'🏭 Infra > ⚡ Github Actions' 카테고리의 다른 글
[Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 3 (AWS EC2 서버에서 배포) (0) | 2022.08.08 |
---|---|
[Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 1 (깃헙 액션 사용법) (0) | 2022.08.07 |