[71일차] GitHubActions

유태형·2022년 8월 8일
0

코드스테이츠

목록 보기
71/77

오늘의 목표

  1. GitHub Actions
  2. 설정, 스크립트
  3. 빌드파일 배포



내용

GitHubActions

자동 배포 과정

  1. GitHub Actions
  • GitHub Actions는 설정 파일에 따라 GitHub Repository에 특정 변동사항을 트리거로 작동됩니다. 기본으로 main브랜치가 push동작을 수행할 경우 트리거가 작동됩니다.
  • GitHub Ations는 GitHub의 main브랜치에 push가 감지되면 AWS의 R3 버킷에 .zip 파일을 저장하도록 구현할 수 있습니다.
  1. S3
  • GitHub Actions를 통해 압축 파일을 저장합니다. 배포 자동화의 저장소로써 사용됩니다.
  1. Code Deploy
  • S3에 저장된 빌드 결과물을 EC2 인스턴스로 이동시킵니다. S3버킷에서 EC2인스턴스로 프로젝트를 이동할 수 있도록 EC2인스턴스에 Code Deploy Agent 설치가 필요하고, 설치법은 OS,버전등 상이하기 때문에 공식문서를 참고해야 합니다.
  1. EC2
  • .yml 설정파일 과 .sh쉘 스크립트에 의해 각 배포 결과를 로그에 저장하여 빌드 파일을 실행합니다.
  • S3로 부터 파일을 받기 위해 Code Deploy Agent와 서버를 실행하기 위한 JDK 설치가 필요합니다.



설정, 스크립트

gradle.yml

name: Java CI with Gradle

# main 브랜치에 push시 트리거 작동
on:
	push:
    	branches: [ "main" ]
        
# 권한은 읽기
permissions:
	contents: read
    
#환경 변수를 이용해 S3 버킷 이름 지정
env:
	S3_BUCKET_NAME: S3_버킷이름

# GitHubActoins 작업
jobs:
	build:
    	runs-on: ubuntu-latest
        
        steps:
    - uses: actions/checkout@v3
    
    # JDK 설치
    - name: Set up JDK 11
      uses: actions/setup-java@v3
      with:
        java-version: '11'
        distribution: 'temurin'
        
    # build 수행
    - name: Build with Gradle
      uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
      with:
        arguments: build
        
    # build한 후 프로젝트를 압축
    - name: Make zip file
      run: zip -r ./압축파일명.zip .
      shell: bash
    
    # Access Key와 Secret Access Key를 통해 권한 확인
    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
      	aws-access-key-id: ${{secrets.공개키}}
        aws-secret-access-key: ${{secrets.비밀키}}
        aws-region: 리전
    
    
    # 압축파일 S3에 전송
    - name: Upload to S3
      run: aws s3 cp --region 리전 ./압축파일명.zip s3://$S3_BUCKET_NAME/압축파일명.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=압축파일명.zip
  • env: : gradle.yml에서 사용할 환경변수를 정의합니다.
  • jobs: : 실제로 GitHubActions이 수행할 작업들의 모음입니다.
  • ${{secrets.공개키}}, ${{secrets.비밀키}} : GitHub 레포지토리에 설정한 해당하는 SSH 공개키와 비밀키를 불러들여 사용합니다.
  • aws-region: 리전 : s3가 존재하는 리전을 선택합니다. 서울은 ap-northeast-2입니다.
    어플리케이션배포그룹은 AWS의 Code Build에서 정의한 이름 그대로 사용합니다.


appspec.yml

version: 0.0
os: linux
#파일의 경로를 지정합니다.
files:
	- source: /
      destination: 인스턴스_경로
      overwrite: yes #덮어쓰기 가능
      
 #권한을 지정합니다.
 permissions:
 	- object: /
      pattern: "*"
      owner: ubuntu
      group: ubuntu
      
 #라이프 사이클별 행동을 정의합니다.
 hooks:
 	#앱 시작시
 	ApplicationStart:
    	- location: scripts/스크립트.sh #이름은 마음 껏 지정해도 가능
          timeout: 60
          runas: ubuntu
  • files: destination: : Code Deploy가 S3버킷에서 파일을 가져와 EC2 인스턴스에 저장할 위치를 지정합니다.
  • hooks: AppliactionStart: : 애플리케이션 시작시 실행할 파일을 지정합니다.
  • - location : 실행할 파일을 지정합니다.


