본문 바로가기

Git

[Github_Action] Github Action 학습

반응형

Github Action - CI/CD Tool

Github Action과 AWS EC2 연동을 통한 CI(빌드 및 저장소 전달)/CD(전달된 서비스 배포) 학습

장점

  • 빌드 과정에서 필요한 서버 리소스 클라우드 지원
  • 환경 제약 없음
  • github 관련 이벤트에 대한 작업 제공

학습이유 

  • 설치 및 설정파일 작성 외 작업이 필요 없는 CI 기능 
 

Github Action 관련 참고 링크

https://devlog-wjdrbs96.tistory.com/361

 

[AWS] Spring + Github Actions + CodeDeploy로 CI/CD 하는 법

Github Action, CodeDeploy로 CI/CD 하는 법 - 1편 CI 도구로 Github Action, CD 도구로는 CodeDeploy를 사용해서 자동화 배포를 진행해보겠습니다.(EC2, S3, CodeDeploy 생성에 대해서는 다루지 않겠습니다.) 이..

devlog-wjdrbs96.tistory.com

다양한 예제 템플릿 지원

 

github 자체 지원 템플릿 (AWS Deploy 관련 템플릿도 있음)

설정파일
# Repo Action 페이지에 나타날 이름
name: Spring Boot & Gradle CI/CD

# Event Trigger
# master branch에 push 또는 pull request가 발생할 경우 동작
# branch 단위 외에도, tag나 cron 식 등을 사용할 수 있음
on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:
    # 실행 환경 지정
    runs-on: ubuntu-latest

    # Task의 sequence를 명시한다.
    steps:
      - uses: actions/checkout@v2

      - name: Set up JDK 17
        uses: actions/setup-java@v1
        with:
          java-version: 17

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

      - name: Build with Gradle
        run: ./gradlew clean build

      # 전송할 파일을 담을 디렉토리 생성
      - name: Make Directory for deliver
        run: mkdir deploy

      # Jar 파일 Copy
      - name: Copy Jar
        run: cp ./build/libs/*.jar ./deploy/

      # appspec.yml Copy 
      - name: Copy appspec
        run: cp appspec.yml ./deploy/

      # script file Copy
      - name: Copy shell
        run: cp ./scripts/* ./deploy/

      # 압축파일 형태로 전달
      - name: Make zip file
        run: zip -r -qq -j ./springboot-intro-build.zip ./deploy

      # S3 Bucket으로 copy
      - name: Deliver to AWS S3
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        run: |
          aws s3 cp \
          --region ap-northeast-2 \
          --acl private \
          ./springboot-intro-build.zip s3://swleebucket/
      # Deploy
      - name: Deploy
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        run: |
          aws deploy create-deployment \
          --application-name CodeDeploy_swlee \
          --deployment-group-name springboot-intro-deploy-group \
          --file-exists-behavior OVERWRITE \
          --s3-location bucket=swleebucket,bundleType=zip,key=springboot-intro-build.zip \
          --region ap-northeast-2

과정 

  • Github 저장소 Event Trigger 생성 - main 브랜치 Push 또는 pull_request 
  • 실행 환경(어느 OS에서 실행 될지..) 및 빌드 환경 설정
  • 빌드 진행
  • 딜리버리 진행을 위한 deploy 폴더 생성 후 배포작업에 필요한 리소스 압축 후 deploy 폴더로 복사
  • 생성해둔 AWS S3 Bucket 으로 전송
  • CodeDeploy 기능을 이용하여 EC2 서버에 배포파일 전달

CodeDeploy 참고 링크

https://jhpa.tistory.com/10

 

야 너두 자동 배포 할 수 있어 with AWS CodeDeploy

안녕하세요 !! 오늘은 AWS CodeDeploy + Github Action + EC2 + S3 를 사용해 자동 배포를 구현한 경험을 공유하려고 합니다. 들어가기에 앞서, 저는 devOps 생초보이므로 중간에 어색하거나 쓸모 없는 로직이

jhpa.tistory.com

appspec.yml 

version: 0.0
os: linux
files:
  - source: /
    destination: /home/ec2-user/app/deploy

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

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

AWS codedeploy는 appspec.yml 시나리오를 따름


deploy.sh

REPOSITORY=/home/ec2-user/app/deploy
PROJECT_NAME=springboot2-webservice



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

# 실행 중이면 종료하기 위해서 현재 수행 중인 프로세스id를 찾습니다.
# springboot2-webservice으로 된 다른 프로그램들이 있을 수 있어 springboot2-webservice된 jar 프로세스를 찾은 뒤 id를 찾습니다(awk '{print $1}').
CURRENT_PID=$(ps -ef | grep url-enc | grep -v grep | awk '{print $2}' )

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

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

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

JAR_NAME=$(ls -tr $REPOSITORY/*.jar | tail -n 1)

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 &

과정 

  • 현재 구동중인 애플리케이션이 존재한다면 종료
  • 새 애플리케이션 배포(단순 테스트용이기 때문에 nohup 명령어 이용

 


사용후기 

Github Action 관련한 자료가 충분하지 않아, 서버에 배포되기까지 오랜 시간소요 되었지만...

위 작업간에 비용발생 또는 EC2 서버 리소스 사용을 제외한 리소스 비용부담이 없음

반응형

'Git' 카테고리의 다른 글

[Git] Submodule Update  (0) 2021.05.10