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에서 필수로 하는 컴파일 조건들이 있는지 확인하는 작업을 추가할 예정입니다.