2016-01-29 16 views
12

Sto cercando di creare uno schermo di stato Jenkins completamente automatizzato per la nostra parete dell'ufficio con un Raspberry Pi. Sono stato in grado di configurare il Pi per mostrare un browser con un URL specifico sui TV e configurare lo Build Monitor Plugin in Jenkins con i nostri lavori di compilazione.Jenkins crea monitor wall senza login manuale

Il nostro Jenkins utilizza la sicurezza basata su matrice, quindi ho creato l'utente raspberry separato con i privilegi richiesti. (Dopo l'accesso manualmente il plug parete è mostrata correttamente.)

posso vedere una risposta HTTP valida con il seguente comando:

curl "http://raspberry:[email protected]:8080/view/wall1/" 

0b45...06 è l'API token dell'utente raspberry Jenkins. (Da http://localhost:8080/user/raspberry/configure)

Sfortunatamente questo schema URL non funziona nei browser grafici. Ho anche provato il parametro token senza successo:

$ curl "http://localhost:8080/view/wall1/?token=0b45...06" 
<html><head>...</head><body ...> 


Authentication required 
<!-- 
You are authenticated as: anonymous 
Groups that you are in: 

Permission you need to have (but didn't): hudson.model.Hudson.Read 
... which is implied by: hudson.security.Permission.GenericRead 
... which is implied by: hudson.model.Hudson.Administer 
--> 

</body></html>        

Come posso ottenere un URL che funziona senza effettuare il login nel browser (come Chromium o Midori) e mostra la mia vista Jenkins?

Non desidero alcun passaggio manuale, incluso il login (anche se VNC, ad esempio) poiché non si adatta troppo bene a più uffici/Pis.

+0

Se tutto il resto fallisce, forse è possibile impostare [un proxy che aggiunge le credenziali di autenticazione] (http://serverfault.com/questions/239154/whats-the-easiest-way-to-create-an-http- proxy-which-adds-basic-authentication-t) alle richieste Pi? – approxiblue

+0

@approxiblue: Grazie per il commento! In realtà l'ho fatto esattamente una settimana fa come soluzione, ma spero che esista una soluzione più semplice. – palacsint

risposta

0

Hai provato a usare apiToken?

wget --auth-no-challenge --http-user=user --http-password=apiToken --secure-protocol=TLSv1 http://jenkins.yourcompany.com/job/your_job/build?token=TOKEN 

Il token API è disponibile nella pagina di configurazione personale. Fai clic sul tuo nome nell'angolo in alto a destra in ogni pagina, quindi fai clic su "Configura" per visualizzare il token dell'API.

Funziona sulla mia configurazione con:

http://<URL>/view/BuildMonito/?token=<token> 
+0

Sì, l'ho provato ma non riuscivo a farlo funzionare con un browser, come Chromium o Midori. Wget non è fattibile perché il plugin collegato utilizza le chiamate JSON per aggiornare la pagina senza il ricaricamento completo della pagina. – palacsint

+0

Ho aggiunto l'URL di lavoro –

+1

Hm, interessante. Solo per assicurarti: questo URL funziona per te senza l'accesso manuale prima? (In una nuova finestra del browser privato?) Quindi dovrebbe funzionare anche: 'wget http: // /view/BuildMonito /? Token = '. L'ho provato senza successo. Sfortunatamente in un browser questo URL mostra il modulo di login, con curl/wget restituisce 403. (Potrebbe funzionare con parametri wget aggiuntivi, ma ho bisogno di eseguirlo da un browser che di solito non supporta questi parametri.) – palacsint

1

A partire da ora (febbraio 2016) Non credo che questo sarà possibile senza codifica alcuni script (Greasemonkey o simile?) Che registra in realtà nella vostra raspberry utente prima di passare alla visualizzazione del monitor. (O attenersi alla soluzione proxy)

Questi due biglietti nell'istanza JIRA di Jenkins mostrano che non sembra essere una soluzione rapida e facile al momento, ma chiaramente non sei l'unica a guardare:
https://issues.jenkins-ci.org/browse/JENKINS-14750
https://issues.jenkins-ci.org/browse/JENKINS-22475

+0

Grazie per i collegamenti JIRA! L'inserimento automatico di script Greasemonkey in un browser non è semplice, quindi ho scelto la soluzione proxy (vedi la mia risposta). – palacsint

2

mi piacerebbe vedere una soluzione più semplice, ma una soluzione potrebbe essere la seguente.

Ho creato un proxy Apache locale che in ascolto sulla porta 80, imposta le intestazioni di autorizzazione e inoltra le richieste al nostro esempio Jenkins con la seguente configurazione di Apache:

<VirtualHost 127.0.0.1:80> 
    ProxyRequests Off 
    ProxyPreserveHost Off 
    ProxyErrorOverride Off 

    <Proxy *> 
     Order deny,allow 
     Allow from all 
    </Proxy> 

    SSLProxyEngine On 
    SSLProxyCheckPeerCN Off 
    SSLProxyCheckPeerExpire On 

    ProxyPass / https://jenkins.example.com/ nocanon 
    ProxyPassReverse / https://jenkins.example.com/ 
    AllowEncodedSlashes NoDecode 

    SetOutputFilter INFLATE;proxy-html;DEFLATE 
    ProxyHTMLURLMap https://jenkins.example.com//
    SetEnv proxy-nokeepalive 1 

    <Location /> 
     RequestHeader set Authorization "Basic {{ jenkins_basic_header }}" 
     Header edit Set-Cookie "Secure;" "" 
     Order allow,deny 
     Allow from all 
    </Location> 

    ErrorLog ${APACHE_LOG_DIR}/error.log 
    CustomLog ${APACHE_LOG_DIR}/access.log combined 
</VirtualHost> 

(potrebbe essere necessario per mettere a punto SSL o altri parametri, il registro di debug di Apache potrebbe essere utile.)

Nota la riga Header edit Set-Cookie "Secure;" "" che rimuove il flag di protezione dai cookie. È necessario poiché Jenkins utilizza https e invia secure cookies mentre il proxy Apache è in ascolto solo sulla porta 80. Senza che il browser recuperi i cookie di sessione (e altri) come sicuri ma non li reinvia su una semplice connessione http.(È un problema se il plug-in dashboard funziona con nuove sessioni su ogni chiamata.Il plug-in Build Monitor collegato in Jenkins non supporta questo, richiede ID sessione stabili.)

L'utilizzo di https su Apache è sembrato eccessivo in questo caso Apache in ascolto solo su localhost (ports.conf):

Listen 127.0.0.1:80 

la variabile jenkins_basic_header può essere generato con il seguente script Python:

#!/usr/bin/python 
import base64 
import errno 
import sys 

if len(sys.argv) != 3: 
    print('Missing user pass/token arguments') 
    print('Usage: ./basic-pass.py <user> <pass/token>') 
    sys.exit(errno.EINVAL) 

hash = base64.b64encode(sys.argv[1] + ':' + sys.argv[2]) 
sys.stdout.write(hash) # do not print new-line char 

funziona con il token troppo.

Problemi correlati