Node-REDのGit機能を学ぶ(1) 概要編

本記事は「Node-REDのGit機能を学ぶハンズオン(第1回)」で紹介した内容です。

https://www.youtube.com/watch?v=qAcZcObgWAY

　Node-REDで本格的なフロー開発を行う際に必須となるGit機能を紹介します。
　Node-REDは産業向けIoTアプリをコーディング不要で構築できる開発環境として近年、工場データの見える化ダッシュボードや、工場のファクトリーオートメーションなどのシステムで利用されています。しかし、これらのミッションクリティカルシステムのフロー開発では以下の問題に遭遇しがちです。
 
 ![図3-1 フローを開発する際の問題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/53c49b69-43da-a95c-063b-0c989d0d47f8.png)

# フロー開発で起きがちな問題

### [問題1] すべての機能が1つのフローに存在
　Node-REDの環境が1つしか存在しない場合、多数のノードを含む巨大なフローがその1つの環境で実行されることになります。このようなフローはメモリやCPUのリソースを大量に消費するため、パフォーマンスの問題が発生しがちです。また、同じ名前のコンテキスト変数やHTTPエンドポイントが衝突したり、ダッシュボードでは複数のアプリケーションのUIが1つの画面に存在したりしてしまっていました。

### [問題2] 誰がいつフローを修正したのか不明
　多くのフロー開発者が1つのNode-RED環境を同時に使用するケースもまれに行なわれています。Node-REDフローエディタは、デフォルトでは誰がいつフローを変更したかを管理しないため、本番環境で問題が発生した場合、フローを元に戻せない問題や、誰がバグを作り出したか分からないという事象が生じます。

### [問題3] 一般的でないフローの共有方法
　フロー開発の初心者が、上手く動作しているフローを失わないよう「フローを書き出し」ダイアログから手動でフローファイルをPCに保存しているケースもよく見られます。複数のフローファイルを区別するために、日時や開発物名を含むファイル名を設定することがありますが、とても手間のかかる作業です。また、フローを他の開発者に共有する際、Wordのような開発者フレンドリでない独自ドキュメントにフローの詳細を書いてしまうと、一般的な開発者は理解するのに時間がかかります。ドキュメント作成者にとってもフローの更新と合わせて、Wordファイルの内容を更新してゆくのは大変でしょう。

　このように、フロー開発にはさまざまな懸念があります。企業での開発プロジェクトにおいて、Node-REDを個人環境と同じ様に使ってしまうと、フロー開発の進捗が滞るでしょう。

# 課題を解決できるGit機能とは
　Visual Studio Codeによる一般的なコード開発と同じように、フローエディタ上で開発物の変更履歴を記録できる機能です。大規模システムの開発経験を持つOSSコミュニティのエンジニアが協力して、この機能を開発しました。Git機能により、前述した3つの問題を次のように解決できます。
 
![Screenshot 2024-02-25 at 20.59.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/5859215e-6fef-aa78-1d95-aabc4197fc8d.png)

### [問題1の解決] 複数プロジェクトの切り替え
　Git機能を有効にすることで、フローエディタ上で複数のプロジェクトを切り替えできるようになります。各プロジェクトには1つのアプリケーションを実現するフローのみが存在するため、リソースの枯渇や名前の競合を解決できます。また、プロジェクトの切り替え機能を用いることで、1つのNode-RED環境で複数のプロジェクトの開発を並行して進めることもできます。

### [問題2の解決] フローの変更履歴
　Git機能を有効にすると、フローエディタの右側に「履歴」タブが登場します。このタブ上で上手く動作したフローを変更内容付きで変更履歴に記録できます。もし、編集したフローが上手く動作しなくなった場合、過去のフローを復元することもできます。また、GitHubのリポジトリにフローを共有した際、変更履歴にはフローを修正した開発者の情報が記録されているため、フローに問題が発生した時に、いつ誰がミスしたかを特定できるようになります。

### [問題3の解決] GitHubにフローを共有
　Git機能には変更履歴に加え、GitHubに開発物をアップロードする機能もあります。この機能を用いることで、上手く動作しているフローのバックアップを取ることができます。また、Git機能を有効にしたフローエディタには、フローの使い方や依存するノードの情報を入力できるUIも存在します。開発者フレンドリなMarkdownファイルやpackage.jsonに情報が記載されるため、他のフロー開発者はアプリの内容を確認しやすくなります。

　Git機能を習得するには、少し時間がかかりますが、本格的なフローを効率良く開発するには必須な機能ため、利用することをお勧めします。

# Git機能を有効化する手順
　Git機能を利用するには、Gitコマンドが必要です。そのため、Windowsの場合は、以下のサイトで提供されている64bit版インストーラを用いて、Gitをインストールします。

https://git-scm.com/downloads 

　macOSやLinuxでは、通常Gitコマンドが既に入っているため、インストール作業は不要です。
　次に、PowerShell上(macOSやLinuxではターミナル)で以下のコマンドを入力します。
```
node-red admin init
```
　このコマンドは、Node-REDのカスタム設定を行うためコマンドラインウィザードです。コマンドラインウィサードで質問に答えてゆくだけで、Node-REDの設定ファイル「settings.js」を生成してくれます。本コマンドラインウィサードで表示されるProjectsセクションの質問のうち、2つがGit機能に関するものです。
 
![1_qd1ZviO220TWc6_iXBniRw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/89566c8c-c978-de5b-d2b7-d1c3ff5a2192.png)

　最初のGit機能を有効にするか否かの質問「Do you want to enable the Project feature?」では「Yes」を選択します。その後のワークフローのモードの質問「What project workflow do you want to use?」では「manual - you must manually commit changes」を選択します。「manual」モードでは、変更履歴に記録する対象ファイルの指定や、フローの変更内容の入力を手動で順を追って行うため、Git機能を理解しやすいモードです。
　ウィザードが終了し、設定ファイルが作られた後は、いつものように「node-red」コマンドを実行してNode-REDを起動します。その後、ブラウザから「[http://localhost:1880](http://localhost:1880)」にアクセスし、フローエディタを開きます。すると、次のような初期ダイアログが表示されます。
 
![Screenshot 2024-02-25 at 15.06.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/c70c0132-f0cb-deca-27a2-ad6d34532d02.png)

 以降の操作は、[次の「Node-REDのGit機能を学ぶ(2) フローの切り替え」の記事](https://qiita.com/kazuhitoyokoi/items/2d16662d18b9158f9b92)で紹介してゆきます。お楽しみに。