
@RestController public class AppController { @GetMapping("/") public String home() { return "Hello, World!"; } }
$ cd instagram-server $ git init $ git add . $ git commit -m "first commit" $ git branch -M main $ git remote add origin _______ $ git push -u origin main
$ sudo apt update && / sudo apt install openjdk-17-jdk -y $ java -version # 잘 설치됐는 지 확인
$ git clone {git repository clone 주소}
$ cd {프로젝트 경로} $ ./gradlew clean build $ cd build/libs $ nohup java -jar ________.jar & $ sudo lsof -i:8080 # 8080번 포트에 Spring Boot가 실행되고 있는 지 확인

$ cd {프로젝트 경로} $ git pull origin main
$ sudo lsof -i:8080 # 8080번 포트에 Spring Boot가 실행되고 있는 지 확인 $ sudo fuser -k -n tcp 8080 # 8080번 포트에 실행되고 있는 프로세스 종료 $ ./gradlew clean build $ cd build/libs $ nohup java -jar ________.jar &
$ git config --global credential.helper store $ git pull origin main # Github 계정 및 비밀번호 입력 $ git pull origin main # 더 이상 비밀번호를 안 묻는 걸 확인할 수 있다.
이 방식은~/.git-credentials에 로그인 정보를 저장해둠으로써 github 계정과 비밀번호를 따로 묻지 않는 방식이다. 이 방식의 단점은 EC2에 접근할 수 있는 모든 사용자가 내 Github 정보를 볼 수 있다는 점이 단점이다.
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 &
appleboy/ssh-action의 공식 문서nohup … & 부분의 코드를 수동으로 배포할 때와 조금 다르게 작성한 이유


application.yml 파일 넣는 과정 자동화시키기... application.yml
aws: access-key: ABCDEFG secret-key: HIJKLMN
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 &

./gradlew clean build의 과정에 테스트 코드를 실행시키는 과정이 포함되어 있다. CI/CD를 할 때 테스트가 실패했는데 자동으로 배포가 되면 안 된다. 테스트를 실패하면 자동 배포가 진행되지 않고 중단되는 지 확인해보자. $ ./gradlew test
package com.example.demo; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class DemoApplicationTests { @Test void contextLoads() { throw new RuntimeException("Fail!"); } }
