ビルトインの Static Analysis Prioritization サンプルは、DTP REST API を使って DTP から静的解析違反を取得するフローを作成する方法と、静的解析違反のメタデータを一括で更新する方法を説明します。このフローは、フローとノードの機能を学習する上でのポイントごとにいくつかのサンプルに分かれています。このチュートリアルでは、Static Analysis Prioritization サンプル フローをセットアップする方法と、フロー中の個々のプロセスが特定の機能を実行する方法について説明します。
この例では、次の DTP REST API を使用します。
- GET /v1.2/staticAnalysisViolations
- POST /v1.4/staticAnalysisViolations/metadata
- GET /v1.4/metadata/priority
目次:
要件
- DTP および Extension Designer を正しく設定していること。「サーバーの設定」を参照してください。
- DTP が Parasoft 静的解析/テスト ツール (C/C++test、dotTEST、 Jtest) から静的解析データを収集済みであること。
サンプルのセットアップ
- 静的解析の実行のビルド ID を取得します。ビルド ID は、ダッシュボードも含め、DTP のいくつかのインターフェイスから取得できます。
- Extension Designer で、既存のサービスをクリックするか、新規にサービスを作成します (「サービスの使用」を参照)。
- 新しいフローを作成し (「フローの使用」を参照)、Extension Designer のメニューから [読み込み] を選択します。
- [Library] タブをクリックし、[Examples] > [Static Analysis Prioritization] を選択します。
- [読み込み] をクリックし、フローをタブにドロップします。
- [デプロイ] をクリックし、 Set flow.buildID ノードをダブルクリックします。
- [to] フィールドにビルド ID の値を入力して [Done] をクリックします。
- 更新したフローをデプロイしてサンプルの準備を完了します。
ノードの動作について詳しく知りたい場合は、ノードをクリックすると [処理ノードの仕様] タブにその説明が表示されます。
このタブが表示されていない場合は、三点メニューから [表示] を選択し、[サイドバーを表示] オプションを有効化します。
例 1 - 担当者の設定
例 1 のノードは、取得したすべての違反を新しいユーザーに割り当てる方法について説明します。
DTP から静的解析違反を取り出す
このフローは、DTP の /staticAnalysisViolation REST API によって静的解析データを取得します。詳細については「DTP API の使用」を参照してください。
Get violations for Build ノードをダブルクリックします。このノードは DTP REST API ノードであり、DTP REST API にリクエストを送るための特別な種類のノードです (利用できるノードの一覧については「ノードの使用」を参照)。このノードのエンドポイントは、/v1.2/staticAnalysisViolations?buildId={{payload}}
を指します。このノードは、フローを設定 したときに指定したビルド IDに基づいてデータを取得します。また、msg.staticAnalysis
に静的解析違反ペイロードを返します。
DTP のデータを処理して新しい担当者を設定する
Set the assigneeName function ノードをダブルクリックします。このノードに含まれる JavaScript は、違反を処理し、次の REST API 呼び出しからの新しいペイロードの準備を行います。
Extension Designer の機能は lodash JavaScript ユーティリティ ライブラリを使用します。コードの先頭部分は、変数として lodash を初期化し、違反データの配列をソートして分割できるようにします。
var _ = context.global.lodash; // note: splitting violations by 100. Sending large data at once to DTP REST API node will trigger // an error and unable to perform correctly. var violationsArrayby100 = _.chunk(msg.staticAnalysis.violations, 100); var prioritize = []; _.forEach(violationsArrayby100, function(violations) { prioritize.push({ metadata: { ids: _.map(violations, 'id'), applyToAllBranches: true, changes: { assignee: 'johndoe' }, } }); }); // returning prioritization violation 100 a time by putting into array of arry object. //[[msg, msg, msg]] return [prioritize];
5 行目は、staticAnalysisViolations
配列をそれぞれ 100 件の違反を持つ複数の配列に分割します。この分割によって、DTP REST API にデータを送り返すときにペイロードの量が安全なサイズまで削減されます。膨大なペイロードを 1 回の呼び出しで処理すると、Extension Designer が予想外のエラーを起こすことがあります (「ノードの使用」を参照)。
7 行目から 16 行目は、次の Prioritization API の呼び出しに備えて新しい msg 配列を作成します。この API は JSON オブジェクトを期待します。各サンプルは Violations メタデータのフィールドを異なる方法で設定します。許容されるペイロードの詳細については API のドキュメントを参照してください。
この例では、"担当者" は johndoe に設定されます。このフローを処理すると、API で呼び出されるすべての違反が johndoe に割り当てられます。必要に応じて、独自のロジックを追加して別の担当者を追加できます。
このフローは、データに関連するプロジェクトのメンバーである既存の DTP ユーザーにだけ違反を割り当てることができます。詳細については「User Administration」を参照してください。
20 行目で、フローは 1 個の要素の 2 次元配列を送ります。特定の順序で複数のメッセージを送ることもできます。この function ノードは、メッセージ オブジェクトの配列を出力に送ることで、1 つの出力だけを期待します。このフローは一度に 1 個の msg オブジェクトを次のフローに送ります。この処理は配列をループして各メッセージを非同期的に返すことに似ています (詳細については https://nodered.org/docs/writing-functions#multiple-messages を参照してください)。
ペイロードが Prioritization API のために準備されます。次の DTP REST API ノードがトランザクションを完了します。
Prioritization API は、パブリッシュされず、ドキュメント化されず、サポートされない API です。しかし、この API を使用すると、優先順位付けしたペイロードで POST を実行し、ペイロードに渡されたすべての違反 ID に変更を適用できます。
Inject Build ノードをクリックしてフローを実行し、[debug] タブで出力を確認します。
違反の数に基づいて、Prioritization REST API の複数のトランザクションが表示されるでしょう。
ウィジェットをクリックすると、違反エクスプローラーが表示されます。ウィジェットは、set flow.buildID ノードで指定されたビルド ID を表示するように構成する必要があります。違反の [担当者] フィールドは johndoe
に設定されます。
例 2 - 優先度の設定
このサンプルのすべてのロジック フローは、Prioritization ペイロードの準備という点でのみ異なります。
Find and set the priorityId function ノードをダブルクリックします。
10 行目から 18 行目に、優先度を設定する JavaScript があります。この例では、渡されるすべての違反に対して priority
として Critical
を設定します。
例 3 - アクションの設定
Set the violationAction function ノードをダブルクリックします。
11 行目から 15 行目は、違反に対するアクションを定義する JavaScript です。この例では、violationAction
が Fix
に設定されます。
アクションは DTP で定義します。/v1.4/metadata/violationAction API を検索して、violationAction フィールドで利用できる値を確認できます。レスポンスで指定された、利用できる任意の値を使用できます。
このメタデータはカスタマイズできます。また、DTP Server ごとにアクションが異なる場合もあります。詳細については /metadata/violationAction API ドキュメントを参照してください。
例 4 - リスク/影響の設定
この例は「例 2 - 優先度の設定」と「例 3 - アクションの設定」に似ています。この例では、すべての違反が "Extreme" に分類されます。Find and set the classificationId function ノードをクリックて JavaScript を確認してください。
例 5 - 期限の設定
Set the dueDate function ノードをダブルクリックして JavaScript を確認します。2 行目で Moment JavaScript ライブラリが初期化されます。この例では、Moment ライブラリを利用して文字列から日付と時刻を取得します。また、明日の日付を計算してこの日付を文字列として dueDate
フィールドに設定します。
例 6 - 参照番号の設定
Set the referenceNumber function ノードをダブルクリックして JavaScript を確認します。この例では、違反メタデータで referenceNumber
を設定します。
参照番号は、後で使用するために、ID や外部システム (JIRA や Bugzilla) で使用できます。
例 7 - コメントの追加
Set the comment function ノードをダブルクリックして JavaScript を確認します。この例では違反にコメントを追加します。
コメントが fields
オブジェクトの一部ではないことが分かります。コメントは、prioritize
オブジェクトに関連付けられた追加プロパティです。
例 8 - 重要度による優先順位付け
例 8 は高度な例です。重要度に基づいて静的解析違反をグループ化し、違反を処理する方法について説明します。
Group violations and set relevant priorityId function ノードをクリックて JavaScript を確認してください。msg 配列から配列を返すのではなく、node.send()
メソッドを使って次のノードに非同期的に msg オブジェクトをプッシュします (メッセージを非同期に送る方法の詳細については https://nodered.org/docs/writing-functions#sending-messages-asynchronously を参照してください)。
/v1.4/metadata DTP REST API を検索して、DTP で利用できるメタデータの値を確認できます。