generate-badges.groovy (134 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import groovy.xml.XmlParser import groovy.util.Node import groovy.json.JsonSlurper import groovy.yaml.YamlSlurper /* groovylint-disable JavaIoPackageAccess */ ArrayList calculateBadges(Map project) { def badges = [] if (getStatus("https://ci-builds.apache.org/job/Sling/job/modules/job/sling-${project.folder}/job/master/badge/icon") != 404) { println 'Adding build status badge...' badges.add(" [![Build Status](https://ci-builds.apache.org/job/Sling/job/modules/job/sling-${project.folder}/job/master/badge/icon)](https://ci-builds.apache.org/job/Sling/job/modules/job/sling-${project.folder}/job/master/)") } if (responseValid("https://img.shields.io/jenkins/tests.svg?jobUrl=https://ci-builds.apache.org/job/Sling/job/modules/job/sling-${project.folder}/job/master/")) { println 'Adding test status badge...' badges.add(" [![Test Status](https://img.shields.io/jenkins/tests.svg?jobUrl=https://ci-builds.apache.org/job/Sling/job/modules/job/sling-${project.folder}/job/master/)](https://ci-builds.apache.org/job/Sling/job/modules/job/sling-${project.folder}/job/master/test/?width=800&height=600)") } if (responseValid("https://sonarcloud.io/api/project_badges/measure?project=apache_sling-${project.folder}&metric=coverage")) { println 'Adding coverage status badge...' badges.add(" [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=apache_sling-${project.folder}&metric=coverage)](https://sonarcloud.io/dashboard?id=apache_sling-${project.folder})") } if (responseValid("https://sonarcloud.io/api/project_badges/measure?project=apache_sling-${project.folder}&metric=alert_status")) { println 'Adding quality status badge...' badges.add(" [![Sonarcloud Status](https://sonarcloud.io/api/project_badges/measure?project=apache_sling-${project.folder}&metric=alert_status)](https://sonarcloud.io/dashboard?id=apache_sling-${project.folder})") } if (project.artifactId) { if (getStatus("https://www.javadoc.io/badge/org.apache.sling/${project.artifactId}.svg") != 404) { println 'Adding JavaDoc badge...' badges.add(" [![JavaDoc](https://www.javadoc.io/badge/org.apache.sling/${project.artifactId}.svg)](https://www.javadoc.io/doc/org.apache.sling/${project.artifactId})") } if (responseValid("https://maven-badges.herokuapp.com/maven-central/org.apache.sling/${project.artifactId}/badge.svg")) { println 'Adding Maven release badge...' badges.add(" [![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.apache.sling/${project.artifactId}/badge.svg)](https://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.apache.sling%22%20a%3A%22${project.artifactId}%22)") } } if (project.contrib) { println 'Adding contrib status badge...' badges.add(' [![Contrib](https://sling.apache.org/badges/status-contrib.svg)](https://github.com/apache/sling-aggregator/blob/master/docs/status/contrib.md)') } if (project.deprecated) { println 'Adding deprecated status badge...' badges.add(' [![Deprecated](https://sling.apache.org/badges/status-deprecated.svg)](https://github.com/apache/sling-aggregator/blob/master/docs/status/deprecated.md)') } if (project.group) { println 'Adding group badge...' badges.add(" [![${project.group}](https://sling.apache.org/badges/group-${project.group}.svg)](https://github.com/apache/sling-aggregator/blob/master/docs/groups/${project.group}.md)") } return badges } String getProjectGroup(String repoName, File aggregatorDir) { println 'Loading manifest...' manifest = new XmlParser().parseText(new File(aggregatorDir, 'default.xml').text) def groupNode = projectGroup = manifest.project.find { it.@path == repoName } if (groupNode != null) { def groupName = groupNode['@groups'] if (groupName != null) { println "Using Group: ${groupName}" return groupName } } return '' } int getStatus(String url) { def get = new URL(url).openConnection() get.setRequestProperty('User-Agent', 'curl/7.35.0') def rc = get.getResponseCode() println 'Retrieved status ' + rc + ' from ' + url return rc } Map parseMavenPom(File projectFolder, File aggregatorDir) { File pomFile = new File(projectFolder, 'pom.xml') String repoName = projectFolder.name println "Fetching from ${projectFolder}..." println 'Reading status lists...' String[] contrib = new File(aggregatorDir, 'contrib-projects.txt').text.split('\\n') assert contrib if (!pomFile.exists()) { return null } println 'Parsing pom.xml...' Node pom = new XmlParser().parseText(pomFile.text) Map project = [:] project['artifactId'] = pom.artifactId.text() project['name'] = pom.name.text() if (!project['name']) { project['name'] = repoName } project['description'] = pom.description.text().replace('\n', ' ') project['group'] = getProjectGroup(repoName, aggregatorDir) project['folder'] = repoName project['projectVersion'] = pom.version.text() project['parentVersion'] = pom.parent.version.text() project['javaVersion'] = pom.properties["sling.java.version"].text() if (contrib.contains(repoName)) { println 'Setting project status to contrib...' project['contrib'] = true } // parse .sling-module.json project['buildJdks'] = '' File slingModuleFile = new File(projectFolder, '.sling-module.json') if (slingModuleFile.exists()) { def jsonParser = new JsonSlurper() def slingModule = jsonParser.parse(slingModuleFile) if (slingModule.jenkins.jdks) { project['buildJdks'] = slingModule.jenkins.jdks } } // parse .asf.yaml File asfYamlFile = new File(projectFolder, '.asf.yaml') if (asfYamlFile.exists()) { def yamlParser = new YamlSlurper() def asfYaml = yamlParser.parse(asfYamlFile) def labels = asfYaml.github.labels if (labels && labels.contains("deprecated")) { println 'Setting project status to deprecated...' project['deprecated'] = true } } return project } boolean responseValid(String url) { def get = new URL(url).openConnection() get.setRequestProperty('User-Agent', 'curl/7.35.0') int rc = get.responseCode if (rc == 200) { println "Retrieved valid response code ${rc} from ${url}" String text = get.inputStream.text if (text.contains('inaccessible') || text.contains('not found') || text.contains('not been found') || text.contains('invalid') || text.contains('unknown') || text.contains('no tests found')) { println "Retrieved invalid response from ${url}" return false } return true } println "Retrieved invalid response code ${rc} from ${url}" return false }