Skip to content

Instantly share code, notes, and snippets.

@allankp
Last active July 12, 2019 08:17
Show Gist options
  • Save allankp/30d882b031e8b7f74e21a9b70b3cb2a2 to your computer and use it in GitHub Desktop.
Save allankp/30d882b031e8b7f74e21a9b70b3cb2a2 to your computer and use it in GitHub Desktop.
import json
import os
from botocore.vendored import requests
from botocore.vendored.requests.auth import HTTPBasicAuth
import statistics
SONAR_CLOUD_API = "https://sonarcloud.io/api"
ORG_KEY = os.getenv("ORG_KEY") # SonarCloud organisation key
TOKEN = os.getenv("SESSION_TOKEN") # Token obtained from SonarCloud account
def lambda_handler(event, _context) -> dict:
"""
Find metrics for each component and average coverage.
:param event: Unused as not data is passed to handler.
:param context: Unused lambda execution context.
"""
coverage = {}
url = f"{SONAR_CLOUD_API}/measures/component_tree"
for component in get_components():
query = {"component": component, "metricKeys": "coverage"}
response = requests.get(url, params=query, auth=HTTPBasicAuth(TOKEN, ""))
metrics_dict = response.json()
try:
coverage[metrics_dict["baseComponent"]["name"]] = metrics_dict["baseComponent"]["measures"][0]["value"]
except IndexError:
pass # Repos that have no code coverage tsk tsk
average = statistics.mean(float(value) for _, value in coverage.items())
body = json.dumps({'components': coverage, 'average': round(average,2)})
return {
"statusCode": response.status_code,
"body": body,
"headers": {"Content-Type": "application/json"},
"isBase64Encoded": True
}
def get_components() -> list:
"""
Return all components listed under organisation key
return: list containing components
"""
url = f"{SONAR_CLOUD_API}/components/search_projects"
response = requests.get(url, params={"organization": ORG_KEY}, auth=HTTPBasicAuth(TOKEN, ""))
return [component["key"] for component in response.json()["components"]]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment