CI / CD 가 뭐야?

Loopy·2024년 1월 21일
1

트러블 슈팅

목록 보기
4/9

CI/CD

  • 소프트웨어 개발과 배포 과정을 자동화하여 개발자들이 효율적으로 소프트웨어를 개발하고 배포하는 방법을 지칭하는 용어
  • 여러 명의 개발자가 코드 작업을 할 때 서로 충돌할 수 있는 문제 해결

1. CI (Continuos Integration)

= 빌드 및 테스트 자동화

  • 지속적인 통합
  • 버전 관리 시스템(Git)에 코드를 푸시할 때 자동화된 빌드, 테스트 및 통합 프로세스를 실행하여 코드를 레포지토리에 지속적으로 통합
    • 추가/변경된 코드를 자동으로 빌드한 후 테스트
    • 테스트에 통과한 경우에만 공유 레포지토리에 병합
  • 구현
    • CI 환경 설정(Java, MySQL 등) 및 테스트 workflow를 작성
  • 순서(원리)
    • GitHub에 PR
    • 빌드 테스트 진행 (올바르게 동작하는지)
    • 문제가 있으면 개발자가 수정하고 다시 PR
    • 문제 없으면 (필요 시 코드 리뷰 진행 후) Merge 후 배포 요청
  • 예시
    • 원래 작업 흐름: 수비가 작업한 파일을 PR 했을 때, 민정이 직접 빌드 및 테스트를 진행하며 확인해야 함 + 수비 로컬에선 오류가 없었는데 민정 로컬에선 제대로 안 돌아갈 수도 있음
    • CI 도입 시: 민정이 수작업으로 직접 빌드 및 테스트를 할 필요가 없음
    • 즉, 빌드 및 테스트 과정을 Github Actions한테 시키는 것임!!
  • 장점
    • 코드 검증에 필요한 시간 감소
    • 개발 편의성 향상
    • 항상 테스트 코드를 통과한 코드만이 레포지토리에 올라가기 때문에, 좋은 코드 퀄리티를 유지할 수 있음

2. CD (Continuos Deployment)

= 배포 자동화

  • 지속적인 배포
  • (배포 파이프라인을 구축하여) CI 과정을 통해 빌드와 테스트를 통과한 코드를 자동으로 실제 환경에 배포
  • 순서(원리)
    • Merge 됐을 때 실행
    • 배포 진행
  • 예시
    • 상황: 코드가 수정됨 ⇒ PR 후 Merge 함 ⇒ 바뀐 부분을 웹 사이트에 적용하기 위해 또 배포해야 함
    • 원래 작업 흐름: 개발자가 직접 jar 파일을 생성하고 서버에 놓는 배포 과정을 직접 해야 함
    • CD 도입 시: 수작업으로 배포할 필요가 없음
    • 즉, 배포하는 과정을 Github Actions한테 시키는 것임!!
  • 장점
    • 개발자가 배포보다는 개발에 더욱 신경을 쓸 수 있음
    • 개발자가 수작업 없이 빌드, 테스트, 배포까지 자동화할 수 있음

3. 구현 방법

  • Jenkins
  • Github Actions

4. GitHub Actions

  • 주요 용어
    • workflow

    • job

    • step

    • action

      workflow(파일) > job(작업 단위) > step(작업 순서) > action(다른 사람이 만든 작업)

  • workflow
    • 작업 흐름, 자동화 하기 위한 작업 과정을 파일로 만들어 놓은 것
    • 코드 저장소 내에서 .github/workflows 폴더 아래에 위치한 YAML 파일로 설정
      • 하나의 코드 저장소에는 여러 개의 워크플로우, 즉 여러 개의 YAML 파일을 생성할 수 있음
    • 예제
      # .github/workflows/example.yml
      on:
        push:
          branches:
            - main
      
      jobs:
        # ...(생략)...
  • job
    • 워크 플로우가 구체적으로 어떤 일을 해야하는지 명시함
    • 작업(job), 독립된 가상 머신(machine) 또는 컨테이너(container)에서 돌아가는 하나의 처리 단위를 의미
    • 하나의 워크플로우는 여러 개의 작업으로 구성되며 적어도 하나의 작업은 있어야 함
    • 각 job은 기본적으로 병렬로 실행됨
    • 예제
      # .github/workflows/example.yml
      
      # ...(생략)...
      jobs:
        job1:
          # job1에 대한 세부 내용
        job2:
          # job2에 대한 세부 내용
        job3:
          # job3에 대한 세부 내용
  • step
    • 작업 순서 정의
      • GitHub Actions에서는 각 작업(job)이 하나 이상의 단계(step)로 모델링이 됨
    • 작업 단계는 단순한 커맨드(command)스크립트(script)가 될 수도 있고 액션(action)이라는 좀 더 복잡한 명령일 수도 있음
    • 예제
      # ...(생략)...
      
      jobs:
        test:
          runs-on: ubuntu-latest
          steps:
            - uses: actions/checkout@v3
            - run: npm install
            - run: npm test
  • action
    • GitHub Acitons에서 빈번하게 필요한 반복 단계를 재사용하기 용이하도록 제공되는 일종의 작업 공유 메커니즘
    • GitHub Marketplace에서 수 많은 사용자들이 공개한 다양한 액션을 쉽게 접할 수 있음

5. OOT BE 기술스택

  • NCP
  • Java
  • Spring Boot (gradle)
  • GitHub Actions

6. 과정

6.1 Container Registry, Object Storage 생성

  • Container Registry: 도커 컨테이너 이미지를 저장할 수 있는 Docker Hub와 같은 개념
  • Container Registry를 사용하기 위해서는 프라이빗 도커 컨테이너 이미지를 저장하기 위한 Object Storage(AWS의 S3 같은 개념)를 먼저 생성해야 함
  • Object Storage의 버킷에 Docker 컨테이너 이미지가 저장되고 레지스트리로 이미지를 pull, push가 가능함

6.2 Docker 환경 파일 설정

6.3 CI 프로세스 코드 (PR 시 Test 진행)

  1. Compare branch 코드 내려 받기
  2. Java 환경 설정
  3. Spring 환경 변수 설정
  4. 테스트를 위한 MySQL 설정
  5. 테스트를 위한 Build 실행 설정
  6. Docker 이미지 build 및 push 설정

6.4 CD 프로세스 코드 (Merge 시 배포 진행)

  1. develop branch 코드 내려 받기
  2. Java 환경 설정
  3. Docker 이미지 pull 후 docker-compose를 통한 실행

Actions Secret 설정

  • ENVIRONMENT

  • DOCKER_USERNAME

  • DOCKER_PASSWORD

  • SERVER_HOST

  • SERVER_SSH_PORT

  • SERVER_USERNAME

  • SERVER_PASSWORD

NCP container registry에 로그인

  • registry : Public Endpoint(Container Registry페이지에서 확인가능)
  • username : access key ID(계정관리의 인증키 관리에서 확인)
  • password : secret key(계정관리의 인증키 관리에서 확인)

참고 자료

profile
잔망루피의 알쓸코딩

0개의 댓글