GitLab CI を用いて IBM Cloud CF環境へ Node-RED プロジェクトをデプロイし使用する

# はじめに
Node-REDにVersion 0.18以降プロジェクト管理機能（フローをGitで管理できる機能）が搭載されました。しかしながら、IBM Cloudが提供するNode-REDボイラープレートではまだ利用できません。そこで今回はボイラープレートを使わずに、以下4点が実施できる環境を構築してみたいと思います。

1. ローカルでフロー開発
2. Gitでフローの管理
3. デプロイメントパイプラインでIBM CloudへPush
4. IBM Cloud CF環境でサーバーアプリとして利用


# ローカル環境の準備
はじめに、ローカルへNode-REDをインストールし、プロジェクト管理機能を有効化します。

## Node-RED インストール
https://nodered.jp/docs/getting-started/installation

```
sudo npm install -g --unsafe-perm node-red
```

## Node-RED プロジェクト機能 有効化
https://nodered.jp/docs/user-guide/projects/  

`<インストール先>/settings.js` ファイルの一番下にプロジェクト機能のセクションがあります。デフォルトは `false` になってますので、ここを `true` に変更し、プロジェクト機能を有効化します。

```js:settings.js
// Customising the editor
editorTheme: {
    projects: {
        // To enable the Projects feature, set this value to true
        enabled: true
    }
}
```

# GitLab プロジェクトの準備
GitLab CI を用いて、Node-RED フローが更新された際の IBM Cloud へのデプロイを自動化します。 
今回は、IBM Cloud CF環境 向けの Node-RED プロジェクトテンプレート を準備してますので、そちらをforkし実施します。

## GitLab プロジェクト 作成
- 以下よりプロジェクトをforkください。
https://gitlab.com/ktsz/node-red-starter-ibmcloud

- fork後、必要に応じて、リポジトリURLや名称、公開レベルを変更ください。

## GitLab CI定義
IBM Cloud CF環境へデプロイする際に必要となる IBM Cloud の組織やスペース、認証といった情報を、GitLab CI の変数として設定します。

- GitLab プロジェクト 左のメニューより、`設定 → CI/CD → Variables` を開きます。
- 以下変数を設定します。
  - BLUEMIX_ORGANIZATION : Push先の組織名
  - BLUEMIX_SPACE : Push先のスペース名
  - BLUEMIX_USER : IBM Cloud ログインユーザーID
  - BLUEMIX_PASSWORD : IBM Cloud ログインユーザーPW
  ![nodered001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142110/82909223-de35-82b0-7cc6-ca8ab1644385.png)

forkしたコードでは、リージョンはデフォルト（us-south）になってます。もし変更したい場合は、GitLab CI定義の変数にリージョンを追加するとともに、それを利用する `.gitlab-ci.yml` を修正ください。

```yml:.gitlab-ci.yml
stages:
  - test
  - deploy

test:
  image: node:10
  stage: test
  script:
   - npm install
   - npm test

staging:
  image: ruby:2.3
  type: deploy
  script:
    - gem install dpl
    - dpl --provider=bluemixcloudfoundry --username=$BLUEMIX_USER --password=$BLUEMIX_PASSWORD --organization=$BLUEMIX_ORGANIZATION --space=$BLUEMIX_SPACE --skip-ssl-validation
  only:
    - master
```
https://github.com/travis-ci/dpl#bluemix-cloud-foundry


# Node-RED プロジェクト開発の準備
GitLab の準備ができましたら、続いてローカルのNode-REDへプロジェクトをcloneし、開発の準備を行います。

## ローカルのNode-REDを起動する
https://nodered.jp/docs/getting-started/running

```
node-red
```

## プロジェクトへクローンする

- ブラウザでローカルのNode-REDへアクセスし、cloneください。標準の場合、以下URLとなります。
http://127.0.0.1:1880/

- 以下手順でcloneください。
![nodered006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142110/a61d0395-d31b-38ac-63dd-b7be2cb5a4e1.png)

- 以下デフォルトフローがあるパレットが表示されます。
![nodered007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142110/de981531-3dfb-4553-e0b6-b60bbd41a39b.png)

## 認証情報の暗号化
cloneしたプロジェクトはデフォルトだと各種ノードに設定する認証などの情報に対する暗号化が有効になっていません。まずはこれを有効にします。以下のように実施ください。

- パレット右上のメニューより、プロジェクト → 設定 → 設定 を開き、編集ボタンを押す
- 暗号化フィールドの鉛筆マークを押し、キーを入力する
- 保存する
![nodered008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142110/89f783d0-0023-817b-f895-80f9441b902b.png)

## アプリケーション名の変更
cloneしたプロジェクト内にある `manifest.yml` ファイルをテキストエディタ等で開き、IBM Cloud CF環境にデプロイする際のアプリ名や環境情報を変更します。（少なくても、name と host は変更ください。）

