Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.devfactory.rapidproto.jenkins.rss
- //to use jsoup in gradle add dependency:
- // compile 'org.jsoup:jsoup:1.11.2'
- import org.jsoup.Jsoup
- import org.w3c.dom.Document
- import org.w3c.dom.Element
- import org.w3c.dom.Node
- import org.w3c.dom.NodeList
- import java.io.InputStream
- import java.net.URL
- import java.time.LocalDateTime
- import java.time.format.DateTimeFormatter
- import java.util.*
- import javax.xml.parsers.DocumentBuilderFactory
- data class Entry(val title: String, val updated: LocalDateTime)
- fun main(args: Array<String>) {
- val jenkinsHome = "jenkins_home"
- val user = "user_login"
- val pass = "user_pass" //the actual user password, not the token
- println("Connecting to Jenkins...")
- val inputStream = inputStream(user, pass, jenkinsHome)
- println("Getting jobs from home page...")
- val parsed = Jsoup.parse(inputStream, Charsets.UTF_8.name(), jenkinsHome)
- val jobs = parsed
- .select("table#projectstatus")
- .select("tr.job-status-")
- .eachAttr("id")
- val latest: MutableList<Entry> = mutableListOf()
- for (job in jobs) {
- val jobUrl = job.replace("_", "/")
- println("Parsing job $jobUrl...")
- val entries: MutableList<Entry> = getJobEntries(user, pass, jenkinsHome, jobUrl)
- if (entries.size > 0) latest.add(entries.sortedByDescending { it.updated }.first())
- }
- latest.sortedBy { it.updated }.map { println(it) }
- }
- private fun getJobEntries(user: String, pass: String, jenkinsHome: String,
- jobUrl: String): MutableList<Entry> {
- val feedStream = inputStream(user, pass, "$jenkinsHome/$jobUrl/rssAll")
- val feedXml: Document = DocumentBuilderFactory
- .newInstance()
- .newDocumentBuilder()
- .parse(feedStream).apply {
- documentElement.normalize()
- }
- val entries: MutableList<Entry> = mutableListOf()
- val entryNodes: NodeList = feedXml.getElementsByTagName("entry")
- for (i in 0..entryNodes.length - 1) {
- val entryNode = entryNodes.item(i)
- if (entryNode.nodeType == Node.ELEMENT_NODE) {
- entries.add(entry(entryNode))
- }
- }
- return entries
- }
- private fun entry(entryNode: Node?): Entry {
- val elem = entryNode as Element
- val titleTag = elem.getElementsByTagName("title").item(0).textContent
- val updatedTag = elem.getElementsByTagName("updated").item(0).textContent
- val title = titleTag.substringBefore("#").substringBefore("»").trim()
- val updated = LocalDateTime.parse(updatedTag.dropLast(1),
- DateTimeFormatter.ISO_LOCAL_DATE_TIME)
- return Entry(title = title, updated = updated)
- }
- private fun inputStream(user: String, pass: String,
- url: String): InputStream? {
- val auth = "$user:$pass"
- val encoded = Base64.getEncoder().encodeToString(auth.toByteArray())
- return URL(url).openConnection().apply {
- setRequestProperty("Authorization", "Basic $encoded")
- }.getInputStream()
- }
Add Comment
Please, Sign In to add comment