2016-01-29 10 views
12

Próbuję stworzyć całkowicie zautomatyzowany ekran statusu Jenkinsa dla naszej ściany biurowej za pomocą Raspberry Pi. Udało mi się skonfigurować Pi, aby wyświetlał przeglądarkę z określonym adresem URL na telewizorach oraz konfigurował Build Monitor Plugin in Jenkins z naszymi zadaniami tworzenia.Jenkins buduje ścianę monitorów bez ręcznego logowania

Nasze Jenkins używa zabezpieczeń opartych na macierzy, więc utworzyłem osobny użytkownik raspberry z wymaganymi uprawnieniami. (Po zalogowaniu ręcznie wtyczki ścianie pokazano prawidłowo.)

widzę prawidłową odpowiedź HTTP za pomocą następującego polecenia:

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

0b45...06 jest API Reklamowe z raspberry Jenkins użytkownika. (Od http://localhost:8080/user/raspberry/configure)

Niestety ten schemat URL nie działa w przeglądarkach graficznych. Próbowałem również parametr tokenu bez powodzenia:

$ 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>        

Jak mogę uzyskać adres URL, który działa bez logowania w przeglądarkach (takich jak chrom lub Midori) i pokazuje mój pogląd Jenkins?

Nie chcę żadnych ręcznych czynności, w tym logowania (na przykład VNC), ponieważ nie skaluje się zbyt dobrze do wielu biur/Pis.

+0

Jeśli wszystko inne zawiedzie, może można skonfigurować [proxy, który dodaje poświadczenia uwierzytelniania] (http://serverfault.com/questions/239154/whats-the-easiest-way-to-create-an-http- proxy-co-dodaje-podstawowe-uwierzytelnianie-t) do żądań Pi? – approxiblue

+0

@approxlue: Dzięki za komentarz! Właściwie zrobiłem to dokładnie tydzień temu jako obejście, ale mam nadzieję, że istnieje prostsze rozwiązanie. – palacsint

Odpowiedz

0

Czy próbowałeś używać apiToken?

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

Token API jest dostępny na osobistej stronie konfiguracji. Kliknij swoją nazwę w prawym górnym rogu na każdej stronie, a następnie kliknij "Konfiguruj", aby zobaczyć token API.

To działa na mojej konfiguracji z:

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

Tak, próbowałem tego, ale nie mogłem pracować z przeglądarką, jak Chromium czy Midori. Wget nie jest tu możliwy, ponieważ połączona wtyczka używa wywołań JSON, aby odświeżyć stronę bez pełnego przeładowania strony. – palacsint

+0

Dodałem działający URL –

+1

Hm, interesujący. Aby upewnić się: Czy ten adres URL będzie działał bez wcześniejszego ręcznego logowania? (? W nowym oknie przeglądarki prywatnej) Następnie dodaje również powinno działać: 'wget http: // /view/BuildMonito/znacznik = '. Próbowałem tego bez powodzenia. Niestety w przeglądarce URL ten pokazuje formularza logowania, z curl/wget powraca 403. (mogą pracować z dodatkowymi parametrami wget, ale muszę go uruchomić z poziomu przeglądarki, które zwykle nie obsługuje tych parametrów.) – palacsint

1

już teraz (lut 2016) I nie sądzę, że to będzie możliwe bez kodowania jakiś skrypt (greasemonkey lub podobnego?), Że faktycznie loguje się swoją raspberry użytkownik przed przejściem do widoku ściany monitora. (Lub trzymać się swojego rozwiązania proxy)

Te dwa bilety na instancję JJRA Jenkinsa pokazują, że obecnie nie wydaje się, aby było to szybkie i łatwe rozwiązanie, ale wyraźnie nie jesteś jedyną osobą, która szuka:
https://issues.jenkins-ci.org/browse/JENKINS-14750
https://issues.jenkins-ci.org/browse/JENKINS-22475

+0

Dzięki za linki Jira! Automatyczne wstrzykiwanie skryptów Greasemonkey do przeglądarki nie wygląda tak łatwo wybrałem rozwiązanie proxy (patrz moja odpowiedź). – palacsint

2

Chciałbym zobaczyć prostsze rozwiązanie, ale obejście może być następujący.

I utworzeniu lokalnego proxy Apache, który nasłuchuje na porcie 80, ustawia nagłówków autoryzacji i przekazuje wnioski do naszego przykładu Jenkins z następującym Apache config:

<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> 

(Być może trzeba dostosować SSL lub inne parametry, może być przydatny dziennik diagnostyczny Apache.)

Zwróć uwagę na linię Header edit Set-Cookie "Secure;" "", która usuwa bezpieczną flagę z plików cookie. Jest to wymagane, ponieważ Jenkins używa https i wysyła secure cookies, podczas gdy serwer proxy Apache słucha tylko na porcie 80. Bez tego przeglądarka pobiera ciasteczko sesji (i inne) jako bezpieczne, ale nie wysyła ich z powrotem na zwykłe połączenie http.(Jest to problem, jeśli wtyczka panelu kontrolnego działa z nowymi sesjami podczas każdego połączenia.) Podłączona wtyczka Build Monitor w Jenkinsach nie obsługuje tego, wymaga stabilnych identyfikatorów sesji.)

Używanie https w Apache wydawało się przesadą tutaj, jeśli Apache nasłuchuje tylko na localhost (ports.conf):

Listen 127.0.0.1:80 

zmienna jenkins_basic_header mogą być generowane z poniższego skryptu Pythona:

#!/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 

współpracuje z tokena też.

Powiązane problemy