ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CI/CD] Github-Actions로 CI/CD 구축하기-2 개선
    devops/CICD 2024. 12. 4. 20:02

    Github-Actions로 CI/CD 구축하기-2

    Github-Actions CI/CD 흐름 개선하기

     

    기존 Github-Actions의 방식

     

     

    기존  방식의 문제점

    인스턴스에서 git pull을 통해 코드를 다운받고 직접 빌드를 했다. 

    하지만 빌드를 하는 작업은 무겁기때문에 이는 서버의 성능에 영향을 미친다.

     

     

     

    새로 개선된 방식

     

    Github-Actions는 컴퓨터이기 때문에 빌드와 테스트를 여기서 해주고 빌드된 파일을 인스턴스로 전달할 수 있다.

    빌드된 파일을 전달할때 압축을 해놓기 때문에 인스턴스에서 압축을 풀고 이를 갖고 서버 재실행.

     

     

    개선한 방식의 장점

    빌드를 인스턴스가 아닌 github-actions에서 하기때문에 배포서버의 성능에 영향을 미치지 않는다.

     

     

    개선한 방식의 단점

    무중단 배포를 구현하거나 여러 인스턴스에 배포해야하는 상황이라면 구현이 복잡해진다

     

     

    이 방식은 언제 써야 좋을까?

    초기서비스를 구축할때 쓴다.

     

    처음 서비스를 구현할 때는 대규모 서비스에 적합한 구조로 하지않는다 (오버 엔지니어링을 하지 않는다 )

    실제 확장의 필요성이 느껴질때 인프라를 고도화한다.

     

     

    복잡한 인프라를 관리하는 것은 여러 비용이 많이든다

     

    1. 인프라 구조 변경시 비용이 많이들어간다.

    2. 에러 발생시 트러블슈팅의 어려움

    3. 팀원이 구조를 이해하기 어려워 한다.

    4. 기능을 추가하거나 수정할때 더 많은 시간이 들어감

    5. 비용자체가 많이 발생한다.

     

     

     

     

    코드

    deploy.yml

     

    name: nestJS CI/CD 적용하기
    
    on:
      push:
        branches:
          - main
    
    jobs:
      my-deploy:
        runs-on: ubuntu-latest
        steps:
          - name: Github Repository 불러오기
            uses: actions/checkout@v4
    
          - name: node js 설치
            uses: actions/setup-node@v4
            with:
              node-version: '20'
    
          - name: 의존성 설치
            run: npm ci
    
          - name: .env 파일 만들기
            run: |
              echo '${{ secrets.ENV }}' > .env
    
          - name: 테스트 코드 실행
            run: npm run test
    
          - name: 빌드
            run: npm run build
    
          - name: 압축하기
            run: tar -czvf project.tar.gz dist .env package.json package-lock.json // project.tar.gz에 여러 파일 압축
    
          - name: SCP로 EC2에 빌드된 파일 전송하기
            uses: appleboy/scp-action@v0.1.7
            env:
              ENV: ${{ secrets.ENV }} // ENV변수에 ENV할당
            with:
              host: ${{ secrets.EC2_HOST }} // EC2 주소
              username: ${{ secrets.EC2_USERNAME }} // EC2 사용자명
              key: ${{ secrets.EC2_PRIVATE_KEY }} // EC2 keypair
              source: project.tar.gz              // 전송파일
              target: /home/ubuntu/github-practice-server/tobe // 전송주소
    
          - name: SSH로 EC2에 원격접속하기
            uses: appleboy/ssh-action@v1.2.0
            with:
              host: ${{ secrets.EC2_HOST }} // EC2 주소
              username: ${{ secrets.EC2_USERNAME }} // EC2 사용자명
              key: ${{ secrets.EC2_PRIVATE_KEY }} // EC2 keypair
              script_stop: true // 아래 스크립트 하나라도 실패하면 실패처리
              script: |
                rm -rf /home/ubuntu/github-practice-server/current
                mkdir /home/ubuntu/github-practice-server/current
                mv /home/ubuntu/github-practice-server/tobe/project.tar.gz /home/ubuntu/github-practice-server/current/project.tar.gz
                cd /home/ubuntu/github-practice-server/current
                tar -xvf project.tar.gz  //  압축해제
                npm i
                pm2 kill
                pm2 start dist/main.js --name "backend-server"

     

Designed by Tistory.