[Github Actions] - SCP 이용하여 CI/CD 구축

 

[방식 설명]

1. Github에서 push

2. Github Actions가 작동함

3. Github Actions 서버내에 jdk 및 프로젝트 다운로드받아 프로젝트 빌드후 운영서버에 jar 전달

4. 실제 운영서버에서 전달받은 jar로 프로젝트 실행

 

2-3.

 

[장점]

  • 빌드 작업을 Github Actions 서버내에서 처리해서 운영서버의 성능에 영향을 주지 않음
    (실제 EC2 서버내에서 빌드하니깐 프리티어는.. 서버가 멈춰버리는현상발생함, 스왑메모리로 해결)
  • 구조가 간단함

[단점]

  • 무중단 배포 하거나, 여러개의 운영서버에 배포해야하는 상황이면 복잡해짐

deploy.yml

name: Deploy To EC2

# 해당 레포지토리의 main 브렌치에 push가 반응했을경우 이벤트 시작
on:
  push:
    branches:
      - main

jobs:
  # 이벤트의 이름은 deploy이다
  deploy:
    # 서버환경 ubuntu 최신버전
    runs-on: ubuntu-latest
    steps:
        # Github ACtions 버내에 해당 Repository에서 해당 폴더를 다운로드함
        # GithubActions 라이브러리임
      - name: Github Repository에 올린 파일들을 불러오기
        uses: actions/checkout@v4

        # Github Actions 서버내에 JDK 17버전 설치함(라이브러리)
      - name: JDK 17버전 설치
        uses: actions/setup-java@v4
        with:
          distribution: temurin #JDK의 회사
          java-version: 17      #JDK의 버전

        # Github Actions 서버내에 application.yml 파일 생성
        # 1. application.yml 파일생성
        # 2. 파일 내에 secrets에 저장해둔값 불러와서 값 입력
      - name: application.yml 파일 만들기
        run: echo "${{ secrets.APPLICATION_PROPERTIES }}" > ./src/main/resources/application.yml

        # Github Actions 서버내에서 프로젝트 빌드하기
      - name: 테스트 및 빌드하기
        run: ./gradlew clean build

        # Github Actions 서버내에 빌드된 jar 파일을 project.jar로 이름 변경
      - name: 빌드된 파일 이름 변경하기
        run: mv ./build/libs/*SNAPSHOT.jar ./project.jar

        # Github Actions 서버내에 있는 jar파일 EC2 서버로 파일 전송하기(라이브러리)
      - 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/cicdMemoryServer/tobe # EC2로 전송하는데 어디에 파일을 보낼지 지정

        # SSH이용하여 EC2서버로 접속하기(라이브러리)
      - 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
          # 1. 기존에 사용하던 프로젝트 폴더 제거
          # 2. 프로젝트 배포할 폴더 생성
          # 3. Github Actions로 부터 받은 jar파일 프로젝트 배포 폴더로 이동
          # 4. 프로젝트 배포 폴더로 이동
          # 5. 현재 실행중이 8080포트 종료하기(만약 실행중인 8080 없더라도 오류로 처리하지 않고 성공처리함)
          # 6. 프로젝트 jar 실행
          # 7. SCP에서 전달받을때 사용하던 폴더 삭제
          script: |
            rm -rf /home/ubuntu/cicdMemoryServer/current 
            mkdir /home/ubuntu/cicdMemoryServer/current
            mv /home/ubuntu/cicdMemoryServer/tobe/project.jar /home/ubuntu/cicdMemoryServer/current/project.jar
            cd /home/ubuntu/cicdMemoryServer/current
            sudo fuser -k -n tcp 8080 || true
            nohup java -jar project.jar > ./output.log 2>&1 &
            rm -rf /home/ubuntu/cicdMemoryServer/tobe

 

 

[간단 요약]

1. github내 push반응하여 이벤트 실행

2. github repository에서 프로젝트를 Github Actions 서버내로 다운로드

3. Github Actions서버내 JDK 설치

4. Github Actions서버내 다운로드 받은 프로젝트에 application.yml 값 설정(깃허브 secrets 에서 미리 작성해둠)

5. Github Actions서버내 프로젝트 빌드함

6. 빌드된 jar파일 project.jar 로 이름 변경

7. project.jar 운영서버로 파일전송함(target 으로 보낼 위치 설정)

8. 운영서버 원격접속(SSH)

9.  기존 프로젝트 폴더 삭제후 재생성

10. prject.jar 생성한 폴더로 이동

11. 기존 8080포트 사용중이면 종료

12. jar 실행

 

[Github Actions 사용 라이브러리]

 

Checkout - GitHub Marketplace

Checkout a Git repository at a particular version

github.com

 

 

Setup Java JDK - GitHub Marketplace

Set up a specific version of the Java JDK and add the command-line tools to the PATH

github.com

 

 

SCP Files - GitHub Marketplace

Copy files and artifacts via SSH

github.com

 

 

GitHub - appleboy/ssh-action: GitHub Actions for executing remote ssh commands.

GitHub Actions for executing remote ssh commands. Contribute to appleboy/ssh-action development by creating an account on GitHub.

github.com

 

 

 

[프로젝트에서 사용한 repository]

 

GitHub - memoryDev/cicdMemoryServer: CI/CD - 개인프로젝트 배포 연습

CI/CD - 개인프로젝트 배포 연습. Contribute to memoryDev/cicdMemoryServer development by creating an account on GitHub.

github.com

 

해당글은 인프런의 강의듣고 작성한 게시글입니다.

 

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

JSCODE 박재성 | 비전공자 입장에서도 쉽게 이해할 수 있고, 실전에서 바로 적용 가능한 CI/CD 입문 강의를 만들어봤습니다!, 🤬 에라이, 못 해먹겠네!비전공자로 개발을 시작해 여러 회사에서 CTO로

www.inflearn.com

 

'프로그래밍 > DevOps' 카테고리의 다른 글

1. CI/CD 기본개념 및 흐름  (1) 2024.12.29
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유