Skip to content
PlusUltraCode edited this page Mar 27, 2025 · 1 revision
  1. 먼저 자바 jdk를 다운받아야 한다.
sudo apt update
sudo apt install openjdk-17-jdk -y
java -version 
  1. 바로 git pull 땡겨서 clone 후 배포방법
git clone <git repo 주소>
chmod -x gradlew
./gradlew clean build
cd build/libs 들어가서 SNAPSHOT.JAR 파일명을 실행시킨다. 
nohup java -jar instagram-server2-0.0.1-SNAPSHOT.jar & 
sudo lsof -i:8080

기타 명령어 모음집

tcp 8080 포트 종료시키는 명령어
sudo fuser -k -n tcp 8080
혹시나 repository 가 private로 설정해서 매번 비밀번호 인증이 귀찮다면
git config --global credential.helper store

근데 이러면 매번 git pull 받아서 서버 배포하는 작업이 귀찮다 . CICD 를 이용하자

intellij를 킨다음 상위 directory에 반드시 .github/workflows/deploy.yml 을 만든다 image

마지막 이름은 자유

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 }}
          username: ${{ secrets.EC2_USERNAME }}
          key: ${{ secrets.EC2_PRIVATE_KEY }}
          script_stop: true
          script: |
            cd /home/ubuntu/instagram-server2
            git pull origin main
            ./gradlew clean build
            sudo fuser -k -n tcp 8080 || true
            nohup java -jar build/libs/*SNAPSHOT.jar > ./output.log 2>&1 &

secrets값은 넣어주자 host 는 ip를 의미 username 은 ubuntu로 설정햏으면 ubuntu private_key 는 pem key를 의미

.gitignore 등록후 cache 문제가 잇을수 있음 resouces 파일을 git 으로 등록하기 위해 임의이 txt파일 저

git add .
git status << 이거 시 new file 에 application.yml 이 있다면 아래와 같이 캐시삭제
git rm -r --cached .

해당 APPLICATION_PROPERTIES 는 SECRETS 로 따로 등록해야 된다. 

최종

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 }}
          username: ${{ secrets.EC2_USERNAME }}
          key: ${{ secrets.EC2_PRIVATE_KEY }}
          envs: APPLICATION_PROPERTIES
          script_stop: true
          script: |
            cd /home/ubuntu/instagram-server2
            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
            nohup java -jar build/libs/*SNAPSHOT.jar > ./output.log 2>&1 &

github Action에서 build 하고 project.jar 파일을 ec2 원격으로 전송 하는 코드

name: Deploy To EC2

on:
  push:
    branches:
      - main

jobs:
  Deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Github Repository에 올린 파일들을 불러오기
        uses: actions/checkout@v4

      - name: Test
        run: |
          ls
          pwd

      - 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: |
          chmod +x ./gradlew
          ./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-server2/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-server2/current
            mkdir /home/ubuntu/instagram-server2/current
            mv /home/ubuntu/instagram-server2/tobe/project.jar /home/ubuntu/instagram-server2/current/project.jar
            cd /home/ubuntu/instagram-server2/current
            sudo fuser -k -n tcp 8080 || true
            nohup java -jar project.jar >./output.log 2>&1 &
            rm -rf /home/ubuntu/instagram-server2/tobe

iam 이란 특정 aws 리소스가 다른 aws 리소스에 접근할 수 있는 권한을 의미한다 사용자란 외부 리소스가 특정 aws 리소스에 접근할 때

코드 deploy 와 s3를 이용하여 배포할 수 있는데 이건 추후에 하기로 ... 공부 image

#!/bin/bash

echo "--------------- 서버 배포 시작 -----------------"
cd /home/ubuntu/instagram-server2
sudo fuser -k -n tcp 8080 || true
nohup java -jar project.jar > ./output.log 2>&1 &
echo "--------------- 서버 배포 끝 -----------------"

image

version: 0.0
os: linux

files:
  # S3에 저장한 파일들 중 destination(AWS EC2)으로 이동시킬 대상을 지정한다.
  # / 이라고 지정하면 S3에 저장한 전체 파일을 뜻한다.
  - source: /
    # EC2의 어떤 경로에 저장할 지 지정한다.
    destination: /home/ubuntu/instagram-server2

permissions:
  - object: /
    owner: ubuntu
    group: ubuntu

hooks:
  ApplicationStart:
    - location: scripts/start-server.sh
      timeout: 60
      runas: ubuntu
name: Deploy To EC2

on:
  push:
    branches:
      - main

jobs:
  Deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Github Repository에 올린 파일들을 불러오기
        uses: actions/checkout@v4

      - name: Test
        run: |
          ls
          pwd

      - 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: |
          chmod +x ./gradlew
          ./gradlew clean build

      - name: 빌드된 파일 이름 변경하기
        run: mv ./build/libs/*SNAPSHOT.jar ./project.jar

      - name: 압축하기
        run: tar -czvf $GITHUB_SHA.tar.gz project.jar appspec.yml scripts

      - name: AWS Resource에 접근할 수 있게 AWS credentials 설정
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-region: ap-northeast-2
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

      - name: S3에 프로젝트 폴더 업로드하기
        run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.tar.gz s3://instagram-server123123/$GITHUB_SHA.tar.gz

      - name: Code Deploy를 활용해 EC2에 프로젝트 코드 배포
        run: aws deploy create-deployment
            --application-name instagram-server2
            --deployment-config-name CodeDeployDefault.AllAtOnce
            --deployment-group-name production
            --s3-location bucket=instagram-server123123,bundleType=tgz,key=$GITHUB_SHA.tar.gz

이걸 하기 위해선 aws codedeploy 설정 및 s3 설정을 해야하고 iam을 이용해 권한 부여 및 사용자를 만들어 githubaction 이 s3랑 codedeploy에 접근도 가능하게 설정해야 한다.