GitHub Actions
main
브랜치가 push
동작을 수행할 경우 트리거가 작동됩니다..zip
파일을 저장하도록 구현할 수 있습니다..yml
설정파일 과 .sh
쉘 스크립트에 의해 각 배포 결과를 로그에 저장하여 빌드 파일을 실행합니다.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에서 정의한 이름 그대로 사용합니다.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에 있어 정보 누출 위험으로 블로깅 하지 못하고 간략히 순서만 적었습니다.
CodeDeploy
에서 애플리케이션을 생성합니다. 이때 - name: Code Deploy
에 정의된 애플리케이션 이름과 일치해야 합니다.배포그룹
을 생성합니다. 이때 - name: Code Deploy
에 정의된 배포 그룹의 이름과 일채해야 합니다.main
브랜치에 변경사항을 push시 자동으로 반영되어 서버에 배포가 됩니다.AWS의 서비스를 이용하여 배포 자동화를 해보았고 이번엔 GitHub Actinos를 이용하여 자동으로 배포해보았습니다. AWS의 서비스가 좀 더 안정성이 있겠으나 AWS에서 따로 GitHub와 연결하는 과정이 필요없이 GitHub에서 직접 EC2인스턴스로 전달하여 더 편리합니다.