GitHubアクションCodeCheckerをドライバーとして使用して静的分析を実行します。 C-Familyプロジェクト(C、C ++、Objective-C、Cudaなど)の場合、CodeCheckerはClangの静的分析プログラムの推進をサポートしています。他のいくつかの静的アナライザーの出力は、レポートコンバーターを介してCodeCheckerに統合できます。
この単一のアクションコンポジットスクリプトには、次の手順が含まれます。
注:静的分析は、時間のかかるプロセスになる可能性があります。静的分析ステップは、CI実行の残りの部分との連続的ではなく、ワークフローで独自の仕事として実行されるか、完全に異なるワークフローを完全に実行することをお勧めします。
このアクションを実行する前に、プロジェクトがビルド用に完全に構成されていることを確認してください。
注:静的アナライザーは、真のリリースビルドで最適化された追加情報に依存できます。したがって、プロジェクトをDebug構成で構成することをお勧めします。
次のように、ジョブをCIに追加します。 2つのバージョンは相互に排他的です。コンパイルデータベースを提供するか、CodeCheckerに作成を指示することができます。
一部のプロジェクトは、構成構成に十分なほど些細なものであるため、 configure.sh 、 cmake 、または同様のツールを実行した後に追加の手順を実行する必要はありません。ビルド自体を実行せずにビルドシステムからコンパイルデータベースを生成できる場合は、時間を節約し、すぐに分析に移動できます。
logfile変数で生成されたコンパイルデータベースを指定できます
job :
steps :
# Check YOUR project out!
- name : " Check out repository "
uses : actions/checkout@v2
# Prepare a build
- name : " Prepare build "
run : |
mkdir -pv Build
cd Build
cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
# Run the analysis
- uses : whisperity/codechecker-analysis-action@v1
id : codechecker
with :
logfile : ${{ github.workspace }}/Build/compile_commands.json
# Upload the results to the CI.
- uses : actions/upload-artifact@v2
with :
name : " CodeChecker Bug Reports "
path : ${{ steps.codechecker.outputs.result-html-dir }} 他の種類のプロジェクトは、生成されたコードに大きく依存する可能性があります。ビルドを事前に実行せずにこれらのプロジェクトのソースコードを見ると、それらはコンパイルされません。そのため、分析も実行できません。
この場合、分析の直前にCodeCheckerにビルドを記録する(およびビルドを行う時間を費やす)ように指示する必要があります。
build-command変数で実行するビルドを指定できます。
job :
steps :
# Check YOUR project out!
- name : " Check out repository "
uses : actions/checkout@v2
# Prepare a build
- name : " Prepare build "
run : |
mkdir -pv Build
cd Build
cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS=OFF
# Run the analysis
- uses : whisperity/codechecker-analysis-action@v1
id : codechecker
with :
build-command : " cd ${{ github.workspace }}/Build; cmake --build . "
# Upload the results to the CI.
- uses : actions/upload-artifact@v2
with :
name : " CodeChecker Bug Reports "
path : ${{ steps.codechecker.outputs.result-html-dir }}要求された場合、 warnings出力変数を一致させて、プロジェクトによって静的分析警告が発生した場合にジョブ全体を破るジョブのステップを実行できます。
注:静的分析は騒々しい可能性があり、レポートは修正が扱いにくいため、デフォルトの動作と推奨は、調査結果のみを報告するが、CI全体を破らないことです。
レポートを人間に消費できる形式で取得するには、失敗ステップがジョブ全体に失敗する前に、最初にどこかにアップロードする必要があります。
job :
steps :
# Check YOUR project out!
- name : " Check out repository "
uses : actions/checkout@v2
# Prepare a build
- name : " Prepare build "
run : |
mkdir -pv Build
cd Build
cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS=OFF
# Run the analysis
- uses : whisperity/codechecker-analysis-action@v1
id : codechecker
with :
build-command : " cd ${{ github.workspace }}/Build; cmake --build . "
# Upload the results to the CI.
- uses : actions/upload-artifact@v2
with :
name : " CodeChecker Bug Reports "
path : ${{ steps.codechecker.outputs.result-html-dir }}
# Break the build if there are *ANY* warnings emitted by the analysers.
- name : " Break build if CodeChecker reported any findings "
if : ${{ steps.codechecker.outputs.warnings == 'true' }}
run : exit 1プロジェクトがどこかでCodeCheckerサーバーをホストしている場合、ジョブは自動的に実行または更新するように構成できます。
# It is recommended that storing only happens for PUSH events, and preferably
# only for long-term branches.
on :
push :
job :
steps :
# Check YOUR project out!
- name : " Check out repository "
uses : actions/checkout@v2
# Prepare a build
- name : " Prepare build "
run : |
mkdir -pv Build
cd Build
cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS=OFF
# Run the analysis
- uses : whisperity/codechecker-analysis-action@v1
id : codechecker
with :
build-command : " cd ${{ github.workspace }}/Build; cmake --build . "
store : true
store-url : ' http://example.com:8001/MyProject '
store-username : ${{ secrets.CODECHECKER_STORE_USER }}
store-password : ${{ secrets.CODECHECKER_STORE_PASSWORD }}
# store-run-name: "custom run name to store against"CodeCheckerは、2つの分析間の違いを計算できます。プロジェクトの安定したバージョンの分析がサーバーに保存されている場合(上記を参照)、新しい分析結果を導入しようとした場合、プル要求を自動的に拒否するプルリクエストのジョブを構成できます。
レポートを人間に消費できる形式で取得するには、失敗ステップがジョブ全体に失敗する前に、最初にどこかにアップロードする必要があります。
on :
pull_request :
runs :
steps :
# Check the pull request out! (In pull_request jobs, the checkout action
# automatically downloads the "after-merge" state of the pull request if
# there are no conflicts.)
- name : " Check out repository "
uses : actions/checkout@v2
# Prepare a build
- name : " Prepare build "
run : |
mkdir -pv Build
cd Build
cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS=OFF
# Run the analysis
- uses : whisperity/codechecker-analysis-action@v1
id : codechecker
with :
build-command : " cd ${{ github.workspace }}/Build; cmake --build . "
store : ${{ github.event_name == 'push' }}
store-url : ' http://example.com:8001/MyProject '
store-username : ${{ secrets.CODECHECKER_STORE_USER }}
store-password : ${{ secrets.CODECHECKER_STORE_PASSWORD }}
# Keep the names for 'store' and 'diff' in sync, or auto-generated!
# diff-run-name: "custom run name to store with"
diff : ${{ github.event_name == 'pull_request' }}
diff-url : ' http://example.com:8001/MyProject '
diff-username : ${{ secrets.CODECHECKER_DIFF_USER }}
diff-password : ${{ secrets.CODECHECKER_DIFF_PASSWORD }}
# diff-run-name: "custom run name to diff against"
# Upload the potential new findings results to the CI.
- uses : actions/upload-artifact@v2
if : ${{ steps.codechecker.outputs.warnings-in-diff == 'true' }}
with :
name : " New introduced results Bug Reports "
path : ${{ steps.codechecker.outputs.diff-html-dir }}
- name : " Fail the job if new findings are introduced "
if : ${{ steps.codechecker.outputs.warnings-in-diff == 'true' }}
shell : bash
run : |
echo "::error title=New static analysis warnings::Analysed commit would introduce new static analysis warnings and potential bugs to the project"
# Fail the build, after results were collected and uploaded.
exit 1 この単一のアクションコンポジットスクリプトには、次の手順が含まれます。
report-converterを使用して、他のアナライザーのレポートをCodeCheckerの形式に変換します。注:静的分析は、時間のかかるプロセスになる可能性があります。静的分析ステップは、CI実行の残りの部分との連続的ではなく、ワークフローで独自の仕事として実行されるか、完全に異なるワークフローを完全に実行することをお勧めします。
これについては、選択したアナライザーのドキュメントを参照してください。 CodeCheCheckerは、外部ツールを介して分析の促進をサポートしていませんが、分析が成功した場合、結果を変換して保存できます。
job :
steps :
# Check YOUR project out!
- name : " Check out repository "
uses : actions/checkout@v2
# Perform the analysis. Details vary between analysers!
# Example for "PyLint" added below!
- name : " Analyse with PyLint "
run : |
sudo apt-get -y install pylint
pylint -f json --exit-zero myproject > pylint_reports.json
# Run the conversion
- uses : whisperity/codechecker-analysis-action@v1
id : codechecker
with :
report-converter : true
original-analyser : " pylint "
original-analysis-output : " pylint_reports.json "
# Upload the results (after conversion by CodeChecker) to the CI.
- uses : actions/upload-artifact@v2
with :
name : " CodeChecker Bug Reports "
path : ${{ steps.codechecker.outputs.result-html-dir }}レポートコンバーターツールは、さまざまなアナライザーの出力をCodeCheckerが使用する共通形式に変換します。コンバージョンが完了すると、アクションの残りの機能は、C/C ++プロジェクトと同じ方法で実行できます。これらの機能の構成については、ドキュメントの以前の部分を参照してください。
| 変数 | デフォルト | 説明 |
|---|---|---|
config | $(project-root)/.codechecker.json | 分析コマンドに追加されるフラグを含む構成ファイル。分析構成のほとんどはプロジェクトにバージョンされることをお勧めします。 ?公式ドキュメントでcodechecker.json構成ファイルの詳細をご覧ください。 |
| 変数 | デフォルト | 説明 |
|---|---|---|
llvm-version | latest | インストールおよび使用するLLVMのメジャーバージョン。 LLVMはコミュニティPPAからインストールされています。値は、使用されるOSのPPAによってサポートされているメジャーバージョン(例13 )でなければなりません! latest場合は、最新の(まだ未発表の)バージョンを自動的に収集します。 ignore場合は、何もインストールしないでください。 (お勧めしません。) |
install-custom | false | trueに設定されている場合、指定されたrepositoryとversionからCodeCheckerをローカルにクローンおよびインストールする機能を開きます。それ以外の場合、 versionはリリースバージョンとして使用され、PypiのCodeCheckerスイートがダウンロードされます。 |
repository | Ericsson/CodeChecker | install-customがtrueある場合は、チェックアウトして構築するためのCodeCheckerリポジトリ。 |
version | master | install-customがfalse場合、リリースバージョン(例えば6.18.0 )がPypiからダウンロードするか、最新リリースを取得するためにmaster 。それ以外の場合、ブランチ( masterにデフォルト)、タグ、またはrepositoryにSHAをコミットしてチェックアウトします。 |
? CodeChecker log詳細については、公式ドキュメントをご覧ください。
| 変数 | デフォルト | 説明 |
|---|---|---|
logfile | プロジェクトの構築方法を説明するJSONコンピレーションデータベースの場所。このフラグは、ビルドシステムがファイルを事前に生成できる場合に使用されます。 | |
build-command | 実行するためのビルドコマンド。 CodeCheCheckerは、それ自体のビルドを実行してログすることができます。このフラグは、ビルドシステムが単独で情報を生成できない場合、またはプロジェクトが他の生成されたコードに依存している場合に使用されます。 |
? CodeChecker analyze 。
| 変数 | デフォルト | 説明 |
|---|---|---|
analyze-output | (自動生成) | 生の分析出力を保存するディレクトリ。 |
ctu | false | Clang Static Analyzerでクロス翻訳ユニット分析を有効にします。 |
ignore-analyze-crashes | true | trueに設定した場合、分析フェーズは、一部の分析アクションが失敗した場合、エラーを報告しません(Clangの潜在的なクラッシュのため)。 |
?公式文書でCodeChecker parseの詳細を読んでください。
?公式ドキュメントでreport-converterの詳細をご覧ください。
| 変数 | デフォルト | 説明 |
|---|---|---|
report-converter | false | trueに設定されている場合、ジョブは静的分析を単独で駆動する代わりに、他のアナライザーからのレポート変換を実行します。 |
original-analyser | 以前に実行された分析の「タイプ」。 report-converter実行可能ファイルへの必須入力として渡されました。 | |
original-analysis-output | サードパーティアナライザーの結果が利用可能なファイルまたはディレクトリ。 report-converter実行可能ファイルへの必須入力として渡されました。 |
?公式ドキュメントでCodeChecker cmd diffの詳細をご覧ください。
?サーバーのコンテンツに対して分析結果を確認するには、サーバーが認証を必要としている場合、 PRODUCT_VIEW許可が必要です。
| 変数 | デフォルト | 説明 |
|---|---|---|
diff | false | trueに設定すると、ジョブはリモートサーバーに保存されている結果に対して現在の分析結果の違いを計算します。 |
diff-url | エンドポイントを含む、チェックおよび違いを確認するためのCodeChecker製品のURL。通常、 http://example.com/ProductNameの形式。 diff trueに設定されている場合、この変数を指定する必要があります。 | |
diff-username | サーバーがアクセスするために認証が必要な場合は、チェックがログインするユーザー名を指定します。 | |
diff-password | ユーザーに対応するパスワードまたは生成されたアクセストークン。 ?注:これはリポジトリシークレットとして構成されていることをお勧めします。 ${{ secrets.CODECHECKER_PASSWORD }}構成するとき。 | |
diff-run-name | (自動生成、フォーマットuser/repo: branchname ) | CodeChecker分析の実行は実行に収集されます。実行は通常、分析の1つの構成と相関します。 |
? CodeChecker storeの詳細については、公式ドキュメントをご覧ください。
?サーバーへの保存の実行には、サーバーが認証を必要としている場合、 PRODUCT_STORE許可が必要です。
| 変数 | デフォルト | 説明 |
|---|---|---|
store | false | trueに設定されている場合、スクリプトは調査結果をCodeCheckerサーバーにアップロードします。通常、他のフラグも構成する必要があります! |
store-url | エンドポイントを含む、保存するCodeChecker製品のURL。通常、 http://example.com/ProductNameの形式。 store trueに設定されている場合、この変数を指定する必要があります。 | |
store-username | サーバーがアクセスするために認証が必要な場合は、アップロードがログインするユーザー名を指定します。 | |
store-password | ユーザーに対応するパスワードまたは生成されたアクセストークン。 ?注:これはリポジトリシークレットとして構成されていることをお勧めします。 ${{ secrets.CODECHECKER_PASSWORD }}構成するとき。 | |
store-run-name | (自動生成、フォーマットuser/repo: branchname ) | CodeChecker分析の実行は実行に収集されます。実行は通常、分析の1つの構成と相関します。ランは段階的に保存できます。この場合、CodeCheckerにはレポートが修正されたことを注釈できます。 |
outputsアクションは、分析に成功したワークフローの手順で使用できる次の出力を公開します。
| 変数 | 価値 | 説明 |
|---|---|---|
analyze-output | 自動生成、またはanalyze-output | 生の分析出力ファイル(アナライザーによって作成されたか、コンバーターによって作成された)が利用可能なディレクトリ。 |
codechecker-version | 自動生成(入力versionと同じ可能性が高い) | 分析を実行したインストールされたCodeCheckerのバージョン。 |
codechecker-hash | 自動生成。 | 分析を実行したインストールされたCodeCheckerのGitハッシュ。 |
logfile | 自動生成、またはlogfile入力 | 実行された分析のJSONコンピレーションデータベース。 |
llvm-version | 自動生成。 | インストールされたLLVM/Clangパッケージのフルバージョン文字列( clang --versionによって報告されています)。 |
diff-html-dir | 自動生成。 | ユーザーフレンドリーなHTMLバグレポートが新しい調査結果について生成されたディレクトリ( diffが有効になった場合)。 |
diff-result-log | 自動生成。 | CodeChecker cmd diffの出力ログファイルには、捨てられた新しい調査結果が含まれています。 |
diff-run-name | 自動生成、またはdiff-run-name入力 | 分析の名前( diffが有効になった場合)がレポートを比較しました。 |
result-html-dir | 自動生成。 | ユーザーフレンドリーなHTMLバグレポートが生成されたディレクトリ。 |
result-log | 自動生成。 | CodeChecker parseの出力ログファイルには、捨てられた結果が含まれています。 |
store-run-name | 自動生成、またはstore-run-name入力 | 結果がアップロードされた分析の実行( storeが有効になっている場合)。 |
store-successful | trueまたはfalse | 結果を保存することが成功したかどうか。オプションでビルドを壊してネットワークの障害を検出するのに役立ちます。 |
warnings | trueまたはfalse | 静的アナライザーが調査結果を報告したかどうか。 |
warnings-in-diff | trueまたはfalse | diffが有効になった場合、サーバーの内容と比較したときに現在の分析に新しい発見があったかどうか。 |