Post

데브코스 TIL - 스프린트4 CI-CD 파이프라인 설계

스프린트4 CI-CD 파이프라인 설계

✅ 파이프라인 순서

이번 실습에서는 스테이징 서버 배포까지만 진행

1. 코드가 잘 작동하는가

Code Checkout - unit test - code coverage

2. 배포 빌드, 이미지 푸시

-production build - packaging - image push

3. 스테이징 서버 배포

-staging - acceptance test

4. 릴리즈 (프로덕션 서버에 배포)

release - smoke test

✅ 전체 시스템

1. 코드 푸시

jenkins master → jnlp (도커의 클라이언트; docker push, docker build) → dind (도커데몬) → ecr

2. staging 배포

jnpl (테라폼 클라이언트) → 쿠버네티스 마스터 → ecr로부터 이미지를 pull 해서 kubelet에게 컨테이너 생성을 명령 → 백엔드, 프론트엔드 컨테이너 생성

3. 배포 상태를 아마존 S3에게 전달

jnpl → S3

4. acceptance test

tstr (테스트 마스터) → 셀레니움 (standalone) → 웹 서버에 요청 → 응답

CI 파이프라인 설계 실습

✅ SCM Checkout

  • jenkins에서 git clone할 수 있도록 github credentials 준비
  • 코드는 각자 프라이빗 레포지토리에 빌드 및 테스트 가능한 상태로 준비

✅ Unit test

  • Node v18이 설치되어 있는 젠킨스 에이전트(builder)에서 npm test
  • code coverage report를 발행하기 위한 부가 설정할 예정

✅ build

  • 단위 테스트 실행과 동일한 agent (builder)에서 npm build
  • frontend/build 및 backend/build 산출

✅ Packaging

  • JNLP agent에서 docker build
  • JNLP agent에서 docker push (레지스트리 접근을 위해서 AWS credentials 설정 필요)

✅ staging

  • 테라폼을 이용하여 스테이징 서버 (minikube onEC2)에 컨테이너 배포
  • 컨테이너 이미지 풀에 있어 ECR 접근하기 위한 AWS credentials 설정이 필요
  • 테라폼 state를 S3에 저장하기 위한 AWS credentials 설정이 필요

✅ Acceptance Test

  • 로컬클러스터 내에 (임시로) selenium standalone 인스턴스를 배포하고 WD hub로 이용
  • 파이썬이 설치된 젠킨슨 에이전트에서 테스트 케이스 실행 (셀레니움 그리드를 통한 브라우저 자동화 테스트)

✅ release

  • staging 배포와 동일한 방식으로 프로덕션 서버에 배포 (테라폼 환경 변수와 컨테이너 환경변수만 필요에 맞도록 지정)

✅ Acceptance Test

  • 프로덕션 서버에 배포된 응용이 올바르게 배포되었는지 확인
  • 올바르게 동작하는지가 아닌 올바르게 배포되었는지를 확인

✅ post-build actions

  • 빌드 및 배포에 필요한 자원들 해제
  • 스테이징 서버에 배포한 리소스 회수
  • 셀레니움에 기반한 테스트에 이용한 리소스 회수

실습하기

1
kubectl config use-context docker-desktop
1
kubectl create namespace jenkins
1
kubectl -n jenkins get all

실습1. 단위 테스트 및 코드 커버리지 레포트

npm 패키지 c8을 이용해서 코드 커버리지할 예정

1
npm i -g c8
  • /frontend/tsconfig.json, /backend/tsconfig.json
1
"exclude": ["src/**/*.test", "src/**/__mocks__/*.ts"]

커버리지 디렉토리 생성

1
c8 -r html -o coverage --all npm test

테스트가 실행되고, 결과가 출력됨

1
c8 -r html -o coverage --all npm test -- --watchAll=false

Makefile에 등록

1
2
3
test:
	npm ci
	c8 -r html -o coverage --all npm test -- --watchAll=false

젠킨스 빌드 에이전트 제작

요구사항: node, make, c8

컨테이너 이미지를 빌드하고, 레지스트리에 푸시 → 이 이미지가 hyeem66/jenkins-agent-node-18에 있다고 가정

1
2
3
4
5
6
7
8
9
# Dockerfile

FROM ubuntu:22.04
RUN apt update && apt upgrade -y
RUN apt install -y curl
RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash -
RUN apt install -y nodejs
RUN apt install -y make
RUN npm i -g c8
This post is licensed under CC BY 4.0 by the author.