이전 포스팅: https://realyun99.tistory.com/entry/CICD-EC2-CodePipeline-Test-1

 

[CI/CD] EC2 CodePipeline Test -1

Spring project 생성 * 환경: jdk-21, Gradle, vscode 활용 vscode에서 ctrl + shift + p (Show all commands) 단축키를 누르고 spring Initializr 를 검색합니다. 원하는 대로 선택 후 프로젝트 생성하면 됩니다. 테스트 용도

realyun99.tistory.com

 

이전 포스팅에서 수동으로 배포하는 방법에 대해 알아보았다면, 이번 포스팅에선 해당 수동 배포를 자동화하는 방법에 대해 알아보겠습니다.

* github, github action, codedeploy 활용


Github Action 설정 (CI)

yaml 파일로 설정하기 위해 해당 네모 부분 클릭해 들어갑니다.

 

# workflow의 이름
name: CI

# 해당 workflow가 언제 실행될 것인지에 대한 트리거를 지정
on:
  push:
    branches: [ master ] # main branch로 push 될 때 실행됩니다.
  pull_request:
    branches: [ master ]  # main branch로 pull request될 때 실행됩니다.

# workflow는 한개 이상의 job을 가지며, 각 job은 여러 step에 따라 단계를 나눌 수 있습니다.
jobs:
  build:
    name: CI
    # 해당 jobs에서 아래의 steps들이 어떠한 환경에서 실행될 것인지를 지정합니다.
    runs-on: ubuntu-latest

    steps:
     # 작업에서 액세스할 수 있도록 $GITHUB_WORKSPACE에서 저장소를 체크아웃합니다.
      - uses: actions/checkout@v2
      - name: Set up JDK 21
        uses: actions/setup-java@v2
        with:
          java-version: '21'
          distribution: 'temurin'

      - name: Grant execute permission for gradlew
        run: sudo chmod +x ./gradlew
        shell: bash
      
      - name: Build with Gradle
        run: ./gradlew build
        shell: bash

위 코드를 넣어 줍니다.

 

이후 로컬 프로젝트에서 git pull 로 가져와야합니다!!

 

 

AWS IAM User 생성(액세스 키 발급)

S3FullAccess, CodeDeployFullAccess 관련 정책을 넣은 사용자를 생성합니다.

생성된 사용자에서 액세스 키를 생성해 다운로드합니다.

 

 

S3 버킷 생성

zip 파일을 담을 프라이빗 버킷을 생성해줍니다.

 

 

Github Action secrets 추가

위에서 생성했던 액세스키와 리전을 넣어줍니다.

 

 

deploy.sh 파일 생성

