본문 바로가기
강의 실습/비전공자도 이해할 수 있는 리눅스 입문 실전

[실습] 'git pull 받아오기 → Spring Boot 빌드 → 빌드된 jar 파일 실행'의 과정을 자동화하기

by jint 2025. 12. 2.

1. 'git pull 받아오기 → Spring Boot 빌드 → 빌드된 jar 파일 실행'의 과정을 자동화하기
새로운 기능이 추가될 때마다 수동으로 백엔드 서버를 배포하는 것은 귀찮으니, 이 과정을 자동화 한다. 수동으로 백엔드 서버를 배포할 때 입력하는 리눅스 명령어를 차례대로 쉘 스크립트 파일에 작성한다.

1) 쉘 스크립트 파일 생성
- Ubuntu

ubuntu@ip-172-31-39-75:~$ cd ~
ubuntu@ip-172-31-39-75:~$ vi deploy.sh


2) 쉘 스크립트 파일 작성
- Ubuntu vim

#!/bin/bash

echo "---- git pull 받아오기 ----"
cd /home/ubuntu/linux-springboot
git pull origin main

echo "---- 빌드하기 ----"
./gradlew clean build

echo "---- 빌드된 jar 파일을 백그라운드로 실행시키기 ----"
cd build/libs
nohup java -jar linux-springboot-0.0.1-SNAPSHOT.jar >> app.log 2>&1 &

echo "---- Spring Boot 서버 실행 완료 ----"
~                                                                                                                                                                                                                  
~                                                                                                                                                                                                                  
~                                                                                                                                                                                                                  
~                                                                                                                                                                                                                  
:wq


참고) 위와 같이 echo 명령어를 적절히 사용하면, 쉘 스크립트 파일의 진행 상황도 파악할 수 있고 디버깅도 편해진다.

작성된 파일을 확인한다.

- Ubuntu

ubuntu@ip-172-31-39-75:~$ cat deploy.sh
#!/bin/bash

echo "---- git pull 받아오기 ----"
cd /home/ubuntu/linux-springboot
git pull origin main

echo "---- 빌드하기 ----"
./gradlew clean build

echo "---- 빌드된 jar 파일을 백그라운드로 실행시키기 ----"
cd build/libs
nohup java -jar linux-springboot-0.0.1-SNAPSHOT.jar >> app.log 2>&1 &

echo "---- Spring Boot 서버 실행 완료 ----"


3) 쉘 스크립트 파일 실행을 위해 권한 부여
모든 사용자에 대해 실행 권한을 추가한다.

- Ubuntu

ubuntu@ip-172-31-39-75:~$ ls -l deploy.sh
-rw-rw-r-- 1 ubuntu ubuntu 371 Dec  2 11:16 deploy.sh
ubuntu@ip-172-31-39-75:~$ chmod +x deploy.sh
ubuntu@ip-172-31-39-75:~$ ls -l deploy.sh
-rwxrwxr-x 1 ubuntu ubuntu 371 Dec  2 11:16 deploy.sh


4) 쉘 스크립트 파일 실행
- Ubuntu

ubuntu@ip-172-31-39-75:~$ ./deploy.sh
---- git pull 받아오기 ----
From https://github.com/JSCODE-EDU/linux-springboot
 * branch            main       -> FETCH_HEAD
Already up to date.
---- 빌드하기 ----
Starting a Gradle Daemon (subsequent builds will be faster)

BUILD SUCCESSFUL in 21s
6 actionable tasks: 6 executed
---- 빌드된 jar 파일을 백그라운드로 실행시키기 ----
---- Spring Boot 서버 실행 완료 ----


정말 Spring Boot 서버를 실행시킨게 맞는지 확인하기 위해, 기존에 실행되던 Spring Boot 서버를 종료하고 다시 실행시킨다.


2. 쉘 스크립트가 잘 작동한 건지 테스트하기
1) 기존에 실행되던 Spring Boot 서버 종료
- Ubuntu

ubuntu@ip-172-31-39-75:~$ sudo lsof -i:8080
COMMAND    PID   USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java    390872 ubuntu    9u  IPv6 3878294      0t0  TCP *:http-alt (LISTEN)
ubuntu@ip-172-31-39-75:~$ ps aux | grep java
ubuntu    390872  0.1 15.2 2785592 143156 ?      Sl   Nov25  14:54 java -jar linux-springboot-0.0.1-SNAPSHOT.jar
ubuntu    428316 12.5 38.8 2392032 364076 ?      Ssl  11:23   0:30 /usr/lib/jvm/java-17-openjdk-amd64/bin/java --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens=java.xml/javax.xml.namespace=ALL-UNNAMED -XX:MaxMetaspaceSize=384m -XX:+HeapDumpOnOutOfMemoryError -Xms256m -Xmx512m -Dfile.encoding=UTF-8 -Duser.country -Duser.language=en -Duser.variant -cp /home/ubuntu/.gradle/wrapper/dists/gradle-8.14-bin/38aieal9i53h9rfe7vjup95b9/gradle-8.14/lib/gradle-daemon-main-8.14.jar -javaagent:/home/ubuntu/.gradle/wrapper/dists/gradle-8.14-bin/38aieal9i53h9rfe7vjup95b9/gradle-8.14/lib/agents/gradle-instrumentation-agent-8.14.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 8.14
ubuntu    428448  0.0  0.2   7076  2100 pts/0    S+   11:27   0:00 grep --color=auto java
ubuntu@ip-172-31-39-75:~$ kill 390872


