Requisito necessario per scaricare un repository bitbucket aziendale via script prevede di essere in possesso di un token, una sorta di user e password per effettuare la chiamata.
CREAZIONE DEL TOKEN PER CHIAMATE A BITBUCKET
I passi per ottenere il token sono i seguenti
Una volta collegati a bitbucket, accedere al menù contestuale dell'utente e scegliere la voce "Manage account"
comparirà una sezione in cui saranno presenti ulteriori opzioni tra cui "Personal Access Token"
sarà quindi possibile selezionare il pulsante per creare un nuovo token
Si accederà quindi ad un form in cui sarà necessario indicare un nome per il token e il tipo di permessi
Selezionare l'opzione "Automatic expire" a No e confermare la creazione
Comparirà l'informazione del nuovo token creato. Il dato va copiato e salvato in quanto non sarà più possibile recuperarlo come indicato nella figura che segue
Una volta ottenuto il token, siamo in grado di effettuare la chiamata per il download.
L'organizzazione delle informazioni si basa sulla seguente struttura: PROGETTO - REPOSITORY - BRANCH.
Lo script che andremo ad utilizzare dovrà quindi ricevere in input le coordinate per bitbucket e un ulteriore parametro che sarà la folder in cui verrà scaricato il pacchetto (in formato zip).
Codice Script
'Parametri Input: PROGETTO - REPO - BRANCH
'La chiamata sarà:
'https://bitbucket.....com/rest/api/latest/projects/PROGETTO/repos/REPO/archive?at=refs%2Fheads%2FBRANCH&format=zip
Const GIT_ROOT = "https://bitbucket.....com/rest/api/latest/projects/"
Const GIT_REPO_TAG = "/repos/"
Const GIT_ARCH_REF = "/archive?at=refs%2Fheads%2F"
Const GIT_FORMAT = "&format=zip"
Const GITTKN = "MyU3MDkzOTAxNjBvOhldPJ4zUhLoFp1XG0iSKp5zCBRb"
'E' possibile anche usare user e password con la basic authentication. Non è il nostro caso ma lo riporto lo stesso.
'Const GITUSR = "MYUSR"
'Const GITPWD = "MYPWD"
Const RC_OK = 0
Const RC_ERR = 3
Dim StdOut : Set StdOut = WScript.StdOut 'Impostazione Standart Output
Dim uscita : uscita = RC_ERR
if wscript.arguments.count <> 4 then
WriteLine date & " - " & time & " : Arguments number error: "
WriteLine date & " - " & time & " : Arguments expected: PROJECT REPO BRANCH OUT_FOLDER(ex. c:\temp)"
WriteLine date & " - " & time & " : End of Program - Exit Code: " & uscita
set StdOut = nothing
wscript.quit uscita
end if
Dim fso : set fso = CreateObject("Scripting.FileSystemObject")
Dim PROJECT : PROJECT = wscript.arguments(0)
Dim REPO : REPO = wscript.arguments(1)
Dim BRANCH : BRANCH = wscript.arguments(2)
Dim OUT_FOLDER : OUT_FOLDER = wscript.arguments(3)
if right(OUT_FOLDER,1) <> "\" then
OUT_FOLDER = OUT_FOLDER & "\"
end if
Dim intRequest : intRequest = JRequest
if intRequest = 200 Or intRequest = 201 then
WriteLine date & " - " & time & " : DownLoad Repo OK "
uscita = RC_OK
else
WriteLine date & " - " & time & " : Error during download repo - Request Return Code: " & intRequest
end if
WriteLine date & " - " & time & " : End of Program - Exit Code: " & uscita
DistruggiOggetti
wscript.quit uscita
Function JRequest()
Dim strURL
strURL = GIT_ROOT & PROJECT & GIT_REPO_TAG & REPO & GIT_ARCH_REF & BRANCH & GIT_FORMAT
Dim HttpReq : set HttpReq = CreateObject("Msxml2.ServerXMLHTTP.6.0")
Dim bStrm : set bStrm = CreateObject("Adodb.Stream")
WriteLine date & " - " & time & " : REQUEST: " & strURL
HttpReq.Open "GET", strURL, False
'We use the token to do the request previous created in
'bitbucket in the profile section (Menage Account > Personal Access Token)
'With token - just add Authorization Header and the value: "Bearer " + token.
HttpReq.setRequestHeader "Authorization", "Bearer " & GITTKN
'It is also possible to use the user and password for the basic authentication
'With Basic Authentication - There are two function to do a Base 64 Encoding.
'HttpReq.setRequestHeader "Authorization", "Basic "& Base64Encode(GITUSR &":"& GITPWD)
HttpReq.Send
wscript.sleep 60000 'fix wait for a minute
with bStrm
.type = 1 '//binary
.open
.write HttpReq.responseBody
.savetofile OUT_FOLDER & PROJECT & ".zip", 2
end with
strRes = HttpReq.Status
Set HttpReq = Nothing
Set bStrm = Nothing
JRequest = strRes
End Function
'**********************************************************************************************************
'**********************************************************************************************************
'Funzioni a contorno per la codifica di un testo in base64
'**********************************************************************************************************
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
'*********************************************************************************************************************************
'Sub per scrivere Output in linea (standard output)
'*********************************************************************************************************************************
Sub WriteLine(text)
StdOut.WriteLine(text) 'Scrivo l'output
End Sub
'*********************************************************************************************************************************
'*********************************************************************************************************************************
'Distruggi oggetti
'*********************************************************************************************************************************
sub DistruggiOggetti()
set fso = nothing
set StdOut = nothing
End Sub