[Github Actions] eslint 통과한 PR만 merge 할 수 있게 해보자.

BabyCTO·2020년 1월 1일
8

목표

Github Actions를 이용해 Pull Request가 새로 등록되면 자동으로 eslint를 실행하고 eslint를 통과하지 못한 PR은 merge 하지 못하도록 막자.

구현

우선 node 기반 repo가 있고 npm run lint 라는 명령으로 eslint를 수행할 수 있는 준비가 되어있다고 가정한다.

Step1. Workflow 작성

아래와 같이 workflow를 만들어 master 브랜치에 포함시키자.
.github/workflow/on-pr.yml 로 저장하자.
파일명의 on-pr은 마음대로 변경해도 된다.

name: Test PR

on:
  pull_request:
    branches:
      - master

jobs:
  build:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [10.x, 12.x]

    steps:
    - uses: actions/checkout@v1
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v1
      with:
        node-version: ${{ matrix.node-version }}
    - name: npm install, build, and test
      run: |
        npm ci
        npm run lint
      env:
        CI: true

코드를 부분 부분 자세히 살펴보자. Workflow에 대한 Documentation은 공식 문서를 참고하자.

name: Test PR

Workflow의 이름이다. 마음껏 지어주자.

on:
  pull_request:
    branches:
      - master

master 브랜치로의 PR이 등록되면 Action을 실행하겠다는 선언이다.

jobs:
  build:
    runs-on: ubuntu-latest

이 Action을 우분투의 최신 버전에서 구동하겠다는 선언이다.

    strategy:
      matrix:
        node-version: [10.x, 12.x]

matrix.node-version라는 전략 변수를 10.x, 12.x 두 개의 항목으로 만든다.

    steps:
    - uses: actions/checkout@v1

actions/checkout version 1을 사용한다는 선언이다. 우분투의 최신 버전이 준비된 후 코드를 체크아웃 받으라는 명령이다.

    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v1
      with:
        node-version: ${{ matrix.node-version }}

actions/setup-node version 1을 사용한다는 선언이다. matrix.node-version라는 전략 변수 배열의 두 항목에 맞게 node version이 각각 준비된다.

    - name: npm install, build, and test
      run: |
        npm ci
        npm run lint
      env:
        CI: true

npm ci를 통해 패키지를 설치하고 npm run lint 명령을 실행한다. 이 때 CI라는 환경변수를 true로 사용한다.

Step2. 테스트로 PR을 하나 만들어보자.

만든 후 잠시 기다리면 아래와 같이 만든 Workflow가 실행된 흔적을 발견할 수 있다.

eslint가 통과한 경우:

eslint가 실패한 경우:

PR을 만들면 자동으로 lint가 실행되고 결과가 표시된다.

Step3. eslint가 실패하면 merge 못하게 만들기

아직 eslint가 실패해도 PR은 merge 할 수 있다. merge를 막기 위해 repo의 Settings에 들어가자. (여기는 Github Actions의 영역은 아니다.)

Settings - Branches - Branch protection rules에서 "Add rule" 버튼을 누른다.

master 혹은 원하는 브랜치명을 입력 후 Require status checks to pass before merging 체크 후 build (10.x), build (12.x) 를 체크해준 후 저장하면 끝이다.

build (10.x), build (12.x)가 아직 나타나지 않았다면 테스트 PR을 만들어 Workflow를 한 번 구동해준 후 확인하자.

마무리

이제 PR을 등록하면 자동으로 eslint를 실행하고 실패하면 자동으로 PR을 merge할 수 없도록 설정할 수 있다. jenkins나 Circle CI가 있어야 구현할 수 있던 lint 강제를 이제 Github Actions와 함께 Github 하나로 끝낼 수 있다. lint와 마찬가지로 유닛 테스트 통과의 강제도 쉽게 이 글을 참고해 추가할 수 있지 않을까 생각한다.

profile
많이 부족한 CTO

0개의 댓글