Créer un projet Jenkins Multibranch Pipeline pour Delphi (Seconde partie)

Dans la première partie, nous avons vu comment installer Jenkins et les extensions nécessaires pour compiler un projet Delphi. Nous allons maintenant voir comment créer un script Jenkinsfile de base.

Créer le fichier Jenkinsfile

Les pipelines s’appuient sur des scripts écris en Groovy, un langage de script faisant appel à Java à travers une sandbox.

Jenkins recherche dans chaque branche du dépôt un fichier Jenkinfile contenant un script Groovy définissant les étapes de la compilation.

Structure de base du script

Un script de pipeline commence par la ligne de commentaire #!groovy, ce qui permet aux éditeurs reconnaissant ce format de le coloriser automatiquement. Sous Windows, je n’ai pas trouvé de logiciel le gérant, même si la demande existe pour une intégration dans Notepad++.

Ensuite, le script doit contenir la balise pipeline {}. Elle indique à Jenkins que le script commence. Ensuite, on peut indiquer des options pour ce pipeline et surtout des « stages » qui seront en fait les étapes de notre compilation.

#!groovy
pipeline {
    agent any
    stages {
        stage('Compilation') {
        }
    } 
}

Dans cet exemple, on déclare un pipeline, qu’il peut utiliser n’importe quel agent déclaré dans Jenkins et qu’il n’y a qu’une grande étape, la compilation.

Compilation d’un projet Delphi

Pour pouvoir compiler Jenkins, nous allons créer une étape de compilation faisant appel à MSBuild.

Dans un pipeline Jenkins, les variables d’environnement de Windows ne sont pas prises en compte ! Il faut donc les préciser à Jenkins dans le script.

Pour cela, nous allons rajouter une section « environnement » à notre script et y déclarer toutes les variables d’environnement nécessaires à la compilation.

environment {
    BDS = "C:\\Program Files (x86)\\Embarcadero\\Studio\\17.0"
    BDSINCLUDE = "C:\\Program Files (x86)\\Embarcadero\\Studio\\17.0\\include"
    BDSCOMMONDIR = "C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\17.0"
    FrameworkDir = "C:\\Windows\\Microsoft.NET\\Framework\\v3.5"
    FrameworkVersion= "v3.5"
    FrameworkSDKDir = ""
    PATH = "C:\\Program Files (x86)\\Embarcadero\\Studio\\18.0\\bin;C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\18.0\\Bpl;C:\\Program Files (x86)\\Embarcadero\\Studio\\18.0\\bin64;C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\18.0\\Bpl\\Win64;C:\\Bitnami\\redmine-3.2.0-0\\ruby\\bin;C:\\ProgramData\\Oracle\\Java\\javapath;C:\\Program Files\\ImageMagick-6.9.2-Q16;C:\\Program Files (x86)\\Embarcadero\\Studio\\17.0\\bin;C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\17.0\\Bpl;C:\\Program Files (x86)\\Embarcadero\\Studio\\17.0\\bin64;C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\17.0\\Bpl\\Win64;C:\\Program Files\\Perl64\\site\\bin;C:\\Program Files\\Perl64\\bin;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\PROGRA~1\\ITM\\bin;C:\\PROGRA~1\\ITM\\InstallITM;C:\\PROGRA~1\\ITM\\TMAITM6;C:\\Program Files\\ITM\\bin;C:\\Program Files\\ITM\\InstallITM;C:\\Program Files\\ITM\\TMAITM6;C:\\Program Files\\Microsoft\\Web Platform Installer\\;C:\\Program Files\\TortoiseSVN\\bin;%USERPROFILE%\\.dnx\\bin;C:\\Program Files\\Microsoft DNX\\Dnvm\\;C:\\sonar-runner\\bin;C:\\Program Files (x86)\\Windows Kits\\10\\Windows Performance Toolkit\\;C:\\Program Files\\Java\\jre1.8.0_66\\bin;C:\\Program Files\\Git\\cmd;C:\\Program Files\\1E\\NomadBranch\\;C:\\Program Files\\VisualSVN Server\\bin;C:\\Program Files (x86)\\Resource Hacker\\;C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\17.0;C:\\Program Files (x86)\\Embarcadero\\Studio\\17.0\\bin;C:\\Program Files (x86)\\Embarcadero\\Studio\\17.0\\bin64;C:\\Users\\Public\\Documents\\Embarcadero\\InterBase\\redist\\InterBaseXE7\\IDE_spoof;"
    LANGDIR = "FR"
    PLATFORM = ""
    PlatformSDK = ""
}

Comme vous pouvez le voir dans l’exemple ci-dessus, les chemins sont tous absolus, il n’est pas possible d’utiliser %PATH% par exemple pour simplement ajouter quelque chose au PATH existant. Ici, nous avons deux versions de Delphi installées, la 17 (Seatle) et la 18 (Berlin) d’où la présence des deux chemins.

Nous allons maintenant pouvoir appeler la compilation à proprement parler. Pour cela, nous allons déclarer une « steps » et faire appel à notre plugin MSBuild via un « script ».