sudo lsof -i 명령어 또는 ps aux 명령어로 PID 확인 후 종료한다.

2) 잘 종료됐는 지 더블체크
- Ubuntu

ubuntu@ip-172-31-39-75:~$ curl localhost:8080
curl: (7) Failed to connect to localhost port 8080 after 0 ms: Couldn't connect to server
ubuntu@ip-172-31-39-75:~$ curl 13.125.210.228:8080
curl: (7) Failed to connect to 13.125.210.228 port 8080 after 0 ms: Couldn't connect to server


curl 명령어로도 확인하고, 브라우저에서 http://{public IP 주소}:8080 으로도 접속하여 확인해본다.

3) 쉘 스크립트 실행시키기
- Ubuntu

ubuntu@ip-172-31-39-75:~$ ./deploy.sh
---- git pull 받아오기 ----
From https://github.com/JSCODE-EDU/linux-springboot
 * branch            main       -> FETCH_HEAD
Already up to date.
---- 빌드하기 ----

BUILD SUCCESSFUL in 4s
6 actionable tasks: 6 executed
---- 빌드된 jar 파일을 백그라운드로 실행시키기 ----
---- Spring Boot 서버 실행 완료 ----


4) Spring Boot 서버 실행되고 있는지 확인
- Ubuntu

ubuntu@ip-172-31-39-75:~$ sudo lsof -i:8080
COMMAND    PID   USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java    428536 ubuntu    9u  IPv6 4218614      0t0  TCP *:http-alt (LISTEN)
ubuntu@ip-172-31-39-75:~$ ps aux | grep java
ubuntu    428316  5.1 40.2 2457568 376624 ?      Ssl  11:23   0:36 /usr/lib/jvm/java-17-openjdk-amd64/bin/java --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens=java.xml/javax.xml.namespace=ALL-UNNAMED -XX:MaxMetaspaceSize=384m -XX:+HeapDumpOnOutOfMemoryError -Xms256m -Xmx512m -Dfile.encoding=UTF-8 -Duser.country -Duser.language=en -Duser.variant -cp /home/ubuntu/.gradle/wrapper/dists/gradle-8.14-bin/38aieal9i53h9rfe7vjup95b9/gradle-8.14/lib/gradle-daemon-main-8.14.jar -javaagent:/home/ubuntu/.gradle/wrapper/dists/gradle-8.14-bin/38aieal9i53h9rfe7vjup95b9/gradle-8.14/lib/agents/gradle-instrumentation-agent-8.14.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 8.14
ubuntu    428536  7.4 13.9 2785592 130128 pts/0  Sl   11:32   0:09 java -jar linux-springboot-0.0.1-SNAPSHOT.jar
ubuntu    428573  0.0  0.2   7076  2200 pts/0    S+   11:34   0:00 grep --color=auto java
ubuntu@ip-172-31-39-75:~$ curl localhost:8080
{"timestamp":"2025-12-02T11:35:35.796+00:00","status":404,"error":"Not Found","path":"/"}ubuntu@ip-172-31-39-75:~$ 
ubuntu@ip-172-31-39-75:~$ curl 13.125.210.228:8080
{"timestamp":"2025-12-02T11:35:49.881+00:00","status":404,"error":"Not Found","path":"/"}ubuntu@ip-172-31-39-75:~$


브라우저에서 http://{public IP 주소}:8080 으로 접속하니 확인이 잘 된다.

 

브라우저에서 Spring Boot 서버 실행 확인


쉘 스크립트 파일을 활용해 매번 수동으로 입력해야 했던 명령어들을 자동화시켰다. 이것이 쉘 스크립트의 힘이다.
앞으로 반복적으로 수행하는 작업을 만나면 쉘 스크립트를 활용해 자동화할 수 있는지 고민해본다.


참고링크 : https://www.inflearn.com/course/%EB%B9%84%EC%A0%84%EA%B3%B5%EC%9E%90%EB%8F%84-%EC%9D%B4%ED%95%B4%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%9E%85

 

비전공자도 이해할 수 있는 리눅스 입문/실전| JSCODE 박재성 - 인프런 강의

현재 평점 5.0점 수강생 318명인 강의를 만나보세요. 비전공자 입장에서도 쉽게 이해할 수 있고, 실전에서 바로 적용 가능한 '리눅스 입문' 강의를 만들어봤습니다! 리눅스를 처음 배우시는 분, Per

www.inflearn.com

댓글