Jenkins构建监视器墙而无需手动登录

时间:2016-01-29 18:21:22

标签: jenkins

我正在尝试使用Raspberry Pi为我们的办公室墙创建一个完全自动化的Jenkins状态屏幕。我能够配置Pi以在电视上显示具有特定URL的浏览器,以及使用我们的构建作业配置Build Monitor Plugin in Jenkins

我们的Jenkins使用基于矩阵的安全性,因此我创建了具有所需权限的单独raspberry用户。 (手动登录后,墙上插件显示正确。)

我可以使用以下命令查看有效的HTTP答案:

curl "http://raspberry:0b45...06@localhost:8080/view/wall1/"

0b45...06raspberry Jenkins用户的API令牌。 (从 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>                               

如何在浏览器(如Chromium或Midori)中获取无需登录的URL,并显示我的Jenkins视图?

我不想要任何手动步骤,包括登录(例如VNC),因为它不能很好地扩展到多个办公室/ Pis。

4 个答案:

答案 0 :(得分:2)

我希望看到一个更简单的解决方案,但解决方法可能如下。

我创建了一个本地Apache代理,它侦听端口80,设置授权标头并使用以下Apache配置将请求转发到我们的Jenkins实例:

<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调试日志可能会有所帮助。)

请注意从Cookie中删除安全标记的Header edit Set-Cookie "Secure;" ""行。这是必需的,因为Jenkins使用https并发送secure cookies,而Apache代理仅在端口80上进行侦听。没有它,浏览器会将会话cookie(和其他cookie)作为安全cookie但不会重新发送一个普通的http连接。 (如果您的仪表板插件在每次调用时都使用新会话,那么这就是一个问题.Jenkins中链接的Build Monitor插件不支持它,它需要稳定的会话ID。)

如果Apache仅侦听localhost(ports.conf),那么在Apache上使用https似乎有点过头了:

Listen 127.0.0.1:80

可以使用以下Python脚本生成jenkins_basic_header变量:

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

它也适用于令牌。

答案 1 :(得分:1)

截至目前(2016年2月)我认为如果不编码实际登录raspberry用户的某些脚本(greasemonkey或类似的?),切换到监视器墙视图之前,这是不可能的。 (或坚持你的代理解决方案)

Jenkins的JIRA实例中的这两张票显示目前似乎没有一个快速简便的解决方案,但你显然不是唯一一个看起来: https://issues.jenkins-ci.org/browse/JENKINS-14750
https://issues.jenkins-ci.org/browse/JENKINS-22475

答案 2 :(得分:0)

您是否尝试过使用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>

答案 3 :(得分:0)

查看对How to share Jenkins BUILD Monitor

的回答 <块引用>

然后您可以将匿名读取访问权限限制为您想要公开的仪表板视图。并要求对其他所有内容进行身份验证。