2016-01-29 159 views
12

我正在嘗試用Raspberry Pi爲我們的辦公室牆創建完全自動化的Jenkins狀態屏幕。我能夠配置Pi在電視上顯示具有特定URL的瀏覽器,並配置我們的構建作業Build Monitor Plugin in JenkinsJenkins構建無需手動登錄的監視器牆

我們的Jenkins使用基於矩陣的安全性,所以我創建了具有所需特權的單獨raspberry用戶。 (在手動壁插件記錄之後被適當地顯示。)

我可以看到下面的命令有效的HTTP應答:

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

0b45...06raspberry詹金斯用戶的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>        

我怎樣才能得到它未經登錄的瀏覽器(如鉻或綠)的作品,並顯示我的詹金斯視圖中的網址?

我不想要任何手動步驟,包括登錄(例如VNC),因爲它不能很好地適應多個辦公室/ Pis。

+0

如果一切都失敗了,也許你可以設置一個[添加認證憑證的代理](http://serverfault.com/questions/239154/whats-the-easiest-way-to-create-an-http- proxy-which-adds-basic-authentication-t)給Pi請求? – approxiblue

+0

@approxiblue:感謝您的評論!實際上,我是在一週前完成的,作爲解決方法,但我希望有一個更簡單的解決方案。 – palacsint

回答

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

是的,我已經嘗試過,但我無法使用瀏覽器工作,如Chromium或Midori。 Wget在這裏是不可行的,因爲鏈接的插件使用JSON調用來刷新頁面而沒有完成頁面重新加載。 – palacsint

+0

我加了工作網址 –

+1

嗯,有意思。只是爲了確認:這個網址是否可以在沒有手動登錄的情況下爲您工作? (在新的私人瀏覽器窗口?)然後下面也應該工作:'wget http:// /view/BuildMonito /?token = '。我試過沒有成功。不幸的是,在瀏覽器中,這個URL顯示了登錄表單,curl/wget返回403.(它可以使用額外的wget參數,但我需要從通常不支持這些參數的瀏覽器運行。) – palacsint

1

截至目前(2月2016),我不認爲這將有可能無需編碼一些腳本(Greasemonkey的或類似的?),其實在你raspberry登錄用戶切換到監視器牆視圖之前。 (或者堅持您的代理解決方案)

詹金斯的JIRA實例中的這兩張票證明,目前似乎並沒有一個快速簡單的解決方案,但您顯然不是唯一一位正在尋找的人:
https://issues.jenkins-ci.org/browse/JENKINS-14750
https://issues.jenkins-ci.org/browse/JENKINS-22475

+0

感謝JIRA鏈接!自動將Greasemonkey腳本注入瀏覽器並不容易,所以我選擇了代理解決方案(請參閱我的答案)。 – palacsint

2

我希望看到一個更簡單的解決方案,但解決方法可能是以下。

我已經創建了監聽80端口的本地Apache代理,將授權頭,並與下面的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併發送secure cookies,而Apache代理僅偵聽端口80.沒有該瀏覽器會將會話cookie(以及其他cookie)作爲安全cookie獲取,但不會將它們發回到普通http連接。(這是一個問題,如果你的儀表板插件在每次調用時都會使用新的會話,Jenkins中的鏈接Build Monitor插件不支持該功能,它需要穩定的會話ID)。阿帕奇只監聽localhost上(ports.conf):

Listen 127.0.0.1:80 

jenkins_basic_header變量可以用下面的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 

它的工作原理與令牌了。