目次


Bluemix 上で実行される Node.js アプリの法的レポートの収集を自動化する

Comments

新しいソフトウェア・バージョンをリリースする前に、開発者やリリース・マネージャーは、そのソフトウェアに含まれるすべてのライブラリー (依存関係) のライセンスを調べ、それぞれのライブラリーを営利目的で使用できることを確認しなければなりません。Node.js アプリケーションを作成する場合、使用する数多くの外部ライブラリーのライセンス条項がそれぞれに異なる可能性がありますが、それらのすべてに関する情報を収集するのは、時間のかかる厄介な作業になりかねません。この記事では、こうした作業の一部を自動化して、プロジェクトで使用しているすべての依存関係のリストを生成する方法を説明します。このリストには、各依存関係に適用されるライセンスと、それらの依存関係ライブラリーを入手できる Web サイトまたはリポジトリーの情報が記載されます。

必要になるもの

  • Node.js アプリケーション
  • npm (node package manager) の最新バージョン (Node.js は npm がインストールされた状態で提供されますが、npm が更新される頻度は Node.js よりも多いので、使用している npm のバージョンが最新のものであることを確認してください)。
  • IBM Bluemix DevOps Services パイプライン
  • Grunt (JavaScript で作成されたタスク・ランナー) バージョン 0.4.5 またはそれ以降のバージョン

注: この記事では例として IBM Bluemix DevOps Services を取り上げていますが、同じ Grunt タスクを Jenkins ジョブに統合するのは簡単です。また、作成済みのコードを Grunt ではなく、Gulp またはその他のタスク自動化フレームワーク内で実行されるように適応させることもできます。

ステップ 1. Grunt をセットアップする

Grunt をセットアップ済みの場合は、次のステップまでスキップして構いません。プロジェクトにまだ Grunt が含まれていない場合は、以下の手順に従って Grunt をセットアップしてください。この手順には、Grunt のコマンド・ライン・インターフェース (CLI) と Grunt の node モジュールが必要になります。

  1. Grunt の CLI をインストールするために、プロジェクトのルート・フォルダーから以下のコマンドを実行します。sudo を使用するか (OSX、Linux、BSD などの場合)、管理者としてコマンドを実行する必要があるかもしれません (Windows の場合)。

    以下のコマンドを実行して、システム・パスに grunt コマンドを含めて任意のディレクトリーから実行できるようにします。

    npm install -g grunt-cli
  2. Grunt の CLI をインストールしても、Grunt のタスク・ランナーはプロジェクトにインストールされません。Grunt のタスク・ランナーをプロジェクトに追加するには、以下のコマンドを実行します。このコマンドによって、Grunt が開発用依存関係として package.json という依存関係ファイルに追加されます。
    npm install grunt --save-dev
  3. Gruntfile.js ファイルを作成します。このファイルは、有効な JavaScript ファイルとして、package.json ファイルと一緒にプロジェクトのルート・ディレクトリーに配置して、プロジェクトのソースと一緒にコミットされるようにしなければなりません。

    以下に、Gruntfile.js ファイルの例を示します。

    module.exports = function(grunt) {
    
      grunt.initConfig({
        pkg: grunt.file.readJSON('package.json')
      });
    
      grunt.registerTask('default');
    
    };

ステップ 2. ライセンス確認タスク用のスクリプトを作成する

Grunt をプロジェクトにセットアップした後は、新規の Grunt タスク・ファイルを作成し、そのファイルに Grunt によって実行されるカスタム・コードを含めます。

  1. プロジェクトのルート・ディレクトリーに、build_tasks という名前のフォルダーを作成し、このフォルダー内に licenses.js という名前のファイルを作成します。
  2. 新規に作成したファイルに、カスタム Grunt タスクを含めます。差し当たり、以下の licenses.js ファイルを使用することができます。
    module.exports = function (grunt) {
    
    	'use strict';
    
        grunt.registerTask('example', 'Example task', function () {
    
        });
    
    };
  3. 上記のコードが登録している単純なタスクは、Gruntfile.js から呼び出すことができます。タスクを呼び出せるようにするには、Gruntfile.js に変更を加えて、前のステップで作成した build_tasks フォルダー内のタスクをロードさせなければなりません。
    npm install grunt --save-dev
    module.exports = function(grunt) {
    
      grunt.initConfig({
        pkg: grunt.file.readJSON('package.json')
      });
    
      grunt.task.loadTasks('build_tasks');
    
      grunt.registerTask('default', ['example']);
    
    };
  4. 正常に動作するかどうかをテストするために、プロジェクトのルート・ディレクトリーから、コマンド・ラインで grunt を実行します。

    以下の出力が表示されたら、正常に動作していることになります。

    Running "example" task
    
    Done, without errors.

