Fork me on GitHub

Herr Knedel/Des trucs cools avec Atlassian : Pimp my Bamboo-Monitor

Created Mon, 01 Jan 0001 00:00:00 +0000 Modified Sun, 03 Apr 2022 06:46:00 +0000 Niveau de difficulté: Vraiment exigeant

795 Words

Comment créer un moniteur de build pour Bamboo, Jenkins ou Gitlab ? D’ici ce soir, je trouverai la solution ! J’ai déjà écrit un Tutoriel sur les tableaux d’affichage Gitlab similaire.

La base de ce tutoriel est le Raspberry-Imager et le système d’exploitation “Raspberry Pi OS Lite”. Après l’installation du système d’exploitation, la carte SD peut être insérée dans le Raspberry. Dans mon cas, il s’agit d’un Raspberry Pi Zero.

Étape 1 : Installer le Matchbox/Window-Manager

Pour faire fonctionner un Raspberry en mode kiosque, un gestionnaire de fenêtres et un navigateur sont nécessaires. Ceux-ci sont installés à l’aide de la commande suivante :

x
+
Terminal

$ sudo apt-get install xorg nodm matchbox-window-manager uzbl xinit unclutter vim

Étape 2 : Je crée un utilisateur du tableau de bord

Avec la commande suivante, je crée un nouvel utilisateur nommé “dashboard” :

x
+
Terminal

$ sudo adduser dashboard

Étape 3 : Configuration du xServer et du gestionnaire de fenêtres

Toutes les étapes suivantes doivent être effectuées dans la session utilisateur “dashboard”. Avec “su”, je change de session :

x
+
Terminal

$ sudo su dashboard

3.1. ) Boutons/fonction

Mon Raspberry doit également pouvoir être utilisé en mode kiosque. Pour cela, j’enregistre deux commandes de touches, Ctrl Alt X pour le terminal et Alt C pour fermer le terminal. Dans le terminal, on peut demander l’IP actuelle avec ifconfig, éteindre le Raspberry avec sudo shutdown -h now, etc…..

x
+
Terminal

$ cd ~
$ mkdir .matchbox
$ vim .matchbox/kbdconfig

Dans ce cas, la disposition des touches se présente comme suit :


##  Opération fenêtre coupes courtes
<Alt>c=close
<ctrl><alt>x=!xterm

3.2. ) X - Session

Les lignes suivantes doivent également être inscrites dans un fichier “$ vim ~/.xsession”. Ce script vérifie si le tableau de bord est accessible. S’il n’est pas accessible, il attend 10 secondes. Bien entendu, l’adresse/IP doit être adaptée.

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

Il est très important que le script soit exécutable :

x
+
Terminal

$ sudo chmod 755 ~/.xsession

3.3. ) Configuration de l’interface

Les lignes suivantes permettent de configurer l’interface web. Le navigateur est maximisé et la barre d’état est masquée.

x
+
Terminal

$ vim ~/uzbl.conf

Contenu :

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.) Prêt

La session “dashboard” peut être quittée :

x
+
Terminal

$ exit

3.5) verhalten.js et texte défilant

Ce javascript permet de contrôler le comportement du forum. Si le build ou le test échoue, un grand ticker s’affiche. Je peux ainsi voir les erreurs de loin.

x
+
Terminal

$ vim ~/verhalten.conf

Contenu :

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();
    }
  }
);


Il est bien sûr possible d’intégrer tout comportement souhaité, par exemple relancer les tests qui ont échoué.

4. autologue dans la session X

La prochaine étape consiste à configurer le login automatique. Pour cela, ce fichier sera adapté :

x
+
Terminal

$ sudo vim /etc/default/nodm

L’utilisateur de connexion “dashboard” est saisi ici et le gestionnaire d’affichage est désactivé :

# 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

Le système peut ensuite être redémarré.

x
+
Terminal

$ sudo reboot

Prêt

Chaque dasboard doit être redémarré une fois par jour. J’ai créé un cron pour cela.