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 으로 접속하니 확인이 잘 된다.

쉘 스크립트 파일을 활용해 매번 수동으로 입력해야 했던 명령어들을 자동화시켰다. 이것이 쉘 스크립트의 힘이다.
앞으로 반복적으로 수행하는 작업을 만나면 쉘 스크립트를 활용해 자동화할 수 있는지 고민해본다.
참고링크 : 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
'강의 실습 > 비전공자도 이해할 수 있는 리눅스 입문 실전' 카테고리의 다른 글
| AWS 비용 나가지 않게 리소스 종료하기 / 혹시나 비용 나가고 있는 지 체크하기 (0) | 2025.12.04 |
|---|---|
| [참고] 쉘 스크립트 공부 지침 (0) | 2025.12.03 |
| 쉘 스크립트 파일 작성/실행 하는 법 (0) | 2025.12.01 |
| 문자열을 터미널 화면에 출력하는 명령어 (echo) (0) | 2025.11.30 |
| 로그 실시간으로 확인하는 법 (tail -f) (0) | 2025.11.29 |
댓글