1. 사전작업
1) Spring Boot 프로젝트 설정
URL : https://start.spring.io/
• 프로젝트 이름: pcy-server
• Java 버전: 17
• Dependencies: Spring Web, Spring Boot DevTools
프로젝트를 생성한 후, 인텔리제이로 프로젝트로 오픈합니다.
2) Spring Boot에 간단한 코드 작성
클래스 파일 생성
• 패키지 경로: com.example.pcy_server
• 파일명: AppController.java
@RestController
public class AppController {
@GetMapping("/")
public String home() {
return "Hello, World!";
}
}
위 코드에서는 다음과 같은 작업을 수행합니다
• @RestController 어노테이션을 사용하여 해당 클래스가 RESTful 웹 서비스를 처리하는 컨트롤러임을 나타냅니다.
• @GetMapping("/") 어노테이션을 사용하여 루트 경로(”/”)에 대한 GET 요청을 처리하는 home 메서드를 정의합니다.
• home 메서드는 “Hello, Spring Boot!” 문자열을 반환합니다.
3) Github에 프로젝트 올리기
1] Github에서 Repository 만들기
(1) GitHub에 로그인한 후, 오른쪽 상단의 + 아이콘을 클릭하고 New repository를 선택합니다.
(2) 저장소 이름(Repository name)을 입력합니다. 여기서는 pcy-server로 설정합니다.
(3) 필요에 따라 설명(Description)을 추가합니다.
(4) Public 또는 Private 저장소를 선택합니다.
(5) Initialize this repository with a README 옵션을 선택하지 않습니다. (나중에 로컬 프로젝트를 푸시할 것이기 때문입니다.)
(6) Create repository 버튼을 클릭하여 저장소를 생성합니다.
2] Github Repository에 프로젝트 코드 올리기
$ git init
$ git add .
$ git commit -m "first commit"
$ git branch -M main
$ git remote add origin https://github.com/pcy4196/pcy-server.git
$ git push -u origin main
(1) Git 저장소를 초기화합니다
(2) 모든 파일을 추가합니다
(3) 커밋 메시지를 작성하여 커밋합니다
(4) 브랜치를 main으로 설정합니다
(5) GitHub 원격 저장소를 추가합니다
(6) 프로젝트 코드를 원격 저장소에 푸시합니다
4) EC2 기본 환경 구성
(1) 아래 PAGE 참조하여 EC2를 생성
• ci/cd 프로젝트 진행 시 메모리 부족 현상이 나타날 경우를 대비한 설정입니다
• Swap Memory 설정 방법을 참고하세요
(2) JDK 설치
$ sudo apt update && /
sudo apt install openjdk-17-jdk -y
$ java -version # 잘 설치됐는 지 확인
(3) Git clone을 활용해 프로젝트 다운받기
$ git clone {git repository clone 주소}
(4) EC2에서 clone 받은 서버가 잘 작동하는 지 확인
$ cd {프로젝트 경로} [cd pcy-server]
$ ./gradlew clean build
$ cd build/libs
$ nohup java -jar ________.jar & [nohup java -jar pcy-server-0.0.1-SNAPSHOT.jar &]
$ sudo lsof -i:8080 # 8080번 포트에 Spring Boot가 실행되고 있는 지 확인
2. 코드 배포 과정을 자동화
• 전체적인 흐름
1) .github/workflows/deploy.yml 작성
• appleboy/ssh-action의 공식 문서
name: Deploy to EC2
on:
push:
branches:
- main
jobs:
Deploy:
runs-on: ubuntu-latest
steps:
- name: SSH로 EC2에 접속하기
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.EC2_HOST }} # EC2의 주소
username: ${{ secrets.EC2_USERNAME }} # EC2 접속 username
key: ${{ secrets.EC2_PRIVATE_KEY }} # EC2의 Key 파일의 내부 텍스트
script_stop: true # 아래 script 중 실패하는 명령이 하나라도 있으면 실패로 처리
script: |
cd /home/ubuntu/pcy-server
git pull origin main
./gradlew clean build
sudo fuser -k -n tcp 8080 || true
nohup java -jar build/libs/*SNAPSHOT.jar > ./output.log 2>&1 &
• name: 이 GitHub Actions 워크플로우의 이름을 지정합니다. 이 예제에서는 “Deploy to EC2”라고 명명했습니다.
• on: 이 워크플로우가 트리거되는 이벤트를 정의합니다.
• push: 코드가 푸시될 때 트리거됩니다.
• branches: 트리거되는 브랜치를 지정합니다. 여기서는 main 브랜치에 코드가 푸시될 때 워크플로우가 실행됩니다.
• jobs: 워크플로우에서 수행할 작업을 정의합니다.
• Deploy: 작업의 이름을 지정합니다.
• runs-on: 작업이 실행될 환경을 지정합니다. 여기서는 ubuntu-latest 환경에서 실행됩니다.
• steps: 작업을 수행하는 단계들을 정의합니다.
• name: 단계의 이름을 지정합니다. 여기서는 “SSH로 EC2에 접속하기”라고 명명했습니다.
• uses: 이 단계에서 사용할 액션을 지정합니다. 여기서는 appleboy/ssh-action을 사용하여 SSH를 통해 EC2에 접속합니다. @v1.0.3은 이 액션의 버전을 지정합니다.
• with: appleboy/ssh-action에 필요한 입력 값을 지정합니다.
• host: EC2 인스턴스의 주소를 지정합니다. GitHub Secrets에 저장된 EC2_HOST 값을 사용합니다.
• username: EC2에 접속할 때 사용할 사용자 이름을 지정합니다. GitHub Secrets에 저장된 EC2_USERNAME 값을 사용합니다.
• key: EC2 인스턴스에 접속하기 위한 SSH 키의 내용을 지정합니다. GitHub Secrets에 저장된 EC2_PRIVATE_KEY 값을 사용합니다.
• script_stop: 스크립트 실행 중 하나라도 실패하면 작업을 실패로 처리합니다.
• script: 실행할 쉘 스크립트를 지정합니다. 여기서는 여러 명령어가 포함되어 있습니다:
• cd /home/ubuntu/pcy-server: EC2 인스턴스에서 프로젝트 디렉토리로 이동합니다.
• git pull origin main: GitHub에서 최신 코드를 가져옵니다.
• ./gradlew clean build: Gradle을 사용하여 프로젝트를 빌드합니다.
• sudo fuser -k -n tcp 8080 || true: 8080 포트에서 실행 중인 프로세스를 종료합니다. (이 명령이 실패해도 무시합니다.)
• nohup java -jar build/libs/*SNAPSHOT.jar > ./output.log 2>&1 &: 빌드된 JAR 파일을 백그라운드에서 실행하고, 출력 로그를 파일에 기록합니다.
2) Github에 Secret값 넣어주기
1] EC2_HOST
• ec2 URL 주소
2] EC2_USERNAME
• ubuntu로 설정해주면 됩니다.
3] EC2_PRIVATE_KEY
• key-pair값을 아래 캡쳐처럼 포함하여 주시면 됩니다.
3) Github에 Push해서 Github Actions 잘 작동하는 지 확인
1) GitHub 저장소로 이동
• 웹 브라우저에서 GitHub 저장소 페이지로 이동합니다.
2) Actions 탭 확인
• 저장소 페이지 상단의 Actions 탭을 클릭합니다.
• 최근에 푸시한 커밋과 관련된 워크플로우 실행이 표시됩니다.
3) 워크플로우 실행 상태 확인
• 워크플로우 실행 목록에서 방금 푸시한 커밋과 관련된 항목을 클릭합니다.
• 실행 상태가 “In progress”로 표시되며, 각 단계가 차례로 실행됩니다.
• 모든 단계가 성공적으로 완료되면 실행 상태가 “Success”로 변경됩니다.
4) 로그 확인
• 각 단계별로 로그를 확인하여 예상대로 실행되었는지 검토합니다.
• 문제가 발생한 경우, 로그를 통해 어떤 단계에서 문제가 발생했는지 확인할 수 있습니다.
3. Github으로 확인
'☁️ Cloud > Github CI,CD' 카테고리의 다른 글
03. 일반 프로젝트에서 많이 쓰는 CI/CD 구축 방법 (Github Actions, SCP) (0) | 2024.07.31 |
---|---|
02-1. application.yml 파일 넣는 과정 자동화(Spring Boot) (0) | 2024.07.21 |
01. Github Actions의 정의 및 기본문법 (0) | 2024.07.12 |