CI CD

Spring + Github Actions + AWS CodeDeploy + AWS S3 + AWS EC2

주코식딩 2022. 6. 22. 13:30

secrets 등록

공개되면 안되는 값들을 이 곳에 작성해준다. 나는 프로퍼티 파일도 여기에 등록했다.

 

 

Git actions / yml 파일 등록

name: Java CI with Gradle

on:
  push:
    branches: [ "ojyojy" ]
  pull_request:
    branches: [ "ojyojy" ]

jobs:
  build:
    runs-on: ubuntu-20.04
    steps:
    - uses: actions/checkout@v2
    
    - name: Set up JDK 11
      uses: actions/setup-java@v1
      with:
        java-version: 11

    ## create application.properties
    - name: make application.properties
      if: true # branch가 develop일 때
      run: |
        cd ./src/main/resources
        touch ./application.properties
        echo "${{ secrets.PROPERTIES_DEV }}" > ./application.properties
      shell: bash
    - name: Grant execute permission for gradlew
      run: chmod +x ./gradlew
      shell: bash
      
    #build
    - name: Build with Gradle
      run: ./gradlew build
      shell: bash

 

빌드 단계에서 contextLoads() FAILED 에러가 뜬다면 프로퍼티 파일이 제대로 올라가지 않은 것이다.

이 외에도 NullPointerException이 뜨면서 테스트를 통과하지 못하는 경우가 있었는데 해당코드만 주석처리하고 넘어갔다.

(로컬에서는 잘돌아간다.)

 

IAM 등록

사용자 추가를 해야한다.

 

다음 페이지에서 나온 엑세스 키 ID와 비밀번호를 꼭 저장 해두어야한다. 

 

 

s3 버킷 생성

버킷은 퍼블릭 엑세스 차단이 잘되었는지만 확인 후 모두 디폴트 값으로 생성한다.

 

Git actions / yml 추가

env 태그가 누락되지 않게 잘 확인하자.

name: Java CI with Gradle

on:
  push:
    branches: [ "ojyojy" ]
  pull_request:
    branches: [ "ojyojy" ]

env:
  PROJECT_NAME: hanghae99Homework02
  BUCKET_NAME: hanghae99bucket


jobs:
  build:
    runs-on: ubuntu-20.04
    steps:
    - uses: actions/checkout@v2
    
    - name: Set up JDK 11
      uses: actions/setup-java@v1
      with:
        java-version: 11

    ## create application.properties
    - name: make application.properties
      if: true # branch가 develop일 때
      run: |
        # spring의 resources 경로로 이동
        cd ./src/main/resources
        touch ./application.properties
        # GitHub-Actions에서 설정한 값을 application-dev.properties 파일에 쓰기
        echo "${{ secrets.PROPERTIES_DEV }}" > ./application.properties
      shell: bash
    - name: Grant execute permission for gradlew
      run: chmod +x ./gradlew
      shell: bash
      
    #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

 

ec2용 IAM 사용자 등록

역할 만들기

 

 

 

 

ec2 서버에 IAM 사용자 등록

ec2서버가 만들어져 있다고 가정한다.

 

역할 수정후 인스턴스 재부팅을 해준다.

 

ec2 서버에 codedeploy 설치

' >>> ' 이 있는 코드를 작성하면 ' - ' 에 해당하는 메세지가 출력되어야 한다.

 

>>> aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install . --region ap-northeast-2

- download: s3://aws-codedeploy-ap-northeast-2/latest/install to ./install

 

>>> chmod +x ./install

아래 명령어는 ruby를 2버전대로 설치해야만 제대로 동작한다.

>>> sudo ./install auto

 

 

>>> sudo service codedeploy-agent status

- The AWS CodeDeploy agent is running as PID ****

 

 

CodeDeploy용 IAM 사용자 등록

역할 만들기

 

 

 

CodeDeploy 생성

애플리케이션 생성 후 배포그룹 생성

 

서비스 역할에 바로 위에서 만든 IAM을 넣으면 된다.

 

 

일치하는 인스턴스가 있어야 한다.

 

 

Git actions / yml 추가 [최종]

name: Java CI with Gradle

on:
  push:
    branches: [ "ojyojy" ]
  pull_request:
    branches: [ "ojyojy" ]

env:
  PROJECT_NAME: hanghae99Homework02
  BUCKET_NAME: hanghae99bucket
  CODE_DEPLOY_APP_NAME: springboot-intro
  DEPLOYMENT_GROUP_NAME: dev

jobs:
  build:
    runs-on: ubuntu-20.04
    steps:
    - uses: actions/checkout@v2
    
    - name: Set up JDK 11
      uses: actions/setup-java@v1
      with:
        java-version: 11

    ## create application.properties
    - name: make application.properties
      if: true # branch가 develop일 때
      run: |
        # spring의 resources 경로로 이동
        cd ./src/main/resources
        touch ./application.properties
        # GitHub-Actions에서 설정한 값을 application-dev.properties 파일에 쓰기
        echo "${{ secrets.PROPERTIES_DEV }}" > ./application.properties
      shell: bash
    - name: Grant execute permission for gradlew
      run: chmod +x ./gradlew
      shell: bash
      
    #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
      run: aws deploy create-deployment --application-name $CODE_DEPLOY_APP_NAME --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name $DEPLOYMENT_GROUP_NAME --s3-location bucket=$BUCKET_NAME,bundleType=zip,key=$PROJECT_NAME/$GITHUB_SHA.zip

 

appspec.yml / deploy.sh 생성

프로젝트 최상단에 appspec.yml을 생성한다.

 

version: 0.0
os: linux

files:
  - source: /
    destination: /home/ubuntu/hanghae99Homework02 # 인스턴스에서 파일이 저장될 위치
    overwrite: yes

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


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

 

 

deploy.sh 파일도 생성해 준다.

REPOSITORY=/home/ubuntu/hanghae99Homework02
cd $REPOSITORY

APP_NAME=hanghae99Homework02 #1
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 ] #2
then
  echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
  echo "> kill -9 $CURRENT_PID"
  sudo kill -15 $CURRENT_PID
  sleep 5
fi

echo "> $JAR_PATH 배포" #3
nohup java -jar $JAR_PATH > /dev/null 2> /dev/null < /dev/null &

 

 

이 모든 설정을 하는데에 약 하루 반이 걸렸다.. 

다음 ci/cd는 더 빠르게 할 수 있기를..

 

 

출처 : https://stalker5217.netlify.app/devops/github-action-aws-ci-cd-1/