Jenkins

Qu’est-ce que Jenkins ?

Jenkins est un outil de test en continue et de déploiement en continue. L’objectif de cet outil est de regarder de temps en temps un serveur de gestion de code (comme Gitea), puis de faire des tests sur les fichiers présents dessus.

Installation

curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null

echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/pkg_jenkins_io_debian.list > /dev/null

sudo apt-get update
sudo apt-get install -y fontconfig openjdk-11-jre
sudo apt-get install -y jenkins

Configuration

Configuration du reverse proxy via NGINX

cat >/etc/nginx/sites-available/jenkins.nginx <<EOF
#jenkins nginx conf
upstream jenkins {
  keepalive 32; # keepalive connections
  server 127.0.0.1:8080; # jenkins ip and port
}

# Required for Jenkins websocket agents
map $http_upgrade $connection_upgrade {
  default upgrade;
  '' close;
}

server {
  listen          80;

  server_name     jenkins.luclis.fr srvprj02ovh.luclis.fr;
  return 301 https://$host$request_uri;
}

server {
  listen 443 ssl http2;
  server_name  jenkins.luclis.fr srvprj02ovh.luclis.fr;
  ssl_certificate     /etc/ssl/public/jenkins.luclis.fr_chain.pem;
  ssl_certificate_key /etc/ssl/private/jenkins.luclis.fr.key;
  ssl_password_file   /etc/ssl/private/jenkins.luclis.fr.pass;

  # this is the jenkins web root directory
  # (mentioned in the output of "systemctl cat jenkins")
  root            /var/run/jenkins/war/;
jenkins-plugin-cli --plugins gitea:1.4.5
  access_log      /var/log/nginx/jenkins.access.log;
  errtion /userContent {
    # have nginx handle all the static requests to userContent folder
    # note : This is the $JENKINS_HOME dir
    root /var/lib/jenkins/;
    if (!-f $request_filename){
      # this file does not exist, might be a directory or a /**view** url
      rewrite (.*) /$1 last;
      break;
    }
    sendfile on;
  }

  location / {
      sendfile off;
      proxy_pass         http://jenkins;
      proxy_redirect     default;
      proxy_http_version 1.1;

      # Required for Jenkins websocket agents
      proxy_set_header   Connection        $connection_upgrade;
      proxy_set_header   Upgrade           $http_upgrade;

      proxy_set_header   Host              $http_host;
      proxy_set_header   X-Real-IP         $remote_addr;
      proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
      proxy_set_header   X-Forwarded-Proto $scheme;
      proxy_max_temp_file_size 0;

      #this is the maximum upload size
      client_max_body_size       10m;
      client_body_buffer_size    128k;

      proxy_connect_timeout      90;
      proxy_send_timeout         90;
      proxy_read_timeout         90;
      proxy_buffering            off;
      proxy_request_buffering    off; # Required for HTTP CLI commands
      proxy_set_header Connection ""; # Clear for keepalive
  }

}

EOFwrite "^/static/[0-9a-fA-F]{8}\/(.*)" /$1 last;
  }

  location /userContent {
    # have nginx handle all the static requests to userContent folder
    # note : This is the $JENKINS_HOME dir
    root /var/lib/jenkins/;
    if (!-f $request_filename){
      # this file does not exist, might be a directory or a /**view** url
      rewrite (.*) /$1 last;
      break;
    }
    sendfile on;
  }

  location / {
      sendfile off;
      proxy_pass         http://jenkins;
      proxy_redirect     default;
      proxy_http_version 1.1;

      # Required for Jenkins websocket agents
      proxy_set_header   Connection        $connection_upgrade;
      proxy_set_header   Upgrade           $http_upgrade;

      proxy_set_header   Host              $http_host;
      proxy_set_header   X-Real-IP         $remote_addr;
      proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
      proxy_set_header   X-Forwarded-Proto $scheme;
      proxy_max_temp_file_size 0;

      #this is the maximum upload size
      client_max_body_size       10m;
      client_body_buffer_size    128k;

      proxy_connect_timeout      90;
      proxy_send_timeout         90;
      proxy_read_timeout         90;
      proxy_buffering            off;
      proxy_request_buffering    off; # Required for HTTP CLI commands
      proxy_set_header Connection ""; # Clear for keepalive
  }

}

EOF
ln -fs /etc/nginx/sites-available/jenkins.nginx /etc/nginx/sites-enabled/jenkins.conf
systemctl restart nginx.service

Lier le serveur au domaine LDAP