#!/bin/bash
BUILD_JAR=$(ls /home/ec2-user/action/build/libs/*-SNAPSHOT.jar)
JAR_NAME=$(basename $BUILD_JAR)
echo "> build cicd-test: $JAR_NAME" >> /home/ec2-user/action/deploy.log

echo "> build 파일 복사" >> /home/ec2-user/action/deploy.log
DEPLOY_PATH=/home/ec2-user/action/
cp $BUILD_JAR $DEPLOY_PATH

echo "> 현재 실행중인 애플리케이션 pid 확인" >> /home/ec2-user/action/deploy.log
CURRENT_PID=$(pgrep -f $JAR_NAME)

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

DEPLOY_JAR=$DEPLOY_PATH$JAR_NAME
echo "> DEPLOY_JAR 배포"    >> /home/ec2-user/action/deploy.log
nohup java -jar $DEPLOY_JAR >> /home/ec2-user/deploy.log 2>/home/ec2-user/action/deploy_err.log &

위 스크립트를 프로젝트 폴더에 scripts 폴더 생성 후 그 안에 넣습니다.

 

그 후 github에 push 합니다.

 

 

Github Action 설정 (CD)

.github/workflows 폴더 안에 cd.yaml 파일을 생성하고 아래 코드를 넣어주세요.

# workflow의 이름
name: CD

# 해당 workflow가 언제 실행될 것인지에 대한 트리거를 지정
on:
  push:
    branches: [ master ] # master branch로 push 될 때 실행됩니다.

# 해당 yml 내에서 사용할 key - value
env:
  S3_BUCKET_NAME: realyun-cicd-test
  PROJECT_NAME: cicd-test
  
# workflow는 한개 이상의 job을 가지며, 각 job은 여러 step에 따라 단계를 나눌 수 있습니다.
jobs:
  build:
    name: CD
    # 해당 jobs에서 아래의 steps들이 어떠한 환경에서 실행될 것인지를 지정합니다.
    runs-on: ubuntu-latest

    steps:
     # 작업에서 액세스할 수 있도록 $GITHUB_WORKSPACE에서 저장소를 체크아웃합니다.
      - uses: actions/checkout@v2
      - name: Set up JDK 21
        uses: actions/setup-java@v2
        with:
          java-version: '21'
          distribution: 'temurin'

      - name: Grant execute permission for gradlew
        run: sudo chmod +x ./gradlew
        shell: bash
      
      - name: Build with Gradle
        run: ./gradlew build
        shell: bash
        
      - name: Make zip file
        run: zip -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: ${{ secrets.AWS_REGION }}
          
      # script files 복사
      - name: Copy script
        run: cp ./scripts/*.sh ./deploy
      
      # S3에 업로드
      - name: Upload to S3
        run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$S3_BUCKET_NAME/$PROJECT_NAME/$GITHUB_SHA.zip

 

성공하면 버킷에 zip 파일이 담긴 것을 확인할 수 있습니다.

 

 

EC2 역할 추가

EC2에 적용할 CodeDeploy role을 만들어 줍니다.

 

IAM 역할 수정을 클릭해 위에서 생성했던 role을 적용합니다. (인스턴스 재부팅 해야 적용됨!)

 

 

EC2에 CodeDeploy agent 설치

aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install . --region ap-northeast-2
chmod +x ./install 
sudo ./install auto
sudo service codedeploy-agent status

# ruby 에러 시
sudo yum install ruby

위 이미지처럼 running 메시지를 확인하면 잘 돌아가고 있음을 알 수 있습니다.

 

 

CodeDeploy 권한 추가 및 애플리케이션 생성

EC2에 권한을 추가한 것 처럼 CodeDeploy에도 EC2에 접근할 수 있는 권한을 생성합니다.

 

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

위에서 CodeDeploy를 위해 생성했던 역할을 선택한 뒤 EC2 인스턴스로 구성해주면 됩니다.

(로드밸런싱은 비활성화로 진행)

 

version: 0.0
os: linux
# S3에 있는 zip 파일이 EC2에 배포될 위치를 지정
files:
  - source: / # CodeDeploy에서 전달해 준 파일 중 destination으로 이동시킬 대상을 루트로 지정(전체파일)
    destination: /home/ec2-user/action/ # source에서 지정된 파일을 받을 위치, 이후 jar를 실행하는 등은 destination에서 옮긴 파일들로 진행
    overwrite: yes

permissions: # CodeDeploy에서 EC2서버로 넘겨준 파일들을 모두 ec2-user권한을 갖도록 합니다.
  - object: /
    pattern: "**"
    owner: ec2-user
    group: ec2-user

# ApplicationStart 단계에서 deploy.sh를 실행시키도록 합
hooks: # CodeDeploy배포 단계에서 실행할 명령어를 지정합니다.
  ApplicationStart: # deploy.sh를 ec2-user권한으로 실행합니다.
    - location: scripts/deploy.sh
      timeout: 60 # 스크립트 실행 60초 이상 수행되면 실패가 됩니다.
      runas: ec2-user

codedeploy를 위한 appspec.yml 파일을 프로젝트의 최상단에 넣어줍니다.

 

 

Github Action(CD) deploy 추가

      # Deploy
      - name: Deploy
        run: |
          aws deploy create-deployment \
          --application-name realyun-ec2-cicd-test \
          --deployment-config-name CodeDeployDefault.AllAtOnce \
          --deployment-group-name ec2-cicd-test \
          --file-exists-behavior OVERWRITE \
          --s3-location bucket=realyun-cicd-test,bundleType=zip,key=cicd-test/$GITHUB_SHA.zip \
          --region ap-northeast-2 \

위 코드들을 cd.yaml에 추가하면 끝이 납니다!!

 

 

 

위에서 사용했던 파일들은 위와 같이 저장되어 있어야 합니다.

(* github과 동기화 확인하기!!)

'Toy Project' 카테고리의 다른 글

[CI/CD] EC2 CodePipeline Test -3  (0) 2024.03.25
[CI/CD] EC2 CodePipeline Test -1  (0) 2024.03.18

+ Recent posts