개인프로젝트

Gitghub Actions로 CI/CD 파이프라인 구축하기 大 삽질일기 - 4

자바걸 2024. 4. 4. 14:33

권한문제 에러를 한번 맞닥뜨리고 파워쉘로 EC2인스턴스 접속했다.

이제 CodeDeploy를 생성하려고한다.

✔️CodeDeploy 생성

CodeDeploy Agent를 설치했다. 


잠깐, apt가 뭐지?

더보기

apt는 리눅스 운영체제에서 패키지 관리를 위해 사용하는 도구이다.

📌apt (Advanced Package Tool)
  • 사용 배포판: 주로 Debian, Ubuntu 및 그 파생 배포판들
  • 기본 명령어:
    • apt-get: 고전적인 apt 도구로, 설치, 업데이트, 제거 등에 사용
    • apt: apt-get의 기능을 포함하면서, 더 직관적이고 사용자 친화적인 인터페이스를 제공
  • 기능:
    • 패키지 설치: sudo apt install package_name
    • 패키지 제거: sudo apt remove package_name
    • 패키지 업데이트: sudo apt update (패키지 리스트 갱신), sudo apt upgrade (모든 패키지 업그레이드)
    • 시스템 업그레이드: sudo apt full-upgrade (전체 시스템 업그레이드)
  • 패키지 형식: .deb 파일 (Debian 패키지)
  • 특징: apt는 의존성 해결과 관련된 다양한 도구를 제공하며, 사용자 친화적이고 비교적 쉽게 사용

 

https://java-girl.tistory.com/158

 

AWS CLI 안깔리는 에러

또,,에러를 만났다&^^^aws cli가 깔리지 않는다.구글링 해보니 apt update하면 된다던데 안된다. ㅎㅎ재빨리 구글링했다...우분투 버전확인하고.. 내 우분투는 24.04버전https://www.liberiangeek.net/2024/04/instal

java-girl.tistory.com


위와 같이 에러 해결 후 아차. S3버킷을 안만들었다는 점이 생각났다...^^

권한문제 에러를 한번 맞닥뜨리고 파워쉘로 EC2인스턴스 접속했다.

이제 CodeDeploy를 생성하려고한다.

✔️CodeDeploy 생성

 

✔️main.yml  수정 - 배포 코드 추가

name: Build and Deploy to EC2

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]
    
# --------------------------추가
env:
  PROJECT_NAME: mounwan_project_server
  BUCKET_NAME: mounwan_deploy
  CODE_DEPLOY_APP_NAME: mounwanm_cicd
  DEPLOYMENT_GROUP_NAME: mounwan_instance
# --------------------------추가

jobs:
  build:
    runs-on: ubuntu-latest # 3 실행 환경 지정
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-java@v4
        with:
          distribution: 'adopt'
          java-version: '17'
          
      - name: Make application.properties
        run: |
          cd ./src/main/resources
          touch ./application.properties
          
          echo "${{ secrets.DATABASE_PROPERTIES }}" >> ./application.properties
        shell: bash
          
      - name: Setup Postgressql
        uses: harmon758/postgresql-action@v1
        with:
         postgresql version: '14'
      - name: Grant execute permission for gradlew
        run: chmod +x gradlew
        
      - name: Build with Gradle
        run: ./gradlew clean build
      
      - name: Build with Gradle
        run: ./gradlew build
        shell: bash

        # --------------------------추가      
      - name: Make Zip File
        run: zip -qq -r ./$GITHUB_SHA.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 ./$GITHUB_SHA.zip s3://$BUCKET_NAME/$PROJECT_NAME/$GITHUB_SHA.zip

      - name: Code Deploy To EC2 instance
        run: aws deploy create-deployment 
                --application-name $CODE_DEPLOY_APP_NAME 
                --deployment-config-name CodeDeployDefault.AllAtOnce
                --deployment-group-name $DEPLOYMENT_GROUP_NAME 
                --s3-location bucket=$BUCKET_NAME,bundleType=zip,key=$PROJECT_NAME/$GITHUB_SHA.zip
# --------------------------추가

시크릿키는 먼저 설정해놓았었다.

하지만 단번에 될 리가 없다 하하

📌에러해결 포스팅.


우여곡절 끝에 빌드 성공했따.

✔️appspec.yml 생성

AWS CodeDeploy는 이 appspec.yml을 통해서 어떤 파일들을, 어느 위치로 배포하고, 이후 어떤 스크립트를 실행시킬것인지를 모두 관리한다.

version: 0.0
os: linux

files:
  - source: /
    destination: /home/ubuntu/mounwan
permissions:
  - object: /home/ubuntu/mounwan
    owner: ubuntu
    group: ubuntu
hooks:
  AfterInstall:
    - location: scripts/deploy.sh
      timeout: 60
      runas: ubuntu

files:아래에 있는 코드는 Code Build / S3 / Github 등을 통해서 받은 전체 파일들(source: /)을 /home/ubuntu/mounwan으로 옮기겠다는 의미다.

EC2에 지정 디렉토리를 만들어주었다.

 

 

✔️scripts/deploy.sh 배포 쉘 스크립트 생성

 스크립트는 Spring Boot 애플리케이션을 배포하기 위해 사용되며, 이전에 실행중인 프로세스를 중단하고 최신 버전의 JAR 파일을 실행하는 작업을 수행된다.

#!/usr/bin/env bash

REPOSITORY=/home/ec2console/mounwan
cd $REPOSITORY

APP_NAME=MoUnWan
JAR_NAME=$(ls $REPOSITORY/build/libs/ | grep 'SNAPSHOT.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 "> Deploy - $JAR_PATH "
nohup java -jar $JAR_PATH > /dev/null 2> /dev/null < /dev/null &

 

🔗배포 명령어 공식 문서 : AWS Docs - CodeDeploy awscli