Monorepo의 노드 모듈에 대한 GitHub 작업

내가 작업한 프로젝트 중 하나는 공유 개인 종속성을 가진 여러 프론트엔드 애플리케이션이 있는 monorepo를 사용합니다. 우리는 모든 공유 노드 모듈을 정리된 상태로 유지하기 위해 하나의 최상위 폴더 아래에 두기로 결정했습니다. 프로젝트에 대한 CI를 설정할 때가 되었을 때 사용자 지정 bash 스크립트를 작성하는 것이 모듈당 워크플로 설정을 피하는 가장 쉬운 방법이라는 것을 알았습니다.

개인 패키지가 꽤 많은 경우 이 전략이 적합하지 않을 수 있습니다. 그러나 우리에게는 몇 가지 밖에 없기 때문에 패키지가 업데이트될 때마다 하나의 워크플로를 실행하는 것이 최선이라고 결정했습니다. 이 모든 패키지를 private_modules 라는 폴더 아래에 보관함에 따라 private_modules/** 경로를 가진 모든 항목을 대상으로 하도록 워크플로를 설정한 다음 실행할 원사 스크립트를 가져올 수 있는 사용자 지정 셸 스크립트를 실행했습니다. 우리는 종속성을 관리하기 위해 yarn을 사용하고 있지만 이것은 npm에서도 작동해야 합니다.

name: Private Packages

on:
  pull_request:
    paths: 
      - "private_modules/**"

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [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: yarn install and test
      run: |
        cd private_modules
        ./yarn_run.sh test

보셨듯이 워크플로 파일이 없으면 cd 최상위 디렉토리로 이동하여 bash 스크립트를 실행하기만 하면 됩니다. 하나 이상의 yarn 명령을 실행해야 하는 경우 각 명령에 대해 새 단계를 추가하거나 여러 명령을 사용하도록 bash 스크립트를 업데이트할 수 있습니다.

bash 스크립트 자체는 간단합니다. 폴더 내의 모든 하위 디렉터리를 반복하고 종속성을 설치한 다음 인수에 지정된 yarn 스크립트를 실행합니다. 이런 식으로 Linting, 테스트 또는 게시 여부에 관계없이 모든 CI 단계에 사용할 수 있습니다.

#!/bin/bash

CMD=$1

dir_resolve()
{
cd "$1" 2>/dev/null || return $?
echo "`pwd -P`"
}

for dir in ./*/
do
    (
      abs_path="`dir_resolve \"$dir\"`"
      echo "Installing $abs_path"
      cd $abs_path
      yarn install
      yarn run $CMD --max-warnings=0 2>/dev/null
      if [ $? -ne "0" ]
      then
        exit 1
      fi
    ) || exit 1
done

이 bash 스크립트를 사용하면 워크플로를 쉽게 관리하고 유지 관리할 수 있습니다. 염두에 두어야 할 주요 사항은 모든 패키지에 bash 스크립트에 전달하려는 yarn 명령이 구성되어 있어야 한다는 것입니다. 그렇지 않으면 스크립트가 실패합니다.

원래 게시 날짜jessie.codes

좋은 웹페이지 즐겨찾기