본문 바로가기
카테고리 없음

[CI/CD]GithubActions 사용하면서 겪었던 이슈

by dev_m.w 2025. 11. 5.

기존에는 프로젝트 파일이 변경될 때마다 로컬에서 직접 빌드한 후, EC2 서버로 JAR 파일을 전송하고 수동으로 실행시켜야 했다.코드가 조금만 수정되어도 같은 과정을 반복해야 했기 때문에, 배포 과정이 매우 번거로웠다.이러한 불편함을 해소하기 위해, 빌드와 배포 과정을 자동화해주는 CI/CD 파이프라인을 도입해보았다.

 

 

 

우선 CI/CD를 사용하면서 마주한 문제들을 해결하기 위해서는 GitHub Actions에 대한 기본적인 이해가 필요했다.CI/CD가 어떤 원리로 내 코드를 감지하고 자동으로 처리하는지 이해하기 위해, 내가 작성한 코드가 변경될 때 어떤 흐름으로 동작하는지를 살펴보았다.

 

 

컴파일: 즉 내가 작성한 언어 - >  기계언어로 바꿔주는걸 컴파일 작업. (영어로된책을 -> 한국어로 번역한다)
 
빌드: 컴파일 된 파일들을 하나로 묶어 실행 가능한 형태로 만드는 작업. (여러 페이지를 한권의 책으로 만든다)

배포: 빌드된 실행 파일을 사용자가 사용하는 환경에 올리는 과정.(서점에 책을 판다)

 

CI: 개발자가 코드를 수정할떄마다 자동으로 빌드,테스트,컴파일을 수행해준다


CD: CI이후 생성된 실행파일을 운영서버에 자동으로 배포하는 과정.

 

github action 실행과정

 

1. Push Event 가발생하면 Github가 GithubAtion Workflows가 실행 (어떠한 작업을 할것인지 적인 주문서)

2. GithubAction은 깃허브에 Runner(가상 컴퓨터를)하나 만든다.

3.Runner는 Workflows안에 적힌  작업을 수행한다.

4. Job 한묶음의 실행단위에서 Action(Step)으로 작업을 나눠서 절차를 실행한다.

 





githubAction 사용하면서 겪었던 문제들.

 

⚠️ 1. nohub에서 systemd로 서버 관리 자동화 문제.

 

 

리눅스(또는 macOS) 처럼 터미널 기반의 세션 구조를 가진 환경에서는 GithubAction은 EC2랑 SSH로 접속할떄 임시 대화방(터미널 세션)이라는게 생성된다. 그 대화방안에서 명령들을 수행하고, 전부 수행하면 대화방을 자동으로 닫고  그 세션에 연결되어 있던 프로세스들도 같이 종료된다. 

 

 

문제 발생

그래서 세션이 끊겨도  내 어플리케이션이 종료되지않게 백그라운드에서 실행될수 있는 리눅스 명령어 nohub을 사용했다. 하지만 며칠뒤 서버가 죽는 현상이 발생됐는데 자동으로 재시작되지 않는 문제가 발생하고, 또한 배포 할떄마다 서버를 껏다 켯다 재시작하는 문제가 발생했다. 그래서 현업에서는 왜 도커나 쿠버네틱스 같은 기술들을  사용하는지 알게돼었다. 

 

 

해결 

도커나 쿠버네틱스 같은 기술을 사용해도 좋지만 내 프로젝트는 간단한 토이 프로젝트기 떄문에 일단은 가장 보편적으로 사용하는 방식 systemd 사용해서 문제를 해결했다.

 

systemd란 리눅스가 켜질 때, 맨 처음부터 끝까지 모든 걸 관리하는 프로그램이다. 즉 서버가 꺼지더라도 자동으로 재시작하고, 로그또한 남겨지기떄문에  관리측면에서 매우 효율적이다.

 

 

⚠️ 2. JAR 파일 복사 시 폴더까지 따라오는 문제

문제 상황
GitHub Actions에서 EC2로 .jar 파일을 보낼 때,build/libs 폴더 안에 있는 파일만 보내고 싶었는데
EC2에 접속해보니 아래처럼 폴더까지 그대로 복사되어 있음. 👇

 

. build/libs 폴더까지 같이 복사되는 경우

 

원인

Workflows.yml에서 아래와 같이 설정되어 있었음:

 

      # 5️⃣ 빌드된 JAR EC2로 전송
      - name: Upload jar to EC2
        uses: appleboy/scp-action@v0.1.7
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ubuntu
          key: ${{ secrets.EC2_PRIVATE_KEY }}
          source: "build/libs/*.jar"
		  target: "/home/ubuntu/app"

 

 

source 부분에 경로 다음 /*.jar -> 해당 폴더안에있는 .jar 파일 모두 가져와라고 하니깐

GitHub Action은 build/libs 폴더 안에 있는 파일들을 다 복사해야 하네? 그럼 build/libs 폴더째로 들고 가야겠다생각하고

/home/ubuntu/app/build/libs/shop-0.0.1-SNAPSHOT.jar 경로로 만들어버림.

 

 

해결 방법
파일 이름을 정확히 지정함.'

 

source: "build/libs/shop-0.0.1-SNAPSHOT.jar"

target: "/home/ubuntu/app/"

 

⚠️ 3. JAR 파일이 디렉토리 로 바뀌는 문제

문제 상황
위해결  방법처럼 파일명을 정확히 지정했는데,EC2 터미널에 가보니 .파일이 아니라 디렉토리로 생기는 현상이 발생. 

실행파일이 아닌 디렉토리 형태로 만들어짐

 

원인
Gradle이 빌드 결과물을 만들 때,이미 같은 이름의 폴더(shop-0.0.1-SNAPSHOT.jar)가 존재하면
그걸 파일로 덮어쓰지 못하고,그냥 디렉토리 상태로 유지함.

 

 

해결

EC2 안의 기존 build 폴더 또는 잘못된 .jar 디렉토리를 삭제하고 로컬에서 다시 빌드 후

GitHubActions로 재배포하면 정상적인 실행 파일(.jar)이 생성됐음.