メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

Jenkins を使用した Polyspace 解析のサンプル スクリプト

継続的インテグレーション プロセスでは、開発者はコードを共有リポジトリに送信します。Jenkins® などのツールを使用する自動ビルド システムでは、定期的にまたは事前定義トリガーに基づいて送信されたコードのビルドとテストが行われ、コードが統合されます。このプロセスの一環として Polyspace® 解析を実行できます。

A flow diagram of a typical continuous integration workflow. Developers submit code to a shared repository. Polyspace Server products can run on the newly submitted code and upload the results to a Polyspace Access web server. Multiple reviewers can fetch the results from the server and review the results on a web browser.

このトピックでは、Polyspace Bug Finder™ Server™ を使用して Polyspace 解析を実行し、PolyspaceAccess™ Web インターフェイスでレビューのために結果をアップロードするサンプル Shell スクリプトについて説明します。またこのスクリプトでは、レビュー担当者に電子メール通知が送信されます。通知を受信したレビュー担当者は、Polyspace Access Web インターフェイスにログインし (Polyspace Access ライセンスを所有している場合)、結果をレビューします。

開発プロセスへのサンプル スクリプトの拡張

スクリプトは、特定の開発ツールチェーンを対象として作成されていますが、プロジェクト、チーム、または組織で使用されているプロセスに容易に拡張できます。また、スクリプトは Jenkins フリースタイル プロジェクトで実行されることを意図して作成されています。Jenkins Pipeline を使用する場合は、Polyspace 解析用のサンプル Jenkins Pipeline スクリプトを参照してください。

特に、スクリプトは次のような特性を持つことに注意してください。

  • Linux® でのみ実行される。

    スクリプトは、export などいくつかの Linux 固有のコマンドを使用します。ただし、これらのコマンドは Polyspace ワークフローに必須というわけではありません。Windows® スクリプト (.bat ファイル) を作成する場合は、代わりに同等の Windows コマンドを使用します。

  • Polyspace プラグインをインストールしている場合にのみ、Jenkins と動作する。

    スクリプトは、次の 2 通りの方法で Jenkins プラグインに対応するように作成されています。

    • スクリプトは、補助関数 $ps_helper および $ps_helper_access を使用することでスクリプトを簡潔にしています。これらの補助関数は Polyspace の結果を電子メールの添付ファイル用にエクスポートし、コマンド ライン ユーティリティを使用して結果をフィルタリングします。

      これらの補助関数は、Jenkins プラグインでのみ使用可能です。ただし、基となるコマンドは Polyspace Bug Finder Server インストールに含まれています。Jenkins 以外のビルド自動化ツールでこれらの補助関数を作成するには、polyspace-report-generator コマンドまたはpolyspace-access -export (Polyspace Access)コマンドを使用します。Polyspace Bug Finder Server の結果を含む電子メール通知の送信を参照してください。

      Jenkins で分散ビルドを実行する場合は、マスター ノードと、Polyspace 解析を実行するエージェント ノードの両方で、同じオペレーティング システムの同じフォルダーにプラグインがインストールされている必要があります。そうでない場合、補助関数を使用できません。

    • スクリプトにより、カスタマイズされた電子メール用の、電子メール添付用のテキスト ファイル、件名、本文が作成されます。Jenkins に Polyspace プラグインをインストールすると、電子メール プラグインの拡張機能が Jenkins プロジェクトで使用可能になります。この電子メール プラグインにより、以前に作成した件名、本文、および添付ファイルを使用して、カスタマイズされた電子メールを簡単に送信できます。Polyspace プラグインがインストールされていない場合は、電子メールを送信する代わりの手段を見つける必要があります。

  • Bug Finder 解析を実行する。

    スクリプトは、デモ サンプル Bug_Finder_Example に対して Bug Finder を実行します。Polyspace Bug Finder Server 製品をインストールしている場合、デモ サンプルが含まれているフォルダーは polyspaceserverroot/polyspace/examples/cxx/Bug_Finder_Example です。ここで、polyspaceserverroot は Polyspace Server 製品のインストール フォルダーです。たとえば、/usr/local/Polyspace Server/R2019a/ です。

    Code Prover を実行するようにスクリプトを容易に変更できます。polyspace-bug-finder-serverpolyspace-code-prover-server で置き換えます。Code Prover 専用のデモ サンプル Code_Prover_Example を使用できます。

