2022-06-26_WIL_CI/CD

설탕유령·2022년 6월 26일
0
post-custom-banner

🔗 CI/CD 란?

CI는 지속적 통합(Continuous Integration)을 의미하고
CD는 지속적 배포(Continuous Deployment)를 의미한다.
두개의 기술을 적절히 사용하면 빌드->테스트->배포의 과정을 자동화 할 수 있다.

CI 단계에서는 빌드/테스트 과정을 자동화 한다.
우리가 코드를 수정하고 이를 반영하는 순간(github 등에 commit 후 push) 해당 변경 사항을 기준으로 프로젝트가 빌드되고 테스트된다.

위에 과정에서 별다른 문제가 없었다면 CD 단계로 넘어간다.
CD는 단계에서는 배포를 자동화 한다.
CI 단계가 완료되고 검증이 된 빌드본을 바탕으로 프로덕션 환경에 배포된다.

이 두 과정에 공통 키워드는 자동화이다.

🤷‍♀️ CI/CD를 하는 이유는?

빌드/테스트는 복잡한 과정이 아닌 명령어로 가능한 영역이다.
하지만 코드 작업은 빈번하게 이루어진다. 매번 수정사항이 발생할때마다 빌드를 기다리고, 빌드가 되면 매번 동일한 테스트를 반복하는건 리소스의 낭비다.
빌드/테스트 이후에 서버에 배포하는 과정또한 마찬가지이다.
배포한 파일을 가지고 FTP 프로그램을 키고, 경로를 찾고, 만약에 여기에 몇가지 단순하지만 시간을 잡아먹는 과정이 추가되면, 점점 놓치는 시간이 더 커질 것이다
그렇기에 이 과정을 자동화하기 위해 CI/CD를 사용한다.

🔧 CI/CD를 하는 방법들

github action

현재 내가 사용하는 방식은 github action이다.
아직 CI/CD에 대해 잘 모르기도 하며, 간단하게 사용할 수 있기에 적용시킨 방법이다.
.github/workflows 경로에 .yml 파일을 하나 가져다 놓으면, 해당 파일 내부에 스크립트를 기준으로 동작을 한다.

name: React build
on: 
  push:                               # main Branch에서 push 이벤트가 일어났을 때만 실행
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-18.04
    steps:
      - name: Checkout source code.   # 레포지토리 체크아웃
        uses: actions/checkout@main

      - name: Cache node modules      # node modules 캐싱
        uses: actions/cache@v1
        with:
          path: node_modules
          key: ${{ runner.OS }}-build-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.OS }}-build-
            ${{ runner.OS }}-
      - name: Install Dependencies    # 의존 파일 설치
        run: npm install

      - name: Build                   # React Build
        env:
          CI: ""
        run: npm run build
        
      - name: Deploy                  # S3에 배포하기
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        run: |
          aws s3 cp \
            --recursive \
            --region ap-northeast-2 \
            dist s3://sugarghost.shop	# dist 폴더에 내용을 s3에 배포

보다 시피 구조가 매우 단순하다.
특정 타겟과 환경을 명시하고
원하는 동작을 run으로 실행시켜 동작한다.
만약 외부에 노출되면 안되는 정보는 github secret 설정을 이용해 명시하면 된다.

그외

CI와 CD는 별개의 존재라서, 다양한 도구들이 존재한다.
다양한 테스팅 라이브러리 또는 Tool 또한 CI의 범주에 포함 될 것이다.
Best 14 CI/CD Tools You Must Know | Updated for 2022의 자료를 확인해보면 정말 다양한 툴들이 존재한다

그중 상위 5개의 툴을 살펴보자면

Jenkins

오픈 소스로 구성되어 아주 다양한 플러그인을 제공하며 다음과 같은 주요 기능이 제공한다고 한다.
주요 기능

  • 다양한 OS에서 쉬운 설치와 업그레이드 제공
  • 단순하고 유저 친화적인 인터페이스 제공
  • 거대한 커뮤니티 층을 기반으로 확장 가능한 다양한 플러그인 제공
  • 사용자 인터페이스를 기반으로 손쉬운 환경 구성이 가능
  • 주종 아키텍쳐를 기반으로 분산 빌드 지원
  • 표현식을 기반으로 일정을 구축
  • 사전 빌드 단계에서 Sheels와 Windows command 명령 실행 지원
  • 빌드 상태에 대한 알림 지원

CircleCi

주요 기능

  • Bitbucket, GitHub 및 GitHub Enterprise와 통합
  • 컨테이너 또는 가상 머신을 사용하여 빌드 실행
  • 쉬운 디버깅
  • 자동화된 병렬화
  • 빠른 테스트
  • 이메일 및 IM 알림
  • 지속적 및 분기별 배포
  • 고도의 사용자 정의 제공
  • 패키지 업로드를 위한 자동 병합 및 사용자 지정 명령 기능 제공
  • 빠른 설정 및 무제한 빌드

TeamCity

로고에서 알 수 있다 시피 JetBrains에서 제공하는 빌드 관리 및 지속적 통합을 위한 서버이다.
주요 기능

  • 상위 프로젝트의 설정 및 구성을 하위 프로젝트에 재사용하는 기능 제공
  • 서로 다른 환경에서 병렬 빌드를 동시에 실행 가능
  • 히스토리 빌드, 테스트 히스토리 보고서 보기, 고정, 태그 지정 및 즐겨찾기 등의 기능을 제공
  • 사용자 정의, 상호 작용 및 확장이 쉬움
  • CI 서버의 기능 및 안정성 유지
  • 유연한 사용자 관리, 사용자 역할 할당, 사용자를 그룹으로 분류, 다양한 사용자 인증 방법, 서버의 모든 활동을 투명하게 보여주는 모든 사용자 작업 로그 등의 다양한 사용자 기능 제공

Bamboo

주요 기능

  • 최대 100개의 원격 빌드 agents 지원

  • 일괄 테스트를 병렬로 실행하며 신속하게 피드백을 받을 수 있음

  • 이미지를 만들고 레지스트리에 푸쉬함

  • 프로덕션이 잠겨 있는 동안 개발자와 테스터가 온디맨드로 환경에 배포할 수 있도록 해주는 환경별 권한 설정 제공

  • git 등의 형상 관리에서 새로운 branch를 감지하고 CI 체계를 자동으로 적용

  • repository에 변화를 감지하는 트리거 빌드 제공

  • 알림 푸쉬

    GitLab

    주요 기능으로 쓰인 말이 다른 Tool과 곂치는 부분이 좀 많아보이는 것 같다.
    주요 기능

  • branching tool을 통해 코드 및 프로젝트 데이터 보기, 생성 및 관리

  • 단일 분산 버전 제어 시스템에서 코드 및 프로젝트 데이터를 설계, 개발 및 관리 가능

  • 프로젝트 및 코드에 대한 공동 작업을 위한 단일 정보 소스 및 확장성을 제공

  • 소스 코드의 빌드, 통합 및 검증을 자동화

  • 컨테이너 스캔, 정적 애플리케이션 보안 테스트(SAST), 동적 애플리케이션 보안 테스트(DAST) 및 종속성 스캔을 제공

  • 애플리케이션의 릴리스 및 제공을 자동화하고 단축

profile
달콤살벌
post-custom-banner

0개의 댓글