임대일

Github Action: 여러 개의 디렉터리 중에서 Github Action 설정하기(feat. 스프링 부트) 본문

GithubAction

Github Action: 여러 개의 디렉터리 중에서 Github Action 설정하기(feat. 스프링 부트)

limdae94 2024. 6. 17. 19:23

깃허브에서 리포지토리를 생성하고 내가 생성한 스프링 부트 프로젝트를 리포지토리에 어떻게 추가하느냐에 따라서 Github Action 설정 경로가 다르다. 대부분은 루트 디렉터리에 생성한 스프링 부트 프로젝트를 구성 여부에 따라 아래와 같이 나뉘게 된다.

 

 

1. 루트 디렉터리에 스프링 부트 프로젝트 구성하기

루트 디렉터리 안에 바로 스프링 부트 프로젝트가 구성

루트 디렉터리에서 스프링 부트 프로젝트를 구성하고 Github Action 설정은 정말 많은 예제가 존재하고 비교적 쉽고 빠르게 Github Action 으로 CI/CD 를 설정할 수 있다. 따라서 해당 방식의 설명은 넘어간다.

 

2. 루트 디렉터리 안에 여러 개의 디렉터리로 구성하기

루트 디렉터리 하위에 여러 디렉터리가 존재

 

일반적으로 루트 디렉터리 하위에 여러 개의 디렉터리가 존재하는 경우는 프로젝트 리포지토리인 경우이다. 이 방식에서 Github Action 을 설정하려면 하위 디렉터리 경로에 알맞게 제대로 작성해야만 CI/CD 를 구성할 수 있다. 그림과 같이 두 개의 디렉터리(.github/workflows, cicd)와 한 개의 파일(.md)으로 구성되어 있을 때, 아래와 같이 작성하면 실행할 수 있다. 

 

Github Action 에서 제공되는 Actions secrets and variables 으로 치명적인 정보를 관리할 수 있다. 

Repository secrets

 

 

 

 

내가 작성한 Github Action 의 특징은 AWS EC2 안에 배포에 필요한 .jar 파일만 존재한다. Github Action 에서는 스프링 부트 프로젝트를 실행한 배포 파일인 .jar 파일을 AWS EC2 으로 전달하여 다방면의 이점을 가질 수 있다.

 

name: Deploy To EC2

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Github Repository 파일 불러오기
        uses: actions/checkout@v4

      - name: JDK 17버전 설치
        uses: actions/setup-java@v4
        with:
          distribution: temurin
          java-version: 17

      - name: application.yml 파일 만들기
        run: echo "${{ secrets.APPLICATION_PROPERTIES }}" > ./src/main/resources/application.yml
        working-directory: ./cicd

      - name: gradlew 권한 변경하기
        run: chmod +x ./gradlew
        working-directory: ./cicd

      - name: 테스트 및 빌드하기
        run: ./gradlew clean build
        working-directory: ./cicd

      - name: 빌드된 파일 이름 변경하기
        run: mv ./cicd/build/libs/*SNAPSHOT.jar ./project.jar

      - name: SCP로 EC2에 빌드된 파일 전송하기
        uses: appleboy/scp-action@v0.1.7
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ${{ secrets.EC2_USERNAME }}
          key: ${{ secrets.EC2_PRIVATE_KEY }}
          source: project.jar
          target: /home/ubuntu/cicd/tobe

      - name: SSH로 EC2에 접속하기
        uses: appleboy/ssh-action@v1.0.3
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ${{ secrets.EC2_USERNAME }}
          key: ${{ secrets.EC2_PRIVATE_KEY }}
          script_stop: true
          script: |
            rm -rf /home/ubuntu/cicd/current
            mkdir /home/ubuntu/cicd/current
            mv /home/ubuntu/cicd/tobe/project.jar /home/ubuntu/cicd/current/project.jar
            cd /home/ubuntu/cicd/current
            sudo fuser -k -n tcp 8080 || true
            nohup java -jar project.jar > ./output.log 2>&1 & 
            rm -rf /home/ubuntu/cicd/tobe

 

 

 

생성된 project.jar

 

AWS CodeDeploy 와 AWS S3 을 구성하여 빌드 파일을 실행할 수 있다. 빌드 파일을 배포하는 방법은 다음글을 참고하자.