Je ne sais pas encore comment automatiser la configuration de jenkins ou comment la poussée en ligne de code. J’ai donc mis les chemins et valeurs a entrer dans l’interface d’administration.

Configuration de la sécurité globale =>
LDAP
server : ldaps://ad.luclis.fr
root DN : DC=LUCLIS,DC=FR
user search base :
user search filter : (|(samaccountname={0})(email={0}))
group search base : OU=GROUPS
Group search filter:
Group membership : Parse user attribute for list of LDAP groups ==> memberOf
Manager DN: CN=svc_jenkins,CN=Users,DC=luclis,DC=fr
Manager password : yourpassword
Autorisations :
Stratégie basée sur les rôles
\*\* Voir ça : The Restrict project naming configuration is not set to the Role-based Strategy. This can lead to problems as it allows users to create items, for which they have not the sufficient permissions to discover, read or configure.

Gérer les rôles et les assigner
Gérer les rôles
Rôle à ajouter : Utilisateur {Global:read ; Agent:Build ; Job:Build,Read ; Historique:Replay ; Vue: Read ; Tag }
Assigner les rôles
Groupe à ajouter : Jenkins Users {Utilisateur}
Groupe à ajouter : Jenkins Admins {admin}

Création dans le LDAP

samba-tool group create 'Jenkins Admins'
samba-tool group create 'Jenkins Users'
samba-tool group addmembers 'Jenkins Admins' adm_svc-l.filippi
samba-tool group addmembers 'Jenkins Users' lucas.filippi

Utilisation

Plugin Gitea

Le but du plugin gitea est de faire vérifier l’ensembles des repos présents dans une organisation par Jenkins. Il n’est donc pas utile si l’on soit créer un simple pipeline. Pour son installation, il suffit de se rendre dans Administrer Jenkins

Gestion des plugins
Available plugins
Gitea

ou jenkins-plugin-cli --plugins gitea:1.4.5. Une fois installé, le service doit redémarrer. Ensuiite, il faut préciser l’adresse du serveur Git à Jenkins pour cela, direction Administrer Jenkins

Configuration Système
Gitea (beaucoup plus bas)
Ajouter Gitea Serveur
Name : Luclis
Serveur URL : https://git.luclis.fr

Il se peut qu’il y ai une erreur 403. C’est pas grave. Il reste de la configuration à faire côté Gitea. En effet, il faut créer un utilisateur qui aura le droit de se connecter aux repos de l’organisation. Sur Gitea, créer un nouvel utilisateur local puis le rajouter dans la base de Jenkins (suivre « Créer un utilisateur pour Git »)

Une fois ce compte créer et paramatré, on peut créer un Organization Folder qui va permettre à Jenkins de vérifier tous les repos de l’organisation.

Nouvel Item
Nom : Ansible
Type : Organization Folder

Créer un utilisateur pour git

Je ne sais pas encore comment automatiser la configuration de jenkins ou comment la poussée en ligne de code. J’ai donc mis les chemins et valeurs a entrer dans l’interface d’administration.

Administrer Jenkins
Identifiants
System
Identifiants globaux (illimité)
Add Credentials
Nom d'utilisateur : jenkins
Mot de passe :

Note

Voir le plugin gitea-checks qui semble être intéressant

TroubleShooting

Renouvellement des mots de passes

Après avoir appliqué la PSO, j’ai du changer les mots de passes. Voici la procédure pour pas en oublier un.

samba-tool user setpassword svc_jenkins

Après ça, le reste se fait côté serveur web :

Configuration de la sécurité globale => LDAP server : ldaps://ad.luclis.fr Manager DN: CN=svc_jenkins,CN=Users,DC=luclis,DC=fr Manager password : yourpassword

Rajouter un certificat racine

Je ne suis pas sûr que cette partie soit utile. Mon problème venait du fait que j’avais refais mes certificats et qu’ils n’étaient plus valides.

systemctl status jenkins.service ==> /usr/bin/java
/usr/bin/java --version ==> openjdk 17.0.4
find / -name cacerts ==> /usr/lib/jvm/java-17-openjdk-amd64/lib/security/cacerts
cd  /usr/lib/jvm/java-17-openjdk-amd64

./bin/keytool -importcert -alias Luclis.fr -file /srv/IGC/luclis.fr/root_ca/public/ACR_LUCLIS.pem -keystore ./lib/security/cacerts -storepass changeit
Ou
./bin/keytool -importcert -alias Luclis.fr -file /srv/IGC/luclis.fr/root_ca/public/ACR_LUCLIS.pem -cacerts -storepass changeit