Jak mogę utworzyć monitor kompilacji dla Bamboo, Jenkinsa lub Gitlab? Do wieczora to rozgryzę! Już wcześniej napisałem podobną instrukcję Tutorial dla Gitlab Issue Boards.
Podstawą tego poradnika jest Raspberry Imager oraz system operacyjny “Raspberry Pi OS Lite”. Po zainstalowaniu systemu operacyjnego można włożyć kartę SD do Maliny. W moim przypadku jest to Raspberry Pi Zero.
Krok 1: Zainstaluj Matchbox/Window Manager
Do obsługi Raspberry w trybie kiosku potrzebne są menedżer okien i przeglądarka. Są one instalowane za pomocą następującego polecenia:
$ sudo apt-get install xorg nodm matchbox-window-manager uzbl xinit unclutter vim
Krok 2: Tworzę użytkownika tablicy rozdzielczej
Za pomocą poniższego polecenia tworzę nowego użytkownika o nazwie “dashboard”:
$ sudo adduser dashboard
Krok 3: Konfiguracja xServer i Window Manager
Wszystkie poniższe czynności należy wykonać w sesji użytkownika “pulpitu nawigacyjnego”. Przechodzę na sesję za pomocą polecenia “su”:
$ sudo su dashboard
3.1.) Przyciski/funkcje
Chcę, aby moja Malina mogła działać w trybie kiosku. W tym celu przechowuję dwa polecenia klawiszowe: Ctrl Alt X do otwierania terminala i Alt C do zamykania terminala. W terminalu możesz sprawdzić aktualne IP za pomocą ifconfig, wyłączyć Raspberry za pomocą sudo shutdown -h now etc…..
$ cd ~
$ mkdir .matchbox
$ vim .matchbox/kbdconfig
## Skróty w obsłudze okien
<Alt>c=close
<ctrl><alt>x=!xterm
3.2. ) X - Sesja
Poniższe wiersze muszą być także wpisane do pliku “$ vim ~/.xsession”. Ten skrypt sprawdza, czy tablica rozdzielcza jest dostępna. Jeśli nie jest osiągalny, odczekuje 10 sekund. Oczywiście należy dostosować adres/IP.
xset -dpms
xset s off
while ! curl -s -o /dev/null https://192.168.178.61:8085/ sleep 10
done
exec matchbox-window-manager -use_titlebar no & while true; do
uzbl -u https://192.168.178.61:8085/telemetry.action -c /home/pi/uzbl.conf
done
Bardzo ważne jest, aby skrypt był wykonywalny:
$ sudo chmod 755 ~/.xsession
3.3. ) Współkonfiguracja interfejsu
W poniższych wierszach konfiguruje się interfejs sieciowy. Przeglądarka jest zmaksymalizowana, a pasek stanu ukryty.
$ vim ~/uzbl.conf
set socket_dir=/tmp
set geometry=maximized
set show_status=0
set on_event = request ON_EVENT
set show_status=0
@on_event LOAD_FINISH script ~/dashboard/verhalten.js
3.4.) Gotowe
Sesję “pulpitu nawigacyjnego” można opuścić:
$ exit
3.5.) behavior.js i tekst przewijany
Ten skrypt Java steruje zachowaniem tablicy. Jeśli kompilacja lub test zakończą się niepowodzeniem, wyświetlany jest duży ticker. W ten sposób mogę dostrzec błędy nawet z dużej odległości.
$ vim ~/verhalten.conf
var bamboobUrl = 'https://ip:port';
var bambooUser = 'nutzer';
var bambooPassword = 'password';
var ticker = jQuery('<marquee direction="left" scrollamount="5" scrolldelay="2" style="display:none;background:#962526;position:fixed;bottom:0;left:0;width:100%;line-height:100px;font-size:80px;"></marquee>');
/*--------------------------Timer--------------------------*/
var Timer = function(intervallInMsec)
{
this.caller = new Array();
this.intervall = window.setInterval(
this.call.bind(this),
intervallInMsec
);
};
Timer.prototype.append = function(callFunction)
{
this.caller.push(callFunction);
};
Timer.prototype.remove = function(callFunction)
{
var index = this.caller.indexOf(callFunction);
if (index > -1)
{
this.caller.splice(index, 1);
}
};
Timer.prototype.call = function()
{
for(
var callerIndex = 0, callerLenght = this.caller.length;
callerIndex < callerLenght;
callerIndex++
) {
this.caller[ callerIndex ].call();
}
};
var timer = new Timer(10000);
jQuery('body').append(ticker);
/* login verhalten */
timer.append(
function()
{
if (jQuery('#loginForm_os_username').length > 0)
{
jQuery('#loginForm_os_username').val(bambooUser);
jQuery('#loginForm_os_password').val(bambooPassword);
jQuery('#loginForm_save').click();
}
else if (jQuery('.aui-dropdown2-trigger-group').length > 0)
{
window.location.href = window.gitlabUrl + '/telemetry.action';
}
}
);
/* roter ticker */
timer.append(
function()
{
if (jQuery('.Failed').length > 0)
{
var failedJobs = new Array();
jQuery.each(
jQuery('.Failed'),
function() {
failedJobs.push( jQuery(this).children('.plan-name').text() + ' (' + jQuery(this).find('time').text() + ')');
}
);
var text = 'Fehlerhafte Jobs: ' + failedJobs.join(' | ');
if( jQuery(ticker).text() !== text)
{
jQuery(ticker).html('<span>' + text + '</span>');
jQuery(ticker).show();
}
}
else
{
jQuery(ticker).hide();
}
}
);
Oczywiście można wbudować dowolne zachowania, takie jak ponowne uruchamianie nieudanych testów.
4. autologowanie do sesji X
Następnym krokiem jest ustawienie automatycznego logowania. Ten plik jest przystosowany do tego celu:
$ sudo vim /etc/default/nodm
# nodm configuration
# Set NODM_ENABLED to something different than 'false' to enable nodm
NODM_ENABLED=true # <-- hier muss true hin
# User to autologin for
NODM_USER=dashboard # <-- hier muss dashboard hin
# First vt to try when looking for free VTs
NODM_FIRST_VT=7
# X session
NODM_XSESSION=/etc/X11/Xsession
# Options for the X server
NODM_X_OPTIONS='-nolisten tcp'
... usw
Następnie można ponownie uruchomić system.
$ sudo reboot
Gotowe
Każda tablica rozdzielcza powinna być uruchamiana ponownie raz dziennie. W tym celu utworzyłem program cron.