packages/pipeline/src/code_scanner/sonarqube-commands.ts (122 lines of code) (raw):

/*! Copyright [Amazon.com](http://amazon.com/), Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 */ import { SonarCodeScannerProps } from "./sonar-code-scanner"; const cube = (path: string, action: string = "GET", args?: string) => `curl -X ${action} -u $SONARQUBE_TOKEN: "$SONARQUBE_ENDPOINT${path}" ${ args || "" }`; const setupSonarqubeQualityGates = ( defaultProfileOrGateName: string, specificProfileOrGateName?: string ) => [ `export DEFAULT_GATE=\`${cube( `/api/qualitygates/search?gateName=${defaultProfileOrGateName}` )}\``, `export SPECIFIC_GATE=\`${cube( `/api/qualitygates/search?gateName=${specificProfileOrGateName}` )}\``, `if [[ "$(echo $SPECIFIC_GATE | jq .errors)" == "null" && "$(echo $SPECIFIC_GATE | jq '.results | length')" -gt 0 ]]; then export GATE_NAME=${specificProfileOrGateName}; else export GATE_NAME=${defaultProfileOrGateName}; fi`, `${cube( "/api/qualitygates/select?projectKey=$PROJECT_NAME&gateName=$GATE_NAME", "POST" )}`, ]; const setupSonarqubeQualityProfiles = ( defaultProfileOrGateName: string, specificProfileOrGateName?: string ) => [ `export DEFAULT_PROFILE=\`${cube( `/api/qualityprofiles/search?qualityProfile=${defaultProfileOrGateName}` )} | jq .profiles\``, `export SPECIFIC_PROFILE=\`${cube( `/api/qualityprofiles/search?qualityProfile=${specificProfileOrGateName}` )} | jq .profiles\``, `export MERGED_PROFILES=\`jq --argjson arr1 "$DEFAULT_PROFILE" --argjson arr2 "$SPECIFIC_PROFILE" -n '$arr1 + $arr2 | group_by(.language) | map(.[-1])'\``, `echo $MERGED_PROFILES | jq -c '.[]' | while read i; do ${cube( "/api/qualityprofiles/add_project?project=$PROJECT_NAME&language=`echo $i | jq -r .language`&qualityProfile=`echo $i | jq -r .name`", "POST" )}; done`, ]; const setupSonarqubePermissions = (authorizedGroup?: string) => !authorizedGroup ? [] : [ "admin", "codeviewer", "issueadmin", "securityhotspotadmin", "scan", "user", ].map( (p) => `${cube( `/api/permissions/add_group?projectKey=$PROJECT_NAME&groupName=${authorizedGroup}&permission=${p}`, "POST" )}` ); const setupSonarqubeProject = ({ sonarqubeTags, sonarqubeAuthorizedGroup, sonarqubeDefaultProfileOrGateName, sonarqubeSpecificProfileOrGateName, }: SonarCodeScannerProps) => { return [ ...setupSonarqubePermissions(sonarqubeAuthorizedGroup), `${cube( "/api/project_branches/rename?project=$PROJECT_NAME&name=mainline", "POST" )}`, `${cube( `/api/project_tags/set?project=$PROJECT_NAME&tags=${[ sonarqubeAuthorizedGroup, ...(sonarqubeTags || []), ].join(",")}`, "POST" )}`, ...setupSonarqubeQualityProfiles( sonarqubeDefaultProfileOrGateName, sonarqubeSpecificProfileOrGateName ), ...setupSonarqubeQualityGates( sonarqubeDefaultProfileOrGateName, sonarqubeSpecificProfileOrGateName ), ].join(";"); }; export const generateSonarqubeReports = () => [ cube( "/api/bitegarden/report/pdf_issues_breakdown?resource=$PROJECT_NAME&branch=mainline", "GET", "--output reports/prototype-issues-report.pdf" ), cube( "/api/bitegarden/report/pdf?resource=$PROJECT_NAME&branch=mainline", "GET", "--output reports/prototype-executive-report.pdf" ), cube( "/api/security_reports/download?project=$PROJECT_NAME", "GET", "--output reports/prototype-security-report.pdf" ), ]; export const createSonarqubeProject = (props: SonarCodeScannerProps) => [ `CREATE_PROJECT_OUTPUT=\`${cube( "/api/projects/create?name=$PROJECT_NAME&project=$PROJECT_NAME&visibility=private", "POST" )}\``, `if [[ "$(echo $CREATE_PROJECT_OUTPUT | jq .errors)" == "null" ]]; then ${setupSonarqubeProject( props )}; fi;`, ]; export const sonarqubeScanner = (excludeGlobsForScan?: string[]) => [ "npx sonarqube-scanner -Dsonar.login=$SONARQUBE_TOKEN", "-Dsonar.projectKey=$PROJECT_NAME", "-Dsonar.projectName=$PROJECT_NAME", "-Dsonar.projectVersion=`echo $RESOLVED_SOURCE_VERSION | cut -c1-7`", "-Dsonar.branch.name=mainline", "-Dsonar.host.url=$SONARQUBE_ENDPOINT", "-Dsonar.cfn.nag.reportFiles=reports/cfn-nag-report.json", "-Dsonar.dependencyCheck.htmlReportPath=reports/dependency-check-report.html", "-Dsonar.javascript.lcov.reportPaths=**/coverage/lcov.info", "-Dsonar.clover.reportPath=**/coverage/clover.xml", `-Dsonar.exclusions="**/reports/**,**/coverage/**${ excludeGlobsForScan ? `,${excludeGlobsForScan.join(",")}` : "" }"`, "-Dsonar.sources=.", ].join(" ");