본문 바로가기

[배포]

[DevOps] GitHub Actions

CI/CD란?

CI/CD는 소프트웨어 개발 및 배포 과정을 자동화하고 효율적으로 만드는 두 가지 주요 개념인 CI (Continuous Integration)와 CD (Continuous Delivery/Continuous Deployment)의 약자이다. 이를 통해 개발자는 코드 변경 사항을 빠르게 반영하고, 품질을 유지하며, 소프트웨어를 신속하게 배포할 수 있다.

 

1. CI (Continuous Integration) 

CI는 코드 변경이 있을 때마다 자동으로 빌드하고 테스트하는 과정을 의미한다. 이 과정은 주로 다음과 같은 작업을 한다.

 

  • 코드 변경 통합: 여러 개발자가 동시에 작업할 때, 각자의 변경 사항을 주기적으로 통합하여 하나의 코드베이스에서 개발을 진행
  • 자동 빌드: 코드가 변경되면, 자동으로 빌드를 실행하여 코드가 제대로 컴파일되고 실행되는지 확인
  • 자동 테스트: 빌드된 코드가 예상대로 동작하는지 자동으로 테스트한다. 이 과정에서 오류나 버그를 발견하면, 개발자는 빠르게 수정할 수 있다.

2. CD (Continuous Delivery/Continuous Deployment) 

CD는 두 가지 의미를 가질 수 있는데 지속적 배포(Continuous Deployment)지속적 배포 준비(Continuous Delivery)이다. 우선  Continuous Delivery는 코드가 항상 배포 가능한 상태에 있도록 유지하는 과정이다. 이 과정에서는 모든 코드 변경 사항이 자동으로 빌드되고 테스트되며, 배포 가능한 상태로 준비된다. 그러나 실무에서 배포는 사람이 직접 승인하거나 추가적인 수동 단계가 필요하다. 

 

1. Continuous Delivery(지속적 배포 준비)

 

  • 코드가 항상 배포 준비 상태에 있음
  • 자동화된 테스트와 빌드 후 배포 준비가 완료됨
  • 실제 배포는 수동으로 승인하거나 필요 시 자동으로 수행

 

다음으로는  Continuous Deploymen을 알아보자. 모든 코드 변경이 자동으로 실제 환경에 배포되는 과정이다.

Continuous Delivery와의 차이는, 배포 준비가 끝난 후 자동으로 실시간 서버나 클라우드 환경에 코드가 배포된다는 점이다.

 

2. Continuous Deployment (지속적 배포)

  • 모든 코드 변경이 자동으로 배포됨
  • 사람의 개입 없이 자동으로 배포가 이루어짐
  • 배포 후 바로 실시간 환경에서 실행됨

 


CI/CD 파이프라인: 자동화된 개발 및 배포 과정

CI/CD를 실현하기 위해서는 CI/CD 파이프라인이 필요하다.

파이프라인코드 변경이 일어날 때마다 자동으로 실행되는 일련의 단계들을 말하는데 아래의 간단한 파이프라인 예시를 보자.

  1. 코드 커밋: 개발자는 코드 변경을 GitHub, GitLab, Bitbucket 등 저장소에 커밋한다.
  2. 자동 빌드: CI 서버(예: Jenkins, GitHub Actions 등)가 자동으로 코드를 빌드한다. 빌드는 코드가 잘 컴파일되고 실행되는지 확인하는 과정이다.
  3. 자동 테스트: 빌드 후, 자동화된 테스트가 실행되어 코드가 예상대로 동작하는지 검사한다.
  4. 배포 준비: 테스트가 통과되면, 코드는 배포 준비 상태가 된다. 이 시점에서 코드가 실제 서버나 클라우드 환경에 배포될 준비가 되어 있다.
  5. 배포: Continuous Delivery에서는 사람이 승인하거나 자동화된 배포 시스템이 배포를 수행한다. Continuous Deployment에서는 배포가 자동으로 이루어진다.
  6. 모니터링 및 피드백: 배포 후, 애플리케이션을 모니터링하여 문제가 발생하지 않았는지 확인하고, 사용자의 피드백을 받는다.

CI/CD 도구들

  • CI 도구: Jenkins, GitHub Actions, GitLab CI, CircleCI, Travis CI
  • 배포 도구: Kubernetes, Docker, AWS, Azure, Heroku
  • 모니터링 도구: Prometheus, Grafana, Sentry, New Relic