```yml:manifest.yml
applications:
- path: .
  memory: 256M
  instances: 1
  domain: mybluemix.net
  name: KS-NodeRED-demo-201906
  host: KS-NodeRED-demo-201906
  disk_quota: 1024M
```

# IBM Cloud CF環境へデプロイ
## Gitへ変更をCommit, Pushする
Node-REDの右のパレット？を使い、Gitへ変更をCommit, Pushします。

- コミットしたい変更対象を選択ください。（今回はすべて選択）
- コミットボタンを押し、コメントを記載の上、コミットします
- リモートへPushします。コミット履歴セクションを開き、「↑↓」ボタンを押します
- ブランチを切りたい場合は、ブランチを新規作成します。（今回は新規に ks_dev を作成）
- ブランチを選択し、アップストリームに設定、変更をプッシュします

![nodered009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142110/07587a08-36e0-5e65-1a5e-c5b65c7cdc58.png)

- 変更がPushされますと、GitLabにてCIが動きます。master以外の場合は、スクリプトチェックのみ実行されます。CI/CD パイプラインにて `成功` を確認してください。

![nodered010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142110/9832687b-1e58-5556-a458-ee8d8e854e6a.png)


## Masterへマージする
今回の `gitlab-ci.yml` では、masterに変更があった場合に IBM Cloud へ Push されるようにパイプラインをくんでいます。IBM CloudへPushするため、ブランチをmasterにマージします。

- マージリクエスト（プルリク）を作成します。Sourceを対象ブランチに、Targetをこのプロジェクトのmasterに設定します。

![nodered011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142110/44cf252a-23a4-f07a-7808-23f11d59a08f.png)

- マージします

![nodered012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142110/f182bba8-4654-37bd-7fb7-c33f08026373.png)

- GitLabにてCIが動きます。masterの場合は、スクリプトチェックとIBM CloudへのPushが走ります。CI/CD パイプラインにて `成功` を確認してください。

![nodered013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142110/7b5ac71c-4395-0405-7dde-f386966efd0d.png)


# IBM Cloud CF Runtime ユーザー定義変数の追加
IBM Cloudダッシュボードにて、GitLabにてデプロイしたアプリを開き、ランタイム変数を追加します。

- デプロイしたアプリをひらきます
- ランタイム → 環境変数 → ユーザー定義に、変数を設定します
  - NODE_RED_CREDENTIAL_SECRET : （必須）Node-RED 認証情報の暗号化にて設定したKEYを設定します
  - NODE_RED_DISABLE_EDITOR : フローエディタを使用させるかどうか設定します（true:使用しない　false:使用する　未設定:使用しない）
  - NODE_RED_USERNAME : フローエディタ利用時のログインIDを設定します
  - NODE_RED_PASSWORD : フローエディタ利用時のログインPWを設定します
  - NODE_RED_USE_APPMETRICS : アプリケーションメトリクスダッシュボードを使用するかどうか設定します（true:使用する　false:使用しない　未設定:使用しない）

![nodered014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142110/7d8eef51-26d9-484d-eba6-e125663d7330.png)
![nodered015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142110/35372355-bb45-4ed0-8cc2-47ff4ba06c33.png)

- CF環境になりますので、フローエディタでのフロー編集は許可していません。フローの編集はローカルで行い、パイプラインを使ってCFへPushしてください。
- フローエディタ表示をON（false）の場合でも、ID/PWの設定を行っていない場合は表示されません

# 稼働確認
## サンプルフロー動作確認
https://ks-nodered-demo-201906.mybluemix.net/hello/

![nodered016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142110/f63d178a-c754-a079-82d9-f361120fd05b.png)

## フローエディタ確認
https://ks-nodered-demo-201906.mybluemix.net/red/

- 使用しない（NODE_RED_DISABLE_EDITOR = true）の場合  
![nodered017.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142110/f26d2bbc-46a4-6ab2-5d8a-711b9db02307.png)

- 使用する（NODE_RED_DISABLE_EDITOR = false）の場合
![nodered019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142110/6e399dfe-807b-19d1-ed95-3fc2d0300f28.png)
![nodered018.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142110/196d0ef8-ac3a-ec79-5bb1-3684e4380269.png)



## アプリケーションメトリクスダッシュボード確認
https://ks-nodered-demo-201906.mybluemix.net/appmetrics-dash/

- 使用しない（NODE_RED_USE_APPMETRICS = false）の場合
![nodered020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142110/0368ab5d-1c9f-ac46-73f2-6cbd42212180.png)

- 使用する（NODE_RED_USE_APPMETRICS = true）の場合
![nodered021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142110/44292e79-862d-5276-a983-7d667a19c2fe.png)

# まとめ
いかがでしたでしょうか。これで IBM Cloud CF環境でも、フローのバージョン管理、自動デプロイが行われるようになりますので、お仕事等でNode-REDを用いる際も安心して進められるのでは、と思います！