CircleCI Orb Deep Dive: Node.jsでのCI / CDパイプラインを効率化する

CircleCI Orb Deep Dive: Node.jsでのCI / CDパイプラインを効率化する

Article actions
View in Markdown

Requires Chrome (latest) built-in AI.

Requires Chrome (latest) built-in AI.

この記事では、Node.jsアプリ( Next.js / Express / NestJS / Remix / Honoなど)のCI / CDパイプラインを効率的にセットアップするための方法について、CircleCIを利用するケースにフォーカスして紹介します。パイプラインの高速化やビルド・デプロイ時に利用するシークレットの管理など、導入してから半年〜1年経過すると気になってくるポイントについて、簡単かつシンプルにカバーできるようになります。

CI / CDパイプラインは複雑化する

CI / CDといえば、テストやビルドを実施してアプリケーションコードを検証したり、ブランチ・コードベースのリリースを自動的に実施させたりするときに使うもの、というイメージが強いかなと思います。テストコードの実装や設計はともかく、タスクとしてはそれぞれのコマンド(npm run build / npm testなど)を実行するだけなので、複雑さは発生しにくいように見えます。

しかし実際に運用を始めると、どのCI / CD サービスでも気がつけばパイプライン上で実施するタスクが複雑化しがちです。これは実行速度やコスト、対応するNodejsバージョンの種類などが原因であることが多く、「キャッシュがあるかないかの判定」や「バージョンごとのタスク定義」などで設定ファイルが肥大化し始めます。

YAMLファイルで定義できるとはいえ、設定が複雑化し始めると次第に「この設定なんでこうなっているのか?」「CIで起きている問題を、どうすれば解決できるのか」などの調査や対応が非常に煩雑になりやすくなります。

CircleCI Orbがタスク(ジョブ)のベストプラクティスを提供する

このような複雑化を回避しつつ、効率的なパイプラインやジョブの設定を行うにはどうすれば良いでしょうか?もっとも簡単な方法は、「CI / CDベンダーが提供するベストプラクティスをインポート」することです。CircleCIでは、Orbという名前で再利用可能な形のジョブやコマンドが配布されています。

Node.js版のOrbを利用することで、問題が発生してから設定を調整するのではなく、CircleCIがこれまでの経験を元に構築した手順を数行の設定コードでインポートして使えるようになります。これは設定作業の効率化以外にも、プロジェクトごとに微妙に異なる独自の設定が行われるという状況の解消にもつながります。Orbを採用することにより、ビルドやデプロイ時の手順を標準化させ、ガバナンスを強化することも実現できます。

Node Orbをパイプラインへ導入する

Orbの導入はとても簡単です。CircleCIが公式で配布しているOrbについては、ダッシュボードの設定なども不要で、.circleci/config.ymlの変更のみで設定ができます。以下のYAMLファイルでは、npmライブラリのインストールからnode_modulesなどのキャッシュ管理、そしてテストの実行や利用するパッケージマネージャーの選定まで自動で実行します。

version: 2.1

orbs:
  node: circleci/node@7.2.1

workflows:
  test_my_app:
    jobs:
      - node/test:
          name: Run Unit Tests

node/install-packagesで、インストールステップだけ実施する

細かいタスクについては独自に定義したnpm-scriptsコマンドを利用したいケースなどでは、ミニマムで利用できるnode/install-packagesコマンドが利用できます。これはnpm / yarn / pnpmなどのパッケージマネージャ検知やキャッシュ管理などが内包されていますので、自前でステップを制御するよりもシンプルなセットアップステップが構築できます。

これはコマンドとして提供されているため、利用する場合はworkflowsではなくjobsstepsに定義しましょう。

version: 2.1
orbs:
  node: circleci/node@7.2.1

jobs:
  build_app:
    executor: node/default
    resource_class: small
    steps:
      - checkout
      - node/install-packages:
          pkg-manager: npm
      - run:
          name: Build app
          command: npm run build
      - persist_to_workspace:
          root: ~/project
          paths:
            - .

workflows:
  build_app_workflow:
    jobs:
      - build_app

node/testでテストコマンド実行までまとめる

インストール後のテストコマンド実行までをまとめてくれるのが、node/testジョブです。こちらはinstall-packagesに加えてnpm run testコマンドの実行をサポートします。

テストで実行するコマンドや実行するNodejsバージョンを変更することもできます。そのため、ユニットテストと結合テストをそれぞれ実行したいケースなどにも利用できます。

version: 2.1
orbs:
  node: circleci/node@7.2.1

workflows:
  build_app_workflow:
    jobs:
      - node/test:
          name: unit_test
          pkg-manager: npm
      - node/test:
          name: integration_test
          pkg-manager: npm
          run-command: test:integration
          test-results-path: test-results

ライブラリの公開や、任意のコマンド実行も

このほかにも任意のNodeコマンド実行もコマンドやジョブとして提供されています。

リントやドキュメント生成、wrangler / vercelなどのコマンド実行ステップを追加したい場合も、node/runジョブをワークフローに定義することで、シンプルな設定ファイルを維持できます。

version: '2.1'
orbs:
  node: circleci/node@x.y
workflows:
  run-npm-command:
    jobs:
      - node/run:
          executor:
            name: node/default
          yarn-run: build

このほかのコマンドやユースケース・最新情報については、ドキュメントも併せてご覧ください。

ガバナンスとベストプラクティスをCircleCI Orbsで両立する

CI / CDの設定は塩漬けにされがちです。テストやビルドの失敗自体は優先して対処されますが、パイプライン自体は「便りがないのはいい知らせ」「寝た子を起こさない」のように現状維持が選ばれます。しかしいざパイプラインに問題が発生したとき、その調査や対応が完了するまで全てのビルドやデプロイメントが停止あるいは手動化せざるを得ません。

このような潜在的なリスクを回避するためには、標準化された手順や信頼できる配布元による手順のインポートをお勧めします。共通の Orb をベースにすることで、組織が拡大しても、開発者体験を一定に保つことができます。

Share:

Hidetaka Okamoto profile photo

Hidetaka Okamoto

Business Development

I'm a Business Development professional at DigitalCube. Based on my experience in EC ASP development and as a Developer Advocate at Stripe, I'm working on methods to increase revenue for SaaS and EC sites, exploring efficiency improvements using generative AI, and developing new business models. You can follow me on Twitter at @hidetaka__dev

Related Articles