ステップ 3. サーバー・サイドの依存関係を収集する (npm モジュール)

  1. grunt-license-finder という node モジュールをプロジェクトに追加します。それには、プロジェクトのルート・ディレクトリーから以下のコマンドを実行します。
    npm install grunt-license-finder –-save-dev
  2. インストールされたプラグインは、Gruntfile.js ファイル内で下記行の JavaScript によって使用可能になります。
    grunt.loadNpmTasks(‘grunt-license-finder');
  3. プロジェクトの Gruntfile.js ファイルで、grunt.initConfig() に渡されるデータ・オブジェクトに、license_finder というセクションを追加します。
    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        license_finder: {
          
        }
      });

    この新しいセクションが、レポートを生成するために使用するオプションを指定する場所となります。サーバー・サイドの依存関係については、2 種類のレポートを作成することができます。1 つは本番用依存関係に関するレポート、もう 1 つは開発用依存関係に関するレポートです。

    本番用依存関係は、サーバーが稼働している間、アプリケーションによってデプロイされて使用されます。開発用依存関係は、開発および自動化の際にだけ使用されるライブラリーです。前にプロジェクトに追加した gruntgrunt-license-finder は、開発用依存関係に該当します。

    依存関係を package.json ファイルに追加する際は、開発用依存関係または本番用依存関係のいずれかに対して追加することができます。

  4. license_finder タスクのターゲットを 2 つ (依存関係のタイプごとに 1 つ) 追加します。これにより、2 つの別個のファイルが生成されるので、本番用依存関係と開発用依存関係を簡単に見分けられるようになります。そのために、2 つのターゲットを license_finder セクションに追加します。
        grunt.initConfig({
            pkg: grunt.file.readJSON('package.json'),
            license_finder: {
                dev: {
                    options: {
                        production: false,
                        out: 'npm-dev-licenses.csv',
                        csv: true
                    }
                },
                prod: {
                    options: {
                        production: true,
                        out: 'npm-prod-licenses.csv',
                        csv: true
                    }
                }
            }
        });

    オプションは、要求される構成に合わせて変更することができます。production オプションは、本番用依存関係と開発用依存関係のどちらのレポートを生成するのかを指定します。out オプションはレポートの出力ファイルを定義し、csv オプションはレポートの csv ファイルを生成することを指定します。

  5. license_finder から 2 つのタスクを呼び出すターゲット・タスクも作成する必要があります。呼び出すタスクは、本番レポートを対象としたタスクと、開発レポートを対象としたタスクの 2 つです。以下の行を Gruntfile.js ファイルに追加します。
    grunt.registerTask('server-side-license', ['license_finder:dev', 'license_finder:prod']);
  6. サーバー・サイドの依存関係を変更したら、Gruntfile.js ファイルを閉じます。
    module.exports = function (grunt) {
    
        grunt.initConfig({
            pkg: grunt.file.readJSON('package.json'),
            license_finder: {
                dev: {
                    options: {
                        production: false,
                        out: 'npm-dev-licenses.csv',
                        csv: true
                    }
                },
                prod: {
                    options: {
                        production: true,
                        out: 'npm-prod-licenses.csv',
                        csv: true
                    }
                }
            }
        });
    
        grunt.task.loadTasks('build_tasks');
        grunt.loadNpmTasks('grunt-license-finder');
    
        grunt.registerTask('server-side-license', ['license_finder:dev', 'license_finder:prod']);
    
    };
  7. これで、server-side-license タスクを Grunt コマンド・ラインから実行できるようになります。
    grunt server-side-license

    タスクを実行すると、以下の出力が生成されるはずです。

    Running "license_finder:dev" (license_finder) task
    Retrieved license information
    License information written to: npm-dev-licenses.csv
    Running "license_finder:prod" (license_finder) task
    Retrieved license information
    License information written to: npm-prod-licenses.csv
    
    Done, without errors.

