{"id":6191,"date":"2020-03-02T15:54:36","date_gmt":"2020-03-02T14:54:36","guid":{"rendered":"https:\/\/blog.via-internet.de\/?p=6191"},"modified":"2020-03-02T15:54:36","modified_gmt":"2020-03-02T14:54:36","slug":"jenkins-build-and-deploy-a-groovy-app","status":"publish","type":"post","link":"https:\/\/via-internet.de\/blog\/2020\/03\/02\/jenkins-build-and-deploy-a-groovy-app\/","title":{"rendered":"Jenkins | Build and Deploy a Groovy App"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Using Jenkins as an automation server for your development, you can automate such repeating tasks as testing and deploying your app.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Starting with a sample Groovy App (a simple calculator) with tests, you will learn how to integrate your app in Jenkins and build a pipeline, so that Jenkins runs the desired tasks every time, you change the code.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Prepare the sources<\/h2>\n\n\n\n<h4 class=\"wp-block-heading\">Clone the sample repository from <a href=\"https:\/\/github.com\/r14r\/Jenkins_SampleApp_GroovyCalculator\" target=\"_blank\" rel=\"noreferrer noopener\">Github<\/a>.<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">You should clone the demo repository into you demo account, because you may change some file during this post., and you will not get write permissions for the demo repository.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Also, clone the repository to your local machine to see what our demo app looks like.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"1\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$ git clone https:\/\/github.com\/jenkins-toolbox\/SampleApp_GroovyCalculator\nCloning into 'SampleApp_GroovyCalculator'...\nremote: Enumerating objects: 194, done.\nremote: Counting objects: 100\nremote: Compressing objects: 100\nremote: Total 194 (delta 44), reused 137 (delta 23), pack-reused 0\nReceiving objects: 100\nResolving deltas: 100\n\n\n\n<h4 class=\"wp-block-heading\">Go into the new create folder<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$ cd SampleApp_GroovyCalculator\/\n$ ls\nJenkinsfile      README.md        bin              build.gradle     gradlew          src\nMakefile         SampleCalculator build            gradle           settings.gradle<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">The first task, Jenkins will do in our pipeline: build your app<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$ .\/gradlew build<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Because it&#8217;s the first time you start <code>gradlew<\/code>, the required software will be downloaded:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">First: the current Gradle Version (Gradle is the Build Tool used by Groovy Projects)<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Downloading https:\/\/services.gradle.org\/distributions\/gradle-6.2.1-bin.zip\n\u2026\u2026\u202610\n\nWelcome to Gradle 6.2.1!\n\nHere are the highlights of this release:\n - Dependency checksum and signature verification\n - Shareable read-only dependency cache\n - Documentation links in deprecation messages\n\nFor more details see https:\/\/docs.gradle.org\/6.2.1\/release-notes.html\n\nStarting a Gradle Daemon, 2 stopped Daemons could not be reused, use --status for details<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">After this, your app will be tested<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ini\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">> Task :test\n\nCalculator02Spec > two plus two should equal four PASSED\n\nCalculator01Spec > add: 2 + 3 PASSED\n\nCalculator01Spec > subtract: 4 - 3 PASSED\n\nCalculator01Spec > multiply: 2 * 3 PASSED\n\nBUILD SUCCESSFUL in 34s\n5 actionable tasks: 5 executed<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Perform the build again<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">No download is required. The build is much quicker.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$ .\/gradlew build\n\nBUILD SUCCESSFUL in 1s\n5 actionable tasks: 5 up-to-date<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Now, test our app:<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"1\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">.\/gradlew clean test\n\n> Task :test\n\nCalculator02Spec > two plus two should equal four PASSED\n\nCalculator01Spec > add: 2 + 3 PASSED\n\nCalculator01Spec > subtract: 4 - 3 PASSED\n\nCalculator01Spec > multiply: 2 * 3 PASSED\n\nBUILD SUCCESSFUL in 4s\n5 actionable tasks: 5 executed<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Create a Jenkins Pipeline<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Start by clicking on the BlueOcean menu item.<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33.33%\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"775\" src=\"https:\/\/blog.via-internet.de\/wp-content\/uploads\/2020\/03\/10_blueocean_menuitem-1.png\" alt=\"\" class=\"wp-image-6230\" srcset=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/10_blueocean_menuitem-1.png 500w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/10_blueocean_menuitem-1-194x300.png 194w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:66.66%\">\n<p class=\"wp-block-paragraph\"><strong>Hint:<\/strong> Blue Ocean is not installed with the default Jenkins installation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You have to install the corresponding Plugins.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Select <code>Manage Jenkins<\/code> \u2192 <code>Manage Plugins<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then, select the tab <code>Available<\/code> and enter in the <code>Filter<\/code> box: Blue Ocean.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Install all plugins, that will be listed.<\/p>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Next: Click on the New Pipeline to create your first Pipeline<\/p>\n\n\n\n<figure class=\"wp-block-image alignwide size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"2040\" height=\"266\" src=\"https:\/\/i2.wp.com\/blog.via-internet.de\/wp-content\/uploads\/2020\/03\/11_create_pipeline_01-1.png?fit=700%2C91&amp;ssl=1\" alt=\"\" class=\"wp-image-6233\" srcset=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/11_create_pipeline_01-1.png 2040w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/11_create_pipeline_01-1-300x39.png 300w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/11_create_pipeline_01-1-1024x134.png 1024w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/11_create_pipeline_01-1-768x100.png 768w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/11_create_pipeline_01-1-1536x200.png 1536w\" sizes=\"auto, (max-width: 2040px) 100vw, 2040px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Use the Item GitHub to specify, where our code is stored<\/p>\n\n\n\n<figure class=\"wp-block-image alignwide size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"2038\" height=\"908\" src=\"https:\/\/i2.wp.com\/blog.via-internet.de\/wp-content\/uploads\/2020\/03\/11_create_pipeline_02-1.png?fit=700%2C312&amp;ssl=1\" alt=\"\" class=\"wp-image-6234\" srcset=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/11_create_pipeline_02-1.png 2038w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/11_create_pipeline_02-1-300x134.png 300w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/11_create_pipeline_02-1-1024x456.png 1024w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/11_create_pipeline_02-1-768x342.png 768w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/11_create_pipeline_02-1-1536x684.png 1536w\" sizes=\"auto, (max-width: 2038px) 100vw, 2038px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Next, use your GitHub account.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Be sure, that you cloned the <a href=\"https:\/\/github.com\/jenkins-toolbox\/SampleApp_GroovyCalculator\">demo repository<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image alignwide size-large\"><img decoding=\"async\" src=\"https:\/\/blog.via-internet.de\/wp-content\/uploads\/2020\/03\/11_create_pipeline_03-700x450.png\" alt=\"\" class=\"wp-image-6200\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Next, we select the demo repository <a href=\"https:\/\/github.com\/jenkins-toolbox\/SampleApp_GroovyCalculator\">SampleApp_GroovyCalculator<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image alignwide size-large\"><img decoding=\"async\" src=\"https:\/\/blog.via-internet.de\/wp-content\/uploads\/2020\/03\/11_create_pipeline_04-700x708.png\" alt=\"\" class=\"wp-image-6201\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Click on Create Pipeline and after a few seconds, the pipeline is created.<\/p>\n\n\n\n<figure class=\"wp-block-image alignwide size-large\"><img decoding=\"async\" src=\"https:\/\/blog.via-internet.de\/wp-content\/uploads\/2020\/03\/11_create_pipeline_06-700x732.png\" alt=\"\" class=\"wp-image-6203\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Immediately after creating the pipeline, Jenkins is starting the pipeline and all steps included.<\/p>\n\n\n\n<figure class=\"wp-block-image alignwide size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"2371\" height=\"524\" src=\"https:\/\/i0.wp.com\/blog.via-internet.de\/wp-content\/uploads\/2020\/03\/22_run_pipeline_1.png?fit=700%2C155&amp;ssl=1\" alt=\"\" class=\"wp-image-6205\" srcset=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/22_run_pipeline_1.png 2371w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/22_run_pipeline_1-300x66.png 300w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/22_run_pipeline_1-1024x226.png 1024w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/22_run_pipeline_1-768x170.png 768w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/22_run_pipeline_1-1536x339.png 1536w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/22_run_pipeline_1-2048x453.png 2048w\" sizes=\"auto, (max-width: 2371px) 100vw, 2371px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">If everything went well, you see a positive status<\/p>\n\n\n\n<figure class=\"wp-block-image alignwide size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"2368\" height=\"504\" src=\"https:\/\/i1.wp.com\/blog.via-internet.de\/wp-content\/uploads\/2020\/03\/22_run_pipeline_2.png?fit=700%2C149&amp;ssl=1\" alt=\"\" class=\"wp-image-6206\" srcset=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/22_run_pipeline_2.png 2368w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/22_run_pipeline_2-300x64.png 300w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/22_run_pipeline_2-1024x218.png 1024w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/22_run_pipeline_2-768x163.png 768w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/22_run_pipeline_2-1536x327.png 1536w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/22_run_pipeline_2-2048x436.png 2048w\" sizes=\"auto, (max-width: 2368px) 100vw, 2368px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Now, click on the pipeline (e.g. the text <code>master<\/code> or the status icon) and you will see the pipeline with all steps and their corresponding state.<\/p>\n\n\n\n<figure class=\"wp-block-image alignwide size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"2364\" height=\"1080\" src=\"https:\/\/i0.wp.com\/blog.via-internet.de\/wp-content\/uploads\/2020\/03\/23_view_pipeline-1.png?fit=700%2C320&amp;ssl=1\" alt=\"\" class=\"wp-image-6208\" srcset=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/23_view_pipeline-1.png 2364w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/23_view_pipeline-1-300x137.png 300w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/23_view_pipeline-1-1024x468.png 1024w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/23_view_pipeline-1-768x351.png 768w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/23_view_pipeline-1-1536x702.png 1536w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/23_view_pipeline-1-2048x936.png 2048w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/23_view_pipeline-1-517x235.png 517w\" sizes=\"auto, (max-width: 2364px) 100vw, 2364px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">If you, want to edit the pipeline, for example to add another step, like on the pencil in the header.<\/p>\n\n\n\n<figure class=\"wp-block-image alignwide size-large\"><img decoding=\"async\" src=\"https:\/\/blog.via-internet.de\/wp-content\/uploads\/2020\/03\/23_view_pipeline_edit_buttomX-700x31.png\" alt=\"\" class=\"wp-image-6242\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image alignwide size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"2378\" height=\"632\" src=\"https:\/\/i2.wp.com\/blog.via-internet.de\/wp-content\/uploads\/2020\/03\/24_edit_pipeline-1.png?fit=700%2C186&amp;ssl=1\" alt=\"\" class=\"wp-image-6211\" srcset=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/24_edit_pipeline-1.png 2378w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/24_edit_pipeline-1-300x80.png 300w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/24_edit_pipeline-1-1024x272.png 1024w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/24_edit_pipeline-1-768x204.png 768w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/24_edit_pipeline-1-1536x408.png 1536w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/24_edit_pipeline-1-2048x544.png 2048w\" sizes=\"auto, (max-width: 2378px) 100vw, 2378px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Click on <code>Cancel<\/code> to leave the Pipeline editor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Hint<\/strong>: If you click on <code>Save<\/code>, all changes are pushed back to the repository and Jenkins starts the Pipeline again.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Run the Pipeline<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you want to run your pipeline, click on the rerun icon for your pipeline<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"2341\" height=\"138\" src=\"https:\/\/i1.wp.com\/blog.via-internet.de\/wp-content\/uploads\/2020\/03\/31_run_pipeline_rerun.png?fit=700%2C41&amp;ssl=1\" alt=\"\" class=\"wp-image-6212\" srcset=\"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/31_run_pipeline_rerun.png 2341w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/31_run_pipeline_rerun-300x18.png 300w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/31_run_pipeline_rerun-1024x60.png 1024w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/31_run_pipeline_rerun-768x45.png 768w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/31_run_pipeline_rerun-1536x91.png 1536w, https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/31_run_pipeline_rerun-2048x121.png 2048w\" sizes=\"auto, (max-width: 2341px) 100vw, 2341px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Using Jenkins as an automation server for your development, you can automate such repeating tasks as testing and deploying your app. Starting with a sample Groovy App (a simple calculator) with tests, you will learn how to integrate your app in Jenkins and build a pipeline, so that Jenkins runs the desired tasks every [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":6220,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[13,30,40],"tags":[],"class_list":["post-6191","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ci-cd","category-groovy","category-jenkins"],"jetpack_featured_media_url":"https:\/\/via-internet.de\/blog\/wp-content\/uploads\/2020\/03\/jenkins-with-groovy-and-spock-1.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/posts\/6191","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/comments?post=6191"}],"version-history":[{"count":0,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/posts\/6191\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/media\/6220"}],"wp:attachment":[{"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/media?parent=6191"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/categories?post=6191"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/tags?post=6191"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}