PRおよびCIパイプライン間でのエビデンスの再利用

デフォルトでは、プルリクエストやCIパイプラインが実行されると、設定されたすべてのスキャンやテストが常に実行されます。これは、スキャンやテストの対象となるリポジトリの内容やイメージが、 前回のスキャンやテスト以降に変更されていない場合でも同様です。 その結果、実行するたびに新たな証拠が収集される。 これは時間とリソースの無駄になります。

DevSecOps Pipelines には「 Evidence Reuse (エビデンスの再利用)」と呼ばれるオプトイン機能があり、スキャンまたはテストの対象となるリポジトリの コンテンツやイメージが前回のスキャンまたはテスト以降変更されていない場合、パイプラインの各ステージでのスキャンやテストをスキップすることができます。 この場合、スキャンやテスト実行は行われないため、新たな証拠は収集されません。 その代わりに、以前にスキャンやテストのために収集されたエビデンスが取得され、CI、CD、およびCCの要約で再利用されます。 これにより、PRおよびCIパイプラインの処理が高速化され、 リソースの使用効率が向上します。 この機能が有効になっている場合、パイプラインは、テストまたはスキャン対象が前回の実行以降変更されていないことを検証します。 検証に成功した場合、パイプラインの各ステージでは、テストやスキャンをスキップし、以前に収集された証拠や結果を利用することができます。

証拠の再利用における代表的なユースケースは以下の通りです:

  • ユース・ケース 1:

    • PRパイプライン内で、エビデンス収集機能を用いてユニットテストを実行する。
    • お好みの方法(リベース、スクワッシュ、または通常のマージ)でPRをマージしてください。
    • PRとCIパイプラインの実行の間にソースコードに変更がない場合、CIパイプラインでのユニットテストの実行はスキップできます。 PRパイプラインの実行から得られたユニットテストの結果が取得され、CIサマリーに再利用されます。
  • ユース・ケース 2:

    • 証拠収集を含むPRパイプラインを実行するか、CIパイプラインを実行してください。
    • たとえば、 compliance-check のようなパイプラインのステージの1つが、断続的な問題により失敗しています。
    • 同じコミットに対して、PRまたはCIパイプラインを再実行します。
    • 再実行時には、正常に完了したスキャンやテストはスキップされ、前回の実行時の結果が取得されて再利用されます。
    • 失敗したスキャンだけが実行され、それに関する新たな証拠が収集される。

PRパイプラインでの証拠収集を有効にするには、「 PRパイプラインの証拠収集 」を参照してください。

証拠の再利用を可能にする

PR または CI パイプラインでエビデンスの再利用を有効にするには、環境プロパティ evidence-reuse を 1`` に設定してください。 デフォルトでは、このプロパティは有効になっていません。

表 1. 証拠の再利用に関する特性
プロパティー (Property) 説明 デフォルト
evidence-reuse 証拠の再利用を有効にするには、 1 に設定してください。 無効
evidence-reuse-for-failure 1 に設定すると、失敗した証拠も再利用されます。 evidence-reuse=1 に加えて設定してください。 無効
evidence-validity-period 証拠を再利用できる時間数。 24(最大720、つまり30日間)

check-evidence-for-reuse ツールは、 asset-key、 tool-type、および evidence-type の組み合わせについて、エビデンスが存在するかどうかを確認し、 そのエビデンスが再利用の条件を満たしているかどうかを検証します。 詳細については、「 check-evidence-for-reuse 」を参照してください。

CLI コマンドの完全なリファレンスおよび利用可能なすべてのパラメータについては、「 cocoa locker evidence reuse 」を参照してください。

証拠の再利用に関する条件

check-evidence-for-reuse ツールは、以下の条件を満たしているかどうかを検証します:

  • その証拠は、同じコミットアセット、リポジトリの内容、またはイメージアセットから収集されました。
  • 証拠のステータスは「 success 」です。 それ以外のステータスのエビデンスは再利用の対象とはならず、新たなスキャンが実行されます。 これにより、ステージで断続的な障害が発生し、その障害の証拠が収集された場合でも、パイプラインを再実行した際に、その障害の証拠が再利用されることがなくなります。 その代わりに、新たなスキャンが実行され、新たな証拠が収集される。 しかし、場合によっては、不備のある証拠を再利用しなければならないこともある。 たとえば、スキャンによってCIパイプラインの脆弱性が検出され、その変更を緊急デプロイとして展開する必要がある場合などです。 失敗した証拠を再利用するには、 evidence-reuse=1 に加えて、環境プロパティ evidence-reuse-for-failure=1 を設定してください。
  • その証拠は古くない。 証拠の収集日は有効期間内です。 デフォルトの有効期間は24時間です。 evidence-validity-period (時間単位)という環境プロパティを使用して、パイプラインの実行時の値を設定できます。 この値には、720時間(30日)という上限が設定されています。
  • 場合によっては、その証拠は、ツールのバージョンやステップのベースイメージのバージョンなど、「詳細」セクションに保存された構成チェックと一致することがあります。

対応しているツールおよび証拠の種類

DevSecOps に含まれるデフォルトのスキャンスクリプトが更新され、証拠の再利用機能が有効になっている場合に、その機能を利用できるようになりました。

証拠の再利用がサポートされている証拠の種類:

表 3. 証拠の種類と再利用のサポート
エビデンス・タイプ 再利用可能
com.ibm.static_scan ある
com.ibm.dynamic_scan ある
com.ibm.detect_secrets ある
com.ibm.code_bom_check ある
com.ibm.code_cis_check ある
com.ibm.code_vulnerability_scan ある
com.ibm.acceptance_tests はい。 カスタムスクリプトを更新する必要があります。
com.ibm.unit_tests はい。 カスタムスクリプトを更新する必要があります。
com.ibm.branch_protection いいえ
com.ibm.pipeline_run_data いいえ
com.ibm.peer_review いいえ

ユニットテストや受け入れテストなどのカスタムスクリプトを更新し、エビデンスの再利用機能が有効になっている場合に、エビデンスを再利用できるようにしてください。 カスタムスクリプトでエビデンスの再利用を採用するには、次のセクションを参照してください。

スクリプトにおけるエビデンスの再利用の導入

スクリプトで証拠の再利用を実装するには、まず再利用可能な証拠があるかどうかを確認してください。 以下の擬似コードは、既存の証拠を確認し、次のステップを決定する方法を概説したものです。

疑似コード

Check whether evidence for reuse exists for (asset, tool, evidence-type) by using check-evidence-for-reuse
  If evidence is found
    Skip the scan or test
    Save the reused result file (optional)
  Else
    Continue with your existing scan process and collect new evidence as usual

再利用可能な証拠があるかどうかを確認する

collect-evidence スクリプトで使用しているのと同じパラメータを指定して、 check-evidence-for-reuse コマンドを実行してください。 詳細については、「 check-evidence-for-reuse 」を参照してください。

再利用可能な証拠が見つかり、保存された場合は、コマンドは「 0 」というメッセージを表示して終了し、見つからなかった場合は「 1 」というメッセージを表示して終了します。

使用例

evidence_params=(
  --tool-type "my-tool"
  --evidence-type "com.ibm.unit_tests"
  --asset-type "repo"
  --asset-key "${repo_key}"
)
reused_evidence_json="$(mktemp)"
if check-evidence-for-reuse "${evidence_params[@]}" --output-path "${reused_evidence_json}"; then
  echo "Reusable evidence found. Skipping the test."
else
  # No reusable evidence: run the test and collect new evidence as usual
  run_my_tests
  collect-evidence "${evidence_params[@]}" --status "success"
fi