상세 컨텐츠

본문 제목

실전프로젝트를 시작하면 추가한 새로운 기능

WIL

by kyuhyun95 2022. 9. 4. 21:36

본문

이번주차에 깃 액션을 맡아서 하게 되었다.

깃액션이란 깃허브에서 CI(Continuous Integration, 지속 통합)와 CD(Continuous Deployment, 지속 배포)를 위해 워크플로우 자동화 기능을 제공하는 서비스를 말한다.

 

이 깃액션을 이용하여 깃 main 브랜치에 파일들이 머지 될때마다 main 브랜치의 레포지토리들을 자동으로 빌드하여 서버에 배포하는 기능을 만들어보기로 하였다.

 

먼저 빌드를 위해서는 깃이그노어 처리를 해주어 깃 레포지토리에 올라가지 않은 application.properties 파일을 빌드전 생성해 주는 로직을 구현할 필요가 있었다.

이를 위해 settings 탭에 보이는 secrets/action 경로에 properties 값을 넣어주었다.

이곳에 properties 값을 넣어주는 이유는 properties에 민감한 정보들이 담겨있기에 깃에서 다른 누군가가 확인할 수 없도록 하기 위함이었다.

 

 

그 뒤 actions 탭을 누른뒤 new workflows 를 눌러 depoly.yml 파일을 만들어 주었다.

depoly.yml의 내용은 아래와 같으며 주석으로 각 코드를 설명하겠다.

#main 브랜치에 푸시가 일어날때마다 발생함
on:
  push:
    branches:
      - main
#action_codedeploy 에서 역할을 부여
name: Deploy String boot to Amazon EC2
env:
  PROJECT_NAME: action_codedeploy

#우분투 18.04로 서버를 돌림
jobs:
  deploy:
    name: DEPLOY
    runs-on: ubuntu-18.04
    #actions 상황 체크
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      #jdk 17 설치와 자바 버전 17로 설정
      - name: Set up JDK 17
        uses: actions/setup-java@v1
        with:
          java-version: 17
      #터미널에 입력
      - name: Grant execute permission for gradlew
        run: chmod +x gradlew
        shell: bash
        
      # 레포지토리의 /src/main/resources/application.properties 경로에 application.properties 파일 생성
      - name: make application.properties
        run:
          mkdir ./src/main/resources | 
          touch ./src/main/resources/application.properties 
        shell: bash
        
       # application.properties에 시크릿 경로에 있는 propertes 파일 값 입력
      - name: deliver application.properties
        run: echo "${{ secrets.PROPERTIES }}" > ./src/main/resources/application.properties
        shell: bash

	   #빌드 실행
      - name: Build with Gradle
        run: ./gradlew build
        shell: bash
       
       #빌드 파일 압축 실행
      - name: Make zip file
        run: zip -qq -r ./$GITHUB_SHA.zip .
        shell: bash
        
		#aws actions 서비스 이용을 위한 액세스키와 보안 액세스 키를 각각 시크릿에서 받아온 값으로 입력
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-2
         
         
		#S3에 압축 파일 업로드
      - name: Upload to S3
        run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://sim-deploy/$PROJECT_NAME/$GITHUB_SHA.zip

		#압축 파일을 deployment 어플리케이션에서 받아와 실행
      - name: Code Deploy
        run: aws deploy create-deployment --application-name greenstep --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name dev --s3-location bucket=sim-deploy,bundleType=zip,key=$PROJECT_NAME/$GITHUB_SHA.zip

 

또한 ./ 루트 경로 에 aspec.yml 파일과 deploy.sh를 만들어 deploy 에 올라간 파일이 내 우분투 서버에서 배포를 시작하도록 설정해 주었다.

각각 코드는 아래와 같다.

version: 0.0
os: linux

files:
  - source: /
    destination: /home/ubuntu/app
permissions:
  - object: /home/ubuntu/app
    owner: ubuntu
    group: ubuntu
    mode: 755
hooks:
  AfterInstall:
    # location은 프로젝트의 root경로를 기준
    - location: deploy.sh
      timeout: 60
      runas: root
#!/usr/bin/env bash

REPOSITORY=/home/ubuntu/app
cd $REPOSITORY

APP_NAME=greenstep
JAR_NAME=$(ls $REPOSITORY/build/libs/ | grep '.jar' | tail -n 1)
JAR_PATH=$REPOSITORY/build/libs/$JAR_NAME

CURRENT_PID=$(pgrep -f $APP_NAME)

if [ -z $CURRENT_PID ]
then
  echo "> 종료할것 없음."
else
  echo "> kill -9 $CURRENT_PID"
  kill -15 $CURRENT_PID
  sleep 5
fi

echo "> $JAR_PATH 배포"
nohup java -jar $JAR_PATH > /dev/null 2> /dev/null < /dev/null &

마지막으로 4개의 aws 서비스를 추가할 필요가 있었다.

각각 S3,  CODEDEPLOY, EC2, IAM 으로 S3는 빌드 파일 업로드를, CodeDeploy는 S3에 업로드된 파일을 받아와서 ec2에 배포해주는 역할을, EC2는 CodeDeploy에서 받아온 파일을 배포하는 역할을, 마지막으로 IAM은 EC2가 받아올때 접근권한 설정을 담당해 주었다.

이 4개의 서비스와 우분투에서 S3와 CodeDeploy 와 관련된 설정을 마치고 나서야 깃액션을 통한 서버 자동 배포 기능을 구현할 수 있었다.

관련글 더보기