Jenkins permette di eseguire inquiry su diverse entità come nodi, pipeline, ecc.. Qui di seguito viene spiegato come effettuare una richiesta di informazioni con l'uso di vbscript.
Ho creato una semplice funzione che lavora insieme ad altre funzioni di utility, che ho scovato in rete, per la trascodifica di testo in base 64. Ci servirà per la basic authentication.
PREREQUISITO
Fondamentale per effettuare le chiamate REST a jenkins è farlo tramite autenticazione. Questa viene espletata tramite una user ed un token che deve essere creato sullo strumento. Il token verrà poi utilizzato come password nella chiamata.
Per la creazione del token quindi accedere alla sezione relativa allo username e selezionare la voce di menù "Configurazione" che si trova direttamente su : http(s)://<JENKINSURL>/user/<USERNAME>/configure
Nella sezione "Token API" è possibile creare un nuovo token tramite "Add new Token" a cui è necessario associare un nome del token (una sorta di label):
Selezionando "Generate" viene generato un codice alfanumerico che rappresenta appunto in nostro token. Questo va salvato subito in quanto non più recuperabile:
questa stringa verrà utilizzata per le chiamate come password dello user.
FUNCTION CODE
'**********************************************************************************************************
'Function to execute REST call to Jenkins and retrieve the response as text
'**********************************************************************************************************
Function JRequest(jHomeURL, endPointClient, strUSR, strPWD, URLProxy, PORTProxy)
'jHomeURL e l'Home di Jenkins, qualcosa come "https://jenkins.company.com"
'endPointClient è l'oggetto della richiesta, l'obiettivo (ad esempio, per lo stato di MYNODE, "/computer/MYNODE/api/json?depth=0")
'URLProxy è l'URL di un eventuale PROXY, se fosse necessario (la foma è questa: "http=proxyname.company.com")
'PORTProxy la porta del proxy (da passare sempre come stringa, esempio: "8787")
'strUSR è lo username da utilizzare per la request
'strPWD è la password (il token di cui prima, vedi PREREQUISITO - "<Jenkins Home URL>/user/<USERNAME>/configure")
Dim strRes : strRes = ""
Dim strURL : strURL = jHomeURL & endPointClient
Dim HttpReq : Set HttpReq = CreateObject("Msxml2.ServerXMLHTTP.6.0")
HttpReq.Open "POST", strURL, False
'Se URLProxy non è vuoto, "", significa che devo utilizzarlo
if len(URLProxy)>0 then
HttpReq.setProxy 2, URLProxy, PORTProxy
end if
HttpReq.setRequestHeader "Authorization", "Basic "& Base64Encode(strUSR &":"& strPWD)
HttpReq.Send
strRes = HttpReq.responseText
Set HttpReq = Nothing
JRequest = strRes
End Function
'**********************************************************************************************************
'**********************************************************************************************************
'Funzione Base64Encode per codificare user and password per la basic authentication
'**********************************************************************************************************
Function Base64Encode(sText)
Dim oXML, oNode
Set oXML = CreateObject("Msxml2.DOMDocument.3.0")
Set oNode = oXML.CreateElement("base64")
oNode.dataType = "bin.base64"
oNode.nodeTypedValue = Stream_StringToBinary(sText)
Base64Encode = oNode.text
Set oNode = Nothing
Set oXML = Nothing
End Function
Private Function Stream_StringToBinary(Text)
Const adTypeText = 2
Const adTypeBinary = 1
Dim BinaryStream 'As New Stream
Set BinaryStream = CreateObject("ADODB.Stream")
BinaryStream.Type = adTypeText
BinaryStream.CharSet = "us-ascii"
BinaryStream.Open
BinaryStream.WriteText Text
BinaryStream.Position = 0
BinaryStream.Type = adTypeBinary
BinaryStream.Position = 0
Stream_StringToBinary = BinaryStream.Read
Set BinaryStream = Nothing
End Function
'*****************************************************************************************
JRequest è la funzione principale per eseguire la chiamata REST a jenkins e recuperare la responseText. Una volta recuparata la risposta come testo è necessario utilizzare le funzioni stringa do le espressioni regolari per estrarre le informazioni che si desidera.
L'esempio riporta come verificare lo stato di un nodo. Per far ciò si può eseguire questo pezzo di codice:
Dim strResponse
strResponse = JRequest("http://MYJENKINS.COMPANY.COM", _
"/computer/MYNODE/api/json?depth=0", _
"MYUSERNAME", _
"MYTOKEN", _
"", _
"")
In questo esempio non faccio uso di un server proxy, infatti gli utili due argomenti sono vuoti.
strResponse sarà qualcosa del genere:
{"_class":"hudson.slaves.SlaveComputer","actions":[{}],"assignedLabels":[{"name":"MYNODE"}],"description":"","displayName":"MYNODE","executors":[{},{}],"icon":"computer-x.png","iconClassName":"icon-computer-x","idle":true,"jnlpAgent":true,"launchSupported":false,"loadStatistics":{"_class":"hudson.model.Label$1"},"manualLaunchAllowed":true,"monitorData":{},"numExecutors":1,"offline":true,"offlineCause":null,"offlineCauseReason":"","oneOffExecutors":[],"temporarilyOffline":false,"absoluteRemotePath":null}
Adesso non basta altro che utilizzare le funzioni di vbscript per la manipolazione di stringhe.