반응형
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
다양한 예제 템플릿 지원
설정파일
# 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 참고 링크
야 너두 자동 배포 할 수 있어 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 |
---|