이번에 CI/CD에 대해 좀 더 깊게 공부한 것을 기록해보려고 한다. 예전에 기술 면접을 본 적이 있는데 그때 받았던 질문이 '최근에 관심을 갖고 있는 기술이 무엇이 있나요?'였고 자신 있게 CI/CD에 관심이 많다고 대답했다. 그 기술이 무엇인지에 대해 설명을 해달라고 해서 배포 자동화 시스템이라고 대답했고 그거 말고는 다른 기능이 없나요?라고 다시 질문을 받았을 때에는 답을 하지 못했다. 나는 그저 대략적으로 CI/CD에 대해 알고 있었고 정확하게 어떤 것들을 할 수 있는지에 대해서는 (변명을 하자면 공부하기 전이라) 많이 알고 있지 않았다. 다음번에 질문을 받았을 때에는 잘 대답할 수 있도록 기록을 남겨본다.

CI/CD란?

CI/CD의 가장 기본적인 것부터 알아보자. CI/CD는 지속적인 통합 (Continuous Integration)과 지속적인 배포 (Continuous Deployment)의 합성어이다. 개발 과정에서 새로운 코드 변경사항이 작성될 때마다 자동으로 코드를 빌드, 테스트, 배포하는 프로세스라고 한다.

CI/CD의 장점

그래서 CI/CD를 하면 정확히 무엇이 좋은데라고 하면 나는 명확하게 이야기할 수 있다. 바로 시간! CI/CD가 하나도 구축되지 않은 환경에서 개발을 한 적이 있는데 정말 비효율적이다. 개발을 완료하고 나서 빌드, 테스트를 직접 하고 테스트하고 나서 나오는 버그나 오류들을 수정하기 위한 개발을 하고 다시 빌드, 테스트를 해야 했다. 이제 어느 정도 완료가 되었다 싶으면 이제 마지막 버전을 빌드해서 앱스토어와 구글스토어에 올리고 심사를 맡기는 과정이었다. 이 얼마나 비효율적인가!!

하지만 CI/CD를 활용하면 시간을 보다 효율적으로 사용할 수 있다. 자세한 장점들을 설명해 보겠다.

1. 더 높은 품질의 소프트웨어

CI/CD를 사용하면 개발자들은 지속적으로 코드 변경을 통합하고 테스트를 실행하므로 버그를 더 빨리 발견할 수 있다.

2. 빠른 시간 내에 제품 출시

CI/CD를 사용하면 새로운 코드 변경 사항이 자동으로 통합되고 테스트되므로 제품 출시에 걸리는 시간이 단축된다.

3. 개발자 생산성 향상

CI/CD를 사용하면 개발자들은 자동화된 테스트 프로세스로 인해 테스트 시간을 줄일 수 있다.

4. 자동화된 배포

CI/CD를 사용하면 개발자들은 새로운 코드 변경 사항을 자동으로 배포할 수 있다.

수동으로 빌드, 테스트, 배포하는 작업을 CI/CD가 대신 자동으로 해주기 때문에 개발자들이 더욱 효율적으로 작업할 수 있게 해 주며 더 적은 시간과 노력으로 제품을 배포가 가능하기 때문에 온전히 개발에 쏟는 시간을 늘릴 수 있는 것을 나는 몸소 경험했다.

CI/CD 사용법

CI/CD Tools

CI/CD를 어떻게 사용하느냐에 대한 질문에 답해보려고 한다. 우선 CI/CD를 사용하기 위해서는 CI/CD를 지원하는 도구들을 선택해야 하는데 대표적인 몇 개의 도구들만 소개해보려고 한다.

  1. Jenkins: 오픈소스 CI/CD 도구 중 가장 많이 사용되는 도구 중 하나이고 다양한 플러그인을 제공하여 많은 개발자들이 쉽게 사용이 가능하다.

  2. Travis CI: 오픈소스 CI/CD 도구로 GitHub과 연동이 간편하다.

  3. CircleCI: 클라우드 기반 CI/CD 도구로, 빠른 속도와 쉬운 설정을 제공한다.

  4. GitLab CI/CD: GitLab에서 제공하는 CI/CD 도구로, GitLab 저장소와 연동이 간편하다.

  5. AWS CodePipeline: AWS의 CI/CD 서비스로, AWS 리소스와 쉬운 통합이 가능하다 예를 들어 AWS CodeBuild, AWS CodeDeploy, AWS CodeCommit 등과 통합하여 사용할 수 있다.

  6. GitHub Actions: GitHub에서 제공하는 CI/CD 도구로, GitHub 저장소와 연동이 간편하다. YAML 파일로 작성된 작업 흐름을 기반으로 동작한다.

나는 Github Actions를 사용하는데 이유는 이미 구축되어 있기 때문에 가장 익숙하기 때문이다. 어떤 도구가 좋은지를 논하기보다 본인의 환경과 잘 맞는 도구를 선택해서 사용하는 것이 가장 좋은 선택이 아닐까 한다. 나처럼.

