Github Actions를 이용해 Pull Request가 새로 등록되면 자동으로 eslint를 실행하고 eslint를 통과하지 못한 PR은 merge 하지 못하도록 막자.
우선 node 기반 repo가 있고 npm run lint
라는 명령으로 eslint를 수행할 수 있는 준비가 되어있다고 가정한다.
아래와 같이 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
로 사용한다.
만든 후 잠시 기다리면 아래와 같이 만든 Workflow가 실행된 흔적을 발견할 수 있다.
eslint가 통과한 경우:
eslint가 실패한 경우:
PR을 만들면 자동으로 lint가 실행되고 결과가 표시된다.
아직 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와 마찬가지로 유닛 테스트 통과의 강제도 쉽게 이 글을 참고해 추가할 수 있지 않을까 생각한다.