Подтвердить что ты не робот

Дженкинс строит стену монитора без входа в систему

Я пытаюсь создать полностью автоматизированный экран статуса Jenkins для нашей офисной стены с малиной Pi. Я смог настроить Pi, чтобы показать браузер с определенным URL-адресом на телевизорах, а также настроить плагин для монитора сборки в Jenkins с нашими заданиями сборки.

Наши Jenkins используют защиту на основе матриц, поэтому я создал отдельного пользователя raspberry с необходимыми привилегиями. (После входа вручную плагин на стене отображается правильно.)

Я могу видеть действительный HTTP-ответ с помощью следующей команды:

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

0b45...06 - это токен API пользователя raspberry Jenkins. (Из http://localhost:8080/user/raspberry/configure)

К сожалению, эта схема URL не работает в графических браузерах. Я также пробовал параметр маркера без успеха:

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

Как я могу получить URL-адрес, который работает без входа в браузер (например, Chromium или Midori) и показывает мой взгляд Jenkins?

Мне не нужен какой-либо ручной шаг, включая вход в систему (хотя, например, VNC), поскольку он недостаточно хорошо масштабируется для нескольких офисов/Pis.

4b9b3361

Ответ 1

Я хотел бы видеть более простое решение, но обходным решением может быть следующее.

Я создал локальный прокси-сервер Apache, который прослушивает порт 80, устанавливает заголовки полномочий и пересылает запросы нашему экземпляру Jenkins со следующей конфигурацией 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>

(Вам может потребоваться тонкая настройка SSL или других параметров, журнал отладки Apache может быть полезен.)

Обратите внимание на строку Header edit Set-Cookie "Secure;" "", которая удаляет безопасный флаг из файлов cookie. Это необходимо, поскольку Jenkins использует https и отправляет защищенные файлы cookie, когда прокси-сервер Apache прослушивает только порт 80. Без этого браузер получает cookie сеанса (и другие), как безопасные, но не отправляет их на простое http-соединение. (Это проблема, если ваш плагин панели мониторинга работает с новыми сеансами при каждом вызове. Связанный плагин Build Monitor в Jenkins не поддерживает это, он требует стабильных идентификаторов сеансов.)

Использование https на Apache показалось излишним здесь, если Apache прослушивает только на localhost (ports.conf):

Listen 127.0.0.1:80

Переменная jenkins_basic_header может быть сгенерирована следующим Python script:

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

Он также работает с токеном.

Ответ 2

На данный момент (февраль 2016), я не думаю, что это будет возможно без кодирования некоторого script (greasemonkey или подобного?), который фактически регистрируется вашим пользователем raspberry, прежде чем переключиться на вид стены монитора. (Или придерживайтесь своего прокси-решения)

Эти два билета в JIRA-экземпляре Jenkins показывают, что на данный момент, похоже, нет быстрого и простого решения, но вы явно не единственный, кто смотрит:
https://issues.jenkins-ci.org/browse/JENKINS-14750
https://issues.jenkins-ci.org/browse/JENKINS-22475

Ответ 3

Вы пытались использовать apiToken?

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

Маркер API доступен на вашей личной странице конфигурации. Нажмите на свое имя в правом верхнем углу на каждой странице, затем нажмите "Настроить", чтобы увидеть токен API.

Он работает на моей настройке с помощью:

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