CI/CD 구현

나는 Github Actions를 사용하고 다른 tool은 사용한 경험이 없기 때문에 Github Actions에 대해서만 설명을 해보려고 한다. GitHub Actions는 다른 도구와 마찬가지로 CI/CD를 지원하는 도구이기 때문에 빌드, 테스트, 배포 등 다양한 작업을 자동화할 수 있다. 그리고 다양한 언어와 프레임워크, 이벤트(trigger)를 기반으로 작업을 실행할 수 있다. CI/CD 파이프라인을 구현하는 방법은 다음과 같다.

  1. .github/workflows 디렉토리에 작업 파일 생성
    GitHub Actions 워크플로우는 .yml 파일로 정의되기 때문에 작업 파일은 .github/workflows 디렉토리에 저장되어야 한다.

  2. 작업 정의
    작업 파일에는 들어가는 구성 요소들이 있다.

    1. name: 작업 이름을 정의
    2. on: 이벤트를 정의 (예: push, pull request 등)
    3. jobs: 작업 정의를 시작하는데 여러 개의 작업을 정의할 수 있다.
    4. steps: 작업에서 실행할 단계를 정의. 이 단계에서는 빌드, 테스트, 배포 등의 단계를 정의할 수 있다.

    Steps안에는 또 다른 구성 요소들이 있다.

    1. name: 해당 단계의 이름을 정의.
    2. uses: 액션을 가져올 때 사용하는 저장소의 경로를 정의 (예: actions/checkout@v3 등)
    3. run: 실행할 명령어를 정의 (예: npm install 등)
    4. env: 해당 단계에서 사용할 환경 변수를 정의 (예: NODE_ENV 등)
  3. 작업 실행
    작업 실행 방법은 쉽다. 작업 파일을 생성해서 위의 명령어들을 사용해서 작성한 후, GitHub 웹사이트에서 Actions 탭으로 이동하여 수동으로 작업을 실행할 수도 있고 이벤트가 발생할 때마다 자동으로 실행되게 할 수도 있다.

예시 코드

예시는 이전 글에서 작성한 localazy CI/CD yml 파일이다.

# Localazy에서 문자열을 다운로드하는 GitHub Actions 워크플로우
name: Download from Localazy

# UTC 시간 기준으로 월-토요일 23:00과 07:00에 스케줄링되어 실행됨
on:
  schedule:
    - cron: '0 23 * * 0-5'
    - cron: '0 7 * * 0-5'

jobs:
  localazy-download-test:
    # ubuntu-latest 환경에서 실행
    runs-on: ubuntu-latest
    steps:
      # 액션을 사용하여 레포지토리를 체크아웃함
      - uses: actions/checkout@v3
      
      # Localazy 액션을 사용하여 문자열을 다운로드함
      - uses: localazy/download@v1
        with:
          # GitHub Secrets에서 가져온 Localazy 읽기 전용 키
          read_key: ${{ secrets.LOCALAZY_READ_KEY }}
      
      # Pull Request를 생성하는 액션을 사용하여 다운로드한 문자열을 커밋하고 푸시함
      - uses: peter-evans/create-pull-request@v4
        with:
          token: ${{ github.token }}
          commit-message: 'localazy 번역 업데이트'
          branch: localazy
          title: 'localazy 번역 업데이트'
          labels: labels
          author: author
          committer: committer

이 코드는 Localazy에서 번역파일들을 다운로드하고 다운로드한 파일들을 커밋하고 푸시하여 Pull Request를 생성하는 CI/CD 워크플로우이다. 스케줄에 따라 하루에 2번 워크플로우가 실행된다.

먼저 "actions/checkout@v1" 액션을 사용하여 리포지토리를 체크아웃한다. 그리고 "localazy/download@v1" 액션을 사용하여 Localazy에서 번역 파일들을 다운로드한다. 마지막으로는 "peter-evans/create-pull-request@v4" 액션을 사용하여 다운로드한 파일들을 커밋하고 푸시하여 Pull Request를 생성한다.

정리

전부터 CI/CD를 공부해보고 싶었지만 딱히 기회도 없었고 사실 의지박약으로 공부를 안 했던 것 같다. 그렇지만 저번에 localazy 작업을 기점으로 이번에 CI/CD에 대해 그리고 Github Actions에 대해 보다 더 많은 지식을 쌓을 수 있었다. 지금 공부한 부분도 아주 기초적인 부분이라 더 익숙해지고 발전시켜야 하는 부분들은 많이 남았다. 역시 공부에는 끝이 없다. 특히 개발이란 분야에는 더.

위의 예시코드는 그리 복잡하지 않지만 IOS나 AOS를 자동 배포하는 CI/CD 코드를 봤는데 양 자체도 많지만 복잡한 부분들이 많았다. 다음 CI/CD 단계로는 IOS와 AOS 자동 배포 공부를 해보아야겠다.

참조: https://zzsza.github.io/development/2020/06/06/github-action/

profile
프론트 엔드 개발자

0개의 댓글