Git Action workflow 정리

김나나·2024년 9월 10일

Git, GitHub

목록 보기
5/7

배포를 자동으로 해줄 수 있도록 하기 위해 알아보다보니,
어제 작성했던 ci.yml파일을 좀 더 명확하게 짚고 넘어가야 추후에 CD 구축이 가능할 것 같아 정리글을 작성하게 되었다.

공식 문서 링크

name: Node.js CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [20.x] 

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

      - run: npm ci

      - run: npm run build --if-present
      - run: npm run lint
      - run: npm test

위는 어제 작성했던 ci 구축 코드였는데,
무작정 하고 넘기지 말고 한 줄씩 코드의 역할을 적어보자.


name: Node.js CI

name: workflow명으로, 해당 workflow의 이름을 지정해줄 수 있는 곳이다.
Github의 Action 페이지를 가면 All workflows 하단에 만든 workflow가 나열되어 있고,
보고싶은 workflow명을 선택하면 run history도 확인할 수 있다.


on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

on은 필수 값으로, 해당 workflow가 어떤 이벤트에서 실행되는지 지정해줄 수 있다.
현재 main branch에 push와 pull_request를 했을 경우를 설정해준 것이다.
간단하게 on: [push, pull_request]로 설정할 수도 있다고 한다.


jobs:
  build:

공식 문서에서는 jobs.build라고 되어있으나, 실제 문법은 jobs.<job_id>이다.
build는 임의로 지정된 이름으로, 원하는 이름을 넣어줄 수 있다.

이런 식으로 넣어줘도 된다는 이야기.
jobs 내부에 현재는 build라는 이름의 job 하나만 있으나,
여러 개의 job을 설정할 수도 있다.

jobs 단위로 개별 서버에서 작업이 수행된다.
(정확히는 Docker 컨테이너 단위라고 함)
각 작업은 병렬로 실행되나, needs: build처럼 표시해서 기다릴 수 있다.


runs-on: ubuntu-latest

runs-on은 job을 실행할 운영체제로,
Ubuntu, Windows, MacOS를 지원하고
노드를 직접 운영하는 경우 self-hosted를 지정할 수 있다.


    strategy:
      matrix:
        node-version: [20.x]

strategynode-version: [10.x, 12.x, 14.x]처럼 작성하여
여러 버전의 환경에서 실행하고 싶은 경우에 배열을 구성한다.
os까지 지정해주면 더욱 복잡하게 구성할 수 있다.
node-versionstrategy가 같이 배열로 되어있는 경우,
해당 원소를 순회하며 작업이 반복해서 실행된다고 한다.
+) 응용하여 runs-on에 여러 OS에서 돌릴 수 있다.


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

      - run: npm ci

steps는 job의 실제 동작을 정의하는 부분으로,
uses에서는 각 스텝에서 사용할 액션을 지정할 수 있다.
액션은 다른 회사나 사람들이 만들어 올려둔 액션을 가져다 설정만 조금 해주어 편리하게 사용할 수 있고, 이 경우 Marketplace에서 찾을 수 있다.

위 코드를 보면 action/checkout@v2에는 Checkout 액션이 사용되었다.
해당 액션의 역할은 저장소의 소스코드를 checkout하여 가져오는 액션이고,
action/setup-node@v1에는 Setup Node.js environment 액션이 사용되었고, 원하는 Node.js의 버전을 설정한 것을 알 수 있다.

action/checkout: GitHub의 마지막 커밋으로 Checkout 한다.
action/setup-node: Node.js를 설치한다.

run은 시스템에서 shell script처럼 명령어를 실행해주는 개념이다.
위처럼 - run: npm ci처럼 한 줄로 작성되어 있으나,

위 이미지처럼 이름을 지정할 수도 있고, 이름을 지정하여 multi line으로 사용할 수도 있다.
npm cinpm install과 동일한 기능을 수행한다.
이렇게 설정한 step은

Github 페이지에 위 이미지처럼 보여진다.


      - run: npm run build --if-present
      - run: npm run lint
      - run: npm test

--if-present옵션은 npm 스크립트가 존재하는 경우에만 실행시킨다는 명령어이다.

npm run lintnpm test는 yml파일에서 위처럼 사용해주기 위해
package.json의 "scripts" 내부에도 코드를 작성해줬었다!!!


CI 구축에 필요한 코드는 정리를 하며 이것저것 찾아보니 처음보다 많이 이해를 할 수 있게 되었다.
CD 구축을 위해 Github Action을 이용해 리눅스 서버에 배포하는 기능을 공부하고 있는데,
리눅스 자체가 익숙하지 않아서인지, 생각보다 공부가 더 필요한 것 같다..
힘내서 해보자 화이팅!!

profile
10분의 정리로 10시간을 아낄 수 있다는 마음으로 글을 작성하고 있습니다💕

0개의 댓글