WIL | 22/09/04

개뉸·2022년 9월 4일
0

WIL

목록 보기
7/9

실전 프로젝트에 초기에 CI/CD 를 적용하기로 했다.
프로젝트 후반에 하게되면 예상치 못한 문제가 발생할까봐 처음부터 설정을 하기로 한것이다.
문제는 한번도 이것을 해본적이 없다는것...

다행히 설명이 잘되어있는 블로그를 찾았다.

https://goodgid.github.io/Github-Action-CI-CD-AWS-EC2/

1편에서는 AWS 설정을 하는데 서버를 사는것부터 설명이 되어있다. 나는 이미 이전에 ubuntu 서버를 사놓은 상태여서 태그부분부터 시작하였다.
step6 에서 CodeDeploy-Element 태그를 추가하는 부분말이다.
밑에는 고정 ip를 할당받는 부분도 있는데 나는 이부분을 패스했다.

이후에 gitbash에서 설정하는 부분이 있는데 여기서 살짝 막혔었다.

$ sudo apt update
$ sudo apt install ruby-full
$ sudo apt install wget
$ cd /home/ubuntu
$ wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
$ chmod +x ./install
$ sudo ./install auto > /tmp/logfile
$ sudo service codedeploy-agent status

위에서 차례대로 입력하고 마지막에 codedeploy-agent status 를 입력하는데 뭔가 이전과는 다른 반응이었다. 보통은 잘되었으면 경로가 나오고 입력창이 깜빡깜빡 거리는데 그러지 않고 이상한 문자들과 함께 맨밑에는 숨김처리 되어있는 항목 13개가 있다는 문구만 보였다. 뭔가 진행중인가 싶어서 1시간을 기다렸지만 그대로였다.
중간에 디플로이가 잘 되었다는 문구가 보여서 그냥 끄긴했는데 정확히 무슨 의미였는지는 모르겠다.

두번째 글에서는 S3를 설정하는 부분이 나온다. 빌드한 파일을 S3에 저장하는것 같더라.
이때 S3의 시크릿 키 같은것을 내 깃액션 설정에 넣어줘야하는데 여기서도 걸리는게 있었다.

AWS_ACCESS_KEY_ID : {{AWS_ACCESS_KEY_ID}} 
AWS_SECRET_ACCESS_KEY : {{AWS_ACCESS_KEY_ID}}
AWS_REGION : ap-northeast-2

굳이 중괄호를 두개나 붙여서 설명되어있길래 설정에 써넣을때도 양옆에 중괄호를 두개씩 붙여서
썼는데 빌드에 실패하더라. AWS_REGION : ap-northeast-2 처럼 중괄호를 지우고 키값을 그대로 써주니까 잘 작동되었다.

세번째 글에서는 코드 디플로이 부분인데 나는 문제없이 넘겼는데 팀원들이 여기서 이전에 입력한 태그가 목록에 뜨지 않는다는 말을 했다. 해당 문제를 겪었던 다른 팀원분이 해결책을 주셨는데 새로고침하고 다시 해당 과정을 밟으면 태그가 잘 뜬다고 했다. 실제로 문제를 겪던 팀원분이 이 방법으로 문제를 해결하셨다.

네번째 글에서 막혔다. 깃에 내가올린 프로젝트에 CI 를 적용하기 위해서 yml 설정 파일을 생성하는 부분인데 생소하기도 하고 어떤게 작동을 위해 필요한건지부터 시작해서 구문이 이해가 안갔다.

name: CI-CD

on:
  push:
    branches:
      - main

env:
  S3_BUCKET_NAME: tiltil
  RESOURCE_PATH: ./src/main/resources/application.yaml
  CODE_DEPLOY_APPLICATION_NAME: tiltil-code-deploy
  CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: tiltil-server

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Set up JDK 11
        uses: actions/setup-java@v1
        with:
          java-version: 11
        
        # [1]
      - name: Set yaml file 
        uses: microsoft/variable-substitution@v1
        with:
          files: ${{ env.RESOURCE_PATH }} 
        env:
          override.value: ${{ secrets.DI_FROM_SECRET }} 
          # override.value: 'from deploy.yaml' <-- 이렇게 사용해도 주입이 된다.

      - name: Grant execute permission for gradlew
        run: chmod +x ./gradlew
        shell: bash

        # [2]
      - name: Build with Gradle
        run: ./gradlew build
        shell: bash

        # [3]
      - name: Make zip file
        run: zip -r ./$GITHUB_SHA.zip .
        shell: bash

        # [4]
      - 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: ${{ secrets.AWS_REGION }} 

        # [5]
      - name: Upload to S3
        run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$S3_BUCKET_NAME/$GITHUB_SHA.zip

        # [6]
      - name: Code Deploy
        run: | 
          aws deploy create-deployment \
          --deployment-config-name CodeDeployDefault.AllAtOnce \
          --application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
          --deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \
          --s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=$GITHUB_SHA.zip

언뜻보니 각 번호마다 어떤건 빌드, 어떤건 AWS, 어떤건 S3 이런식으로 설정값을 넣어준것 같은데 해당 설정대로 내가 넣어줘야 할 값들을 수정한뒤에 빌드를 하면 초입부터 실패한다.
여기에는 두가지 문제가 있다.

1.내가 겪은 문제는 아니고 팀원분이 겪은 문제인데 .yaml 로 확장자를 하게되면 실패한다. 자신이 빌드에 실패하는데 yaml 파일이라면 yml 로 바꿔서 해보자.

  1. [1] 과정인 yaml 설정 과정은 자신의 spring 프로젝트의 실행부분이 .properties 가 아니라 .yaml 인경우에 해당하는것 같다. 나는 properties 여서 [1] 부분을 지웠더니 빌드가 잘 되었다.

5번째 글이 사실상 마지막이다. 여기서는 S3에 올라간 빌드파일을 AWS 디플로이가 실행시켜주는 스크립트를 작성하는 곳이다. appspec.yml 은 잘 설명이 되어있는데 정작 스크립트 부분은 완성본이나 설명조자 안되어있다.
src 폴더가 있는 프로젝트에 scripts 폴더를 만들고 gh_deploy.sh 라는 파일안에

#!/bin/bash
PROJECT_NAME="github_action"
JAR_PATH="/home/ubuntu/github_action/build/libs/*.jar"
DEPLOY_PATH=/home/ubuntu/$PROJECT_NAME/
DEPLOY_LOG_PATH="/home/ubuntu/$PROJECT_NAME/deploy.log"
DEPLOY_ERR_LOG_PATH="/home/ubuntu/$PROJECT_NAME/deploy_err.log"
APPLICATION_LOG_PATH="/home/ubuntu/$PROJECT_NAME/application.log"
BUILD_JAR=$(ls $JAR_PATH)
JAR_NAME=$(basename $BUILD_JAR)

echo "===== 배포 시작 : $(date +%c) =====" >> $DEPLOY_LOG_PATH

echo "> build 파일명: $JAR_NAME" >> $DEPLOY_LOG_PATH
echo "> build 파일 복사" >> $DEPLOY_LOG_PATH
cp $BUILD_JAR $DEPLOY_PATH

echo "> 현재 동작중인 어플리케이션 pid 체크" >> $DEPLOY_LOG_PATH
CURRENT_PID=$(pgrep -f $JAR_NAME)

if [ -z $CURRENT_PID ]
then
echo "> 현재 동작중인 어플리케이션 존재 X" >> $DEPLOY_LOG_PATH
else
echo "> 현재 동작중인 어플리케이션 존재 O" >> $DEPLOY_LOG_PATH
echo "> 현재 동작중인 어플리케이션 강제 종료 진행" >> $DEPLOY_LOG_PATH
echo "> kill -9 $CURRENT_PID" >> $DEPLOY_LOG_PATH
kill -9 $CURRENT_PID
fi

DEPLOY_JAR=$DEPLOY_PATH$JAR_NAME
echo "> DEPLOY_JAR 배포" >> $DEPLOY_LOG_PATH
nohup java -jar -Dspring.profiles.active=local $DEPLOY_JAR --server.port=8080 >> $APPLICATION_LOG_PATH 2> $DEPLOY_ERR_LOG_PATH &

sleep 3

echo "> 배포 종료 : $(date +%c)" >> $DEPLOY_LOG_PATH

를 입력해주자.

성공만 보이지만 이 밑에는 이 보다 더 수많은 실패의 역사가 담겨있다...

0개의 댓글