Git Actions + S3 + CodeDeploy, CI/CD 배포 #

코딩을 합시다·2023년 1월 29일
0

사실 NGINX 무중단 배포 전에 이 글을 작성해야했는데 어쩌다보니 이걸 더 늦게 작성하게 된다.


NGINX 무중단 배포
https://velog.io/@dirn0568/NGINX-%EB%AC%B4%EC%A4%91%EB%8B%A8-%EB%B0%B0%ED%8F%AC


우선 나의 프로젝트에 .github/workflows/파일명.yml을 만들어주고 깃에 푸쉬해준다

이렇게 하면 깃에서 알아서 파일명.yml을 찾아서 Actions에서 만들어준다.

그 다음은 IAM 에서 사용자를 등록해준다.

권한정책은 저렇게 4개만 추가해줘도 된다.

그리고 IAM을 통해 생긴 ACCESS_KEY와 SECRET_ACCESS_KEY를 Github Settings에 등록해 준다.(나는 CLI 방식으로 만들었다)


추가 과정(안해도 무방함)

  • 만약 application.properties를 secret으로 넣고 싶다면 아래와 같은 과정을 거치면 된다


  • learn-github-action.yml에 application.properties 파일 생성 부분만 추가로 작성해준다.

S3를 생성해준다.

CI 과정이 끝났다.
이제 CD과정을 해보자

새로운 역할을 하나 만들어 준다
정책과 신뢰관계까지 만들어주고


방금 생성한 역할을 ec2의 IAM 역할 수정에 넣어준다

CodeDeploy에 필요한 파일을 설치하자

ubuntu 22.04 루비 버전이 안맞아서 오류가 날 수 있었던 것으로 기억함 ruby를 2.x대로 바꿔줘야함


$cd /tmp
$wget https://aws-codedeploy-us-east-1.s3.us-east-1.amazonaws.com/releases/codedeploy-agent_1.3.2-1902_all.deb
$mkdir codedeploy-agent_1.3.2-1902_ubuntu22
$dpkg-deb -R codedeploy-agent_1.3.2-1902_all.deb codedeploy-agent_1.3.2-1902_ubuntu22
$sed 's/Depends:.*/Depends:ruby3.0/' -i ./codedeploy-agent_1.3.2-1902_ubuntu22/DEBIAN/control
$dpkg-deb -b codedeploy-agent_1.3.2-1902_ubuntu22/
$sudo dpkg -i codedeploy-agent_1.3.2-1902_ubuntu22.deb
$systemctl list-units --type=service | grep codedeploy
$sudo service codedeploy-agent status (잘작동하는지 확인)

그리고 CodeDeploy의 설정을 끝마춰준다. Name-EC2(이름)을 설정해주고 중요한 것은 로드밸런싱을 해제해야 한다는 것이다.


그리고 3개의 파일들을 작성해서 프로젝트에 올려준다.

# learn-github.action.yml

name: server CI/CD
#
on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

env:
  S3_BUCKET_NAME: 버켓 이름

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name: Set up JDK 11
        uses: actions/setup-java@v2
        with:
          java-version: '11'
          distribution: 'temurin'

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

      - name: Build with Gradle
        run: ./gradlew build
        shell: bash

      - name: Make zip file
        run: zip -r ./파일명.zip .
        shell: bash

      - 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

      - name: Upload to S3
        run: aws s3 cp --region ap-northeast-2 ./파일명.zip s3://$S3_BUCKET_NAME/

      - name: Code Deploy
        run: aws deploy create-deployment --application-name 애플리케이션 이름 --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name 애플리케이션 배포 그룹 이름 --s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=파일 이름.zip
# appspec.yml

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

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

hooks:
  ApplicationStart:
    - location: deploy.sh
      timeout: 60
      runas: root
# deploy.sh

#!/usr/bin/env bash

JAR_REPOSITORY=/home/ubuntu/app/build/libs
REPOSITORY=/home/ubuntu/app/
JAR_NAME=$(ls -tr $JAR_REPOSITORY/빌드.gradle jar파일명(-0.0.1-SNAPSHOT.jar) | tail -n 1)

echo "> 현재 구동 중인 애플리케이션 pid 확인"

CURRENT_PID=$(pgrep -f $JAR_NAME)

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

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

echo "> 새 애플리케이션 배포"

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 &

appspec.yml과 deploy.sh는 프로젝트 제일 상단(src 패키지와 같은 위치)에 위치시켜준다.

0개의 댓글