프로젝트 - 빙터뷰 [CI/CD]

Chan Young Jeong·2023년 6월 30일
0

프로젝트 빙터뷰

목록 보기
6/9
post-thumbnail

CI/CD

GitHub Actions를 사용하여 Spring Boot 애플리케이션의 CI/CD 파이프라인을 구축하는 과정입니다. 이를 통해 애플리케이션의 자동 빌드, 테스트, 배포 과정을 자동화하여 개발을 효율적으로 진행할 수 있도록 하였습니다.

CI 도구로 Github Action를 사용하고 CD로는 AWS CodeDeploy를 사용하여 Spring Gradle 프로젝트 자동 배포를 구현하였습니다.

전체적인 과정은 다음과 같습니다.

  1. Github에 push 시, Github Action이 자동으로 실행 (build하여 jar 생성)
  2. jar 와 shell script 파일을 압축하여 S3로 upload.
  3. EC2에 설치되어 있는 CodeDeploy Agent가 S3에 업로드 된 zip 파일을 가져와서 배포를 진행.
  4. CodeDeploy Agent는 S3에서 zip 파일을 내려받고, appspec.yml을 읽어서 설정된 스크립트 파일을 실행시키면서 배포.

Github Action

name: Spring Boot & Gradle CI/CD

on:
  push:
    branches:
      - main

permissions:
  contents: read

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    
    - name: Set up JDK 17
      uses: actions/setup-java@v3
      with:
        java-version: '17'
        distribution: 'adopt'
    # application-deploy.yml을 application.yml로 변경합니다.  배포 버전의 설정 파일을 사용하기 위한 작업입니다.
    - name: Change application.yml to deploy version
      run: |
        cd ./src/main/resources
        rm ./application.yml
        mv ./application-deploy.yml ./application.yml
        cat application.yml
   # 환경 변수와 시크릿 값을 사용하여 application-secret.yml 파일을 생성합니다. 이 파일에는 보안 관련 설정이 포함됩니다.
          
    - name: Make application-secret.yml
      env:
        GOOGLE_OAUTH_CLIENT_ID: ${{ secrets.GOOGLE_OAUTH_CLIENT_ID }}
        GOOGLE_OAUTH_CLIENT_SECRET: ${{ secrets.GOOGLE_OAUTH_CLIENT_SECRET }}
        JWT_TOKEN_SECRET: ${{ secrets.JWT_TOKEN_SECRET }}
        AWS_S3_ACCESS_KEY: ${{ secrets.AWS_S3_ACCESS_KEY }}
        AWS_S3_KEY_SECRET: ${{ secrets.AWS_S3_KEY_SECRET }}
        AGORA_APP_ID: ${{ secrets.AGORA_APP_ID }}
        AGORA_APP_CERTIFICATE: ${{ secrets.AGORA_APP_CERTIFICATE }}
      run: |
        cd ./src/main/resources
        echo -e \
        "
        spring:
          security:
            oauth2:
              client:
                registration:
                  google:
                    client-id: $GOOGLE_OAUTH_CLIENT_ID
                    client-secret: $GOOGLE_OAUTH_CLIENT_SECRET
                    scope:
                      - profile
                      - email

        jwt:
          secret: $JWT_TOKEN_SECRET
          
        cloud:
          aws:
            credentials:
              accessKey: $AWS_S3_ACCESS_KEY
              secretKey: $AWS_S3_KEY_SECRET
        agora:
          appId: $AGORA_APP_ID
          appCertificate: $AGORA_APP_CERTIFICATE
        " > application-security.yml
        cat application-security.yml

    - name: Grant execute permission for gradlew
      run: chmod +x gradlew

    - name: Build with Gradle
      run: ./gradlew clean build
    
    - name: Make Directory for deliver
      run: mkdir deploy
    
    - name: Copy Jar
      run: cp ./build/libs/*.jar ./deploy/
      
    - name: Copy AppSpec
      run: cp ./appspec.yml ./deploy/
    
    - name: Copy deploy.sh
      run: cp ./scripts/* ./deploy/
    
    - name : Make zip file
      run: zip -r -qq -j ./vingterview-build.zip ./deploy
      
    - name: Upload to AWS S3
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY_SECRET }}
      run: |
        aws s3 cp \
        --region ap-northeast-2 \
        --acl private \
        ./vingterview-build.zip s3://$S3_BUCKET_NAME/
    
    - name: Deploy
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY_SECRET }}
      run: |
        aws deploy create-deployment \
        --application-name $CODEDEPLOY_NAME \
        --deployment-group-name $CODEDEPLOY_GROUP \
        --file-exists-behavior OVERWRITE \
        --s3-location bucket=$S3_BUCKET_NAME, bundleType=zip,key=vingterview-build.zip \
        --region ap-northeast-2
        

appspec.yml

version: 0.0
os: linux
files:
  - source: /
    destination: /home/ubuntu/app/deploy

permissions:
  - object: /
    pattern: "**"
    owner: ubuntu
    group: ubuntu

hooks:
  ApplicationStart:
    - location: deploy.sh
      timeout: 60
      runas: ubuntu

deploy.sh

#! /bin/bash
REPOSITORY=/home/ubuntu/app/deploy
PROJECT_NAME=vingterview

echo "> 현재 구동중인 어플리케이션 확인"
CURRENT_PID=$(pgrep -f "vingterview.*\.jar" | awk '{print $1}')

echo "> 현재 구동중인 어플리케이션 pid: $CURRENT_PID"

if [ -z "$CURRENT_PID" ]; then
    echo "> 현재 구동중인 어플리케이션이 없으므로 종료하지 않습니다."
else
  echo "> kill -15 $CURRENT_PID"
  kill -15 $CURRENT_PID
  sleep 5
fi

echo "> 새 어플리케이션 배포"
JAR_NAME=$(ls -tr $REPOSITORY/*.jar | tail -n 1)

echo "> JAR_NAME: $JAR_NAME"

echo "> $JAR_NAME에 실행 권한 추가"
chmod +x $JAR_NAME

echo ">$JAR_NAME 실행"
nohup java -jar \
  $JAR_NAME > $REPOSITORY/nohup.out 2>&1 &

0개의 댓글

관련 채용 정보