ステップ 4. クライアント・サイドの依存関係を収集する (Bower コンポーネント)

Bower は、クライアント・サイドの依存関係を容易に管理できるようにするツールです。Bower 構成ファイルを作成することで、使用する必要がある各プロジェクトのサイトにアクセスして必要なライブラリー・ファイルをダウンロードしなくても、このプロセスを自動化することができます。

Bower が環境に含まれていない場合、このチュートリアルで説明されている手順に従ってセットアップしてください。

Bower をインストールしてプロジェクト用に構成した後は、クライアント・サイドのすべての依存関係が bower.json という名前のファイルに保管されることになります。正確なレポートが生成されるように、プロジェクトで使用するクライアント・サイドの依存関係がすべて Bower を介して追加されていて、ページに直接追加されていないことを確認してください。

  1. Bower 依存関係を収集するために、bower-license という node モジュールをプロジェクトに追加します。それには、プロジェクトのルート・ディレクトリーから以下のコマンドを実行します。
    npm install bower-license --save-dev
  2. インストールされたプラグインは、license.js ファイル内で下記 JavaScript コード行によって使用可能になります。
    var license = require('bower-license');
  3. このモジュールを読み込んだ後、bower-license を使用するカスタム・タスクのコーディングを開始します。まず、run_bower_license というタスクを作成します。このタスクですべての依存関係を収集し、その結果をファイルに出力します。そのために、以下のコードを licenses.js ファイルに追加します。
    var license = require('bower-license'),
    fs = require('fs');
    
    module.exports = function (grunt) {
    
        'use strict';
    
        grunt.registerMultiTask('run_bower_license', 'Gather bower license report', function () {
            var options = this.options({
                    directory: 'bower_components',
                    output: 'bower-license.csv'
                }),
                entry, item, prop, done, dependency;
    
            done = this.async();
    
            console.log('Executing run_bower_license task');
    
            // If output file already exists, will delete it
            if(grunt.file.exists(options.output)) {
                console.log('Output file already exists. Will delete it');
                grunt.file.delete(options.output);
            }
    
            license.init(options, function (data) {
                for (entry in data) {
                    item = {
                        licenses: "",
                        repository: "",
                        homepage: ""
                    };
    
                    for (prop in data[entry]) {
                        if (prop === 'licenses') {
                            item.licenses = data[entry][prop];
                        } else if (prop === 'repository') {
                            item.repository = data[entry][prop];
                            if (item.repository.constructor === Object) {
                                item.repository = item.repository.url;
                            }
                        } else if (prop === 'homepage') {
                            item.homepage = data[entry][prop];
                        }
                    }
    
                    item.version = entry.substring(entry.indexOf('@') + 1, entry.length);
                    item.name = entry.substring(0, entry.indexOf('@'));
    
                    dependency = item.name + ',' + item.version + ',' + item.repository + ',' + item.licenses;
    
                    if(item.homepage) {
                        dependency += ',' + item.homepage;
                    }
    
                    fs.appendFileSync(options.output, dependency + '\r\n');
                }
    
                console.log('End of run_bower_license task');
                done();
    
            });
    
        });
    
    };

    上記のコードが登録する run_bower_license という Grunt タスクは、2 つのパラメーターを取ります。1 つは Bower コンポーネントが格納されているディレクトリーを指定するパラメーター、もう 1 つは、生成される出力ファイルの名前を指定するパラメーターです。この出力ファイルが指定のディレクトリーに存在する場合、このタスクはその出力ファイルを削除してから bower-license ライブラリーを呼び出します。このライブラリーが、Bower からクライアント・サイドのすべての依存関係を読み取ります。

    依存関係が返されると、run_bower_license はそのそれぞれについて、ライブラリーの名前、バージョン、git リポジトリーの URL、ライセンス、ホーム・ページの取得を試みます。ライブラリーによっては、このすべての情報を取得できるとは限りませんが、取得した情報はすべて出力ファイルに書き込まれます。

  4. Gruntfile.js ファイル内で、run_bower_license タスクを呼び出す新しいターゲット・タスクを登録します。登録するタスクには、client-side-license という名前を付けます。
    grunt.registerTask('client-side-license', ['run_bower_license:all']);
  5. Grunt コマンド・ラインから、client-side-license タスクを実行します。
    grunt client-side-license

    このタスクによる出力は、以下のようになります。

    Running "run_bower_license:all" (run_bower_license) task
    Executing run_bower_license task
    Output file already exists. Will delete it
    End of run_bower_license task
    
    Done, without errors.
  6. クライアント・サイドのバージョンとサーバー・サイドのバージョンの両方を呼び出すタスクを作成し、get-licenses という名前を付けます。
    grunt.registerTask('client-side-license', ['run_bower_license:all']);
  7. 以上の変更をすべて加えた後の Gruntfile.js ファイルは、以下のような内容になっているはずです。
    module.exports = function (grunt) {
    
        grunt.initConfig({
            pkg: grunt.file.readJSON('package.json'),
            license_finder: {
                dev: {
                    options: {
                        production: false,
                        out: 'npm-dev-licenses.csv',
                        csv: true
                    }
                },
                prod: {
                    options: {
                        production: true,
                        out: 'npm-prod-licenses.csv',
                        csv: true
                    }
                }
            },
            run_bower_license: {
                all: {
                  options: {
                        directory: 'bower_components',
                        output: 'bower-license.csv'
                  }
                }
            }
        });
    
        grunt.task.loadTasks('build_tasks');
        grunt.loadNpmTasks('grunt-license-finder');
    
        grunt.registerTask('server-side-license', ['license_finder:dev', 'license_finder:prod']);
        grunt.registerTask('client-side-license', ['run_bower_license:all']);
        grunt.registerTask('get-licenses', ['server-side-license', 'client-side-license']);
    
    };
  8. Grunt コマンド・ラインから get-licenses タスクを実行し、クライアント・サイドとサーバー・サイド両方のレポートを生成します。
    grunt get-licenses

    以下のような出力が生成されるはずです。

    Running "license_finder:dev" (license_finder) task
    Retrieved license information
    License information written to: npm-dev-licenses.csv
    
    Running "license_finder:prod" (license_finder) task
    Retrieved license information
    License information written to: npm-prod-licenses.csv
    
    Running "run_bower_license:all" (run_bower_license) task
    Executing run_bower_license task
    Output file already exists. Will delete it
    End of run_bower_license task
    
    Done, without errors.

ステップ 5. ライセンス確認スクリプトを Bluemix パイプラインに組み込む

このセクションでは、IBM Bluemix DevOps Services 上で、ライセンス確認タスクの実行を自動化する方法を説明します。

プロジェクトの「BUILD & DEPLOY (ビルドおよびデプロイ)」ビューを表示すると、そのプロジェクトのパイプラインが表示されます。このパイプライン機能をプロジェクトで有効にすると、2 つのステージで構成されたパイプラインが作成されます。一方のステージではビルドが実行され、もう一方のステージではアプリケーションが Bluemix にデプロイされます。

IBM Bluemix DevOps Services のパイプラインを構成する 2 つのステージ: 「Bluid Stage (ビルド・ステージ)」と「Deploy Stage (デプロイ・ステージ)」のスクリーンショット
IBM Bluemix DevOps Services のパイプラインを構成する 2 つのステージ: 「Bluid Stage (ビルド・ステージ)」と「Deploy Stage (デプロイ・ステージ)」のスクリーンショット
  1. 新しいステージを作成するために、「ADD STAGE (ステージの追加)」をクリックします。「Add Stage (ステージの追加)」ボタンのスクリーンショット
    「Add Stage (ステージの追加)」ボタンのスクリーンショット
  2. ステージに「Generate Licenses (ライセンス情報生成)」という名前を付けて、このステージへの入力を構成します。「Generate Licenses (ライセンス情報生成)」パネルの「Input (入力)]」タブで、「Input Settings (入力設定)」セクションを以下のように構成した後、「SAVE (保存)」をクリックします。
    • Input Type (入力タイプ): Build Artifacts (ビルド成果物)
    • Stage (ステージ): Build Stage (ビルド・ステージ)
    • Job (ジョブ): Build (ビルド)
    • Stage Trigger (ステージ・トリガー): Run jobs when the previous stage is completed (前のステージが完了したらジョブを実行)

    この構成は、ビルド・ステージが完了した後、ライセンス確認タスクを実行できるように、すべてのビルド成果物がコピーされることを意味します。

    新しいパイプライン・ステージの作成画面 (ステップ 1) のスクリーンショット
    新しいパイプライン・ステージの作成画面 (ステップ 1) のスクリーンショット
  3. 「Job (ジョブ)」タブで、新しいジョブを追加するために「ADD JOB (ジョブの追加)」をクリックします。「Add Job (ジョブの追加)」ボタンのスクリーンショット
    「Add Job (ジョブの追加)」ボタンのスクリーンショット
  4. 「SELECT JOB TYPE (ジョブ・タイプの選択)」ドロップダウン・リストから、「Build (ビルド)」を選択します。 「ADD JOB (ジョブの追加)」に続いてジョブ・タイプを選択する画面のスクリーンショット
    「ADD JOB (ジョブの追加)」に続いてジョブ・タイプを選択する画面のスクリーンショット
  5. 「Execute License tasks (ライセンス確認タスクの実行)」パネルで、「Builder Type (ビルダー・タイプ)」として「Grunt」を選択し、「Build Shell Command (シェル・コマンドのビルド)」に以下のコードを入力します。
    #!/bin/bash
    npm install
    node_modules/bower/bin/bower install
    grunt get-licenses
    新しいパイプライン・ステージの作成画面 (ステップ 2) のスクリーンショット
    新しいパイプライン・ステージの作成画面 (ステップ 2) のスクリーンショット
  6. 「SAVE (保存)」をクリックしてステージの構成を保存します。以下の図に示すように、パイプラインを構成するステージは、「Build Stage (ビルド・ステージ)」、「Deploy Stage (デプロイ・ステージ)」、「Generate Licenses (ライセンス情報生成)」の 3 つになっています。 3 つのステージで構成されたプロジェクトのパイプラインのスクリーンショット
    3 つのステージで構成されたプロジェクトのパイプラインのスクリーンショット
  7. パイプラインの最初のステージを再び実行するために、以下に示す「Run Stage (ステージの実行)」矢印をクリックします。すると、再びすべてのステージが順番に実行されます。 「Build Stage (ビルド・ステージ)」ボタンのスクリーンショット
    「Build Stage (ビルド・ステージ)」ボタンのスクリーンショット
  8. 「Generate Licenses (ライセンス情報生成)」ステージが正常に実行された後、「Last Execution Results (最終実行の結果)」をクリックすると、そのステージの実行に関するログが表示されます。ここに、生成された成果物も示されます。「Last Execution Results (最終実行の結果)」ボタンのスクリーンショット
    「Last Execution Results (最終実行の結果)」ボタンのスクリーンショット
    ライセンス確認タスクの実行に関する詳細のスクリーンショット
    ライセンス確認タスクの実行に関する詳細のスクリーンショット
  9. 「ARTIFACTS (成果物)」タブをクリックして、このタスクのすべてのファイルを表示します。ここには、サーバー・サイドとクライアント・サイドの依存関係に関するレポート (bower-license.csvnpm-dev-licenses.csvnpm-prod-licenses.csv) が含まれています。パイプライン・ステージで生成された成果物のスクリーンショット
    パイプライン・ステージで生成された成果物のスクリーンショット
  10. ファイルの横にある「Download (ダウンロード)」をクリックして、目的のファイルをダウンロードします。成果物のダウンロード・リンクのスクリーンショット
    成果物のダウンロード・リンクのスクリーンショット
  11. 以下に、生成されるレポートの例を記載します。
    1. bower-license.csv (クライアント・サイドの依存関係) の例:
      angular-bootstrap,0.13.0,,MIT
      d3,undefined,,MIT*
      jquery,2.1.4,,MIT
      angular,1.4.1,git+https://github.com/angular/angular.js,MIT
      angular-animate,1.3.16,git+https://github.com/angular/angular.js,MIT
      angular-resource,1.3.16,git+https://github.com/angular/angular.js,MIT
      angular-route,1.3.16,git+https://github.com/angular/angular.js,MIT
      angular-sanitize,1.4.1,git+https://github.com/angular/angular.js,MIT
      bootstrap,3.1.1,git+https://github.com/twbs/bootstrap,MIT
      jquery-ui,1.11.4,https://github.com/jquery/jquery-ui,MIT
      angular-ui-bootstrap,0.13.0,git+https://github.com/angular-ui/bootstrap,MIT,https://github.com/angular-ui/bootstrap
      Flot,0.8.3,,UNKNOWN
    2. npm-prod-license.csv (サーバー・サイドの依存関係) の例:
      name,version,directory,repository,summary,from package.json,from license,from readme
      NodejsStarterApp,0.0.1,/home/fmariani/bluemix/MyTestLicensesApp,(none),MIT,,MIT,MIT
      accepts,1.2.12,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/accepts,git+https://github.com/jshttp/accepts,MIT,MIT,MIT,
      argparse,1.0.2,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/cfenv/node_modules/js-yaml/node_modules/argparse,http://github.com/nodeca/argparse,MIT,MIT,MIT,MIT
      cfenv,1.0.0,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/cfenv,git+https://github.com/cloudfoundry-community/node-cfenv,Apache;Apache-2.0,Apache-2.0,Apache,
      content-disposition,0.5.0,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/content-disposition,git+https://github.com/jshttp/content-disposition,MIT,MIT,MIT,
      content-type,1.0.1,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/content-type,git+https://github.com/jshttp/content-type,MIT,MIT,MIT,
      cookie,0.1.2,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/cookie,http://github.com/shtylman/node-cookie,MIT,,MIT,
      cookie-signature,1.0.6,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/cookie-signature,git+https://github.com/visionmedia/node-cookie-signature,MIT,MIT,,MIT
      crc,3.2.1,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/etag/node_modules/crc,http://github.com/alexgorbatchev/node-crc,MIT,MIT,MIT,MIT
      debug,2.2.0,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/debug,http://github.com/visionmedia/debug,MIT,MIT,,MIT
      depd,1.0.1,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/depd,git+https://github.com/dougwilson/nodejs-depd,MIT,MIT,MIT,
      destroy,1.0.3,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/send/node_modules/destroy,git+https://github.com/stream-utils/destroy,MIT,MIT,,
      ee-first,1.1.0,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/on-finished/node_modules/ee-first,git+https://github.com/jonathanong/ee-first,MIT,MIT,MIT,
      escape-html,1.0.1,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/escape-html,git+https://github.com/component/escape-html,Unknown,,,
      esprima,2.0.0,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/cfenv/node_modules/js-yaml/node_modules/esprima,git+https://github.com/jquery/esprima,BSD,BSD,,BSD
      etag,1.6.0,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/etag,git+https://github.com/jshttp/etag,MIT,MIT,MIT,
      express,4.12.4,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express,git+https://github.com/strongloop/express,MIT,MIT,MIT,
      finalhandler,0.3.6,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/finalhandler,git+https://github.com/pillarjs/finalhandler,MIT,MIT,MIT,
      forwarded,0.1.0,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/proxy-addr/node_modules/forwarded,git+https://github.com/jshttp/forwarded,MIT,MIT,MIT,
      fresh,0.2.4,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/fresh,git+https://github.com/jshttp/fresh,MIT,MIT,MIT,
      ipaddr.js,1.0.1,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js,http://github.com/whitequark/ipaddr.js,MIT,MIT,,
      js-yaml,3.2.7,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/cfenv/node_modules/js-yaml,http://github.com/nodeca/js-yaml,MIT,MIT,MIT,
      lodash,3.10.1,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/cfenv/node_modules/js-yaml/node_modules/argparse/node_modules/lodash,git+https://github.com/lodash/lodash,MIT,MIT,,
      media-typer,0.3.0,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/type-is/node_modules/media-typer,git+https://github.com/jshttp/media-typer,MIT,MIT,MIT,
      merge-descriptors,1.0.0,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/merge-descriptors,git+https://github.com/component/merge-descriptors,MIT,MIT,MIT,
      methods,1.1.1,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/methods,git+https://github.com/jshttp/methods,MIT,MIT,MIT,
      mime,1.3.4,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/send/node_modules/mime,git+https://github.com/broofa/node-mime,MIT,MIT,,
      mime-db,1.17.0,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db,git+https://github.com/jshttp/mime-db,MIT,MIT,MIT,
      mime-types,2.1.5,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/accepts/node_modules/mime-types,git+https://github.com/jshttp/mime-types,MIT,MIT,MIT,
      ms,0.7.1,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/debug/node_modules/ms,http://github.com/guille/ms.js,MIT,,MIT,MIT
      negotiator,0.5.3,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/accepts/node_modules/negotiator,git+https://github.com/jshttp/negotiator,MIT,MIT,MIT,
      on-finished,2.2.1,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/on-finished,git+https://github.com/jshttp/on-finished,MIT,MIT,MIT,
      parseurl,1.3.0,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/parseurl,git+https://github.com/expressjs/parseurl,MIT,MIT,MIT,
      path-to-regexp,0.1.3,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/path-to-regexp,git+https://github.com/component/path-to-regexp,Unknown,,,
      ports,1.1.0,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/cfenv/node_modules/ports,git+https://github.com/hoodiehq/node-ports,Apache 2.0,Apache 2.0,,
      proxy-addr,1.0.8,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/proxy-addr,git+https://github.com/jshttp/proxy-addr,MIT,MIT,MIT,
      qs,2.4.2,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/qs,git+https://github.com/hapijs/qs,BSD,BSD,,
      range-parser,1.0.2,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/range-parser,git+https://github.com/jshttp/range-parser,MIT,MIT,MIT,
      send,0.12.3,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/send,git+https://github.com/pillarjs/send,MIT,MIT,MIT,
      serve-static,1.9.3,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/serve-static,git+https://github.com/expressjs/serve-static,MIT,MIT,MIT,
      sprintf-js,1.0.3,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/cfenv/node_modules/js-yaml/node_modules/argparse/node_modules/sprintf-js,git+https://github.com/alexei/sprintf.js,BSD;BSD-3-Clause,BSD-3-Clause,,BSD
      type-is,1.6.7,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/type-is,git+https://github.com/jshttp/type-is,MIT,MIT,MIT,
      underscore,1.7.0,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/cfenv/node_modules/underscore,http://github.com/jashkenas/underscore,MIT,MIT,,
      utils-merge,1.0.0,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/utils-merge,http://github.com/jaredhanson/utils-merge,MIT,MIT,MIT,MIT
      vary,1.0.1,/home/fmariani/bluemix/MyTestLicensesApp/node_modules/express/node_modules/vary,git+https://github.com/jshttp/vary,MIT,MIT,MIT 
      
      name,version,directory,repository,summary,from package.json,from license,from readme

まとめ

この記事では、新しいソフトウェアをリリースする前に、プロジェクトのすべての依存関係に関する必要な情報を取得するプロセスを自動化する方法を紹介しました。この例では、IBM Bluemix DevOps Services のプロジェクト・パイプラインで自動化に対処しているため、新しいコミットによってコードの変更がサーバーにプッシュされると、パイプライン全体が再び実行されて、すべてのラインセンス・レポートが更新されます。この自動化プロセスによって、アプリケーションの法的情報を収集するという厄介な作業にかかる時間が節約され、作業の大変さが軽減されることを願っています。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Web development, Cloud computing
ArticleID=1027422
ArticleTitle=Bluemix 上で実行される Node.js アプリの法的レポートの収集を自動化する
publish-date=02252016