코드가 푸시되면 자동으로 배포해 보자 - CI 배포 자동화

김성혁·2023년 1월 10일
0

👨🏻‍💻 CI, CD란?

코드 버전 관리를 하는 VCS 시스템(Git, SVN 등)에 PUSH가 되면 자동으로 테스트와 빌드가 수행되어 안정적인 배포 파일을 만드는 과정을 CI(Continuous Integration - 지속적 통합)라고 하며, 이 빌드 결과를 자동으로 운영 서버에 무중단 배포까지 진행되는 과정을 CD(Continuous Deployment - 지속적인 배포)라고 한다.

CI에 대한 4가지 규칙

  • 모든 소스 코드가 살아 있고(현재 실행되고) 누구든 현재의 소스에 접근할 수 있는 단일 지점을 유지할 것
  • 빌드 프로세스를 자동화해서 누구든 소스로부터 시스템을 빌드하는 단일 명령어를 사용할 수 있게 할 것
  • 테스팅을 자동화해서 단일 명령어로 언제든지 시스템에 대한 건전한 테스트 수트를 실행할 수 있게 할 것
  • 누구나 현재 실행 파일을 얻으면 지금까지 가장 완전한 실행 파일을 얻었다는 확실하게 할 것

Travis CI

  • 깃허브에서 제공하는 무료 CI 서비스
  • 오픈소스 웹 서비스

.travis.yml

language: java
jdk:
  - openjdk8

branches:
  only:
    - master

# Travis CI 서버의 Home
cache:
  directories:
    - '$HOME/.m2/repository'
    - '$HOME/.gradle'

script: "./gradlew clean build"

# CI 실행 완료 시 메일로 알람
notifications:
  email:
    recipients:
      - sunghyuk1609@gmail.com
  • branches

    • Travis CI를 어느 브랜치가 푸시될 때 수행할지 지정
    • 현재 옵션은 오직 master 브랜치에 push될 때만 수행
  • cache

    • 그레이들을 통해 의존성을 받게 되면 이를 해당 디렉토리에 캐시하여, 같은 의존성은 다음 배포 때부터 다시 받지 않도록 설정
  • script

    • master 브랜치에 푸시되었을 때 수행하는 명령어
    • 여기서는 프로젝트 내부에 둔 gradlew을 통해 clean & build를 수행
  • notifications

    • Travis CI 실행 완료 시 자동으로 알람이 가도록 설정

Travis CI 연동은 크레딧 부족으로 수행하지 못해서 Github Action을 사용하려고 한다.


전체적인 CI/CD 플로우

Github Actions와 AWS S3 연동하기

👨🏻‍💻 S3란?

  • AWS에서 제공하는 일종의 파일 서버
  • 이미지 파일을 비롯한 정적 파일들을 관리하거나 지금 진행하는 것처럼 배포 파일들을 관리하는 등의 기능을 지원
  • CodeDeploy는 저장 기능이 없습니다. 그래서 Github Action이 빌드한 결과물을 받아서 CodeDeploy가 가져갈 수 있도록 보관할 수 있는 공간이 필요합니다. 보통은 이럴 때 AWS S3를 사용
  • CodeDeploy가 빌드도 배포도 가능하지만 확장성이 떨어지기에 빌드와 배포를 분리하는 것을 추천합니다.

# This is a basic workflow to help you get started with Actions

name: springboot2-webservice CI

# Controls when the workflow will run
on:
  # Triggers the workflow on push or pull request events but only for the master branch
  push:
    branches: [ master ]

  # Allows you to run this workflow manually from the Actions tab
#  workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      - name: Checkout
        uses: actions/checkout@v2
        
      - name: Set up JDK 1.8
        uses: actions/setup-java@v1
        with:
          java-version: 1.8
          
      - name: Grant execute permission for gradlew
        run: chmod +x gradlew
        shell: bash
        
      - name: Build with Gradle
        run: ./gradlew build
        shell: bash
  • name
    • workflow 의 이름을 지정합니다.
  • on
    • 이 workflow 가 언제 실행될건지 트리거를 지정할 수 있습니다. 특정 브랜치가 push 되는 경우, Pull Request 가 생성될 경우, 또는 crontab 문법으로 스케줄링을 걸 수도 있습니다.
    • workflow_dispatch 는 수동으로 해당 workflow 를 실행시키겠다는 의미입니다.
    • push 등의 이벤트에 의해 자동으로 배포가 되기 보다는 사람이 수동으로 빌드/배포를 실행하는 것이 안전하다고 생각합니다.
  • job, steps
    • workflow 는 하나 혹은 그 이상의 job 을 가질 수 있고 각 job 은 여러 step 에 따라 단계를 나눌 수 있습니다.
  • runs-on
    • 해당 workflow 를 어떤 OS 환경에서 실행할 것인지 지정할 수 있습니다.

IAM 권한 사용자 생성하기

👨🏻‍💻 IAM이란?

  • AWS에서 제공하는 서비스의 접근 방식과 권한을 관리
  • IAM을 통해 Github Actions가 AWS의 S3와 CodeDeploy에 접근할 수 있도록 함.
  • 사용자와 역할의 차이
    • 역할
      • AWS 서비스에만 할당할 수 있는 권한
      • EC2, CodeDeploy, SQS 등
    • 사용자
      • AWS 서비스 외에 사용할 수 있는 권한
      • 로컬 PC, IDC 서버 등

👨🏻‍💻 CodeDeploy란?

  • 애플리케이션 배포를 자동화하는 AWS의 배포 서비스
  • EC2, AWS Lambda와 같은 서비스에 배포를 할 수 있고, 현재 위치 배포나 블루/그린 배포와 같은 무중단 배포를 지원
  • CodeDeploy Agent 는 EC2 인스턴스에 설치되어 CodeDeploy의 명령을 기다리고 있는 프로그램

Github Actions와 CodeDeploy, Nginx로 무중단 배포하기

👨🏻‍💻 Nginx란?

  • 웹 서버, 리버스 프록시, 캐싱, 로드 밸런싱, 미디어 스트리밍 등을 위한 오픈소스 소프트웨어
  • 리버스 프록시란 엔진엑스가 외부의 요청을 받아 백엔드 서버로 요청을 전달하는 행위. 리버스 프록시 서버(엔진엑스)는 요청을 전달하고, 실제 요청에 대한 처리는 뒷단의 웹 애플리케이션 서버들이 처리

https://wbluke.tistory.com/39
https://wbluke.tistory.com/40?category=418851
https://wbluke.tistory.com/41?category=418851

0개의 댓글