前提条件

サーバーで Polyspace 解析を実行し、Polyspace Access Web インターフェイスで結果を確認するには、次の 1 回限りの設定を実行する必要があります。

  • 解析を実行するには、Polyspace Server 製品のインスタンスを 1 つインストールする必要があります。

  • 結果をアップロードするには、Polyspace Access の Web インターフェイスをホストするために必要なコンポーネントを設定する必要があります。

  • アップロードされた結果を表示するには、(結果をレビューする開発者の各々が) 1 つの Polyspace ライセンスを所有していなければなりません。

同様の要件は、サーバー上での PolyspaceCode Prover™ 解析に適用されます。

Polyspace Server および Access 製品のインストールを参照してください。

Polyspace プラグインをインストールするには、Jenkins インターフェイスの左側にある [Manage Jenkins] を選択します。[Manage Plugin] を選択します。Polyspace プラグインを検索し、ダウンロードしてインストールします。

Jenkins での Polyspace プロジェクトの設定

Polyspace プラグインのインストール後に Jenkins で Polyspace 解析を設定する手順を、以下で説明します。この手順は Jenkins version 2.150.1 に対応していることに注意してください。ご使用の Jenkins のバージョンと Polyspace プラグイン インストールでは、手順が多少異なることがあります。

他のビルド自動化ツールを使用する場合は、同様の設定手順を実行できます。

Polyspace コマンドのパスと Polyspace Access Web インターフェイスのサーバー詳細の指定

Polyspace コマンドが含まれているフォルダーの絶対パスと、Polyspace Access Web インターフェイスをホストするサーバーのホスト名およびポート番号を指定します。パスを指定した後は、結果をアップロードするために、コマンドの絶対パスやサーバー詳細をスクリプトで使用する必要はなくなります。

  1. Jenkins インターフェイスの左側にある [Manage Jenkins] を選択します。[Configure System] を選択します。

  2. [Polyspace] セクションで以下を指定します。

    • Polyspace コマンドのパス。

      パスは polyspaceserverroot/polyspace/bin を指します。ここで、polyspaceserverroot は Polyspace Server 製品のインストール フォルダーです。たとえば、/usr/local/Polyspace Server/R2019a/ です。

      Enter the path to Polyspace commands and a short name for the path.

    • Polyspace Access Web インターフェイスをホストするサーバーが使用するホスト名、ポート番号、およびプロトコル (http または https)。

      Enter the protocol, host and port name for the Polyspace Access server, and a short name to refer to the server.

    [Name] フィールドでは、Jenkins プロジェクトで後で使用する、便利な省略表記を定義できます。

  3. [E-mail Notification] セクションに、会社の SMTP サーバー (および電子メールの送信に必要なその他の詳細情報) を指定します。

    Enter email server details.

Polyspace を実行するための Jenkins プロジェクトの作成

Jenkins プロジェクト (フリースタイル プロジェクトなど) を作成するときに、先ほど定義したグローバル省略表記を使用して Polyspace パスを参照できます。

Polyspace を実行するための Jenkins プロジェクトを作成するには、次のようにします。

  1. Jenkins インターフェイスの左側にある [New Item] を選択します。[Freestyle Project] を選択します。

  2. プロジェクトの [Build Environment] セクションで、先に定義した 2 つの省略表記名を入力します。

    • Polyspace コマンドが含まれているフォルダーのパス名

    • PolyspaceAccess Web インターフェイスをホストするサーバーの詳細情報の名前。

    PolyspaceAccess Web インターフェイスへのアップロードに使用できるログインとパスワードも入力します。ログインとパスワードは、Polyspace Access ライセンスに関連付けられている必要があります。

    Enter path to Polyspace commands and Polyspace Access server details using short names you created earlier. Enter credentials that can be used to log in to Polyspace Access.

  3. プロジェクトの [Build] セクションに、Polyspace コマンドと、Polyspace Access Web インターフェイスをホストするサーバーの詳細情報を使用するスクリプトを入力できます。スクリプトが Polyspace 解析を実行し、結果を Polyspace Access Web インターフェイスにアップロードします。

    Script to run Polyspace analysis from Jenkins

  4. プロジェクトの [Post-build Actions] セクションで、解析後に送信する電子メールのアドレスと添付ファイルを設定します。

    Enter email addresses of recipients, name of file with Polyspace results, mail subject and mail body.

