쌩로그

GitHub Actions 본문

Deploy/GitHub

GitHub Actions

.쌩수. 2023. 6. 30. 00:35
반응형

목차

  1. 포스팅 개요
  2. 본론
      2-1. GitHub Actions란?
      2-2. GitHub Actions 구축
        2-2-1. 사전 준비
  3. 요약

1. 포스팅 개요

GitHub Actions가 무엇인지 간략히 알아보고 구축 과정을 살펴보고자 포스팅을 하게 되었다.

2. 본론

2-1. GitHub Actions란?

GitHub Actions는 GitHub가 공식적으로 제공하는 빌드, 테스트 및 배포 파이프라인을 자동화할 수 있는 CI/CD 플랫폼이다.

CI/CD에 간략히 정리한 이 있다.

이제 GitHub Actions를 구축해보도록 하자.

2-2. GitHub Actions 구축

2-2-1. 사전 준비

  • S3가 준비되어있어야 한다.
  • CodeDeploy가 준비되어있어야 한다.
  • EC2가 준비되어있어야 한다.
  • IAM 서비스 역할과 EC가 연결되어있어야한다.
  • IAM 사용자를 생성하여 액세스키와 비밀키가 준비되어있어야 한다.

참 고맙게도 누군가 따라하면 쉽게 구축할 수 있도록 이미 다 포스팅을 해놨다.
그리고 지금 난 GitHub Actions 구축 방법을 포스팅 중이다.

참고 링크를 걸어둘테니 보고 준비해보면 된다.
보안 그룹 설정
EC2 생성
배포와 관련된 EC2 셋팅
AWS S3
IAM 서비스 역할과 사용자 생성
AWS CodeDeploy 구축

이제 준비가 끝났으니 본격적으로 GitHub Actions를 구축하자.

프로젝트 레포의 Actions 탭으로 간다.

화면과 같이 New workflow를 선택해준다.

다음 화면처럼 샘플을 고르거나, 혹은 생성할 수 있는데,
나는 SpringBoot+Gradle 이므로 Java with Gradle을 선택했다.

Java with GradleConfigure를 클릭하면 다음과 같이 나온다.

일단 우측 상단의 초록버튼 Commit changes...를 클릭하여 gradle.yml을 생성해준다.

프로젝트의 Actions 탭에 들어가면 GitHub Actions가 실행되고 있는 것을 확인할 수 있다.
처음엔 아마 실패할 것이다.

수행되고 있는 작업을 눌러보면,
(Equal 그냥 둘 다 똑같다는 거다.)

다음과 같은 화면이 나오는데, 어떤 작업들이 순차적으로 수행되고 있는지를 확인할 수 있다.
배포 진행시, 여기서 어떤 작업을 수행중인지, 진행 상황을 알 수 있고, 혹여 실패했다면, 어떤 작업에서 실패했는지를 추적할 수 있다.

그리고 동시에 레포의 커밋 내역 표시에서 GitHub Actions의 성공 여부를 알 수 있다.

이제 Actions에서 생성한 gradle.yml 파일을 통해 GitHub Action 설정을 할 수 있는데 먼저 해줘야 할 작업이 있다.

바로 IAM 사용자를 생성하면서 얻은 액세스 키를 프로젝트 Repository에 SecretKey로 저장해줘야 한다.

프로젝트의 Settings에서 Secrets and variables - Actions로 이동해서 저장해주면된다.

New repository secret 으로 값을 저장해준다.
나는 아래와 같이 저장했다.

Secrets에는 IAM 사용자를 생성하면서 받은 실제 액세스키를 넣어야한다

액세스 비밀키도 액세스 키를 넣듯이 하면 된다.

내가 비밀키를 넣을 때는 AWS_SECRET_ACCESS_KEY로 저장했다.
그리고 내가 설정한 값들을 확인할 수 있다.

이 값들은 아까 Actions 탭에서 생성한 gradle.yml에서 사용된다.
이제 그 파일을 수정할 것인데, 아래 스크립트를 참고해서 작성하면 된다.

지금 설정할 이 gradle.yml을 통해서 GitHub Actions의 각 작업들이 수행된다.

name: Java CI with Gradle

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


permissions:
  contents: read

env:
  S3_BUCKET_NAME: S3이름

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'
    - name: Build with Gradle
      uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
      with:
        arguments: build

      - name: init with Gradle
        uses: gradle/gradle-build-action@v2
      - run: gradle init
      - name: Build with Gradle
        uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
        with:
          gradle-version: 7.6.1 # gradle 버전

      # build한 후 프로젝트를 압축
      - name: Make zip file
        run: zip -r ./애플리케이션이름-deploy.zip .
        shell: bash

      # Access Key와 Secret Access Key를 통해 권한을 확인
      # 아래 코드에 Access Key와 Secret Key를 직접 작성하지 않도록한다. 
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }} # 등록한 Github Secret을 자동으로 불러옴.
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} # 등록한 Github Secret을 자동으로 불러옴.
          aws-region: ap-northeast-2  # 서울 리전

      # 압축한 프로젝트를 S3로 전송
      - name: Upload to S3
        run: aws s3 cp --region ap-northeast-2 ./애플리케이션이름-deploy.zip s3://$S3_BUCKET_NAME/애플리케이션이름-deploy.zip

      # CodeDeploy에게 배포 명령을 내림.
      - name: Code Deploy
        run: >
          aws deploy create-deployment --application-name 코드디플로이애플리케이션이름
          --deployment-config-name CodeDeployDefault.AllAtOnce
          --deployment-group-name 코드디플로이배포그룹이름
          --s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=애플리케이션이름-deploy.zip

당부하는 바이지만, 나 같은 경우 이 외에도 설정이 더 들어간다..
그러니 이 글은 참고만 하길 바란다...

아까 Secrets에서 넣은 IAM 사용자 액세스 키, 비밀 키는 이 부분에서 쓰인다.

그리고 코드에 한글로 써진 부분들이 있다.

S3이름AWS에서 설정한 S3이름을 적어주면된다.
애플리케이션이름이라고 표시되어있는 부분은 각자 커스터마이징 하면된다.
코드디플로이배포그룹이름,코드디플로이애플리케이션이름AWS CodeDeploy에서 설정한 대로 적어주면된다.

그리고 프로젝트 최상단의 디렉터리 내에 appspec.yml파일을 생성해서 작성해줘야 하는데, 이 파일을 통해서 배포가 어느 경로에서 진행될지, 배포를 진행시 어느 스크립트(리눅스 명령어집합 파일)를 참고할지 설정해준다.
다음을 참고해주면 된다.

 # Code Deploy의 작동을 모아놓은 파일

version: 0.0
os: linux
files:
  - source:  /
    destination: /home/ubuntu/디렉터리이름  # 배포가 진행 되는 디렉터리 / 깃허브 레포의 zip파일이 압축해제 되는 곳 /여기서 빌드 진행됨.
    overwrite: yes

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

hooks:
  ApplicationStart:
    - location: scripts/deploy.sh     # /scripts/deploy.sh 가 실행됨 : '.sh'는 쉘 스크립트 확장자
      timeout: 60
      runas: ubuntu
      overwrite: yes

✅참고로 /home/ubuntu/디렉터리이름을 설정했다면, EC2에 실제로 해당 디렉터리가 존재해야 한다.
배포하기 전에 EC2에 접속해서 디렉터리를 생성해주자.

그리고 빌드가 완료된 후에 실행될 명령어들을 쉘 스크립트를 통해서 작성해주면 된다.
쉘 스크립트는 최상단/scripts/deploy.sh으로 생성주면 된다.

#!/bin/bash
BUILD_JAR=$(ls /home/ubuntu/action/build/libs/practice-githubAction-deploy-0.0.1-SNAPSHOT.jar)
JAR_NAME=$(basename $BUILD_JAR)

echo "> 현재 시간: $(date)" >> /home/ubuntu/action/deploy.log

echo "> build 파일명: $JAR_NAME" >> /home/ubuntu/action/deploy.log

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

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

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


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

🤔 참고로 해당 명령어들이 이해가 되지 않으면 리눅스 명령어를 참고해보길 바란다.
✅ 작성한 이 쉘 스크립트에 있는 log파일이나 디렉터리EC2에 생성되어 있는 상태여야 한다.

여기까지 하면 GitHub Actions에 대한 설정이 대부분 완료된 것이다.

그리고 gradle.yml에서 설정된 대로 main 브랜치 push를 해보면, 작업이 수행되고 있는 표시가 나온다.

그리고 성공하면, 이쁜 초록색이 나온다.

그리고 배포가 잘 되었는지 확인해보면 된다.

먼저 AWS의 CodeDeploy에서 확인해보면, 다음과 같이 배포 내역에 기록된다.

그리고 배포가 잘 되었는지 확인해보면...!!!
자~알 나온다.!!

3. 요약

GitHub Actions에 대해 간략히 언급하고, 그것을 구축하는 과정에 대한 내용이었다.

참고로... 위에 있는 yml파일을 배껴쓰더라도 혹여 안 될 수도 있다.
참고해서 적절한 구글링 + ChatGPT를 통해 각자 상황에 맞게 커스터마이징해서 작성하길 바란다.

728x90
Comments