SARIF pro Repository
GET /api/v1/repositories/{repositoryUrl}/sarif
Dieser Endpunkt wird mit der vollständigen Repository-URL parametrisiert. Die Repository-URL ist die URL des zu scannenden Repositorys.
Die URL muss URL-encodiert sein
(https://gitlab.opencode.de/zendis-repo-scanner
→ https%3A%2F%2Fgitlab.opencode.de%2Fzendis-repo-scanner
).
Die Verwendung dieses Formats eröffnet die Möglichkeit, Repositorys von anderen Plattformen wie GitHub, Bitbucket usw. zu scannen. Außerdem wird das Caching vereinfacht, da die URL eindeutig ist (anstatt beispielsweise die Projekt-ID und eine Plattform-URL als Query-String zu verwenden) und die URL zumindest nach der URL-Dekodierung für Menschen lesbar ist. Dies könnte in Zukunft die Fehlerbehebung verbessern.
Die Antwort der API ist im SARIF format. SARIF vereinfacht eine mögliche spätere Integration mit anderen Tools. Es handelt sich um einen offenen Standard, der breite Unterstützung findet.
Beispiel Anfrage
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
url := "https://badgeapi.opencode.de/api/v1/repositories/https%3A%2F%2Fgitlab.opencode.de%2Fzendis-repo-scanner/sarif"
resp, err := http.Get(url)
if err != nil {
fmt.Println("Error:", err)
return
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}
Beispiel Antwort
{
"$schema": "https://www.schemastore.org/schemas/json/sarif-2.1.0.json",
"runs": [
{
"properties": {
"badges": [
{
"badgeName": "Badge fĂĽr aktive Wartung",
"badgeId": "maintained",
"badgeLevel": "bronze",
"badgeUrl": "/api/v1/svg/ac91ddb24a6ab5551c5aa4b1e043e218.svg",
"badgeGranted": true,
"badgeInformationUri": "",
"isHighestGrantedBadge": false,
"badgeExplanation": {
"criteria": [
{
"description": "Mindestens 5 Commits",
"value": "384",
"status": "pass",
"ruleId": "COMMITS:6",
"threshold": {
"min": 5,
"timeRangeInMonths": 6
},
"badgeId": "maintained",
"badgeLevel": "bronze",
"evidence": "In den letzten 6 Monaten wurden 384 Commit(s) erstellt."
},
{
"description": "Reaktionszeit bei Issues in den letzten drei Monaten liegt unter 7 Tagen",
"value": "\u003cnil\u003e",
"status": "open",
"ruleId": "ISSUE_REACTION_TIME:3",
"threshold": {
"max": 7,
"timeRangeInMonths": 3
},
"badgeId": "maintained",
"badgeLevel": "bronze",
"evidence": "In den letzten 3 Monaten wurden keine Tickets/Issues erstellt (alle Tickets/Issues stammen von Projektmitgliedern)."
}
]
},
"badgeDescription": "Das Projekt erfĂĽllt die Mindestanforderungen fĂĽr ein gewartetes Projekt. Es wird weiterentwickelt und auf Probleme wird schnell reagiert."
},
{
"badgeName": "Badge fĂĽr aktive Wartung",
"badgeId": "maintained",
"badgeLevel": "silver",
"badgeUrl": "/api/v1/svg/0866611c9c3c566159c534803961b01c.svg",
"badgeGranted": true,
"badgeInformationUri": "",
"isHighestGrantedBadge": true,
"badgeExplanation": {
"criteria": [
{
"description": "Mindestens 5 Commits",
"value": "384",
"status": "pass",
"ruleId": "COMMITS:6",
"threshold": {
"min": 5,
"timeRangeInMonths": 6
},
"badgeId": "maintained",
"badgeLevel": "bronze",
"evidence": "In den letzten 6 Monaten wurden 384 Commit(s) erstellt."
},
{
"description": "Reaktionszeit bei Issues in den letzten drei Monaten liegt unter 7 Tagen",
"value": "\u003cnil\u003e",
"status": "open",
"ruleId": "ISSUE_REACTION_TIME:3",
"threshold": {
"max": 7,
"timeRangeInMonths": 3
},
"badgeId": "maintained",
"badgeLevel": "bronze",
"evidence": "In den letzten 3 Monaten wurden keine Tickets/Issues erstellt (alle Tickets/Issues stammen von Projektmitgliedern)."
},
{
"description": "Mindestens 1 Veröffentlichung in den letzten 6 Monaten",
"value": "11",
"status": "pass",
"ruleId": "RELEASES:6",
"threshold": {
"min": 1,
"timeRangeInMonths": 6
},
"badgeId": "maintained",
"badgeLevel": "silver",
"evidence": "In den letzten 6 Monaten wurden 11 Tags/Releases gefunden. (11 Tag(s) von denen 1 als Release veröffentlicht worden sind)."
}
]
},
"badgeDescription": "Das Projekt erfüllt die Anforderungen für ein verlässlich gewartetes Projekt. Es werden regelmäßig neue Versionen veröffentlicht, auf Probleme wird schnell reagiert und es gibt eine aktive Community."
},
{
"badgeName": "Badge fĂĽr aktive Wartung",
"badgeId": "maintained",
"badgeLevel": "gold",
"badgeUrl": "/api/v1/svg/c34e637c77fea4b8bfb06750cb588ec8.svg",
"badgeGranted": false,
"badgeInformationUri": "",
"isHighestGrantedBadge": false,
"badgeExplanation": {
"criteria": [
{
"description": "Mindestens 5 Commits",
"value": "384",
"status": "pass",
"ruleId": "COMMITS:6",
"threshold": {
"min": 5,
"timeRangeInMonths": 6
},
"badgeId": "maintained",
"badgeLevel": "bronze",
"evidence": "In den letzten 6 Monaten wurden 384 Commit(s) erstellt."
},
{
"description": "Reaktionszeit bei Issues in den letzten drei Monaten liegt unter 7 Tagen",
"value": "\u003cnil\u003e",
"status": "open",
"ruleId": "ISSUE_REACTION_TIME:3",
"threshold": {
"max": 7,
"timeRangeInMonths": 3
},
"badgeId": "maintained",
"badgeLevel": "bronze",
"evidence": "In den letzten 3 Monaten wurden keine Tickets/Issues erstellt (alle Tickets/Issues stammen von Projektmitgliedern)."
},
{
"description": "Mindestens 1 Veröffentlichung in den letzten 6 Monaten",
"value": "11",
"status": "pass",
"ruleId": "RELEASES:6",
"threshold": {
"min": 1,
"timeRangeInMonths": 6
},
"badgeId": "maintained",
"badgeLevel": "silver",
"evidence": "In den letzten 6 Monaten wurden 11 Tags/Releases gefunden. (11 Tag(s) von denen 1 als Release veröffentlicht worden sind)."
},
{
"description": "Bus-Faktor von mindestens 2 im Zeitraum von 6 Monaten",
"value": "1",
"status": "fail",
"ruleId": "CONTRIBUTOR_ABSENCE_FACTOR:6",
"threshold": {
"min": 2,
"timeRangeInMonths": 6
},
"badgeId": "maintained",
"badgeLevel": "gold",
"evidence": "Der Busfaktor ist: 1. D.h. die 1 aktivsten Contributor(s) ist/sind fĂĽr mehr als 50% aller Commits in den letzten 6 Monaten verantwortlich.\n\nInsgesamt haben 9 Contributors an dem Projekt mitgewirkt.\n\nE-Mails der Contributors:\n- t**.*****n@l*******e.com: 48 Commit(s)\n- d****.*****r@l*******e.com: 87 Commit(s)\n- b*****.**m@g***l.com: 196 Commit(s)\n- J*****.*******r@z****s.de: 1 Commit(s)\n- j*******.******r@z****s.de: 2 Commit(s)\n- r*****.*****o@h*****l.com: 10 Commit(s)\n- k**************n@g***l.com: 9 Commit(s)\n- s********.******e@l*******e.com: 30 Commit(s)\n- m***c@w*********s.com: 1 Commit(s)."
}
]
},
"badgeDescription": "Das Projekt erfüllt die Anforderungen für ein kriesensicher-gewartetes Projekt. Es werden regelmäßig neue Versionen veröffentlicht, auf Probleme wird schnell reagiert und es gibt eine breit aufgestellte und aktive Community."
},
{
"badgeName": "Nachnutzungs Badge",
"badgeId": "reused",
"badgeLevel": "bronze",
"badgeUrl": "/api/v1/svg/bfc6ef52e87f9df391c13fd66280fac2.svg",
"badgeGranted": true,
"badgeInformationUri": "",
"isHighestGrantedBadge": false,
"badgeExplanation": {
"criteria": [
{
"description": "Veröffentlichung von mindestens einem Paket in den letzten 6 Monaten",
"value": "328",
"status": "pass",
"ruleId": "PACKAGES:6",
"threshold": {
"min": 1,
"timeRangeInMonths": 6
},
"badgeId": "reused",
"badgeLevel": "bronze",
"evidence": "Container tags: 327, Packages: 0, Releases mit angehängten Dateien: 1."
},
{
"description": "Mindestens eine erfolgreiche CI-Pipeline in den letzten 6 Monaten",
"value": "400",
"status": "pass",
"ruleId": "CI_PIPELINES:6",
"threshold": {
"min": 1,
"timeRangeInMonths": 6
},
"badgeId": "reused",
"badgeLevel": "bronze",
"evidence": "In den letzten 6 Monaten wurden 400 CI-Pipeline(s) ausgefĂĽhrt (davon waren 277 erfolgreich)."
}
]
},
"badgeDescription": "Das Projekt erfĂĽllt die Anforderungen fĂĽr eine Nachnutzung. Es werden Pakete fĂĽr die weitere Verwendung bereitgestellt."
},
{
"badgeName": "Nachnutzungs Badge",
"badgeId": "reused",
"badgeLevel": "silver",
"badgeUrl": "/api/v1/svg/38cfe47fa8fddb371b650fd6702063e1.svg",
"badgeGranted": true,
"badgeInformationUri": "",
"isHighestGrantedBadge": true,
"badgeExplanation": {
"criteria": [
{
"description": "Mindestens eine aktive Nachnutzung",
"value": "1",
"status": "pass",
"ruleId": "SUBSEQUENT_USE",
"threshold": {
"min": 1
},
"badgeId": "reused",
"badgeLevel": "silver",
"evidence": "Das Projekt wird 1 mal nachgenutzt."
}
]
},
"badgeDescription": "Das Projekt wird von mind. 1 Person produktiv genutzt."
},
{
"badgeName": "Nachnutzungs Badge",
"badgeId": "reused",
"badgeLevel": "gold",
"badgeUrl": "/api/v1/svg/c0322ef8a4c844597e2ca94812aff649.svg",
"badgeGranted": false,
"badgeInformationUri": "",
"isHighestGrantedBadge": false,
"badgeExplanation": {
"criteria": [
{
"description": "Mindestens eine aktive Nachnutzung",
"value": "1",
"status": "pass",
"ruleId": "SUBSEQUENT_USE",
"threshold": {
"min": 1
},
"badgeId": "reused",
"badgeLevel": "silver",
"evidence": "Das Projekt wird 1 mal nachgenutzt."
},
{
"description": "Mindestens 10 aktive Nachnutzungen",
"value": "1",
"status": "fail",
"ruleId": "SUBSEQUENT_USE",
"threshold": {
"min": 10
},
"badgeId": "reused",
"badgeLevel": "gold",
"evidence": "Das Projekt wird 1 mal nachgenutzt."
}
]
},
"badgeDescription": "Das Projekt wird von mind. 10 Personen produktiv genutzt."
},
{
"badgeName": "Open-Source-Badge",
"badgeId": "open-source",
"badgeLevel": "gold",
"badgeUrl": "/api/v1/svg/ff5e031b4839932510c7af3507d54616.svg",
"badgeGranted": true,
"badgeInformationUri": "",
"isHighestGrantedBadge": true,
"badgeExplanation": {
"criteria": [
{
"description": "PrĂĽft, ob ein Projekt Open Source ist. Diese PrĂĽfung wird manuell vom Open-Code-Team vorgenommen.",
"value": "1",
"status": "pass",
"ruleId": "MANUAL:open-source",
"threshold": {},
"badgeId": "open-source",
"badgeLevel": "gold",
"evidence": "Erfolgreiche Prüfung durch Regulären Ausdruck (Regex) (^https://gitlab\\.opencode\\.de.*)."
}
]
},
"badgeDescription": "Das Projekt ist Open Source."
}
],
"isMirrored": false,
"testedRepository": "https://gitlab.opencode.de/open-code/badgebackend/badge-api"
},
"results": [
{
"kind": "pass",
"message": {
"text": "Mindestens 5 Commits"
},
"properties": {
"badgeId": "maintained",
"badgeLevel": "bronze",
"evidence": "In den letzten 6 Monaten wurden 384 Commit(s) erstellt.",
"threshold": {
"min": 5,
"timeRangeInMonths": 6
},
"value": "384"
},
"ruleId": "COMMITS:6",
"ruleIndex": 0
},
{
"kind": "open",
"message": {
"text": "Reaktionszeit bei Issues in den letzten drei Monaten liegt unter 7 Tagen"
},
"properties": {
"badgeId": "maintained",
"badgeLevel": "bronze",
"evidence": "In den letzten 3 Monaten wurden keine Tickets/Issues erstellt (alle Tickets/Issues stammen von Projektmitgliedern).",
"threshold": {
"max": 7,
"timeRangeInMonths": 3
},
"value": "\u003cnil\u003e"
},
"ruleId": "ISSUE_REACTION_TIME:3",
"ruleIndex": 1
},
{
"kind": "pass",
"message": {
"text": "Mindestens 1 Veröffentlichung in den letzten 6 Monaten"
},
"properties": {
"badgeId": "maintained",
"badgeLevel": "silver",
"evidence": "In den letzten 6 Monaten wurden 11 Tags/Releases gefunden. (11 Tag(s) von denen 1 als Release veröffentlicht worden sind).",
"threshold": {
"min": 1,
"timeRangeInMonths": 6
},
"value": "11"
},
"ruleId": "RELEASES:6",
"ruleIndex": 2
},
{
"kind": "fail",
"message": {
"text": "Bus-Faktor von mindestens 2 im Zeitraum von 6 Monaten"
},
"properties": {
"badgeId": "maintained",
"badgeLevel": "gold",
"evidence": "Der Busfaktor ist: 1. D.h. die 1 aktivsten Contributor(s) ist/sind fĂĽr mehr als 50% aller Commits in den letzten 6 Monaten verantwortlich.\n\nInsgesamt haben 9 Contributors an dem Projekt mitgewirkt.\n\nE-Mails der Contributors:\n- t**.*****n@l*******e.com: 48 Commit(s)\n- d****.*****r@l*******e.com: 87 Commit(s)\n- b*****.**m@g***l.com: 196 Commit(s)\n- J*****.*******r@z****s.de: 1 Commit(s)\n- j*******.******r@z****s.de: 2 Commit(s)\n- r*****.*****o@h*****l.com: 10 Commit(s)\n- k**************n@g***l.com: 9 Commit(s)\n- s********.******e@l*******e.com: 30 Commit(s)\n- m***c@w*********s.com: 1 Commit(s).",
"threshold": {
"min": 2,
"timeRangeInMonths": 6
},
"value": "1"
},
"ruleId": "CONTRIBUTOR_ABSENCE_FACTOR:6",
"ruleIndex": 3
},
{
"kind": "pass",
"message": {
"text": "Veröffentlichung von mindestens einem Paket in den letzten 6 Monaten"
},
"properties": {
"badgeId": "reused",
"badgeLevel": "bronze",
"evidence": "Container tags: 327, Packages: 0, Releases mit angehängten Dateien: 1.",
"threshold": {
"min": 1,
"timeRangeInMonths": 6
},
"value": "328"
},
"ruleId": "PACKAGES:6",
"ruleIndex": 4
},
{
"kind": "pass",
"message": {
"text": "Mindestens eine erfolgreiche CI-Pipeline in den letzten 6 Monaten"
},
"properties": {
"badgeId": "reused",
"badgeLevel": "bronze",
"evidence": "In den letzten 6 Monaten wurden 400 CI-Pipeline(s) ausgefĂĽhrt (davon waren 277 erfolgreich).",
"threshold": {
"min": 1,
"timeRangeInMonths": 6
},
"value": "400"
},
"ruleId": "CI_PIPELINES:6",
"ruleIndex": 5
},
{
"kind": "pass",
"message": {
"text": "Mindestens eine aktive Nachnutzung"
},
"properties": {
"badgeId": "reused",
"badgeLevel": "silver",
"evidence": "Das Projekt wird 1 mal nachgenutzt.",
"threshold": {
"min": 1
},
"value": "1"
},
"ruleId": "SUBSEQUENT_USE",
"ruleIndex": 6
},
{
"kind": "pass",
"message": {
"text": "PrĂĽft, ob ein Projekt Open Source ist. Diese PrĂĽfung wird manuell vom Open-Code-Team vorgenommen."
},
"properties": {
"badgeId": "open-source",
"badgeLevel": "gold",
"evidence": "Erfolgreiche Prüfung durch Regulären Ausdruck (Regex) (^https://gitlab\\.opencode\\.de.*).",
"threshold": {},
"value": "1"
},
"ruleId": "MANUAL:open-source",
"ruleIndex": 7
}
],
"tool": {
"driver": {
"informationUri": "https://gitlab.opencode.de/open-code/badgebackend/badge-api",
"name": "badge-api",
"rules": [
{
"id": "COMMITS:6",
"name": "COMMITS",
"fullDescription": {
"text": "Mindestens 5 Commits"
},
"properties": {
"unit": "commits",
"threshold": {
"min": 5,
"timeRangeInMonths": 6
}
}
},
{
"id": "ISSUE_REACTION_TIME:3",
"name": "ISSUE_REACTION_TIME",
"fullDescription": {
"text": "Reaktionszeit bei Issues in den letzten drei Monaten liegt unter 7 Tagen"
},
"properties": {
"unit": "days",
"threshold": {
"max": 7,
"timeRangeInMonths": 3
}
}
},
{
"id": "RELEASES:6",
"name": "RELEASES",
"fullDescription": {
"text": "Mindestens 1 Veröffentlichung in den letzten 6 Monaten"
},
"properties": {
"unit": "releases",
"threshold": {
"min": 1,
"timeRangeInMonths": 6
}
}
},
{
"id": "CONTRIBUTOR_ABSENCE_FACTOR:6",
"name": "CONTRIBUTOR_ABSENCE_FACTOR",
"fullDescription": {
"text": "Bus-Faktor von mindestens 2 im Zeitraum von 6 Monaten"
},
"properties": {
"unit": "",
"threshold": {
"min": 2,
"timeRangeInMonths": 6
}
}
},
{
"id": "PACKAGES:6",
"name": "PACKAGES",
"fullDescription": {
"text": "Veröffentlichung von mindestens einem Paket in den letzten 6 Monaten"
},
"properties": {
"unit": "packages",
"threshold": {
"min": 1,
"timeRangeInMonths": 6
}
}
},
{
"id": "CI_PIPELINES:6",
"name": "CI_PIPELINES",
"fullDescription": {
"text": "Mindestens eine erfolgreiche CI-Pipeline in den letzten 6 Monaten"
},
"properties": {
"unit": "successful pipeline runs",
"threshold": {
"min": 1,
"timeRangeInMonths": 6
}
}
},
{
"id": "SUBSEQUENT_USE",
"name": "SUBSEQUENT_USE",
"fullDescription": {
"text": "Mindestens eine aktive Nachnutzung"
},
"properties": {
"unit": "usages",
"threshold": {
"min": 1
}
}
},
{
"id": "MANUAL:open-source",
"name": "MANUAL",
"fullDescription": {
"text": "PrĂĽft, ob ein Projekt Open Source ist. Diese PrĂĽfung wird manuell vom Open-Code-Team vorgenommen."
},
"properties": {
"unit": "",
"threshold": {}
}
}
]
}
}
}
],
"version": "2.1.0"
}