Bug Finder の実行、結果のアップロード、および共通の通知の送信を行うスクリプト

このスクリプトは、Bug Finder 解析を実行し、結果をアップロードし、全受信者に送信する共通の通知メールに添付する、影響度の高い欠陥をエクスポートします。

このスクリプトでは、現行フォルダーに、.c ファイルがある sources フォルダーが含まれていることを前提としています。そうでない場合は、gcc -c sources/*.c 行をソースの絶対パスに変更してください。

set -e
export RESULT=ResultBF
export PROG=Bug_Finder_Example
export PARENT_PROJECT=/public/BugFinderExample_PRS_01

# ================================================================
# Trace build command and create an options file

build_cmd="gcc -c sources/*.c"
polyspace-configure \
      -allow-overwrite \
      -allow-build-error \
      -prog $PROG \
      -author jenkins \
      -output-options-file $PROG.psopts \
      $build_cmd


# ================================================================
# Run Bug Finder on the options file

polyspace-bug-finder-server -options-file $PROG.psopts -results-dir $RESULT

# ================================================================
# Upload results to Polyspace Access web interface

$ps_helper_access -create-project $PARENT_PROJECT
$ps_helper_access \
      -upload $RESULT \
      -parent-project $PARENT_PROJECT \
      -project $PROG

# ================================================================
# Export results filtered for defects with "High" impact

$ps_helper_access \
      -export $PARENT_PROJECT/$PROG \
      -output Results_All.tsv \
      -defects High

# ================================================================
# Finalize Jenkins status

exit 0

スクリプトの実行後に、エクスポートされたファイル Results_All.tsv が添付された電子メールを全受信者に送信するビルド後のアクションを作成できます。

Enter email addresses of recipients, name of file with Polyspace results, mail subject and mail body.

このスクリプトでは、$ps_helper_access は、ホスト名、ポート、ログイン、および暗号化パスワードを指定するオプションを含む polyspace-access (Polyspace Access) コマンドの省略表記です。その他の polyspace-access オプションは、スクリプトに明示的に記述されます。

Bug Finder の実行、結果のアップロード、カスタマイズされた通知の送信を実行するスクリプト

このスクリプトは、前述の Bug Finder 解析を実行して、結果をアップロードします。ただし、このスクリプトは次の点で前述のスクリプトとは異なります。

  • このスクリプトはコマンドの実行時にメッセージを出力する関数 run_command を使用します。この関数は、コンソール出力でスクリプトのどの部分が実行されているかを確認するときに役立ちます。

  • このスクリプトは、結果のエクスポート時にオーナーごとに個別の結果ファイルを作成します。

    • メイン ファイル Results_All.tsv にはすべての結果が含まれています。このファイルは電子メールの添付ファイルとしてマネージャーに送信されます。マネージャー宛ての電子メールは、ビルド後のステップで設定されます。

      ファイルに含まれる欠陥が 10 を超える場合、ビルド ステータスは失敗と見なされます。スクリプトは電子メール通知でステータス UNSTABLE を送信します。

    • userA 用にエクスポートされた結果ファイル Results_Users_userA.tsv には、Programming グループの欠陥のうち、影響度が高い欠陥が含まれています。

      この結果ファイルは電子メールの添付ファイルとして userA に送信されます。

    • userB 用にエクスポートされた結果ファイル Results_Users_userB.tsv には、関数 bug_memstdlib() からの欠陥が含まれています。

      この結果ファイルは電子メールの添付ファイルとして userB に送信されます。

  • メールの件名を含むファイルは、それぞれ個別に作成されます。マネージャーの件名はファイル mailsubject_manager.txt に、userA の件名はファイル mailsubject_user_userA.txt に、userB の件名はファイル mailsubject_user_userB.txt にそれぞれ作成されます。

    ファイル mailbody_manager.txt には、マネージャー宛ての電子メールの本文が作成されます。

このスクリプトは次のことを前提としています。

  • 現行フォルダーに、.c ファイルがあるフォルダー sources が含まれていること。

    そうでない場合は、gcc -c sources/*.c 行をソースの絶対パスに変更してください。

  • userA および userB という名前のユーザーがいること。特に電子メール アドレス userA@companyname.comuserB@companyname.com (先に設定したユーザー名と SMTP サーバーから決定される) は、実際の電子メール アドレスにする必要があります。

    名前は実際のユーザー名に置き換えてください。

set -e
export RESULT=ResultBF
export PROG=Bug_Finder_Example
export REPORT=Results_List.tsv


# ================================================================
# Define function to print message while running command
run_command()
{
# $1 is a message
# $2 $3 ... is the command to dump and to run
message=$1
shift
cat >> mailbody_manager.txt << EOF
$(date): $message

EOF
"$@"
}

# ================================================================
# Initialize mail body
cat > mailbody_manager.txt << EOF
Dear Manager(s)

Here is the report of the Jenkins Job ${JOB_NAME} #${BUILD_NUMBER}
It contains all Red Defect found in Bug Finder Example project

EOF

# ================================================================
# Trace build command and create options file

build_cmd="gcc -c sources/*.c"
run_command "Tracing build command",               \
            polyspace-configure                   \
                -allow-overwrite                  \
                -allow-build-error                \
                -prog $PROG                       \
                -author jenkins                   \
                -output-options-file $PROG.psopts \
                    $build_cmd

# ================================================================
# Run Bug Finder on the options file

run_command "Running Bug finder" \
            polyspace-bug-finder-server -options-file $PROG.psopts -results-dir $RESULT



# ================================================================
# Upload results to Polyspace Access web interface

run_command "Creating Project $PARENT_PROJECT" \
  $ps_helper_access -create-project $PARENT_PROJECT

run_command "Uploading on $PARENT_PROJECT/$PROG" \
  $ps_helper_access \
        -upload $RESULT \
        -parent-project $PARENT_PROJECT \
        -project $PROG \
        -output upload.output
PROJECT_RUNID=$($ps_helper prs_print_runid upload.output)
PROJECT_URL=$($ps_helper prs_print_projecturl upload.output $POLYSPACE_ACCESS_URL)

# ================================================================
# Export report

run_command "Exporting report from $PARENT_PROJECT/$PROG" \
  $ps_helper_access \
        -export $PROJECT_RUNID \
        -output $REPORT \
        -defects High


# ================================================================
# Filter Reports

run_command "Filtering reports for defects" \
            $ps_helper report_filter \
                $REPORT \
                Results_All.tsv \
                Family Defect \


# ================================================================
# Filter Reports for userA and userB

run_command "Filtering Reports for userA: Group=='Programming' and Information=='Impact: High'" \
            $ps_helper report_filter \
                $REPORT \
                Results_Users.tsv \
                userA \
                Group Programming \
                Information "Impact: High"
run_command "Filtering Reports for userB: Function=='bug_memstdlib()'" \
            $ps_helper report_filter \
                $REPORT \
                Results_Users.tsv \
                userB \
                Function "bug_memstdlib()"


# ================================================================
# Update Jenkins status
# Jenkins build status is unstable when there are more than 10 Defects

BUILD_STATUS=$($ps_helper report_status Results_All.tsv 10)

# ================================================================
# Update mail body and mail subject

NB_FINDINGS_ALL=$($ps_helper report_count_findings Results_All.tsv)
NB_FINDINGS_USERA=$($ps_helper report_count_findings Results_Users_userA.tsv)
NB_FINDINGS_USERB=$($ps_helper report_count_findings Results_Users_userB.tsv)
cat >> mailbody_manager.txt << EOF

Number of defects: $NB_FINDINGS_ALL
Number of findings owned by userA: $NB_FINDINGS_USERA
Number of findings owned by userB: $NB_FINDINGS_USERB

All results are uploaded in: $PROJECT_URL

Build Status: $BUILD_STATUS

EOF

cat >> mailsubject_manager.txt << EOF
Jenkins for Manager - Polyspace run completed with status $BUILD_STATUS and $NB_FINDINGS_ALL findings
EOF

for user in userA userB
do
  echo "Jenkins for $user - $($ps_helper report_count_findings Results_Users_$user.tsv)) findings" > mailsubject_user_$user.txt
done



# ================================================================
# Exit with correct build status

[ "$BUILD_STATUS" != "SUCCESS" ] && exit 129
exit 0

スクリプトの実行後に、エクスポートしたファイル Results_All.tsv を添付した電子メールをマネージャーに送信する、ビルド後のアクションを作成できます。[Recipients] フィールドに電子メール アドレスを指定し、[Mail Subject] フィールドに電子メールの件名を指定し、[Mail Body] フィールドに電子メールの本文を指定します。

また、userA には Results_Users_userA.tsv ファイルを添付した電子メールが、userB には Results_Users_userB.tsv ファイルを添付した電子メールが、それぞれに送信されます (メールの件名はそれぞれ mailsubject_user_userA.txtmailsubject_user_userB.txt の内容です)。電子メール アドレスは userA@companyname.comuserB@companyname.com です (先に設定したユーザー名と SMTP サーバーから決定される)。

Enter email addresses of recipients, name of file with Polyspace results, mail subject and mail body.

このスクリプトは、補助関数 $ps_helper を使用して、グループ、影響度、および関数に基づいて結果をフィルタリングします。この補助関数はコマンド ライン ユーティリティを使用して、メイン ファイルをフィルタリングして結果を絞り込み、オーナーごとに個別の結果ファイルを作成するなどのアクションを実行します。この関数は次のアクションを引数として取ります。

  • report_filter:エクスポートしたテキスト ファイルの結果を、テキスト ファイルの内容に基づいてフィルタリングします。

    次に例を示します。

    $ps_helper report_filter \
                    Results_List.tsv \
                    Results_Users.tsv \
                    userA \
                    Group Programming \
                    Information "Impact: High"
    ファイル Results_List.tsv を読み取り、ファイル Results_Users_userA.tsv に書き込みます。テキスト ファイル Results_List.tsv には、Group および Information の列が含まれています。Group 列に Programming が含まれており、Information 列に Impact: High が含まれている行のみが、ファイル Results_Users_userA.tsv に書き込まれます。

  • report_status:ファイル内の結果の数に基づいて UNSTABLE または SUCCESS を返します。

    次に例を示します。

    BUILD_STATUS=$($ps_helper report_status Results_All.tsv 10))
    ファイル Results_All.tsv に含まれる結果 (行) の数が 10 を超えている場合には UNSTABLE を返します。

  • report_count_findings:ファイル内の結果の数を報告します。

    次に例を示します。

    NB_FINDINGS_ALL=$($ps_helper report_count_findings Results_All.tsv)
    ファイル Results_All.tsv 内の結果 (行) の数を返します。

  • prs_print_projecturl:ホスト名とポート番号を使用して、Polyspace Access Web インターフェイスの URL を作成します。

    次に例を示します。

    PROJECT_URL=$($ps_helper prs_print_projecturl Results_All.tsv $POLYSPACE_ACCESS_URL)
    
    (polyspace-access コマンドによりエクスポートされる) ファイル Results_All.tsv を読み取り、Polyspace Access Web インターフェイスの URL を $POLYSPACE_ACCESS_URL に、現在のプロジェクトの URL を $PROJECT_URL に抽出します。

参考

| (Polyspace Code Prover) | |

トピック