공통 CI/CD 파이프라인

수행 기간 : 2024.08 ~ 2024.09 (2개월)

프로젝트 개요

_images/%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8-%EC%BB%A8%EC%83%99.png

팀에서 사용하는 CI 관련 스크립트를 표준화 하고 모든 프로젝트에서 참조할 수 있게 하는 공통 파이프라인 스크립트를 만드는 프로젝트 입니다.

핵심 기능

  • 표준화 된 CI/CD 스크립트

  • CI/CD 단계에서 스크립트를 하나의 레포지토리에서 관리할 수 있는 형태로 구현

  • 재사용 가능한 CI JOB을 제공

_images/%ED%91%9C%EC%A4%80-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8-%EC%98%88%EC%8B%9C.png

개발 환경

  • Gitlab CI/CD

  • yaml

해결 방법

  • Project include 로 다른 gitlab 레포지토리 에서 파일을 가져와 include

  • hidden job, extends를 통한 브랜치 별 job 추상화

  • 파이프라인 스크립트에서 배포관련 템플릿을 clone 후 사용

  • yaml anchor를 통해 스크립트 간소화

성과

Before

  • 레포 마다 독립적인 CI/CD 스크립트를 사용하고 있어 유지보수가 어려움

  • CI/CD 를 실행 시키기 위한 helm template, 패키징 관련 파일이 모든 레포지토리에 존재

_images/%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8-%ED%8C%8C%EC%9D%BC.png

After

  • 파이프라인 표준화

  • CI/CD 관련 템플릿을 하나의 소스에서 관리할 수 있게 개선

  • 프로젝트에 CI/CD 파이프라인을 적용하기 쉽게 개선

  • 파이프라인 STEP/JOB을 추가하기 쉬운 형태로 변경

  • 실제로 사용하는 스크립트 라인 90% 감소

_images/%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8-%EA%B2%B0%EA%B3%BC.png

예시 스크립트

# .gitlab-ci.yml
# 공통 파이프라인 프로젝트에서 job include
include:
  - project: cloud/backend/cloud-pipeline
    file:
      - jobs/poetry-test.yml
      - jobs/prepare-ci.yml
      - jobs/pages-ci.yml
      - jobs/build-ci.yml
      - jobs/deploy-ci.yml
      - jobs/poetry-init.yml
      - feature.gitlab-ci.yml
      - develop.gitlab-ci.yml
      - qa.gitlab-ci.yml
      - prod.gitlab-ci.yml


variables:
  <some variables>


stages:
  - test
  - prepare_page
  - pages
  - package
  - deploy


.develop-settings: &develop-settings
  only:
    - develop
  tags:
    - dev
    - cloud

api-page:
  <<: *develop-settings
  stage: prepare_page
  image: nikolaik/python-nodejs:python3.11-nodejs18
  extends: .poetry_init
  script:
    - |
      BUILD_TYPE=local ENV_FILE=.env.sample poetry run \
      python infra/docs/extract_openapi.py --app main:create_app --app-dir ./app/main
      npx @redocly/cli build-docs -o api/index.html openapi.yaml
    - mv openapi.yaml public/
    - cp -r api public
  artifacts:
    paths:
      - public

docs-page:
  <<: *develop-settings
  stage: prepare_page
  image: python:3.11
  extends: .poetry_init
  script:
    - . docs/plantuml_init.sh
    - poetry run make html
    - cp -r docs/build/html public
    - mv public/html public/docs
  artifacts:
    paths:
      - public

pages:
  only:
    refs:
      - /^develop$/
  stage: pages
  script:
    - echo "publish pages"
  artifacts:
    paths:
      - public
  tags:
    - dev
    - cloud