-
개인 프로젝트에서 많이 쓰는 CI/CD 구축 방법 (Github Actions)
-
✅ 전체적인 흐름
-
1. Spring boot 프로젝트 셋팅
-
2. Spring boot 프로젝트 셋팅
-
3. EC2에 들어가서 기본 환경 구성
-
4. 실제 코드가 업데이트 될 때 어떤 과정을 거쳐서 배포하는 지 짚어보기
-
5. 매번 Github 계정과 비밀번호를 치는 과정 없애기
-
6. 지금까지 했던 코드 배포 과정을 자동화하기
-
7. application.yml 파일 넣는 과정 자동화시키기
-
8. 테스트 코드 실패하면 CI/CD 과정이 실패하는 지 확인하기
-
한번에 CI/CD 구축
개인 프로젝트에서 많이 쓰는 CI/CD 구축 방법 (Github Actions)
✅ 전체적인 흐름

✅ 장점
- git pull을 활용해서 변경된 부분의 프로젝트 코드에 대해서만 업데이트 하기 때문에 CI/CD 속도가 빠르다.
- 대부분의 CI/CD 방식들은 전체 프로젝트를 통째로 갈아끼우는 방식을 사용한다.
- CI/CD 툴로 Github Actions만 사용하기 때문에 인프라 구조가 복잡하지 않고 간단하다.
✅ 단점
- 빌드 작업을 EC2에서 직접 진행하기 때문에 운영하고 있는 서버의 성능에 영향을 미칠 수 있다. (운영하고 있는 서버에서 빌드를 하면 성능이 안좋아짐)
- Github 계정 정보가 해당 EC2에 저장되기 때문에 개인 프로젝트 또는 믿을만한 사람들과 같이 진행하는 토이 프로젝트에서만 사용해야 한다.
1. Spring boot 프로젝트 셋팅
간단한 코드 작성
@RestController
public class AppController {
@GetMapping("/")
public String home() {
return "Hello, World!";
}
}
2. Spring boot 프로젝트 셋팅
-> github에 프로젝트 올리기
$ git init
$ git add .
$ git commit -m "first commit"
$ git branch -M main
$ git remote add origin _______
$ git push -u origin main
3. EC2에 들어가서 기본 환경 구성
1. 보안그룹 8080번 포트 열기
Spring Boot는 기본적으로 8080번 포트에서 실행된다.
2. JDK 설치
$ sudo apt update && /
sudo apt install openjdk-17-jdk -y
$ java -version # 잘 설치됐는 지 확인
3. Git clone을 활용해 프로젝트 다운받기
** 참고) Private Repository를 clone할 경우 Github의 계정과 비밀번호를 입력해야 한다. 이 때, 비밀번호는 실제 Github 계정의 비밀번호가 아닌 Github 토큰을 입력해야 한다. 토큰을 발급받는 방법은 아래 링크를 참고하자.
https://velog.io/@nara7875/github-%ED%86%A0%ED%81%B0-%EB%B0%9C%EA%B8%89%ED%95%98%EA%B8%B0
github 토큰 발급하기
위와 같이 private으로 된 repository를 다운받으려고 하면 github의 아이디와 비밀번호를 입력하라고 한다. 그런데 이걸 맨날 private에서 public으로 바꿔서 하기엔 너무 귀찮다. 실제로도 그렇게 어렵지
velog.io
4. EC2에서 clone 받은 서버가 잘 작동하는 지 확인하기
$ cd {프로젝트 경로}
$ ./gradlew clean build
$ cd build/libs
$ nohup java -jar ________.jar &
$ sudo lsof -i:8080 # 8080번 포트에 Spring Boot가 실행되고 있는 지 확인
* gradlew permission denied 이슈 해결
[백엔드] gradlew permission denied 이슈 해결
문제: ./gradlew build 시 gradlew: permission denied 오류 발생해결 방법:문제 원인 분석: 'Permission Denied' 오류는 실행 파일에 실행 권한이 없어서 발생합니다.권한 설정:chmod 명령어: chmod +x ./grad
velog.io
4. 실제 코드가 업데이트 될 때 어떤 과정을 거쳐서 배포하는 지 짚어보기
- 내 컴퓨터에서 새로운 코드 작성
- Commit 찍은 뒤 Github에 Push하기
- EC2에 들어가서 Git Pull 받기
$ cd {프로젝트 경로}
$ git pull origin main
4. 빌드 후 재배포하기
$ sudo lsof -i:8080 # 8080번 포트에 Spring Boot가 실행되고 있는 지 확인
$ sudo fuser -k -n tcp 8080 # 8080번 포트에 실행되고 있는 프로세스 종료
$ ./gradlew clean build
$ cd build/libs
$ nohup java -jar ________.jar &
5. 매번 Github 계정과 비밀번호를 치는 과정 없애기
$ git config --global credential.helper store
$ git pull origin main
# Github 계정 및 비밀번호 입력
$ git pull origin main # 더 이상 비밀번호를 안 묻는 걸 확인할 수 있다.
6. 지금까지 했던 코드 배포 과정을 자동화하기
1. .github/workflows/deploy.yml 작성하기
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/instagram-server # 여기 경로는 자신의 EC2에 맞는 경로로 재작성하기
git pull origin main
./gradlew clean build
sudo fuser -k -n tcp 8080 || true # || true를 붙인 이유는 8080에 종료시킬 프로세스가 없더라도 실패로 처리하지 않기 위해서이다.
# jar 파일을 실행시키는 명령어이다. 그리고 발생하는 로그들을 ./output.log 파일에 남기는 명령어이다.
nohup java -jar build/libs/*SNAPSHOT.jar > ./output.log 2>&1 &
2. Github에 Secret값 넣어주기


3. Github에 Push해서 Github Actions 잘 작동하는 지 확인하기

4. 실제 서버로 접속해서 잘 작동하는 지 확인하기
* 나는 branch가 master로 설정되어있었고 파일이름을 다르게 설정하여서 오류가 났었다. (이점 참고)
7. application.yml 파일 넣는 과정 자동화시키기
민감한 값을 따로 application.yml로 분리하는 경우가 많다.
민감한 값이기에 .gitignore에 추가해서 application.yml가 버전관리 되지 않게 셋팅한다.
이 때문에 배포를 할 때 application.yml를 따로 넣어주어야 하는 귀찮은 과정이 포함된다. 이 과정을 자동화시켜보자.
1. .gitignore에 application.yml 추가
...
application.yml
2. application.yml 파일 만들기
aws:
access-key: ~
secret-key: ~
3 .Github에 resources 폴더가 push 되도록 임의의 파일 하나 만들어주기
src/main/resources/empty.txt
4. Gitbub Actions 코드 수정하기
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
env:
APPLICATION_PROPERTIES: ${{ secrets.APPLICATION_PROPERTIES }}
with:
host: ${{ secrets.EC2_HOST }} # EC2의 주소
username: ${{ secrets.EC2_USERNAME }} # EC2 접속 username
key: ${{ secrets.EC2_PRIVATE_KEY }} # EC2의 Key 파일의 내부 텍스트
envs: APPLICATION_PROPERTIES
script_stop: true # 아래 script 중 실패하는 명령이 하나라도 있으면 실패로 처리
script: |
cd /home/ubuntu/instagram-server # 여기 경로는 자신의 EC2에 맞는 경로로 재작성하기
rm -rf src/main/resources/application.yml
git pull origin main
echo "$APPLICATION_PROPERTIES" > src/main/resources/application.yml
./gradlew clean build
sudo fuser -k -n tcp 8080 || true # || true를 붙인 이유는 8080에 종료시킬 프로세스가 없더라도 실패로 처리하지 않기 위해서이다.
nohup java -jar build/libs/*SNAPSHOT.jar > ./output.log 2>&1 &
5. Github에 Secret 값 넣어주기

6. 실제 EC2에 application.yml 파일도 같이 배포 잘 됐는 지 체크하기
8. 테스트 코드 실패하면 CI/CD 과정이 실패하는 지 확인하기
🧑🏻 ./gradlew clean build의 과정에 테스트 코드를 실행시키는 과정이 포함되어 있다. CI/CD를 할 때 테스트가 실패했는데 자동으로 배포가 되면 안 된다. 테스트를 실패하면 자동 배포가 진행되지 않고 중단되는 지 확인해보자.
한번에 CI/CD 구축
name: Deploy To EC2
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Github Repository 파일 불러오기
uses: actions/checkout@v4
- name: JDK 17버전 설치
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- name: application.yml 파일 만들기
run: echo "${{ secrets.APPLICATION_PROPERTIES }}" > ./src/main/resources/application.yml
- name: 테스트 및 빌드하기
run: ./gradlew clean build
- name: 빌드된 파일 이름 변경하기
run: mv ./build/libs/*SNAPSHOT.jar ./project.jar
- name: SCP로 EC2에 빌드된 파일 전송하기
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
source: project.jar
target: /home/ubuntu/instagram-server/tobe
- name: SSH로 EC2에 접속하기
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
script_stop: true
script: |
rm -rf /home/ubuntu/instagram-server/current
mkdir /home/ubuntu/instagram-server/current
mv /home/ubuntu/instagram-server/tobe/project.jar /home/ubuntu/instagram-server/current/project.jar
cd /home/ubuntu/instagram-server/current
sudo fuser -k -n tcp 8080 || true
nohup java -jar project.jar > ./output.log 2>&1 &
rm -rf /home/ubuntu/instagram-server/tobe
'🏛️Infra > CI & CD' 카테고리의 다른 글
EC2에 Docker 설치, ECR 세팅하기 (0) | 2025.02.01 |
---|---|
Code Deploy 이용한 CI/CD 구축 (0) | 2025.01.31 |
CodeDeploy 세팅/ IAM 설정 (0) | 2025.01.31 |
Github Actions 작동 (0) | 2025.01.26 |
CI/CD, Github Actions (0) | 2025.01.26 |
개인 프로젝트에서 많이 쓰는 CI/CD 구축 방법 (Github Actions)
✅ 전체적인 흐름

✅ 장점
- git pull을 활용해서 변경된 부분의 프로젝트 코드에 대해서만 업데이트 하기 때문에 CI/CD 속도가 빠르다.
- 대부분의 CI/CD 방식들은 전체 프로젝트를 통째로 갈아끼우는 방식을 사용한다.
- CI/CD 툴로 Github Actions만 사용하기 때문에 인프라 구조가 복잡하지 않고 간단하다.
✅ 단점
- 빌드 작업을 EC2에서 직접 진행하기 때문에 운영하고 있는 서버의 성능에 영향을 미칠 수 있다. (운영하고 있는 서버에서 빌드를 하면 성능이 안좋아짐)
- Github 계정 정보가 해당 EC2에 저장되기 때문에 개인 프로젝트 또는 믿을만한 사람들과 같이 진행하는 토이 프로젝트에서만 사용해야 한다.
1. Spring boot 프로젝트 셋팅
간단한 코드 작성
@RestController
public class AppController {
@GetMapping("/")
public String home() {
return "Hello, World!";
}
}
2. Spring boot 프로젝트 셋팅
-> github에 프로젝트 올리기
$ git init
$ git add .
$ git commit -m "first commit"
$ git branch -M main
$ git remote add origin _______
$ git push -u origin main
3. EC2에 들어가서 기본 환경 구성
1. 보안그룹 8080번 포트 열기
Spring Boot는 기본적으로 8080번 포트에서 실행된다.
2. JDK 설치
$ sudo apt update && /
sudo apt install openjdk-17-jdk -y
$ java -version # 잘 설치됐는 지 확인
3. Git clone을 활용해 프로젝트 다운받기
** 참고) Private Repository를 clone할 경우 Github의 계정과 비밀번호를 입력해야 한다. 이 때, 비밀번호는 실제 Github 계정의 비밀번호가 아닌 Github 토큰을 입력해야 한다. 토큰을 발급받는 방법은 아래 링크를 참고하자.
https://velog.io/@nara7875/github-%ED%86%A0%ED%81%B0-%EB%B0%9C%EA%B8%89%ED%95%98%EA%B8%B0
github 토큰 발급하기
위와 같이 private으로 된 repository를 다운받으려고 하면 github의 아이디와 비밀번호를 입력하라고 한다. 그런데 이걸 맨날 private에서 public으로 바꿔서 하기엔 너무 귀찮다. 실제로도 그렇게 어렵지
velog.io
4. EC2에서 clone 받은 서버가 잘 작동하는 지 확인하기
$ cd {프로젝트 경로}
$ ./gradlew clean build
$ cd build/libs
$ nohup java -jar ________.jar &
$ sudo lsof -i:8080 # 8080번 포트에 Spring Boot가 실행되고 있는 지 확인
* gradlew permission denied 이슈 해결
[백엔드] gradlew permission denied 이슈 해결
문제: ./gradlew build 시 gradlew: permission denied 오류 발생해결 방법:문제 원인 분석: 'Permission Denied' 오류는 실행 파일에 실행 권한이 없어서 발생합니다.권한 설정:chmod 명령어: chmod +x ./grad
velog.io
4. 실제 코드가 업데이트 될 때 어떤 과정을 거쳐서 배포하는 지 짚어보기
- 내 컴퓨터에서 새로운 코드 작성
- Commit 찍은 뒤 Github에 Push하기
- EC2에 들어가서 Git Pull 받기
$ cd {프로젝트 경로}
$ git pull origin main
4. 빌드 후 재배포하기
$ sudo lsof -i:8080 # 8080번 포트에 Spring Boot가 실행되고 있는 지 확인
$ sudo fuser -k -n tcp 8080 # 8080번 포트에 실행되고 있는 프로세스 종료
$ ./gradlew clean build
$ cd build/libs
$ nohup java -jar ________.jar &
5. 매번 Github 계정과 비밀번호를 치는 과정 없애기
$ git config --global credential.helper store
$ git pull origin main
# Github 계정 및 비밀번호 입력
$ git pull origin main # 더 이상 비밀번호를 안 묻는 걸 확인할 수 있다.
6. 지금까지 했던 코드 배포 과정을 자동화하기
1. .github/workflows/deploy.yml 작성하기
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/instagram-server # 여기 경로는 자신의 EC2에 맞는 경로로 재작성하기
git pull origin main
./gradlew clean build
sudo fuser -k -n tcp 8080 || true # || true를 붙인 이유는 8080에 종료시킬 프로세스가 없더라도 실패로 처리하지 않기 위해서이다.
# jar 파일을 실행시키는 명령어이다. 그리고 발생하는 로그들을 ./output.log 파일에 남기는 명령어이다.
nohup java -jar build/libs/*SNAPSHOT.jar > ./output.log 2>&1 &
2. Github에 Secret값 넣어주기


3. Github에 Push해서 Github Actions 잘 작동하는 지 확인하기

4. 실제 서버로 접속해서 잘 작동하는 지 확인하기
* 나는 branch가 master로 설정되어있었고 파일이름을 다르게 설정하여서 오류가 났었다. (이점 참고)
7. application.yml 파일 넣는 과정 자동화시키기
민감한 값을 따로 application.yml로 분리하는 경우가 많다.
민감한 값이기에 .gitignore에 추가해서 application.yml가 버전관리 되지 않게 셋팅한다.
이 때문에 배포를 할 때 application.yml를 따로 넣어주어야 하는 귀찮은 과정이 포함된다. 이 과정을 자동화시켜보자.
1. .gitignore에 application.yml 추가
...
application.yml
2. application.yml 파일 만들기
aws:
access-key: ~
secret-key: ~
3 .Github에 resources 폴더가 push 되도록 임의의 파일 하나 만들어주기
src/main/resources/empty.txt
4. Gitbub Actions 코드 수정하기
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
env:
APPLICATION_PROPERTIES: ${{ secrets.APPLICATION_PROPERTIES }}
with:
host: ${{ secrets.EC2_HOST }} # EC2의 주소
username: ${{ secrets.EC2_USERNAME }} # EC2 접속 username
key: ${{ secrets.EC2_PRIVATE_KEY }} # EC2의 Key 파일의 내부 텍스트
envs: APPLICATION_PROPERTIES
script_stop: true # 아래 script 중 실패하는 명령이 하나라도 있으면 실패로 처리
script: |
cd /home/ubuntu/instagram-server # 여기 경로는 자신의 EC2에 맞는 경로로 재작성하기
rm -rf src/main/resources/application.yml
git pull origin main
echo "$APPLICATION_PROPERTIES" > src/main/resources/application.yml
./gradlew clean build
sudo fuser -k -n tcp 8080 || true # || true를 붙인 이유는 8080에 종료시킬 프로세스가 없더라도 실패로 처리하지 않기 위해서이다.
nohup java -jar build/libs/*SNAPSHOT.jar > ./output.log 2>&1 &
5. Github에 Secret 값 넣어주기

6. 실제 EC2에 application.yml 파일도 같이 배포 잘 됐는 지 체크하기
8. 테스트 코드 실패하면 CI/CD 과정이 실패하는 지 확인하기
🧑🏻 ./gradlew clean build의 과정에 테스트 코드를 실행시키는 과정이 포함되어 있다. CI/CD를 할 때 테스트가 실패했는데 자동으로 배포가 되면 안 된다. 테스트를 실패하면 자동 배포가 진행되지 않고 중단되는 지 확인해보자.
한번에 CI/CD 구축
name: Deploy To EC2
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Github Repository 파일 불러오기
uses: actions/checkout@v4
- name: JDK 17버전 설치
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- name: application.yml 파일 만들기
run: echo "${{ secrets.APPLICATION_PROPERTIES }}" > ./src/main/resources/application.yml
- name: 테스트 및 빌드하기
run: ./gradlew clean build
- name: 빌드된 파일 이름 변경하기
run: mv ./build/libs/*SNAPSHOT.jar ./project.jar
- name: SCP로 EC2에 빌드된 파일 전송하기
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
source: project.jar
target: /home/ubuntu/instagram-server/tobe
- name: SSH로 EC2에 접속하기
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
script_stop: true
script: |
rm -rf /home/ubuntu/instagram-server/current
mkdir /home/ubuntu/instagram-server/current
mv /home/ubuntu/instagram-server/tobe/project.jar /home/ubuntu/instagram-server/current/project.jar
cd /home/ubuntu/instagram-server/current
sudo fuser -k -n tcp 8080 || true
nohup java -jar project.jar > ./output.log 2>&1 &
rm -rf /home/ubuntu/instagram-server/tobe
'🏛️Infra > CI & CD' 카테고리의 다른 글
EC2에 Docker 설치, ECR 세팅하기 (0) | 2025.02.01 |
---|---|
Code Deploy 이용한 CI/CD 구축 (0) | 2025.01.31 |
CodeDeploy 세팅/ IAM 설정 (0) | 2025.01.31 |
Github Actions 작동 (0) | 2025.01.26 |
CI/CD, Github Actions (0) | 2025.01.26 |