gengminy
갱미니의 코딩일지
gengminy
전체 방문자
오늘
어제
  • 분류 전체보기 (61)
    • 🚀 프로젝트 (16)
      • 🎸 고스락 티켓 (4)
      • 🌞 내친소 (5)
      • 🥁 두둥 (7)
    • 📡 백엔드 (31)
      • 🌱 Spring Boot (13)
      • 🐱 Nest.js (10)
      • ⭐ Node.js (8)
    • 🏭 Infra (11)
      • ⚙ 준비를 위한 준비 (2)
      • 🥑 AWS (3)
      • 🐳 Docker (3)
      • ⚡ Github Actions (3)
    • 🌊 프론트엔드 (1)
      • 🌌 React.js (1)
    • 😎 주저리 (2)

블로그 메뉴

  • 💻Github
  • 📸Instagram
  • ✨Blog

공지사항

인기 글

태그

  • JSON
  • github
  • nodejs
  • 도커
  • docker
  • 네스트
  • Spring
  • AWS
  • 스프링부트
  • SlackAPI
  • oauth2
  • 깃헙액션
  • springboot
  • nest
  • OAuth
  • GithubActions
  • 스프링
  • nestjs
  • JWT
  • 슬랙알림

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
gengminy

갱미니의 코딩일지

[Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 2 (스프링 Gradle 빌드 + 도커 푸시)
🏭 Infra/⚡ Github Actions

[Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 2 (스프링 Gradle 빌드 + 도커 푸시)

2022. 8. 8. 14:19

쓰면 쓸수록 생각보다 재미있는 깃헙 액션

 

서버를 어떻게 효율적으로 띄울까 하다가 여러 방식을 찾아보았는데

개발 서버와 운영 서버를 방식이 가장 일반적이었다

 

하지만 돈없는 가난한 대학생은 여러 서버를 띄울 형편이 안되니...

로컬에서 테스트 코드까지 빡세게 돌린 것들만

하나의 운영 서버에 띄우기로 결심했다

 

고로 프론트엔드, 백엔드, 배포 레포지토리 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 }}

전체 코드는 이렇다

 

📖 실행 과정

  1. JDK 11 버전으로 세팅을 시작한다
  2. Gradle Caching 이라는 과정이 있는데 반드시 필요한 것은 아니지만
    캐싱 사용 시 성능이 2~30퍼센트 정도 빨라진다
  3. gradlew 빌더를 사용하기 위해 chmod 로 권한을 부여한다
  4. 환경변수 파일을 생성한다 secrets 는 레포지토리의 Settings 에서 설정 가능하다. 후술
  5. gradlew 빌드를 진행한다
  6. 도커 이미지에 태그를 붙힌다
  7. 도커 빌더 셋업
  8. 도커 이미지 푸시를 위해 도커 허브에 로그인한다, 비밀번호로 토큰을 사용하는 것을 권장한다
  9. 도커 파일을 통해 도커 이미지 빌드를 하고 이것을 내 레포지토리에 푸시한다

 

 

🚀 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
    '🏭 Infra/⚡ Github Actions' 카테고리의 다른 글
    • [Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 3 (AWS EC2 서버에서 배포)
    • [Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 1 (깃헙 액션 사용법)
    gengminy
    gengminy
    코딩

    티스토리툴바