Lerna 및 Github Actions로 모노 리포지토리를 강화하세요

문제



Scalable Capital에서 우리는 재사용 가능한 반응 구성 요소, 구성, 도우미 등을 위한 공통 장소인 Whitelabel 플랫폼을 사용합니다.

플랫폼은 패키지를 관리하기 위해 monorepo로 구성됩니다. 패키지와 해당 종속성을 처리하기 위해 Lerna을 사용하고 있습니다.

현재Lerna는 캐시 시스템을 사용하지 않습니다. 루트 수준에서 테스트를 빌드하거나 실행할 때마다 패키지 중 하나에서 파일을 변경한 경우에도 모든 패키지에 대해 모든 것을 실행합니다.

빌드 및 테스트에 시간이 걸리고 많은 개발 시간이 소요될 수 있기 때문에 좋지 않습니다.

What if somehow we build and run tests only for the package that is changed and not all packages?

What if we can cache the Github action workflows for the Pull requests subsequent commits for PR checks?



Turborepo을 입력합니다. ⚡️


변경 사항



바로 변경 사항을 살펴보겠습니다.

1부 - Turborepo 추가(Lerna가 이미 설정되었다고 가정)



터보를 추가하려면 터미널에서 다음 명령을 실행하십시오.

yarn add turbo --dev -W


프로젝트의 루트에 turbo.json 파일을 만듭니다.

{
    "$schema": "https://turborepo.org/schema.json",
    "pipeline": {
        "build": {
            "dependsOn": ["^build"],
            "outputs": [".next/**"]
        },
        "test": {
            "outputs": []
        },
        "test-coverage": {
            "outputs": ["coverage/**"]
        },
        "start": {
            "cache": false
        },
        "typecheck": {
            "outputs": []
        },
        "prepublishOnly": {
            "outputs": []
        },
        "@scacap/whitelabel-app-cockpit#prepublishOnly": {
            "dependsOn": ["@scacap/whitelabel-components#prepublishOnly"]
        },
        "@scacap/whitelabel-app-onboarding#prepublishOnly": {
            "dependsOn": ["@scacap/whitelabel-components#prepublishOnly"]
        }
    }
}


위의 turbo.json 파일에서 pipeline 를 정의해야 합니다.
따라서 package.json를 사용하여 루트turbo run <tests | build>의 NPM 스크립트에서 실행하려는 모든 항목은 pipeline에 동일한 필드가 있어야 합니다.
turbo 실행 중에 파이프라인 작업을 NPM 스크립트에 적용합니다.

여기서 주목해야 할 가장 중요한 것은 dependsOn 입니다. 위 구성@scacap/whitelabel-app-cockpit 패키지prepublishOnly에서 NPM 스크립트는 @scacap/whitelabel-componentsprepublishOnly 스크립트가 실행된 경우에만 실행됩니다.

파이프라인 설정에 대한 자세한 내용은 here입니다.

마지막으로 루트로 변경됨package.json

packageManagerpackage.json와 함께 사용하는 경우 Yarn WorkspacesLerna에 추가

"packageManager": "[email protected]",



2부 - 터보 캐시로 Github 작업 설정



코드 품질을 유지하기 위해 Github 작업 PR 검사를 사용합니다.

문제는 PR에 대한 모든 커밋이 이러한 검사(테스트 실행, 유형 검사 등)를 트리거하고 일부 캐싱 메커니즘 없이 이러한 작업이 모든 패키지에 대해 실행된다는 것입니다.

액션 워크플로 속도를 높이기 위해 Github 액션에 터보 매직을 추가해 봅시다.

테스트 실행의 예를 들어 보겠습니다.
패키지에 대한 일부 테스트를 변경하면 Turbo CacheLerna가 없으면 모든 패키지에 대한 테스트가 실행됩니다. 그리고 이것은 모든 커밋에 대해 발생합니다. 😱

변경하자

tests:
        name: Unit tests
        runs-on: ubuntu-18.04
        steps:
            - name: Checkout repo
              uses: actions/checkout@v2
              with:
                  fetch-depth: 0
            - name: Setup node
              uses: actions/[email protected]
              with:
                  node-version: 14
            - name: Restore node_modules cache
              uses: actions/[email protected]
              with:
                  path: '**/node_modules'
                  key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}
            - name: Turbo Cache
              id: turbo-cache
              uses: actions/cache@v2
              with:
                  path: .turbo
                  key: turbo-${{ github.job }}-${{ github.ref_name }}-${{ github.sha }}
                  restore-keys: |
                      turbo-${{ github.job }}-${{ github.ref_name }}-
            - name: Install packages
              run: yarn --frozen-lockfile
            - name: All tests
              run: yarn test-coverage --cache-dir=".turbo"
            - name: Add coverage comment
              continue-on-error: true
              uses: eeshdarthvader/code-coverage-assistant@master
              with:
                  github-token: ${{ secrets.GITHUB_TOKEN }}
                  monorepo-base-path: './packages'


여기서는 Github 작업 워크플로에 mem 캐시를 추가하고 동일한 PR의 커밋 간에 재사용될 캐시 데이터를 .turbo에 저장합니다.


결과



각 커밋에 대한 일반 CI PR 검사는 다음과 같습니다.

ℹ️ Note the time. This much time is taken for every tiny commit you push to PR.





CI는 TurboRepo와 함께 실행됩니다.



ℹ️ The test run has decreased from 4 min to 1 min and Typecheck reduced from 3 min to 52 sec 😱



로컬에서 개발할 때 어떻게 도움이 되는지 살펴보겠습니다.
yarn test를 사용하여 테스트를 처음 실행한 후 다시 실행해 보십시오.



✅ ===> 풀 터보 ✅

매번 실행하는 데 일반적으로 걸리는 테스트~20 sec는 Turborepo와 함께 캐싱 시스템으로 괴물0.7 sec로 실행되었습니다. 🎉

그게 다야! Turborepo으로 모노레포를 빠르게 충전하시기 바랍니다.

더 많은 리소스
  • 오피셜 가이드 Migrate from Lerna

  • 게시물에 언급된 Pull request Github Action workflow

  • Code coverage Github action 모노레포용으로 제작
  • 좋은 웹페이지 즐겨찾기