๐ŸŽฏ ํ”„๋ก ํŠธ์—”๋“œยท๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, ํŒจํ‚ค์ง•, ๋ฐฐํฌ, ๊ฒ€์ฆํ•˜๋Š” CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“— Today I Learned

CI/CD ํŒŒ์ดํ”„๋ผ์ธ ์„ค๊ณ„

CI ํŒŒ์ดํ”„๋ผ์ธ (Continuous Integration)

  • Code Checkout

    • Jenkins๊ฐ€ GitHub์—์„œ git clone ํ•˜๊ธฐ ์œ„ํ•œ credentials ์„ค์ • ํ•„์š”

    • ๊ฐ์ž์˜ Private Repository์—์„œ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€ ๋นŒ๋“œ

  • Unit Test

    • builder ์—์ด์ „ํŠธ์—์„œ Node.js v18 ํ™˜๊ฒฝ์œผ๋กœ npm test ์‹คํ–‰

    • Coverage Report๋ฅผ ์œ„ํ•œ ์„ค์ • ์ถ”๊ฐ€ ์˜ˆ์ •

  • Build

    • ๋™์ผํ•œ builder ์—์ด์ „ํŠธ์—์„œ npm run build

    • ๊ฒฐ๊ณผ๋ฌผ:

      • frontend/build

      • backend/build

  • Packaging

    • JNLP ์—์ด์ „ํŠธ์—์„œ docker build ๋ฐ docker push

    • ECR ์ ‘๊ทผ์„ ์œ„ํ•ด Jenkins์— AWS credentials ๋ฐ ๊ด€๋ จ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์ • ํ•„์š”




CD ํŒŒ์ดํ”„๋ผ์ธ (Continuous Delivery)

  • Staging

    • Terraform ์‚ฌ์šฉ โ†’ EC2์— ๋„์šด Minikube ํด๋Ÿฌ์Šคํ„ฐ์— ์ปจํ…Œ์ด๋„ˆ ๋ฐฐํฌ

    • ECR ์ ‘๊ทผ ๋ฐ S3 ์ƒํƒœ ์ €์žฅ์„ ์œ„ํ•ด AWS ์ธ์ฆ ํ•„์š”

  • Acceptance Test

    • Selenium Standalone ์ธ์Šคํ„ด์Šค๋ฅผ ๋กœ์ปฌ ํด๋Ÿฌ์Šคํ„ฐ์— ๋„์›€ (WD ํ—ˆ๋ธŒ๋กœ ์‚ฌ์šฉ)

    • tester ์—์ด์ „ํŠธ์—์„œ Python ๊ธฐ๋ฐ˜ E2E ํ…Œ์ŠคํŠธ ์‹คํ–‰

    • pytest, selenium ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ

    • Selenium Grid ๊ธฐ๋ฐ˜ ๋ธŒ๋ผ์šฐ์ € ์ž๋™ํ™” ํ…Œ์ŠคํŠธ




Release & Smoke Test

  • Release

    • Staging๊ณผ ๋™์ผ ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ

    • Terraform ๋ฐ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋งŒ ๋ณ€๊ฒฝํ•˜์—ฌ ์ ์šฉ

  • Smoke Test

    • ๋ฐฐํฌ๋œ ์•ฑ์ด โ€œ์ •์ƒ ๋ฐฐํฌ๋˜์—ˆ๋Š”์ง€โ€ ํ™•์ธ

    • ์‹ค์ œ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ๋Š” ์•„๋‹˜




Post-Build Actions (๋ฆฌ์†Œ์Šค ํ•ด์ œ)

  • Staging ์„œ๋ฒ„ ์ž์› ํ•ด์ œ

    • terraform destroy๋กœ k8s ์˜ค๋ธŒ์ ํŠธ ์ œ๊ฑฐ

    • EC2๋„ ๋™์ ์œผ๋กœ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ

  • Selenium ์ธ์Šคํ„ด์Šค ํ•ด์ œ

    • ํ…Œ์ŠคํŠธ ์™ธ์—๋Š” ๋ถˆํ•„์š” โ†’ ์ž์› ํšŒ์ˆ˜ ๊ณ ๋ ค



๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ฐ ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€

ํ”„๋ก ํŠธ์—”๋“œ & ๋ฐฑ์—”๋“œ ๊ณตํ†ต ์‚ฌํ•ญ

  • ํ…Œ์ŠคํŠธ ๋„๊ตฌ: npm test

  • ์ปค๋ฒ„๋ฆฌ์ง€ ๋„๊ตฌ: c8

  • ์ œ์™ธ ์„ค์ • (tsconfig.json, c8 ์„ค์ •)

"exclude": ["src/**/*.test.ts", "src/**/__mocks__/*.ts"]



์ปค๋ฒ„๋ฆฌ์ง€ ๋ฆฌํฌํŠธ ์„ค์ •

๋ฆฌํฌํŠธ ๊ฒฝ๋กœ

  • ํ”„๋ก ํŠธ์—”๋“œ: ${PROJECT_ROOT}/frontend/coverage/index.html

  • ๋ฐฑ์—”๋“œ: ${PROJECT_ROOT}/backend/coverage/index.html


Makefile

  • frontend/Makefile , backend/Makefile
test:
	npm ci
	c8 -r html -o coverage --all npm test -- --watchAll=false



Jenkins Build Agent ์ œ์ž‘

  • Dockerfile
FROM ubuntu:22.04

RUN apt update && apt upgrade -y
RUN apt install -y curl make
RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash -
RUN apt install -y nodejs
RUN npm i -g c8
  • ์ƒ์„ฑํ•œ ์ด๋ฏธ์ง€๋Š” sheayun/jenkins-agent-node-18 ๋กœ ๋“ฑ๋ก

  • Jenkins๊ฐ€ ์ด ์ด๋ฏธ์ง€๋ฅผ ์ด์šฉํ•ด ํ…Œ์ŠคํŠธ ์‹คํ–‰


Jenkins Pipeline ๊ตฌ์„ฑ

  • Pipeline ์ด๋ฆ„: lecture

  • Jenkins Credentials: github-credentials (SSH private key ์‚ฌ์šฉ


Jenkins Pipeline Script ๊ตฌ์„ฑ

  • Kubernetes pod
pipeline {
  agent {
    kubernetes {
      yaml '''
apiVersion: v1
kind: Pod
spec:
  containers:
  - name: builder
    image: sheayun/jenkins-agent-node-18
    command:
    - cat
    tty: true
'''
    }
  }
  • checkout
stage("Checkout") {
  steps {
    git url: "git@github.com:sheayun/lecture.git",
        branch: "main",
        credentialsId: "github-credentials"
  }
}
  • unit test
stage("UT") {
  steps {
    script {
      container("builder") {
        sh '''
        (cd backend && make test)
        (cd frontend && make test)
        chmod -R 777 backend/coverage
        chmod -R 777 frontend/coverage
        '''
      }
    }
  }
}
  • code coverage report
stage("Code Coverage") {
  steps {
    publishHTML(target: [
      reportDir: 'backend/coverage',
      reportFiles: 'index.html',
      reportName: 'Backend Coverage'
    ])
    publishHTML(target: [
      reportDir: 'frontend/coverage',
      reportFiles: 'index.html',
      reportName: 'Frontend Coverage'
    ])
  }
}
profile
๐ŸŒฑ๊ฐœ๋ฐœ ๊ธฐ๋ก์žฅ

0๊ฐœ์˜ ๋Œ“๊ธ€