* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
+import { Link } from '@sonarsource/echoes-react';
import { Dictionary } from 'lodash';
import * as React from 'react';
+import { FormattedMessage } from 'react-intl';
import withAvailableFeatures, {
WithAvailableFeaturesProps,
} from '../../../app/components/available-features/withAvailableFeatures';
+import { DocLink } from '../../../helpers/doc-links';
+import { useDocUrl } from '../../../helpers/docs';
+import { translate } from '../../../helpers/l10n';
import { Feature } from '../../../types/features';
import { Component } from '../../../types/types';
import { CompilationInfo } from '../components/CompilationInfo';
import CreateYmlFile from '../components/CreateYmlFile';
-import { Arch, BuildTools, TutorialConfig } from '../types';
+import { Arch, AutoConfig, BuildTools, TutorialConfig } from '../types';
import { isCFamily } from '../utils';
import { PreambuleYaml } from './PreambuleYaml';
import cFamilyExample from './commands/CFamily';
[BuildTools.Other]: othersExample,
};
+const showJreWarning = (config: TutorialConfig, arch: Arch) => {
+ if (!isCFamily(config.buildTool)) {
+ return false;
+ }
+ if (config.autoConfig === AutoConfig.Automatic) {
+ return false;
+ }
+ return arch === Arch.Arm64;
+};
+
export function AnalysisCommand(props: Readonly<AnalysisCommandProps>) {
const { config, arch, mainBranchName, component } = props;
const branchesEnabled = props.hasFeature(Feature.BranchSupport);
+ const scannerRequirementsUrl = useDocUrl(DocLink.SonarScannerRequirements);
if (!config.buildTool) {
return null;
projectName: component.name,
});
+ const warning = showJreWarning(config, arch) && (
+ <p className="sw-mb-2">
+ <FormattedMessage
+ defaultMessage={translate('onboarding.analysis.sq_scanner.jre_required_warning')}
+ id="onboarding.analysis.sq_scanner.jre_required_warning"
+ values={{
+ link: (
+ <Link to={scannerRequirementsUrl}>
+ {translate('onboarding.analysis.sq_scanner.jre_required_warning.link')}
+ </Link>
+ ),
+ }}
+ />
+ </p>
+ );
+
return (
<>
<PreambuleYaml buildTool={config.buildTool} component={component} />
- <CreateYmlFile yamlFileName="bitbucket-pipelines.yml" yamlTemplate={yamlTemplate} />
+ <CreateYmlFile
+ yamlFileName="bitbucket-pipelines.yml"
+ yamlTemplate={yamlTemplate}
+ warning={warning}
+ />
{isCFamily(config.buildTool) && <CompilationInfo />}
</>
);
- mkdir $HOME/.sonar
- curl -sSLo $HOME/.sonar/build-wrapper-linux-aarch64.zip \${SONAR_HOST_URL}/static/cpp/build-wrapper-linux-aarch64.zip
- unzip -o $HOME/.sonar/build-wrapper-linux-aarch64.zip -d $HOME/.sonar/
- - curl -sSLo $HOME/.sonar/sonar-scanner.zip https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-\${SONAR_SCANNER_VERSION}-linux.zip
+ - curl -sSLo $HOME/.sonar/sonar-scanner.zip https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-\${SONAR_SCANNER_VERSION}.zip
- unzip -o $HOME/.sonar/sonar-scanner.zip -d $HOME/.sonar/
- - export PATH="$PATH:$HOME/.sonar/sonar-scanner-\${SONAR_SCANNER_VERSION}-linux/bin"
+ - export PATH="$PATH:$HOME/.sonar/sonar-scanner-\${SONAR_SCANNER_VERSION}/bin"
- <any step required before running your build, like ./configure>
- $HOME/.sonar/build-wrapper-linux-aarch64/build-wrapper-linux-aarch64 --out-dir bw-output <your clean build command>
- sonar-scanner -Dsonar.cfamily.compile-commands=bw-output/compile_commands.json
- mkdir $HOME/.sonar
- curl -sSLo $HOME/.sonar/build-wrapper-linux-aarch64.zip \${SONAR_HOST_URL}/static/cpp/build-wrapper-linux-aarch64.zip
- unzip -o $HOME/.sonar/build-wrapper-linux-aarch64.zip -d $HOME/.sonar/
- - curl -sSLo $HOME/.sonar/sonar-scanner.zip https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-\${SONAR_SCANNER_VERSION}-linux.zip
+ - curl -sSLo $HOME/.sonar/sonar-scanner.zip https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-\${SONAR_SCANNER_VERSION}.zip
- unzip -o $HOME/.sonar/sonar-scanner.zip -d $HOME/.sonar/
- - export PATH="$PATH:$HOME/.sonar/sonar-scanner-\${SONAR_SCANNER_VERSION}-linux/bin"
+ - export PATH="$PATH:$HOME/.sonar/sonar-scanner-\${SONAR_SCANNER_VERSION}/bin"
- <any step required before running your build, like ./configure>
- $HOME/.sonar/build-wrapper-linux-aarch64/build-wrapper-linux-aarch64 --out-dir bw-output <your clean build command>
- sonar-scanner -Dsonar.cfamily.compile-commands=bw-output/compile_commands.json
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-import { AutoConfig, BuildTools } from '../../types';
-import { getBuildWrapperExecutableLinux, getBuildWrapperFolderLinux } from '../../utils';
+import { AutoConfig, BuildTools, OSs } from '../../types';
+import {
+ getBuildWrapperExecutableLinux,
+ getBuildWrapperFolderLinux,
+ getScannerUrlSuffix,
+} from '../../utils';
import { BuildToolExampleBuilder } from '../AnalysisCommand';
import othersExample from './Others';
}
const buildWrapperExecutable = getBuildWrapperExecutableLinux(arch);
const buildWrapperFolder = getBuildWrapperFolderLinux(arch);
+ const scannerSuffix = getScannerUrlSuffix(OSs.Linux, arch);
return `image: <image ready for your build toolchain>
definitions:
- mkdir $HOME/.sonar
- curl -sSLo $HOME/.sonar/${buildWrapperFolder}.zip \${SONAR_HOST_URL}/static/cpp/${buildWrapperFolder}.zip
- unzip -o $HOME/.sonar/${buildWrapperFolder}.zip -d $HOME/.sonar/
- - curl -sSLo $HOME/.sonar/sonar-scanner.zip https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-\${SONAR_SCANNER_VERSION}-linux.zip
+ - curl -sSLo $HOME/.sonar/sonar-scanner.zip https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-\${SONAR_SCANNER_VERSION}${scannerSuffix}.zip
- unzip -o $HOME/.sonar/sonar-scanner.zip -d $HOME/.sonar/
- - export PATH="$PATH:$HOME/.sonar/sonar-scanner-\${SONAR_SCANNER_VERSION}-linux/bin"
+ - export PATH="$PATH:$HOME/.sonar/sonar-scanner-\${SONAR_SCANNER_VERSION}${scannerSuffix}/bin"
- <any step required before running your build, like ./configure>
- $HOME/.sonar/${buildWrapperFolder}/${buildWrapperExecutable} --out-dir bw-output <your clean build command>
- sonar-scanner -Dsonar.cfamily.compile-commands=bw-output/compile_commands.json
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-import { ClipboardIconButton, CodeSnippet, NumberedListItem } from 'design-system';
+import { ClipboardIconButton, CodeSnippet, FlagMessage, NumberedListItem } from 'design-system';
import * as React from 'react';
import { FormattedMessage } from 'react-intl';
import { translate } from '../../../helpers/l10n';
import { InlineSnippet } from './InlineSnippet';
export interface CreateYmlFileProps {
+ warning?: React.ReactNode;
yamlFileName: string;
yamlTemplate: string;
}
-export default function CreateYmlFile(props: CreateYmlFileProps) {
- const { yamlTemplate, yamlFileName } = props;
+export default function CreateYmlFile(props: Readonly<CreateYmlFileProps>) {
+ const { yamlTemplate, yamlFileName, warning } = props;
return (
<NumberedListItem>
<FormattedMessage
),
}}
/>
+ {warning && (
+ <div>
+ <FlagMessage className="sw-mt-2 sw-w-abs-600" variant="warning">
+ {warning}
+ </FlagMessage>
+ </div>
+ )}
<CodeSnippet className="sw-p-6 sw-overflow-auto" snippet={yamlTemplate} language="yml" />
</NumberedListItem>
);
arch?: Arch;
config: TutorialConfig;
hasCLanguageFeature: boolean;
+ isLocal: boolean;
os?: OSs;
setArch: (arch: Arch) => void;
setConfig: (config: TutorialConfig) => void;
}
export function BuildToolForm(props: Readonly<Props>) {
- const { config, setConfig, os, setOs, arch, setArch, hasCLanguageFeature } = props;
+ const { config, setConfig, os, setOs, arch, setArch, isLocal, hasCLanguageFeature } = props;
function handleConfigChange(newConfig: TutorialConfig) {
const selectOsByDefault = (newConfig.buildTool === BuildTools.Cpp ||
titleLabelKey="onboarding.build.other.os"
/>
)}
- {shouldShowArchSelector(os, config) && (
+ {shouldShowArchSelector(os, config, !isLocal) && (
<RenderOptions
label={translate('onboarding.build.other.architecture')}
checked={arch}
<div className="sw-pb-4">
<BuildToolForm
config={config}
+ isLocal={isLocal}
setConfig={setConfig}
os={os}
setOs={setOs}
// C++ - Automatic
await user.click(ui.cppBuildButton.get());
await user.click(ui.linuxButton.get());
+ expect(getCopyToClipboardValue(0, 'Copy')).toMatchSnapshot(
+ 'c++ (automatic) and other linux: download scanner',
+ );
expect(getCopyToClipboardValue(1, 'Copy')).toMatchSnapshot(
'c++ (automatic) and other linux: execute scanner',
);
+ await user.click(ui.arm64Button.get());
+ expect(getCopyToClipboardValue(0, 'Copy')).toMatchSnapshot(
+ 'c++ (automatic) and other linux arm64: download scanner',
+ );
+ expect(getCopyToClipboardValue(1, 'Copy')).toMatchSnapshot(
+ 'c++ (automatic) and other linux arm64: execute scanner',
+ );
await user.click(ui.windowsButton.get());
expect(getCopyToClipboardValue(1, 'Copy')).toMatchSnapshot(
'c++ (automatic) and other windows: execute scanner',
// C++ - Linux (x86_64)
await user.click(ui.autoConfigManual.get());
await user.click(ui.linuxButton.get());
+ await user.click(ui.x86_64Button.get());
expect(getCopyToClipboardValue(0, 'Copy')).toMatchSnapshot(
'c++ (manual) linux: download build wrapper',
);
// Jest Snapshot v1, https://goo.gl/fbAQLP
+exports[`can choose build tools and copy provided settings: c++ (automatic) and other linux arm64: download scanner 1`] = `
+"export SONAR_SCANNER_VERSION=5.0.1.3006
+export SONAR_SCANNER_HOME=$HOME/.sonar/sonar-scanner-$SONAR_SCANNER_VERSION
+curl --create-dirs -sSLo $HOME/.sonar/sonar-scanner.zip https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-$SONAR_SCANNER_VERSION.zip
+unzip -o $HOME/.sonar/sonar-scanner.zip -d $HOME/.sonar/
+export PATH=$SONAR_SCANNER_HOME/bin:$PATH
+export SONAR_SCANNER_OPTS="-server"
+"
+`;
+
+exports[`can choose build tools and copy provided settings: c++ (automatic) and other linux arm64: execute scanner 1`] = `
+"sonar-scanner \\
+ -Dsonar.projectKey=my-project \\
+ -Dsonar.sources=. \\
+ -Dsonar.host.url=http://localhost:9000"
+`;
+
+exports[`can choose build tools and copy provided settings: c++ (automatic) and other linux: download scanner 1`] = `
+"export SONAR_SCANNER_VERSION=5.0.1.3006
+export SONAR_SCANNER_HOME=$HOME/.sonar/sonar-scanner-$SONAR_SCANNER_VERSION-linux
+curl --create-dirs -sSLo $HOME/.sonar/sonar-scanner.zip https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-$SONAR_SCANNER_VERSION-linux.zip
+unzip -o $HOME/.sonar/sonar-scanner.zip -d $HOME/.sonar/
+export PATH=$SONAR_SCANNER_HOME/bin:$PATH
+export SONAR_SCANNER_OPTS="-server"
+"
+`;
+
exports[`can choose build tools and copy provided settings: c++ (automatic) and other linux: execute scanner 1`] = `
"sonar-scanner \\
-Dsonar.projectKey=my-project \\
exports[`can choose build tools and copy provided settings: c++ (manual) linux arm64: download scanner 1`] = `
"export SONAR_SCANNER_VERSION=5.0.1.3006
-export SONAR_SCANNER_HOME=$HOME/.sonar/sonar-scanner-$SONAR_SCANNER_VERSION-linux
-curl --create-dirs -sSLo $HOME/.sonar/sonar-scanner.zip https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-$SONAR_SCANNER_VERSION-linux.zip
+export SONAR_SCANNER_HOME=$HOME/.sonar/sonar-scanner-$SONAR_SCANNER_VERSION
+curl --create-dirs -sSLo $HOME/.sonar/sonar-scanner.zip https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-$SONAR_SCANNER_VERSION.zip
unzip -o $HOME/.sonar/sonar-scanner.zip -d $HOME/.sonar/
export PATH=$SONAR_SCANNER_HOME/bin:$PATH
export SONAR_SCANNER_OPTS="-server"
exports[`can choose build tools and copy provided settings: objective-c linux arm64: download scanner 1`] = `
"export SONAR_SCANNER_VERSION=5.0.1.3006
-export SONAR_SCANNER_HOME=$HOME/.sonar/sonar-scanner-$SONAR_SCANNER_VERSION-linux
-curl --create-dirs -sSLo $HOME/.sonar/sonar-scanner.zip https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-$SONAR_SCANNER_VERSION-linux.zip
+export SONAR_SCANNER_HOME=$HOME/.sonar/sonar-scanner-$SONAR_SCANNER_VERSION
+curl --create-dirs -sSLo $HOME/.sonar/sonar-scanner.zip https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-$SONAR_SCANNER_VERSION.zip
unzip -o $HOME/.sonar/sonar-scanner.zip -d $HOME/.sonar/
export PATH=$SONAR_SCANNER_HOME/bin:$PATH
export SONAR_SCANNER_OPTS="-server"
case BuildTools.Other:
return (
- <Other baseUrl={baseUrl} os={os} component={component} isLocal={isLocal} token={token} />
+ <Other
+ arch={Arch.X86_64}
+ baseUrl={baseUrl}
+ os={os}
+ component={component}
+ isLocal={isLocal}
+ token={token}
+ />
);
case BuildTools.Cpp:
case BuildTools.ObjectiveC:
if (config.buildTool === BuildTools.Cpp && config.autoConfig === AutoConfig.Automatic) {
return (
- <Other os={os} baseUrl={baseUrl} component={component} isLocal={isLocal} token={token} />
+ <Other
+ arch={arch}
+ os={os}
+ baseUrl={baseUrl}
+ component={component}
+ isLocal={isLocal}
+ token={token}
+ />
);
}
return (
token: string;
}
-export default function ClangGCCCustom(props: ClangGCCCustomProps) {
+export default function ClangGCCCustom(props: Readonly<ClangGCCCustomProps>) {
const { os, arch, baseUrl, component, isLocal, token } = props;
return (
<div>
<DownloadBuildWrapper isLocal={isLocal} baseUrl={baseUrl} os={os} arch={arch} />
- <DownloadScanner isLocal={isLocal} os={os} token={token} />
+ <DownloadScanner arch={arch} isLocal={isLocal} os={os} token={token} />
<ExecBuildWrapper os={os} arch={arch} />
<CompilationInfo />
<ExecScanner
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
+import { Link } from '@sonarsource/echoes-react';
import {
ClipboardIconButton,
CodeSnippet,
- Link,
+ FlagMessage,
NumberedList,
NumberedListItem,
SubHeading,
import { useDocUrl } from '../../../../helpers/docs';
import { translate } from '../../../../helpers/l10n';
import { InlineSnippet } from '../../components/InlineSnippet';
-import { OSs } from '../../types';
+import { Arch, OSs } from '../../types';
+import { getScannerUrlSuffix } from '../../utils';
export interface DownloadScannerProps {
+ arch: Arch;
isLocal: boolean;
os: OSs;
token: string;
}
-export default function DownloadScanner(props: DownloadScannerProps) {
- const { os, isLocal, token } = props;
+export default function DownloadScanner(props: Readonly<DownloadScannerProps>) {
+ const { arch, os, isLocal, token } = props;
const docUrl = useDocUrl(DocLink.SonarScanner);
+ const scannerRequirementsUrl = useDocUrl(DocLink.SonarScannerRequirements);
return (
<div className="sw-mb-4">
</p>
) : (
<>
+ {os === OSs.Linux && arch === Arch.Arm64 && (
+ <FlagMessage className="sw-mt-2 sw-w-abs-600" variant="warning">
+ <p className="sw-mb-2">
+ <FormattedMessage
+ defaultMessage={translate('onboarding.analysis.sq_scanner.jre_required_warning')}
+ id="onboarding.analysis.sq_scanner.jre_required_warning"
+ values={{
+ link: (
+ <Link to={scannerRequirementsUrl}>
+ {translate('onboarding.analysis.sq_scanner.jre_required_warning.link')}
+ </Link>
+ ),
+ }}
+ />
+ </p>
+ </FlagMessage>
+ )}
<CodeSnippet
className="sw-p-4"
wrap
language={os === OSs.Windows ? 'powershell' : 'bash'}
- snippet={getRemoteDownloadSnippet(os)}
- render={`<code>${getRemoteDownloadSnippet(os)}</code>`}
+ snippet={getRemoteDownloadSnippet(os, arch)}
+ render={`<code>${getRemoteDownloadSnippet(os, arch)}</code>`}
/>
<SubHeading className="sw-mb-2 sw-mt-4">
{translate('onboarding.analysis.sq_scanner.sonar_token_env.header')}
);
}
-function getRemoteDownloadSnippet(os: OSs) {
+function getRemoteDownloadSnippet(os: OSs, arch: Arch) {
if (os === OSs.Windows) {
return `$env:SONAR_SCANNER_VERSION = "5.0.1.3006"
$env:SONAR_DIRECTORY = [System.IO.Path]::Combine($(get-location).Path,".sonar")
$env:SONAR_SCANNER_OPTS="-server"
`;
}
- const suffix = os === OSs.MacOS ? 'macosx' : 'linux';
+ const suffix = getScannerUrlSuffix(os, arch);
return `export SONAR_SCANNER_VERSION=5.0.1.3006
-export SONAR_SCANNER_HOME=$HOME/.sonar/sonar-scanner-$SONAR_SCANNER_VERSION-${suffix}
-curl --create-dirs -sSLo $HOME/.sonar/sonar-scanner.zip https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-$SONAR_SCANNER_VERSION-${suffix}.zip
+export SONAR_SCANNER_HOME=$HOME/.sonar/sonar-scanner-$SONAR_SCANNER_VERSION${suffix}
+curl --create-dirs -sSLo $HOME/.sonar/sonar-scanner.zip https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-$SONAR_SCANNER_VERSION${suffix}.zip
unzip -o $HOME/.sonar/sonar-scanner.zip -d $HOME/.sonar/
export PATH=$SONAR_SCANNER_HOME/bin:$PATH
export SONAR_SCANNER_OPTS="-server"
*/
import * as React from 'react';
import { Component } from '../../../../types/types';
-import { OSs } from '../../types';
+import { Arch, OSs } from '../../types';
import DownloadScanner from './DownloadScanner';
import ExecScanner from './ExecScanner';
export interface OtherProps {
+ arch: Arch;
baseUrl: string;
component: Component;
isLocal: boolean;
token: string;
}
-export default function Other(props: OtherProps) {
- const { baseUrl, os, component, isLocal, token } = props;
+export default function Other(props: Readonly<OtherProps>) {
+ const { arch, baseUrl, os, component, isLocal, token } = props;
return (
<div>
- <DownloadScanner isLocal={isLocal} os={os} token={token} />
+ <DownloadScanner arch={arch} isLocal={isLocal} os={os} token={token} />
<ExecScanner
baseUrl={baseUrl}
isLocal={isLocal}
return false;
}
-export function shouldShowArchSelector(os: OSs | undefined, config: TutorialConfig) {
+export function shouldShowArchSelector(
+ os: OSs | undefined,
+ config: TutorialConfig,
+ scannerDownloadExplicit = false,
+) {
if (os !== OSs.Linux) {
return false;
}
if (!isCFamily(config.buildTool)) {
return false;
}
+ if (scannerDownloadExplicit) {
+ return true;
+ }
if (config.buildTool === BuildTools.Cpp && config.autoConfig === AutoConfig.Automatic) {
return false;
}
throw new Error(`Unsupported OS: ${os}`);
}
-export const getBuildWrapperFolderLinux = (arch?: Arch) => getBuildWrapperFolder(OSs.Linux, arch);
-export const getBuildWrapperExecutableLinux = (arch?: Arch) =>
- getBuildWrapperExecutable(OSs.Linux, arch);
+export function getBuildWrapperFolderLinux(arch?: Arch) {
+ return getBuildWrapperFolder(OSs.Linux, arch);
+}
+export function getBuildWrapperExecutableLinux(arch?: Arch) {
+ return getBuildWrapperExecutable(OSs.Linux, arch);
+}
+
+export function getScannerUrlSuffix(os: OSs, arch?: Arch) {
+ if (os === OSs.Windows) {
+ return '-windows';
+ }
+ if (os === OSs.MacOS) {
+ return '-macosx';
+ }
+ if (os === OSs.Linux && arch === Arch.X86_64) {
+ return '-linux';
+ }
+ return '';
+}
ServerUpgradeRoadmap = '/setup-and-upgrade/upgrade-the-server/roadmap/',
SonarLintConnectedMode = '/user-guide/sonarlint-connected-mode/',
SonarScanner = '/analyzing-source-code/scanners/sonarscanner/',
+ SonarScannerRequirements = '/analyzing-source-code/scanners/general-requirements/',
SonarScannerDotNet = '/analyzing-source-code/scanners/sonarscanner-for-dotnet/',
SonarScannerGradle = '/analyzing-source-code/scanners/sonarscanner-for-gradle/',
SonarScannerMaven = '/analyzing-source-code/scanners/sonarscanner-for-maven/',
onboarding.analysis.sq_scanner.sonar_token_env.header=Configure a SONAR_TOKEN environment variable in your CI settings
onboarding.analysis.sq_scanner.sonar_token_env.var_name=Add an environment variable called
onboarding.analysis.sq_scanner.sonar_token_env.var_value=Give it the following value
+onboarding.analysis.sq_scanner.jre_required_warning=A compatible Java Runtime Environment is required to run the Scanner on this platform, please refer to {link} for more details.
+onboarding.analysis.sq_scanner.jre_required_warning.link=the documentation
onboarding.analysis.sqscanner.docs.gradle.title=official documentation of the Scanner for Gradle
onboarding.analysis.sqscanner.docs.gradle.example_project.title=live Gradle-based example project