name : build + eslint
# 이벤트를 발생시킬 트리거
on:
pull_request: # pull request, push 등등 가능
branches: # branches로 지정할 수 있음
- develop
jobs: # 실행할 작업들! 병렬적으로 실행된다는걸 의식하자
check:
name: check #이름을 적어줘야 branch protection 설정에서 찾아줄 수 있다
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install client dependencies # client 폴더에서 npm 설치
run : |
cd client
npm install
- name: Install server dependencies # server 폴더에서 npm 설치
run : |
cd server
npm install
- name: Check eslint # eslint 돌리기
run : |
./client/node_modules/.bin/eslint client/src --ext .js,.jsx
./server/node_modules/.bin/eslint server --ext .js,.jsx
- name: Run client build check # 클라이언트 돌리기
run: |
cd client
npm run build
- name: Run server build check # 서버 빌드 돌리기
run: |
cd server
npm run build
<aside> <img src="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/1c879625-ca7a-4c25-9ce5-55228661650b/25231.png" alt="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/1c879625-ca7a-4c25-9ce5-55228661650b/25231.png" width="40px" /> PR 올림 → 빌드 기다림(2분 이상) →
빌드 완료 → 통과 못했네? → 빌드 기다림 →
빌드 완료 → 아 맞다 콘솔 로그 지워야하는데 → 또 빌드 …
</aside>
첫번째로 개선할 수 있다고 생각한 요소는 node_modules
를 설치하는 부분이다.
node_modules
설치에 1분 이상의 시간이 소요되고 있다.caching
하는 기능을 Github actions
에서는 지원하고 있다check:
name: check
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v2
변경된 부분
=======================================================================================
- name: Cache client node_modules
id: cache-client
# 위의 checkout 과 유사한 github에서 제공하는 actions
uses: actions/cache@v3
with:
# 캐싱할 대상을 지정합니다. 모노레포이기때문에 client 폴더로 진입
path: client/node_modules
# 캐시의 변경 기준은 package-lock.json
key: npm-packages-client-${{hashFiles('**/package-lock.json')}}
#이걸 넣어야 캐시 실패했을때 이전 캐시를 사용합니다 안그러면 계속 쌓여요
restore-keys: |
npm-packages-client-
- name: Install client dependencies
# 이전 package-lock.json과 현재가 동일할 경우 cache hit
if: steps.cache-client.outputs.cache-hit != 'true'
run: cd client && npm install
- name: Cache server node_modules
id: cache-server
uses: actions/cache@v3
with:
path: server/node_modules
key: npm-packages-server-${{hashFiles('**/package-lock.json')}}
restore-keys: |
npm-packages-server-
- name: Install server dependencies
if: steps.cache-server.outputs.cache-hit != 'true'
run: cd server && npm install
=======================================================================================
- name: Check eslint
run: |
./client/node_modules/.bin/eslint client/src --ext .ts,.tsx
./server/node_modules/.bin/eslint server/src --ext .ts,.tsx
- name: Run client build check
run: |
cd client
npm run build
- name: Run server build check
run: |
cd server
npm run build
⇒ 바뀐 코드를 감지해서, 원하는 job만 실행시킬수는 없을까?
actions
도 누군가가 만들어서 제공하고 있습니다name: build + eslint check
on:
pull_request:
branches:
- ci-test
jobs:
check:
name: check
runs-on: ubuntu-latest
outputs:
client: ${{steps.filter.outputs.client}}
server: ${{steps.filter.outputs.server}}
steps:
- uses: dorny/paths-filter@v2
id: filter
# 클라이언트/서버 폴더 내부에 변경된 파일이 있다면
# outputs.로 내보내줍니다
with:
filters: |
client:
- 'client/**'
server:
- 'server/**'
# 클라이언트에서 변경된 파일이 있을경우에 실행되는 job
client:
needs: check
if: ${{needs.check.outputs.client=='true'}}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Nodejs Setup
uses: actions/setup-node@v2
- name: Cache client node modules
id: cache-client
uses: actions/cache@v3
with:
path: client/node_modules
key: npm-packages-client-${{hashFiles('**/package-lock.json')}}
restore-keys: |
npm-packages-client-
- name: Install client dependencies
if: ${{steps.cache-client.outputs.cache-hit != 'true'}}
run: cd client && npm install
- name: Client eslint check
run: ./client/node_modules/.bin/eslint client/src --ext .ts,.tsx
- name: Run client build check
run: cd client && npm run build
# 서버에서 변경된 파일이 감지될경우 실행되는 job
server:
needs: check
if: ${{needs.check.outputs.server=='true'}}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Nodejs Setup
uses: actions/setup-node@v2
- name: Cache server node modules
id: cache-server
uses: actions/cache@v3
with:
path: server/node_modules
key: npm-packages-server-${{hashFiles('**/package-lock.json')}}
restore-keys: |
npm-packages-server-
- name: Install server dependencies
if: ${{steps.cache-server.outputs.cache-hit != 'true'}}
run: cd server && npm install
- name: server eslint check
run: ./server/node_modules/.bin/eslint server/src --ext .ts,.tsx
- name: Run server build check
run: cd server && npm run build
출처