{"id":238,"date":"2019-03-01T23:10:03","date_gmt":"2019-03-01T22:10:03","guid":{"rendered":"http:\/\/blog.xoupix.fr\/?p=238"},"modified":"2019-03-01T23:10:05","modified_gmt":"2019-03-01T22:10:05","slug":"jenkins-and-pipelines","status":"publish","type":"post","link":"https:\/\/blog.xoupix.fr\/index.php\/2019\/03\/01\/jenkins-and-pipelines\/","title":{"rendered":"Jenkins and Pipelines"},"content":{"rendered":"\n<p>Continous integration is, in computer sciences, a must-have. Jenkins help us to reach this objectives. But how to configure it using &#8220;Pipelines&#8221; ?<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">What are pipeline for ?<\/h2>\n\n\n\n<p>From Jenkins official documentation :<br><br>&#8220;Jenkins Pipeline (or simply &#8220;Pipeline&#8221; with a capital &#8220;P&#8221;) is a suite of plugins which supports implementing and integrating <em>continuous delivery pipelines<\/em>&nbsp;into Jenkins.  <br> <br>A&nbsp;<em>continuous delivery (CD) pipeline<\/em> is an automated expression of your process for getting software from version control right through to your users and customers. Every change to your software (committed in source control) goes through a complex process on its way to being released. This process involves building the software in a reliable and repeatable manner, as well as progressing the built software (called a &#8220;build&#8221;) through multiple stages of testing and deployment. &#8220;<\/p>\n\n\n\n<p>With this specific process, you will be able to create a list of tasks to be executed.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How to start ?<\/h2>\n\n\n\n<p>A Jenkins Pipeline always start with the <em>node<\/em> function. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>node {\n  echo \"Hello World !\"\n}<\/code><\/pre>\n\n\n\n<p>This simple Pipeline will only print &#8220;Hello World !&#8221;.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Let&#8221;s go deeper : Git + Maven + Sonar<\/h2>\n\n\n\n<p> Before configuring Pipeline, you will have to configure your Jenkins environment.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Preparing Sonar environment<\/h3>\n\n\n\n<p>On your SonarQube interface, create a new user (named it <em>jenkins<\/em>). Connect to SonarQube with <em>jenkins <\/em>credentials and generate an new authentication token (accessible from the &#8220;My Account&#8221; menu).<\/p>\n\n\n\n<p>The token will be displayed after setting a new token name and clicked on &#8220;Generate&#8221;. Copy it, you will need it to configure SonarQube in Jenkins.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"630\" height=\"411\" src=\"https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-09_19_27-Security-My-Account.png\" alt=\"\" class=\"wp-image-241\" srcset=\"https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-09_19_27-Security-My-Account.png 630w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-09_19_27-Security-My-Account-300x196.png 300w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-09_19_27-Security-My-Account-460x300.png 460w\" sizes=\"auto, (max-width: 630px) 100vw, 630px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Preparing git environment<\/h3>\n\n\n\n<p>On your Git interface, create a new user and affect it to your Git repository as developer.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Preparing Jenkins environment<\/h3>\n\n\n\n<p>Back to Jenkins. Go into &#8220;Manage Jenkins&#8221; then &#8220;Configure System&#8221;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"712\" height=\"298\" src=\"https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-09_22_51-Manage-Jenkins-Jenkins.png\" alt=\"\" class=\"wp-image-242\" srcset=\"https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-09_22_51-Manage-Jenkins-Jenkins.png 712w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-09_22_51-Manage-Jenkins-Jenkins-300x126.png 300w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-09_22_51-Manage-Jenkins-Jenkins-500x209.png 500w\" sizes=\"auto, (max-width: 712px) 100vw, 712px\" \/><\/figure>\n\n\n\n<p>Add a new SonarQube server. Check the &#8220;Enable injection of SonarQube server configuration as build environment variables&#8221; checkbox, set the name to &#8220;SonarQube&#8221;, the server URL to the \/sonarqube endpoint, and the authentication token from the previously generated token. When it&#8217;s done, click on &#8220;Save&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1003\" height=\"382\" src=\"https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-09_26_18-Configure-System-Jenkins.png\" alt=\"\" class=\"wp-image-243\" srcset=\"https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-09_26_18-Configure-System-Jenkins.png 1003w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-09_26_18-Configure-System-Jenkins-300x114.png 300w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-09_26_18-Configure-System-Jenkins-768x292.png 768w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-09_26_18-Configure-System-Jenkins-500x190.png 500w\" sizes=\"auto, (max-width: 1003px) 100vw, 1003px\" \/><\/figure>\n\n\n\n<p>When it&#8217;s done, click on &#8220;Manage Jenkins&#8221; > &#8220;Managed files&#8221;. Add a new Maven configuration file matching with your environment, and name it &#8220;Maven Settings&#8221;, then click &#8220;Submit&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"935\" height=\"893\" src=\"https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_13_52-Jenkins.png\" alt=\"\" class=\"wp-image-245\" srcset=\"https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_13_52-Jenkins.png 935w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_13_52-Jenkins-300x287.png 300w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_13_52-Jenkins-768x734.png 768w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_13_52-Jenkins-314x300.png 314w\" sizes=\"auto, (max-width: 935px) 100vw, 935px\" \/><\/figure>\n\n\n\n<p>When the maven file is configured, let&#8217;s configure Jenkins tools. Click on &#8220;Manage Jenkins&#8221; and &#8220;Global Tools Configuration&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"956\" height=\"468\" src=\"https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_14_58-Manage-Jenkins-Jenkins.png\" alt=\"\" class=\"wp-image-246\" srcset=\"https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_14_58-Manage-Jenkins-Jenkins.png 956w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_14_58-Manage-Jenkins-Jenkins-300x147.png 300w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_14_58-Manage-Jenkins-Jenkins-768x376.png 768w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_14_58-Manage-Jenkins-Jenkins-500x245.png 500w\" sizes=\"auto, (max-width: 956px) 100vw, 956px\" \/><\/figure>\n\n\n\n<p>Configure the &#8220;Maven Configuration&#8221; part as the following:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"865\" height=\"187\" src=\"https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_18_14-Global-Tool-Configuration-Jenkins.png\" alt=\"\" class=\"wp-image-247\" srcset=\"https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_18_14-Global-Tool-Configuration-Jenkins.png 865w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_18_14-Global-Tool-Configuration-Jenkins-300x65.png 300w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_18_14-Global-Tool-Configuration-Jenkins-768x166.png 768w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_18_14-Global-Tool-Configuration-Jenkins-500x108.png 500w\" sizes=\"auto, (max-width: 865px) 100vw, 865px\" \/><\/figure>\n\n\n\n<p>Configure the &#8220;Git&#8221; part as the following:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"872\" height=\"289\" src=\"https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_19_04-Global-Tool-Configuration-Jenkins.png\" alt=\"\" class=\"wp-image-248\" srcset=\"https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_19_04-Global-Tool-Configuration-Jenkins.png 872w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_19_04-Global-Tool-Configuration-Jenkins-300x99.png 300w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_19_04-Global-Tool-Configuration-Jenkins-768x255.png 768w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_19_04-Global-Tool-Configuration-Jenkins-500x166.png 500w\" sizes=\"auto, (max-width: 872px) 100vw, 872px\" \/><\/figure>\n\n\n\n<p>Configure the &#8220;SonarQube Server&#8221; part as the following:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"875\" height=\"338\" src=\"https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_20_59-Global-Tool-Configuration-Jenkins.png\" alt=\"\" class=\"wp-image-249\" srcset=\"https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_20_59-Global-Tool-Configuration-Jenkins.png 875w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_20_59-Global-Tool-Configuration-Jenkins-300x116.png 300w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_20_59-Global-Tool-Configuration-Jenkins-768x297.png 768w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_20_59-Global-Tool-Configuration-Jenkins-500x193.png 500w\" sizes=\"auto, (max-width: 875px) 100vw, 875px\" \/><\/figure>\n\n\n\n<p>Configure the &#8220;Maven&#8221; part as the following:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"869\" height=\"341\" src=\"https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_21_53-Global-Tool-Configuration-Jenkins.png\" alt=\"\" class=\"wp-image-250\" srcset=\"https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_21_53-Global-Tool-Configuration-Jenkins.png 869w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_21_53-Global-Tool-Configuration-Jenkins-300x118.png 300w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_21_53-Global-Tool-Configuration-Jenkins-768x301.png 768w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_21_53-Global-Tool-Configuration-Jenkins-500x196.png 500w\" sizes=\"auto, (max-width: 869px) 100vw, 869px\" \/><\/figure>\n\n\n\n<p>When all is configured, click on &#8220;Save&#8221;. You are now ready to go with the Pipeline part !<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Defining a new Jenkins Job<\/h3>\n\n\n\n<p>Create a new Jenkins Job. Named it &#8220;My Pipeline&#8221;, click on the Pipeline wizard, and click on &#8220;OK&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"860\" src=\"https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_25_03-New-Item-Jenkins-1024x860.png\" alt=\"\" class=\"wp-image-251\" srcset=\"https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_25_03-New-Item-Jenkins-1024x860.png 1024w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_25_03-New-Item-Jenkins-300x252.png 300w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_25_03-New-Item-Jenkins-768x645.png 768w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_25_03-New-Item-Jenkins-357x300.png 357w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_25_03-New-Item-Jenkins.png 1119w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>In the &#8220;Build Triggers&#8221; part, you can configure when the job is launch. For my personal use, I will check the &#8220;Build periodically&#8221; check box, and set the &#8220;Schedule&#8221; part to &#8220;H H * * *&#8221; (one execution per day).<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"717\" height=\"443\" src=\"https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_29_06-BouyguesTelecom-Pipeline-Config-Jenkins.png\" alt=\"\" class=\"wp-image-252\" srcset=\"https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_29_06-BouyguesTelecom-Pipeline-Config-Jenkins.png 717w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_29_06-BouyguesTelecom-Pipeline-Config-Jenkins-300x185.png 300w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_29_06-BouyguesTelecom-Pipeline-Config-Jenkins-486x300.png 486w\" sizes=\"auto, (max-width: 717px) 100vw, 717px\" \/><\/figure>\n\n\n\n<p>Then the Pipeline script. Set the &#8220;Definition&#8221; value to &#8220;Pipeline script&#8221; (I will write my script in Jenkins instead of a SCM file available on Git repository), and let&#8217;s go to the Pipeline !<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Preparation stage<\/h4>\n\n\n\n<p>Firstly, let&#8217;s prepare our environment. Here is the preparation stage:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>   stage('Preparation') { \/\/ for display purposes\n      \/\/ Cleaning workspace\n      cleanWs()\n      \/\/ Get some code from Git\n      git branch: 'master', \n      credentialsId: 'e65361e0-6bc0-4de3-8041-d22b44e6d3b3',\n      url: 'http:\/\/git-server\/gitlab\/repository.git'\n      \/\/ Get the Maven tool.\n      env.PATH = \"${tool 'Maven3'}\/bin:${env.PATH}\"\n   }<\/code><\/pre>\n\n\n\n<p>This stage will clean the Job workspace on each execution, and will checkout my &#8220;master&#8221; Git branch using specific credentials (based on credentials id) from a specific url. I will also add to the PATH environment my Maven informations (here, &#8216;Maven3&#8217; must match the Maven tool name you set previously).<\/p>\n\n\n\n<p>Second stage, compiling all my sources:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>   stage('Build') {\n      \/\/ Run the maven build\n      configFileProvider(\n        [configFile(fileId: 'MavenSettings', variable: 'MAVEN_SETTINGS')]) {\n\t\ttry {\n           sh 'mvn -s $MAVEN_SETTINGS clean package -Dmaven.test.skip=true'\n\t\t} catch (err) {\n\t\t   echo \"Error while compiling projects\"\n\t\t}\n      }\n   }<\/code><\/pre>\n\n\n\n<p>Here, I specify my configuration file using the &#8220;configFileProvider&#8221; function, fileId matching my &#8220;Managed Files&#8221; configuration.<\/p>\n\n\n\n<p>Third stage, my SonarQube execution. Based on Maven, I will just invoke the &#8220;sonar:sonar&#8221; goal:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>   stage('SonarQube analysis') {\n      withSonarQubeEnv('SonarQube') {\n      \/\/ requires SonarQube Scanner for Maven 3.2+\n\t  \n         configFileProvider([configFile(fileId: 'MavenSettings', variable: 'MAVEN_SETTINGS')]) {\n\t\t    try {\n               sh 'mvn -s $MAVEN_SETTINGS org.sonarsource.scanner.maven:sonar-maven-plugin:3.2:sonar'\n\t\t    } catch (err) {\n\t\t       echo \"Error while processing sonar on projects\"\n\t\t    }\n         }\n      }\n   }<\/code><\/pre>\n\n\n\n<p>Same as the &#8220;Build&#8221; stage, I specified my SonarQube installation using the &#8220;withSonarQubeEnv&#8221; function (&#8220;SonarQube&#8221; is my actual installation name), and I run my SonarQube analysis by calling sh &#8216;mvn -s $MAVEN_SETTINGS org.sonarsource.scanner.maven:sonar-maven-plugin:3.2:sonar&#8217;.<\/p>\n\n\n\n<p>Next stage, the Quality Gate:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>   stage(\"Quality Gate\"){\n      timeout(time: 1, unit: 'HOURS') { \/\/ Just in case something goes wrong, pipeline will be killed after a timeout\n         def qg = waitForQualityGate() \/\/ Reuse taskId previously collected by withSonarQubeEnv\n         if (qg.status != 'OK') {\n            error \"Pipeline aborted due to quality gate failure: ${qg.status}\"\n         }\n      }\n   }<\/code><\/pre>\n\n\n\n<p>Will wait 1 hour for SonarQube execution.<\/p>\n\n\n\n<p>You can also add a &#8220;Result&#8221; stage, if you want to do something when all stages were executed well:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>   stage('Results') {\n      \n   }<\/code><\/pre>\n\n\n\n<p>Your global Pipeline must look as the following:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>node {\n   def mvnHome\n   stage('Preparation') { \/\/ for display purposes\n      \/\/ Cleaning workspace\n      cleanWs()\n      \/\/ Get some code from Git\n      git branch: 'master', \n      credentialsId: 'e65361e0-6bc0-4de3-8041-d22b44e6d3b3',\n      url: 'http:\/\/git-server\/gitlab\/repository.git'\n      \/\/ Get the Maven tool.\n      env.PATH = \"${tool 'Maven3'}\/bin:${env.PATH}\"\n   }\n   stage('Build') {\n      \/\/ Run the maven build\n      configFileProvider(\n        [configFile(fileId: 'MavenSettings', variable: 'MAVEN_SETTINGS')]) {\n\t\ttry {\n           sh 'mvn -s $MAVEN_SETTINGS clean package -Dmaven.test.skip=true'\n\t\t} catch (err) {\n\t\t   echo \"Error while compiling projects\"\n\t\t}\n      }\n   }\n   stage('SonarQube analysis') {\n      withSonarQubeEnv('SonarQube Production Line') {\n      \/\/ requires SonarQube Scanner for Maven 3.2+\n\t  \n         configFileProvider([configFile(fileId: 'MavenSettings', variable: 'MAVEN_SETTINGS')]) {\n\t\t    try {\n               sh 'mvn -s $MAVEN_SETTINGS org.sonarsource.scanner.maven:sonar-maven-plugin:3.2:sonar'\n\t\t    } catch (err) {\n\t\t       echo \"Error while processing sonar on projects\"\n\t\t    }\n         }\n      }\n   }\n   stage(\"Quality Gate\"){\n      timeout(time: 1, unit: 'HOURS') { \/\/ Just in case something goes wrong, pipeline will be killed after a timeout\n         def qg = waitForQualityGate() \/\/ Reuse taskId previously collected by withSonarQubeEnv\n         if (qg.status != 'OK') {\n            error \"Pipeline aborted due to quality gate failure: ${qg.status}\"\n         }\n      }\n   }\n   stage('Results') {\n      \n   }\n}<\/code><\/pre>\n\n\n\n<p>And voila ! Your Pipeline is now ready to run ! A first execution will result to the following:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"831\" height=\"251\" src=\"https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_51_29-BouyguesTelecom-Pipeline-Jenkins.png\" alt=\"\" class=\"wp-image-253\" srcset=\"https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_51_29-BouyguesTelecom-Pipeline-Jenkins.png 831w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_51_29-BouyguesTelecom-Pipeline-Jenkins-300x91.png 300w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_51_29-BouyguesTelecom-Pipeline-Jenkins-768x232.png 768w, https:\/\/blog.xoupix.fr\/wp-content\/uploads\/2019\/03\/2019-03-01-22_51_29-BouyguesTelecom-Pipeline-Jenkins-500x151.png 500w\" sizes=\"auto, (max-width: 831px) 100vw, 831px\" \/><\/figure>\n\n\n\n<p>Your Pipeline execution is successfull, your report is available in your SonarQube application, and your compilation packages can be retrieved by accessing your last execution, clicking on &#8220;Pipeline Steps&#8221;, &#8220;Allocate node : Start&#8221; and &#8220;Workspace&#8221;.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Continous integration is, in computer sciences, a must-have. Jenkins help us to reach this objectives. But how to configure it using &#8220;Pipelines&#8221; ?<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[16],"tags":[],"class_list":["post-238","post","type-post","status-publish","format-standard","hentry","category-jenkins"],"_links":{"self":[{"href":"https:\/\/blog.xoupix.fr\/index.php\/wp-json\/wp\/v2\/posts\/238","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.xoupix.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.xoupix.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.xoupix.fr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.xoupix.fr\/index.php\/wp-json\/wp\/v2\/comments?post=238"}],"version-history":[{"count":3,"href":"https:\/\/blog.xoupix.fr\/index.php\/wp-json\/wp\/v2\/posts\/238\/revisions"}],"predecessor-version":[{"id":254,"href":"https:\/\/blog.xoupix.fr\/index.php\/wp-json\/wp\/v2\/posts\/238\/revisions\/254"}],"wp:attachment":[{"href":"https:\/\/blog.xoupix.fr\/index.php\/wp-json\/wp\/v2\/media?parent=238"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.xoupix.fr\/index.php\/wp-json\/wp\/v2\/categories?post=238"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.xoupix.fr\/index.php\/wp-json\/wp\/v2\/tags?post=238"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}