이번주차에 깃 액션을 맡아서 하게 되었다.
깃액션이란 깃허브에서 CI(Continuous Integration, 지속 통합)와 CD(Continuous Deployment, 지속 배포)를 위해 워크플로우 자동화 기능을 제공하는 서비스를 말한다.
이 깃액션을 이용하여 깃 main 브랜치에 파일들이 머지 될때마다 main 브랜치의 레포지토리들을 자동으로 빌드하여 서버에 배포하는 기능을 만들어보기로 하였다.
먼저 빌드를 위해서는 깃이그노어 처리를 해주어 깃 레포지토리에 올라가지 않은 application.properties 파일을 빌드전 생성해 주는 로직을 구현할 필요가 있었다.
이를 위해 settings 탭에 보이는 secrets/action 경로에 properties 값을 넣어주었다.
이곳에 properties 값을 넣어주는 이유는 properties에 민감한 정보들이 담겨있기에 깃에서 다른 누군가가 확인할 수 없도록 하기 위함이었다.
그 뒤 actions 탭을 누른뒤 new workflows 를 눌러 depoly.yml 파일을 만들어 주었다.
depoly.yml의 내용은 아래와 같으며 주석으로 각 코드를 설명하겠다.
#main 브랜치에 푸시가 일어날때마다 발생함
on:
push:
branches:
- main
#action_codedeploy 에서 역할을 부여
name: Deploy String boot to Amazon EC2
env:
PROJECT_NAME: action_codedeploy
#우분투 18.04로 서버를 돌림
jobs:
deploy:
name: DEPLOY
runs-on: ubuntu-18.04
#actions 상황 체크
steps:
- name: Checkout
uses: actions/checkout@v2
#jdk 17 설치와 자바 버전 17로 설정
- name: Set up JDK 17
uses: actions/setup-java@v1
with:
java-version: 17
#터미널에 입력
- name: Grant execute permission for gradlew
run: chmod +x gradlew
shell: bash
# 레포지토리의 /src/main/resources/application.properties 경로에 application.properties 파일 생성
- name: make application.properties
run:
mkdir ./src/main/resources |
touch ./src/main/resources/application.properties
shell: bash
# application.properties에 시크릿 경로에 있는 propertes 파일 값 입력
- name: deliver application.properties
run: echo "${{ secrets.PROPERTIES }}" > ./src/main/resources/application.properties
shell: bash
#빌드 실행
- name: Build with Gradle
run: ./gradlew build
shell: bash
#빌드 파일 압축 실행
- name: Make zip file
run: zip -qq -r ./$GITHUB_SHA.zip .
shell: bash
#aws actions 서비스 이용을 위한 액세스키와 보안 액세스 키를 각각 시크릿에서 받아온 값으로 입력
- 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: ap-northeast-2
#S3에 압축 파일 업로드
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://sim-deploy/$PROJECT_NAME/$GITHUB_SHA.zip
#압축 파일을 deployment 어플리케이션에서 받아와 실행
- name: Code Deploy
run: aws deploy create-deployment --application-name greenstep --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name dev --s3-location bucket=sim-deploy,bundleType=zip,key=$PROJECT_NAME/$GITHUB_SHA.zip
또한 ./ 루트 경로 에 aspec.yml 파일과 deploy.sh를 만들어 deploy 에 올라간 파일이 내 우분투 서버에서 배포를 시작하도록 설정해 주었다.
각각 코드는 아래와 같다.
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/app
permissions:
- object: /home/ubuntu/app
owner: ubuntu
group: ubuntu
mode: 755
hooks:
AfterInstall:
# location은 프로젝트의 root경로를 기준
- location: deploy.sh
timeout: 60
runas: root
#!/usr/bin/env bash
REPOSITORY=/home/ubuntu/app
cd $REPOSITORY
APP_NAME=greenstep
JAR_NAME=$(ls $REPOSITORY/build/libs/ | grep '.jar' | tail -n 1)
JAR_PATH=$REPOSITORY/build/libs/$JAR_NAME
CURRENT_PID=$(pgrep -f $APP_NAME)
if [ -z $CURRENT_PID ]
then
echo "> 종료할것 없음."
else
echo "> kill -9 $CURRENT_PID"
kill -15 $CURRENT_PID
sleep 5
fi
echo "> $JAR_PATH 배포"
nohup java -jar $JAR_PATH > /dev/null 2> /dev/null < /dev/null &
마지막으로 4개의 aws 서비스를 추가할 필요가 있었다.
각각 S3, CODEDEPLOY, EC2, IAM 으로 S3는 빌드 파일 업로드를, CodeDeploy는 S3에 업로드된 파일을 받아와서 ec2에 배포해주는 역할을, EC2는 CodeDeploy에서 받아온 파일을 배포하는 역할을, 마지막으로 IAM은 EC2가 받아올때 접근권한 설정을 담당해 주었다.
이 4개의 서비스와 우분투에서 S3와 CodeDeploy 와 관련된 설정을 마치고 나서야 깃액션을 통한 서버 자동 배포 기능을 구현할 수 있었다.
깃액션과 aws를 이용한 HTTPS 서버 자동 배포(2) (0) | 2022.09.18 |
---|---|
깃액션과 aws를 이용한 HTTPS 서버 자동 배포(1) (0) | 2022.09.11 |
인스타그램을 클론코딩하며 신경 쓴 기술구현들 (0) | 2022.08.28 |
첫 협업을 진행하며 느낀 것들 (0) | 2022.08.21 |
Axios와 CORS란 무엇인가? (0) | 2022.08.14 |