본문 바로가기

카테고리 없음

Git Action 3

깃 엑션 탭에 들어가서 깃엑션을 시작하고 yml파일을 만든다.

1) deploy.yml: (이름은 상관없음)

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
name: Java CI with Gradle

on:
  push:
    branches: [ "main" ]

permissions:
  contents: read


jobs:
  build:


    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    - name: Set up JDK 11
      uses: actions/setup-java@v3
      with:
        java-version: '11'
        distribution: 'temurin'
        
    ## create application-secret.properties 중요 properties 숨기기!
    - name: make application-secret.properties
      run: |
        cd ./src/main/resources
        touch ./application-secret.properties
        echo "${{ secrets.PROPERTIES_SECRET }}" > ./application-secret.properties
      shell: bash
      
    - name: Build with Gradle
      run: chmod +x ./gradlew
    - uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
      with:
        arguments: build

      
        # (4) AWS 인증 (IAM 사용자 Access Key, Secret Key 활용)
    - 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
        # cloud-aws-credentials-accessKey : ${{ secrets.AWS_ACCESS_KEY_ID }}
        # cloud-aws-credentials-secretKey : ${{ secrets.AWS_SECRET_ACCESS_KEY }}

    # (5) 빌드 결과물을 S3 버킷에 업로드
    - name: Upload to AWS S3
      run: |
        aws deploy push \
          --application-name testapp \
          --ignore-hidden-files \
          --s3-location s3://magorosc/$GITHUB_SHA.zip \
          --source .
    # (6) S3 버킷에 있는 파일을 대상으로 CodeDeploy 실행
    - name: Deploy to AWS EC2 from S3
      run: |
        aws deploy create-deployment \
          --application-name testapp \
          --deployment-config-name CodeDeployDefault.OneAtATime \
          --deployment-group-name dev \
          --s3-location bucket=magorosc,key=$GITHUB_SHA.zip,bundleType=zip

 

2) 깃의 Settings -> Secrets -> Actions로 이동

secret 만들기:

AWS_ACCESS_KEY_ID : 사전에 생성해둔 iam의 시크릿 id를 value로 해서 만든다.

AWS_SECRET_ACCESS_KEY : 사전에 생성해둔 iam의 시크릿 pw를 value로 해서 만든다.

PROPERTIES_SECRET: 기존에 숨기고싶었던(gitignore) application-secret.properties내의 정보를 value로 넣는다.

 

 

3) 루트경로에 appspec.yml 만들기

version: 0.0
os: linux

files:
  - source:  /
    destination: /home/ubuntu/app
    overwrite: yes

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


hooks:
  AfterInstall:
    - location: stop.sh
      timeout: 60
      runas: ubuntu
  ApplicationStart:
    - location: start.sh
      timeout: 60
      runas: ubuntu

 

 4) start.sh 만들기:

#!/usr/bin/env bash

PROJECT_ROOT="/home/ubuntu/app"
JAR_FILE="$PROJECT_ROOT/build/libs/CookBank-0.0.1-SNAPSHOT.jar"

APP_LOG="$PROJECT_ROOT/application.log"
ERROR_LOG="$PROJECT_ROOT/error.log"
DEPLOY_LOG="$PROJECT_ROOT/deploy.log"

TIME_NOW=$(date +%c)

# build 파일 복사
echo "$TIME_NOW > $JAR_FILE 파일 복사" >> $DEPLOY_LOG

# jar 파일 실행
echo "$TIME_NOW > $JAR_FILE 파일 실행" >> $DEPLOY_LOG
nohup java -jar $JAR_FILE > $APP_LOG 2> $ERROR_LOG &

CURRENT_PID=$(pgrep -f $JAR_FILE)
echo "$TIME_NOW > 실행된 프로세스 아이디 $CURRENT_PID 입니다." >> $DEPLOY_LOG

5) stop.sh 만들기:

#!/usr/bin/env bash

PROJECT_ROOT="/home/ubuntu/app"
JAR_FILE="$PROJECT_ROOT/*SNAPSHOT.jar.jar"

DEPLOY_LOG="$PROJECT_ROOT/deploy.log"

TIME_NOW=$(date +%c)

# 현재 구동 중인 애플리케이션 pid 확인
CURRENT_PID=$(pgrep -f $JAR_FILE)

# 프로세스가 켜져 있으면 종료
if [ -z $CURRENT_PID ]; then
  echo "$TIME_NOW > 현재 실행중인 애플리케이션이 없습니다" >> $DEPLOY_LOG
else
  echo "$TIME_NOW > 실행중인 $CURRENT_PID 애플리케이션 종료 " >> $DEPLOY_LOG
  kill -15 $CURRENT_PID
fi

로그파일에서 (application.log) 포트번호가 사용중이라는 오류가 뜬다면 ps -ef | grep java로 프로세스 번호 확인 후

kill -9 프로세스번호로 종료하고 nohup java -jar 파일명.jar &으로 다시 실행해보기

 

코드부분은 먼저 완료하신 성우님의 코드를 많이 참고하였다.

추가로 참고한 자료: https://zzang9ha.tistory.com/404

 

GitHub-Actions로 CI/CD 구축하기(AWS, Docker, SpringBoot)

GitHub-Actions로 CI/CD 구축하기(AWS, Docker, SpringBoot) 안녕하세요, 이번 시간에는 GitHub-Actions로 CI/CD를 구축하는 방법에 대해 알아보겠습니다. 해당 포스팅이 CI/CD를 전체적으로 포함하고 있기는..

zzang9ha.tistory.com