2021-11-27 11:18:56 +01:00
name : 'CodeChecker Static Analysis'
author : 'Whisperity'
description : 'Execute C/C++ static analysis of LLVM/Clang (Clang Static Analyzer and Clang-Tidy) driven via CodeChecker.'
2021-11-27 12:34:26 +01:00
branding :
icon : 'tool'
color : 'blue'
2021-11-27 11:18:56 +01:00
inputs :
2021-11-29 17:42:43 +01:00
install-custom :
description : 'Whether to download, check out, and build a CodeChecker package manually in the CI.'
required : true
default : 'false'
2021-11-27 11:23:14 +01:00
repository :
description : 'The CodeChecker repository to check out and build from.'
required : true
default : 'Ericsson/CodeChecker'
2021-11-27 11:18:56 +01:00
version :
2021-11-29 17:42:43 +01:00
description : 'The version of the CodeChecker suite to obtain and execute. Might be a Git commit SHA, a branch name, or a tag if building a custom package, or a release version if downloading from PyPI. If "master" and downloading from PyPI, fetch the latest release.'
2021-11-27 11:18:56 +01:00
required : true
default : 'master'
2021-11-27 12:34:26 +01:00
llvm-version :
description : 'The major version of LLVM to install and use. LLVM is installed from PPA. If "latest", automatically gather the latest version. If "ignore", do not install anything. (Not recommended)'
required : true
default : 'latest'
2021-11-28 10:34:05 +01:00
config :
description : 'The CodeChecker configuration JSON that contains for each CodeChecker action (analyze, parse, ...) the list of flags that should be appended to the invocation of the command.'
required : false
logfile :
description : 'The location of the JSON Compilation Database for the project. This file describes how the project is compiled, and thus how it should be analysed. Mutually exclusive with "build-command".'
required : false
build-command :
description : 'The build command to execute and log for the creation of a JSON Compilation Database. Mutually exclusive with "logfile".'
required : false
2021-11-28 14:31:07 +01:00
analyze-output :
description : 'The output directory where the raw analysis output should be stored. If left the default empty, the path will be generated automatically.'
required : false
2021-11-29 17:42:43 +01:00
default : ''
2021-11-28 14:31:07 +01:00
ctu :
description : 'Whether to enable Cross Translation Unit (CTU) analysis in the Clang Static Analyzer.'
required : true
2021-11-29 17:42:43 +01:00
default : 'false'
2021-12-03 12:02:53 +01:00
ignore-analyze-crashes :
description : 'If set to "true", the "analyze" action will ALWAYS pass, and not report a failure if some analysis jobs fail to execute due to internal crashes in the Clang analysers.'
required : true
default : 'true'
2021-11-28 14:31:07 +01:00
2022-03-26 11:09:05 +01:00
report-converter :
description : 'Whether to perform report conversion from analyses executed by third-party analysers instead of driving the analysis via CodeChecker directly.'
required : true
default : 'false'
original-analyser :
description : 'The type of the third-party analyser which performed the analysis. Passed to the report converter executable, as a mandatory input parameter.'
required : false
original-analysis-output :
description : 'The location of the analysis data emitted by the third-party analyser. Passed to the report converter executable, as a mandatory input parameter.'
required : false
2021-11-30 18:21:11 +01:00
diff :
description : 'Whether to enable calculating the different of the current analysis results against a run stored on a CodeChecker server. If enabled, other flags, such as "diff-url" must also be set.'
required : true
default : 'false'
diff-url :
description : 'The CodeChecker product URL (usually in the format of http://example.com/ProductName) where the diff should connect to. Mandatory if "diff" is true.'
required : false
diff-username :
description : 'If the server requires authentication, the username to authenticate with.'
required : false
diff-password :
description : 'The password (or generated private access token) corresponding to the user.'
required : false
diff-run-name :
description : 'An identifying name of the analysis run. A run usually correlates to a set of configuration, e.g. analysis mode, branch, etc. If left default, the name is automatically generated from the current repository and branch name.'
required : true
default : '__DEFAULT__'
2021-11-29 16:22:28 +01:00
store :
2021-11-29 17:42:43 +01:00
description : 'Whether to enable storing the results to a CodeChecker server. If enabled, other flags, such as "store-url" must also be set.'
2021-11-29 16:22:28 +01:00
required : true
2021-11-29 17:42:43 +01:00
default : 'false'
2021-11-29 16:22:28 +01:00
store-url :
2021-11-29 17:42:43 +01:00
description : 'The CodeChecker product URL (usually in the format of http://example.com/ProductName) where the store should connect to. Mandatory if "store" is true.'
2021-11-29 16:22:28 +01:00
required : false
store-username :
description : 'If the server requires authentication, the username to authenticate with.'
required : false
store-password :
description : 'The password (or generated private access token) corresponding to the user.'
required : false
store-run-name :
description : 'An identifying name of the analysis run. A run usually correlates to a set of configuration, e.g. analysis mode, branch, etc. If left default, the name is automatically generated from the current repository and branch name.'
required : true
2021-11-29 17:42:43 +01:00
default : '__DEFAULT__'
2021-11-29 16:22:28 +01:00
2021-11-28 14:31:07 +01:00
outputs :
2022-03-26 12:41:02 +01:00
codechecker-version :
description : 'The version of the installed CodeChecker package.'
value : ${{ steps.codechecker.outputs.VERSION }}
codechecker-hash :
description : 'The Git hash of the installed CodeChecker package.'
value : ${{ steps.codechecker.outputs.GITSEVEN }}
llvm-version :
description : 'The version of the installed LLVM package, if the install was requested.'
value : ${{ steps.llvm.outputs.REAL_VERSION }}
2021-11-28 14:31:07 +01:00
logfile :
description : 'The location of the JSON Compilation Database that was used for the analysis.'
value : ${{ steps.log.outputs.COMPILATION_DATABASE }}
analyze-output :
2022-03-26 11:09:05 +01:00
description : 'The output directory where the raw analysis or converted output was stored to.'
value : ${{ steps.analyze-or-report.outputs.OUTPUT_DIR }}
2021-11-28 14:31:07 +01:00
2021-11-28 15:50:11 +01:00
warnings :
description : 'Whether the static analyser(s) reported any findings.'
value : ${{ steps.parse.outputs.HAS_FINDINGS }}
2021-11-28 15:59:18 +01:00
result-log :
description : 'The file where the output of CodeChecker parse is written to verbatim.'
value : ${{ steps.parse.outputs.OUTPUT_LOG }}
2021-11-28 15:50:11 +01:00
result-html-dir :
description : 'The output directory where the user-friendly HTML reports were stored to.'
value : ${{ steps.parse.outputs.HTML_DIR }}
2021-11-30 18:21:11 +01:00
diff-html-dir :
description : 'The output directory where the user-friendly HTML reports about the new findings (if "diff" was enabled) were stored to.'
value : ${{ steps.diff.outputs.HTML_DIR }}
diff-run-name :
description : 'The name of the analysis run against which the current reports were compared.'
value : ${{ steps.diff-pre.outputs.RUN_NAME }}
diff-result-log :
description : 'The file where the output of CodeChecker cmd diff is written to verbatim.'
value : ${{ steps.diff.outputs.OUTPUT_LOG }}
warnings-in-diff :
description : 'Whether the current analysis produced any reports that were NEW, compared to the configured analysis run on the server.'
value : ${{ steps.diff.outputs.HAS_NEW_FINDINGS }}
2021-11-29 16:22:28 +01:00
store-run-name :
description : 'The name of the analysis run that the results were uploaded to.'
value : ${{ steps.store-pre.outputs.RUN_NAME }}
2021-11-30 15:10:38 +01:00
store-successful :
description : 'Whether storing the analysis results to the configured server was successful. Useful for breaking the build in a later step if the store action is deemed mandatory.'
value : ${{ steps.store.outputs.SUCCESS }}
2021-11-29 16:22:28 +01:00
2021-11-27 11:18:56 +01:00
runs :
using : "composite"
steps :
2021-11-27 11:23:14 +01:00
- name : "Check out repository ${{ inputs.repository }}"
uses : actions/checkout@v2
2021-11-29 17:42:43 +01:00
if : ${{ inputs.install-custom == 'true' }}
2021-11-27 11:23:14 +01:00
with :
path : CodeChecker
2021-11-29 17:42:43 +01:00
repository : ${{ inputs.repository }}
2021-11-27 11:23:14 +01:00
ref : ${{ inputs.version }}
2021-11-29 17:42:43 +01:00
- name : "Install LLVM (${{ inputs.llvm-version }})"
2021-11-27 12:34:26 +01:00
id : llvm
2022-03-26 11:09:05 +01:00
if : ${{ inputs.llvm-version != 'ignore' && inputs.report-converter != 'true' }}
2021-11-27 12:34:26 +01:00
env :
2021-11-29 17:42:43 +01:00
IN_LLVM_VERSION : ${{ inputs.llvm-version }}
2021-11-27 12:34:26 +01:00
shell : bash
2021-11-29 17:42:43 +01:00
run : ${{ github.action_path }}/src/get-llvm.sh
2021-11-27 12:34:26 +01:00
2021-11-27 11:23:14 +01:00
- name : "Build and Package CodeChecker"
2021-11-27 12:34:26 +01:00
id : codechecker
2021-11-27 11:23:14 +01:00
env :
2021-11-30 18:21:11 +01:00
CODECHECKER_WILL_USE_WEB_API : ${{ inputs.store == 'true' || inputs.diff == 'true' }}
2021-11-29 17:42:43 +01:00
IN_INSTALL_CUSTOM : ${{ inputs.install-custom }}
IN_VERSION : ${{ inputs.version }}
2021-11-27 11:23:14 +01:00
shell : bash
2021-11-27 11:18:56 +01:00
run : |
2021-11-29 17:42:43 +01:00
set -x
if [[ "$IN_INSTALL_CUSTOM" == "true" ]]; then
${{ github.action_path }}/src/build-codechecker.sh
2021-11-27 11:23:14 +01:00
else
2021-11-29 17:42:43 +01:00
${{ github.action_path }}/src/pip-codechecker.sh
2021-11-27 11:23:14 +01:00
fi
2021-11-28 10:34:05 +01:00
- name : "Prepare JSON Compilation Database"
2021-11-28 14:31:07 +01:00
id : log
2022-03-26 11:09:05 +01:00
if : ${{ inputs.report-converter != 'true' }}
2021-11-28 10:34:05 +01:00
env :
2021-11-28 14:31:07 +01:00
ACTION_NAME : ${{ github.action }}
2021-11-28 10:34:05 +01:00
CODECHECKER_PATH : ${{ steps.codechecker.outputs.PATH }}
IN_LOGFILE : ${{ inputs.logfile }}
IN_COMMAND : ${{ inputs.build-command }}
2021-11-28 14:31:07 +01:00
OUT_FILE : ${{ github.workspace }}/${{ github.action }}_codechecker_compilation_database.json
2021-11-28 10:34:05 +01:00
shell : bash
run : ${{ github.action_path }}/src/get-or-create-build-json.sh
2021-11-28 14:31:07 +01:00
2022-03-26 11:09:05 +01:00
- name : "Execute static analysis for C/C++"
2021-11-28 14:31:07 +01:00
id : analyze
2022-03-26 11:09:05 +01:00
if : ${{ inputs.report-converter != 'true' }}
2021-11-28 14:31:07 +01:00
env :
CODECHECKER_PATH : ${{ steps.codechecker.outputs.PATH }}
COMPILATION_DATABASE : ${{ steps.log.outputs.COMPILATION_DATABASE }}
2021-11-30 18:21:11 +01:00
GITHUB_ACTION_NAME : ${{ github.action }}
2021-11-28 14:31:07 +01:00
IN_CONFIGFILE : ${{ inputs.config }}
IN_CTU : ${{ inputs.ctu }}
2021-12-03 12:02:53 +01:00
IN_IGNORE_CRASHES : ${{ inputs.ignore-analyze-crashes }}
2021-11-28 14:31:07 +01:00
IN_OUTPUT_DIR : ${{ inputs.analyze-output }}
shell : bash
run : ${{ github.action_path }}/src/execute-analysis.sh
2021-11-28 15:50:11 +01:00
2022-03-26 11:09:05 +01:00
- name : "Perform report-converter"
id : report-convert
if : ${{ inputs.report-converter == 'true' }}
env :
CODECHECKER_PATH : ${{ steps.codechecker.outputs.PATH }}
GITHUB_ACTION_NAME : ${{ github.action }}
IN_ORIGINAL_ANALYSER : ${{ inputs.original-analyser }}
IN_ORIGINAL_ANALYSIS_OUTPUT : ${{ inputs.original-analysis-output }}
IN_IGNORE_CRASHES : ${{ inputs.ignore-analyze-crashes }}
IN_OUTPUT_DIR : ${{ inputs.analyze-output }}
shell : bash
run : ${{ github.action_path }}/src/report-converter.sh
# This step is needed because it is forbidden to reuse the 'id' of a step,
# even if the two steps taking the same 'id' are mutually exclusive.
- name : "(Internal: set output variables for steps after analyze/convert)"
id : analyze-or-report
shell : bash
run : |
if [[ ! -z "$CODECHECKER_ACTION_DEBUG" ]]; then
set -x
fi
if [[ "${{ inputs.report-converter }}" != "true" ]]
then
echo "::set-output name=OUTPUT_DIR::${{ steps.analyze.outputs.OUTPUT_DIR }}"
else
echo "::set-output name=OUTPUT_DIR::${{ steps.report-convert.outputs.OUTPUT_DIR }}"
fi
- name : "Parse and convert results to HTML"
2021-11-28 15:50:11 +01:00
id : parse
env :
PROJECT_PATH : ${{ github.workspace }}
CODECHECKER_PATH : ${{ steps.codechecker.outputs.PATH }}
2022-03-26 11:09:05 +01:00
RAW_RESULT_DIR : ${{ steps.analyze-or-report.outputs.OUTPUT_DIR }}
2021-11-28 15:50:11 +01:00
IN_CONFIGFILE : ${{ inputs.config }}
shell : bash
run : ${{ github.action_path }}/src/parse-results.sh
2021-11-30 18:21:11 +01:00
- name : "Generate the configuration for diffing current results against previously stored"
id : diff-pre
if : ${{ inputs.diff == 'true' }}
env :
IN_DIFF_URL : ${{ inputs.diff-url }}
IN_DIFF_USERNAME : ${{ inputs.diff-username }}
IN_DIFF_PASSWORD : ${{ inputs.diff-password }}
IN_DIFF_RUN_NAME : ${{ inputs.diff-run-name }}
GITHUB_BASE_REF : ${{ github.base_ref }}
GITHUB_EVENT_NAME : ${{ github.event_name }}
GITHUB_REPOSITORY : ${{ github.repository }}
GITHUB_REF_NAME : ${{ github.ref_name }}
GITHUB_REF_TYPE : ${{ github.ref_type }}
shell : bash
run : ${{ github.action_path }}/src/diff-pre.sh
- name : "Diff current results against previously stored run"
id : diff
if : ${{ steps.diff-pre.outputs.DIFF_CONFIGURED == 'true' }}
env :
PROJECT_PATH : ${{ github.workspace }}
CODECHECKER_PATH : ${{ steps.codechecker.outputs.PATH }}
CODECHECKER_DIFF_RUN_NAME : ${{ steps.diff-pre.outputs.RUN_NAME }}
2022-03-26 11:09:05 +01:00
RAW_RESULT_DIR : ${{ steps.analyze-or-report.outputs.OUTPUT_DIR }}
2021-11-30 18:21:11 +01:00
IN_CONFIGFILE : ${{ inputs.config }}
IN_DIFF_URL : ${{ inputs.diff-url }}
shell : bash
run : ${{ github.action_path }}/src/diff.sh
2021-11-29 16:22:28 +01:00
- name : "Generate the configuration for uploading results"
id : store-pre
if : ${{ inputs.store == 'true' }}
env :
IN_STORE_URL : ${{ inputs.store-url }}
IN_STORE_USERNAME : ${{ inputs.store-username }}
IN_STORE_PASSWORD : ${{ inputs.store-password }}
IN_STORE_RUN_NAME : ${{ inputs.store-run-name }}
GITHUB_REPOSITORY : ${{ github.repository }}
GITHUB_REF_NAME : ${{ github.ref_name }}
GITHUB_REF_TYPE : ${{ github.ref_type }}
GITHUB_SHA : ${{ github.sha }}
shell : bash
run : ${{ github.action_path }}/src/store-pre.sh
- name : "Store analysis results to server"
id : store
if : ${{ steps.store-pre.outputs.STORE_CONFIGURED == 'true' }}
env :
PROJECT_PATH : ${{ github.workspace }}
CODECHECKER_PATH : ${{ steps.codechecker.outputs.PATH }}
CODECHECKER_STORE_RUN_NAME : ${{ steps.store-pre.outputs.RUN_NAME }}
CODECHECKER_STORE_RUN_TAG : ${{ steps.store-pre.outputs.RUN_TAG }}
2022-03-26 11:09:05 +01:00
RAW_RESULT_DIR : ${{ steps.analyze-or-report.outputs.OUTPUT_DIR }}
2021-11-29 16:22:28 +01:00
IN_CONFIGFILE : ${{ inputs.config }}
IN_STORE_URL : ${{ inputs.store-url }}
shell : bash
run : ${{ github.action_path }}/src/store.sh