GitHub Actions

GitHub Actions는 GitHub에서 제공하는 CI/CD 도구로, 코드 변경 사항에 따라 자동으로 테스트, 빌드, 배포 등을 수행할 수 있게 해주는 서비스이다. 간단히 말하면, 코드가 GitHub 저장소에 푸시(push)될 때마다 자동으로 특정 작업을 수행하는 것이다.

GitHub Actions 외에도 다양한 CI/CD 도구들이 있다. 각각의 CI/CD 도구는 특징과 기능이 다르므로 프로젝트의 필요에 따라 선택해야 한다.

 

GitHub Actions Workflow는 GitHub에서 제공하는 자동화된 작업의 집합이다. 이 작업들은 코드가 변경될 때마다 자동으로 실행될 수 있으며, 보통 CI/CD 파이프라인을 구축하는 데 사용되고 있다. Workflow는 여러 작업(Job)을 포함하고 있으며, 각 작업은 순차적으로 또는 병렬로 실행될 수 있다. 


GitHub Actions 구성(포함 관계)

 

1. Workflow

name: CI/CD Pipeline

on:
  push:
    branches:
      - main  # main 브랜치에 푸시되면 워크플로가 실행됨
  pull_request:
    branches:
      - main  # main 브랜치로의 풀 리퀘스트가 생성될 때 실행

jobs:
  build:
    runs-on: ubuntu-latest  # Ubuntu 환경에서 실행

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Set up JDK
        uses: actions/setup-java@v2
        with:
          java-version: '11'

      - name: Build with Maven
        run: mvn clean package -DskipTests  # Maven을 사용하여 JAR 파일 빌드

      - name: Upload JAR to S3
        run: aws s3 cp target/your-app.jar s3://your-bucket-name/your-app.jar  # 빌드된 JAR 파일을 S3로 업로드

  deploy:
    needs: build
    runs-on: ubuntu-latest

    steps:
      - name: Deploy to EC2 with CodeDeploy
        run: |
          aws deploy create-deployment \
            --application-name YourAppName \
            --deployment-group-name YourDeploymentGroup \
            --revision revisionType=S3, S3Location={bucket=your-bucket-name,key=your-app.jar} \
            --deployment-config-name CodeDeployDefault.OneAtATime \
            --description "Deployment of your app"  # AWS CodeDeploy를 사용하여 EC2에 배포
  • Workflow는 자동화된 작업의 집합으로, 특정 이벤트(예: 코드 푸시, 풀 리퀘스트 생성 등)가 발생했을 때 실행된다.
  • 여러 작업(Job)을 포함하고 있으며, 각 작업은 순차적으로 또는 병렬로 실행될 수 있다.
  • Workflow는 .github/workflows/ 디렉토리에 YAML 파일 형식으로 정의된다.
  • 가장 큰 작업 단위이다.

2. Event

  • Event는 워크플로가 실행되는 트리거(trigger)이다.
  • 예를 들어, push, pull_request, issue와 같은 GitHub 이벤트가 발생할 때 Workflow가 실행될 수 있다.
  • 예를 들어, 코드가 저장소에 푸시되면 push 이벤트가 발생하고, 이에 따라 Workflow가 실행된다.

3. Runner

  • Runner는 GitHub Actions 워크플로가 실행되는 환경입니다.
  • GitHub은 자체적인 runner를 제공하지만, 사용자가 직접 runner를 설정할 수도 있습니다.
  • runner는 보통 다양한 OS(Windows, Ubuntu, macOS 등)에서 실행됩니다.

4. Job

  • Job은 Workflow 내에서 실행되는 개별적인 작업이다.
  • 각 Job은 독립적으로 실행되며, 한 번에 하나의 머신에서 실행된다.
  • 각 Job은 여러 Step으로 구성된다.

5. Step

  • Step은 Job 내에서 실행되는 개별적인 작업이다.
  • 각 Step은 실행할 명령어 또는 액션(Action)을 포함하며, 순차적으로 실행된다.
  • 예를 들어, "코드를 체크아웃"하거나 "의존성을 설치"하는 명령어가 Step에 해당한다.

6. Action

  • Action은 GitHub에서 제공하는 미리 정의된 작업 또는 사용자가 만든 작업이다.
  • 예를 들어, actions/checkout 액션은 코드 저장소의 코드를 체크아웃하는 작업을 자동으로 수행한다.