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