Frontend CI

이규현·2023년 6월 11일
post-thumbnail

CI(Continuous Integration)

코드 품질을 유지하고, 버그를 사전에 방지하기 위해 CI 과정에서 Prettier, Eslint, React Testing Library와 Jest를 적용하였습니다.

우선 Prettier는 코드 포맷팅 도구로서, 일관된 코드 스타일을 유지하는 데 도움이 됩니다.

그리고 Eslint는 JavaScript 코드를 분석해 문제점을 찾고 고치는 정적 코드 분석 도구입니다.

Prettier와 Eslint를 CI에 포함시킴으로써, 코드 스타일과 문법적 오류에 대한 일관성을 유지하고, 팀원 간의 코드 스타일 차이로 인한 혼란을 줄였습니다. 이는 코드 리뷰의 집중도를 높이고, 잠재적인 코드 오류를 사전에 방지하며, 전반적인 코드 품질을 향상시켰습니다.

한편, React Testing Library와 Jest를 CI에 포함시킴으로써, 테스트를 자동화하고 테스트 커버리지를 유지하며, 각 기능이 의도대로 동작하는지 지속적으로 검증할 수 있었습니다. 이는 코드 변경에 따른 사이드 이펙트를 최소화하고, 소프트웨어의 안정성을 향상시키는 데 도움이 되었습니다.

테스트에 대한 자세한 내용은 이를 참고해주세요.

Test with React Testing Library

코드 설명

다음은 Github actions로 자동 테스트를 진행하기 위한 WorkFlows.yml 파일 코드를 설명하겠습니다.

frontend-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

frontend-test 작업을 정의하는 코드로 Backend-test와 병렬적으로 실행됩니다. Ubuntu 환경에서 실행하도록 설정하였습니다.

uses: actions/checkout@v3 : 현재 소스 코드를 체크아웃 합니다.

			- name: Set up Node.js
        		uses: actions/setup-node@v3
        		with:
          			node-version: 16

actions/setup-node 작업을 통해 node 16을 설치하는 코드입니다.

			- name: Install packages
        		working-directory: frontend
        		run: npm ci

이는 package-lock.json 또는 npm-shrinkwrap.json 파일을 사용하여 정확히 프로젝트의 종속성을 설치합니다. 이 npm ci 명령어는 패키지 버전 충돌을 방지하고 재현 가능한 설치를 위해 사용됩니다. 일반적으로 CI/CD 파이프라인이나 배포 환경에서 사용됩니다.

  • working-directory: frontend : package-lock.json 파일이 graphy/frontend에 위치하기 때문에 설정했습니다.
			- name: Prettier
        		working-directory: frontend
        		run: npm run format

이는 Prettier의 규칙에 위배된 코드가 없는지 검사합니다. package.json의 script에 "format": "prettier --check ./src”로 등록 해둔 명령을 실행하게 했습니다.

		   - name: ESLint
         		working-directory: frontend
         		run: npm run lint

ESLint로 문법 오류가 없는지 검사합니다. package.json의 script에 "lint": "eslint ./src"로 등록 해둔 명령을 실행하게 했습니다.

		  - name: Frontend Test
        		working-directory: frontend
        		run: npm test

React Testing Library로 작성한 Unit 테스트코드를 Jest 환경에서 실행합니다. package.json의 script에 "test": "jest --config jest.config.cjs"로 등록 해둔 명령을 실행합니다.

참고로 테스트 결과 저장을 위해 미리 프로젝트에 Jest-Junit을 설치하고 Jest 설정파일에 밑에 이를 추가했습니다.

reporters: [
'default',
['jest-junit', { outputDirectory: './', outputName: 'test-results.xml' }],
]
		  - name: Frontend Test Results
        		uses: EnricoMi/publish-unit-test-result-action@v1
        		if: ${{ always() }} # test가 실패해도 report를 남기기 위해 설정
        		with:
          			files: frontend/test-results.xml

이는 테스트 결과를 보기위한 설정입니다.

CI 캐싱

npm ci로 종속성 패키지를 설치할때 Github Actions의 workflow는 매 실행마다 새로운 환경을 구축하기 때문에, 새롭게 종속성 패키지들을 가지고 와야합니다. 따라서 전체 빌드 시간의 증가됩니다.

이를 개선하기 위해 Github Actions의 actions/cache를 사용해 frontend/node_modules를 캐싱하였습니다.

			- name: Cache frontend packages
        		uses: actions/cache@v3
        		with:
          			path: frontend/node_modules
          			key: ${{ runner.os }}-frontend-${{ hashFiles('frontend/package-lock.json') }}
          			restore-keys: ${{ runner.os }}-frontend-
  • path: 캐시의 저장과 복원에 사용되는 runner 내 파일 경로
  • key: 캐시를 저장, 복원에 사용되는 키
  • restore-keys: 설정한 key로 cache miss가 발생할 때 사용할 수 있는 후보군 키들

마지막으로 전체 코드를 올리면서 글을 마치도록 하겠습니다. 감사합니다.

name: CI

on:
  push:
    branches: ["feature"]
  pull_request:
    branches: ["feature"]

jobs:
  backend-test:
    //백엔드 테스트 코드
  frontend-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Cache frontend packages
        uses: actions/cache@v3
        with:
          path: frontend/node_modules
          key: ${{ runner.os }}-frontend-${{ hashFiles('frontend/package-lock.json') }}
          restore-keys: ${{ runner.os }}-frontend-

      - name: Set up Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 16

      - name: Install packages
        working-directory: frontend
        run: npm ci

      - name: Prettier
        working-directory: frontend
        run: npm run format

      - name: ESLint
        working-directory: frontend
        run: npm run lint

      - name: Frontend Test
        working-directory: frontend
        run: npm test

      - name: Frontend Test Results
        uses: EnricoMi/publish-unit-test-result-action@v1
        if: ${{ always() }}
        with:
          files: frontend/test-results.xml

Reference

https://dr0joon.notion.site/CI-1-6b0df03922074cc0a6cdba5ca29af56c

https://dr0joon.notion.site/CI-2-20732c1191a042feaa673189af0e48cb

ChatGPT

profile
Front-end Engineer를 목표로 달리고 있습니다

0개의 댓글