[misc] Github Action을 이용해 코드 검사 자동화하기

42의 C 과제들은 깐깐한 코딩 컨벤션에 맞추어 진행되어야 합니다. Norm이라 불리는 이 컨벤션을 지키지 못하면, 과제를 아무리 잘 했더라도 코드를 다시 짜야 합니다.

다행이, 42에서는 이 norm을 검사해주는 유틸리티를 제공합니다. Norminette 검사기를 활용하면 내 코드가 이 규정을 따랐는지 쉽게 확인할 수 있습니다.

최근 Minishell이라는 팀 과제를 진행하면서, Github을 사용해 협업하기로 하였습니다.

이때 팀원 중 한 사람이라도 norm을 따르지 않는다면 과제를 평가받던 중에 norm error로 리트라이해야 하는 불행한 일이 생길 수 있기 때문에, 애초에 코드를 작성하는 과정에서도 이 norm 규정을 지키도록 만들었습니다.

이 글에서는 Github Action을 이용해 검사를 자동화하는 방법과, 특정 조건에 이 Action을 트리거하는 방법을 설명합니다.


Github의 Action은 Workflow 단위로 이루어집니다. 각 Workflow는 리포지토리 최상단에 위치한 .github/workflows 밑에 yaml 형식으로 작성되어야 합니다.

Workflow 파일은 다음 정보를 포함하고 있습니다.

제가 만든 Workflow를 보며, 설명을 이어가겠습니다.

name: check 42 norminette

on:
  push:
  pull_request:
jobs:
  check_42_norm:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: install 42 norminette
        run: |
          sudo apt update
          sudo apt install python3 -y
          python3 -m pip install --upgrade pip setuptools
          python3 -m pip install --upgrade norminette

      - name: check for 42 norminette requirements
        run: |
          echo checking files: $(git ls-files)
          norminette .

  check_compile_error:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: check for compilation errors
        run: |
          sudo apt update
          sudo apt install build-essential -y
          echo checking files: $(git ls-files)
          for f in $(find . -name \\\\*.c); do gcc -Wall -Wextra -Werror -fsyntax-only $f; done

하나의 action(workflow)은 다수의 job들로 구성됩니다. 각각의 job은 독립된 환경에서 별도로 실행됩니다. 따라서 여러 개의 검사를 동시에 진행할 수 있으며, 각각의 결과를 받아볼 수 있습니다.

여기에서는 컴파일 오류를 확인하는 check_compile_error와 컨벤션 오류를 확인하는 check_42_norm 작업이 실행됩니다. 아직 프로젝트를 막 시작한 단계여서 별도의 규칙을 만들지는 않았지만, Makefile의 relink 여부와 norm에서 필수로 하는 컴파일 조건들이 있는지 확인하는 작업을 추가할 예정입니다.