스크립트 파일

//환경 변수 선언
#!/bin/bash
BUILD_JAR=$(ls /인스턴스_경로/build/libs/서버파일.jar)
JAR_NAME=$(basename $BUILD_JAR)

//출력
echo "> 현재 시간: $(date)" >> 인스턴스_경로/deploy.log
echo "> build 파일명: $JAR_NAME" >> 인스턴스_경로/deploy.log
echo "> build 파일 복사" >> 인스턴스_경로/deploy.log
echo "> 현재 실행중인 애플리케이션 pid 확인" >> 인스턴스_경로/deploy.log
echo "> DEPLOY_JAR 배포"    >> 인스턴스_경로/deploy.log

//복사
DEPLOY_PATH=인스턴스_경로
cp $BUILD_JAR $DEPLOY_PATH

//배포 자동화 이전에도 실행중이었는지
CURRENT_PID=$(pgrep -f $JAR_NAME)
if [ -z $CURRENT_PID ]
then //처음 실행
  echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다." >> 인스턴스_경로/deploy.log
else //이미 실행
  echo "> kill -15 $CURRENT_PID" >> 인스턴스_경로/deploy.log
  sudo kill -15 $CURRENT_PID
  sleep 5
fi

DEPLOY_JAR=$DEPLOY_PATH$JAR_NAME
sudo nohup java -jar $DEPLOY_JAR >> 인스턴스_경로/deploy.log 2> 인스턴슥여로/deploy_err.log &
  • #!/bin/bash : bash쉘을 사용합니다.
  • 환경변수=$(명령어) : 명령어의 결과를 환경변수로 사용합니다.
  • BUILD_JAR : build한 파일의 위치입니다.
  • JAR_NAME : BUILD_JAR에서 경로를 제외한 파일명입니다.
  • DEPLOY_PATH : appspec.yml에서 정의한 환경변수와 같은 경로를 사용합니다.
  • cp $BUILD_JAR $DEPLOY_PATH : build한 파일을 인스턴스_경로에 복사합니다.
  • pgrep -f $JAR_NAME : JAR_NAME의 PID(프로세스 식별자)를 반환합니다.
  • if[] then... else ... fi : 리눅스에서의 if문입니다. 자바나, 파이썬, c와 다르게 마지막에 fi로 끝을 명시해야만 합니다.
  • sudo kill -15 ${PID} : 실행중은 PID에 해당하는 프로세서를 종료합니다.
  • DEPLOY_JAR : 인스턴스_경로에 복사한 Build파일입니다.
  • sudo nohup java -jar $DEPLOY_JAR : 로그아웃이나 세션이 종료되더라도 웹 애플리케이션이 종료되지 않습니다.
  • >> : 실행 성공시 출력 경로 지정합니다. 2> : 실행 실패시 출력 경로 지정합니다.
  • & : 프로그램을 백그라운드로 실행합니다. 프로그램 실행동안 사용자는 다른 작업을 수행할 수 있습니다.
  • nohup&을 함께 사용한다면 로그아웃이나 세션이 종료되더라도 백그라운드로 실행합니다.



빌드파일 배포

IAM User계정은 Codestates에 있어 정보 누출 위험으로 블로깅 하지 못하고 간략히 순서만 적었습니다.

  1. 배포하고자 하는 프로젝트의 GitHub 레포지토리에 IAM User 계정의 공개키와 비밀키를 등록합니다.
  2. CodeDeploy에서 애플리케이션을 생성합니다. 이때 - name: Code Deploy에 정의된 애플리케이션 이름과 일치해야 합니다.
  3. 애플리케이션의 배포그룹을 생성합니다. 이때 - name: Code Deploy에 정의된 배포 그룹의 이름과 일채해야 합니다.
  4. GitHub main브랜치에 변경사항을 push시 자동으로 반영되어 서버에 배포가 됩니다.



후기

AWS의 서비스를 이용하여 배포 자동화를 해보았고 이번엔 GitHub Actinos를 이용하여 자동으로 배포해보았습니다. AWS의 서비스가 좀 더 안정성이 있겠으나 AWS에서 따로 GitHub와 연결하는 과정이 필요없이 GitHub에서 직접 EC2인스턴스로 전달하여 더 편리합니다.




GitHub

https://github.com/ds02168/practice-githubAction-deploy

profile
오늘도 내일도 화이팅!

0개의 댓글