steps {
    script {
        def msbuildHome = tool 'MSBuild pour Delphi'
        bat "${msbuildHome}\\MSBuild.exe\ "${WORKSPACE}\\MonProjet\\Projet.groupproj\""
}

On commence par indiquer à Jenkins qu’on veut récupérer le chemin d’accès à l’outil MSBuild en l’appelant par le nom déclaré lors de la configuration.

Ensuite, on fait appel à la commande « bat » à laquelle on passe le chemin d’accès absolu à MSBuild et le chemin d’accès absolu à notre fichier .dproj. La variable ${WORSPACE} est renseignée par Jenkins et contient le chemin vers le répertoire de travail où va avoir lieu la compilation.

Si besoin, on peut ajouter des paramètres dans la ligne de commande pour indiquer quel plateforme utilisée ou le mode de compilation.

On obtient donc au final le script suivant :

#!groovy
pipeline {
    agent any
    stages {
        stage('Compilation') {
            environment {
                BDS = "C:\\Program Files (x86)\\Embarcadero\\Studio\\17.0"
                BDSINCLUDE = "C:\\Program Files (x86)\\Embarcadero\\Studio\\17.0\\include"
                BDSCOMMONDIR = "C:\sers\\Public\\Documents\\Embarcadero\\Studio\\17.0"
                FrameworkDir = "C:\\Windows\\Microsoft.NET\\Framework\\v3.5"
                FrameworkVersion= "v3.5"
                FrameworkSDKDir = ""
                PATH = "C:\\Program Files (x86)\\Embarcadero\\Studio\\18.0\\bin;C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\18.0\\Bpl;C:\\Program Files (x86)\\Embarcadero\\Studio\\18.0\\bin64;C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\18.0\\Bpl\\Win64;C:\\Bitnami\\redmine-3.2.0-0\\ruby\\bin;C:\\ProgramData\\Oracle\\Java\\javapath;C:\\Program Files\\ImageMagick-6.9.2-Q16;C:\\Program Files (x86)\\Embarcadero\\Studio\\17.0\\bin;C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\17.0\\Bpl;C:\\Program Files (x86)\\Embarcadero\\Studio\\17.0\\bin64;C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\17.0\\Bpl\\Win64;C:\\Program Files\\Perl64\\site\\bin;C:\\Program Files\\Perl64\\bin;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\PROGRA~1\\ITM\\bin;C:\\PROGRA~1\\ITM\\InstallITM;C:\\PROGRA~1\\ITM\\TMAITM6;C:\\Program Files\\ITM\\bin;C:\\Program Files\\ITM\\InstallITM;C:\\Program Files\\ITM\\TMAITM6;C:\\Program Files\\Microsoft\\Web Platform Installer\\;C:\\Program Files\\TortoiseSVN\\bin;%USERPROFILE%\\.dnx\\bin;C:\\Program Files\\Microsoft DNX\\Dnvm\\;C:\\sonar-runner\\bin;C:\\Program Files (x86)\\Windows Kits\\10\\Windows Performance Toolkit\\;C:\\Program Files\\Java\\jre1.8.0_66\\bin;C:\\Program Files\\Git\\cmd;C:\\Program Files\\1E\\NomadBranch\\;C:\\Program Files\\VisualSVN Server\\bin;C:\\Program Files (x86)\\Resource Hacker\\;C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\17.0;C:\\Program Files (x86)\\Embarcadero\\Studio\\17.0\\bin;C:\\Program Files (x86)\\Embarcadero\\Studio\\17.0\\bin64;C:\\Users\\Public\\Documents\\Embarcadero\\InterBase\\redist\\InterBaseXE7\\IDE_spoof;"
                LANGDIR = "FR"
                PLATFORM = ""
                PlatformSDK = ""
                } 
            steps {
                script {
 def msbuildHome = tool 'MSBuild pour Delphi (release)'
 bat "${msbuildHome}\\MSBuild.exe \"${WORKSPACE}\\Composants\\TMSFMXPack\\TMSFMXPackDXE9.groupproj\""
 bat "${msbuildHome}\\MSBuild.exe \"${WORKSPACE}\\WLZ\\WLZcompression.dproj\""
 bat "${msbuildHome}\\MSBuild.exe \"${WORKSPACE}\\EPERMITLIB.XE8\\LIBTOTAL\\Total.dproj\""
 bat "${msbuildHome}\\MSBuild.exe \"${WORKSPACE}\\EPERMITLIB.XE8\\connection monitoring\\DSServerConnectionMonitoring\\DataSnapServerConnectionMonitoring.dproj\""
 bat "${msbuildHome}\\MSBuild.exe \"${WORKSPACE}\\EPERMIT.XE8\\EPERMIT.groupproj\""
                }
            }
        }
    }
}

Et voilà, vous n’avez plus qu’à nomer ce fichier « Jeninksfile » et à le placer à la racine du trunk ou de la branche, puis livrer !

Comme nous n’avons pas encore configuré la compilation automatique sur une livraison SVN, il nous faut lancer un scanne des branches manuellement. Pour cela, dans l’interface de Jenkins, cliquez sur votre projet Mutibranch Pipeline puis sur « Scan Multibranch Pipeline » dans le menu de gauche. Jenkins va alors détecter qu’une branche est à compiler et lancer la compilation.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.