🙌

NxモノレポをGitHub Actionsでビルド・デプロイする際のTips

2022/05/25に公開

はじめに

Nxでビルドする際は、全てをビルドするのではなく、 nx affected で変更が影響するものだけをビルドすることで、Nxの恩恵の大部分を享受できます。
このとき、 dist/apps 以下にビルド成果物が作成されたりされなかったりするため、それに応じて必要なデプロイだけを走らせる対応が必要です。
ここではそれをやるためのTipsを紹介します。

やったこと

dist/apps 直下のディレクトリをリストのJSONとして取得し、それをbuildジョブの出力に設定しました。そして、以降のdeployジョブで、buildジョブで出力されたJSON中に自身がビルドすべきappの名前が含まれていれば、デプロイを実行するようにしました。

jobs:
  build:
    runs-on: ubuntu-latest
    outputs:
      # JobのOutputsにJSONをセットする
      affected-apps: ${{ steps.list-affected-apps.outputs.affected-apps }}

    steps:
      ...
      - run: npx nx affected --target=build --parallel=3

      # dist/apps直下のディレクトリ一覧をJSONとして出力
      - id: list-affected-apps
        run: |
          affected_apps=$(npx nx affected:apps --plain | jq -ncR '[inputs]')
          echo "::set-output name=affected-apps::$affected_apps"      

  deploy-web:
    # buildジョブのOutputをパースし、デプロイ対象のappが含まれている場合のみ実行
    if: contains(fromJSON(needs.build.outputs.affected-apps), 'web')
    needs: build
    runs-on: ubuntu-latest
    steps:
      - run: # フロントのデプロイ処理

Discussion