{"id":168,"date":"2016-02-17T12:00:45","date_gmt":"2016-02-17T11:00:45","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=168"},"modified":"2023-06-09T14:14:51","modified_gmt":"2023-06-09T12:14:51","slug":"building_jobs_with_jenkins_and_github_part_3","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2016\/02\/17\/building_jobs_with_jenkins_and_github_part_3\/","title":{"rendered":"Jenkbird \u2013 Building jobs with Jenkins and Github \u2013 Part 3"},"content":{"rendered":"<blockquote><p>Me want&nbsp;Deployment Pipeline.<\/p>\n<p>&#8211; <em>Cookie Monster<\/em><\/p><\/blockquote>\n<p><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/cookie_monster.png\" rel=\"attachment wp-att-171\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"171\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2016\/02\/17\/building_jobs_with_jenkins_and_github_part_3\/cookie_monster\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/cookie_monster.png\" data-orig-size=\"600,600\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"cookie_monster\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/cookie_monster.png\" class=\"wp-image-171 alignleft\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/cookie_monster-300x300.png\" alt=\"cookie_monster\" width=\"232\" height=\"228\"><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>In this blog post we will show you, <strong>how to set up your first job using Jenkins CI and Github<\/strong>. We will guide you through every single step of the process &#8211; including all rookie mistakes we made. Without further ado, let&#8217;s begin.<\/p>\n<p><!--more--><\/p>\n<h2>Setting up a Deployment Pipeline with Jenkins and Github<\/h2>\n<p>First we need to install a simple web server. Usually you would use two different instances for your <strong>application<\/strong> and your <strong>Jenkins<\/strong>. For simplicity, we deploy our application on the same instance where our Jenkins lives. The most common web server these days is <strong>Apache<\/strong>.<\/p>\n<p>Therefore we will install the Apache web server, MySQL and PHP software packages. Use the <strong>yum install<\/strong>&nbsp;command to install multiple software packages plus all related dependencies at the same time:<\/p>\n<p><code class=\"\" data-line=\"\">sudo yum install -y httpd24 php56 mysql55-server php56-mysqlnd<\/code><\/p>\n<p>Start the Apache web server:<\/p>\n<p><code class=\"\" data-line=\"\">sudo service httpd start<\/code><\/p>\n<p>Use the <strong>chkconfig command<\/strong>&nbsp;to configure the Apache web server to start with&nbsp;every system boot:<\/p>\n<p><em><strong><code class=\"\" data-line=\"\">sudo chkconfig httpd on<\/code><\/strong><\/em><\/p>\n<p><em><strong>Tip<\/strong>: The chkconfig command does not provide any confirmation message when you successfully enable a service. You can verify that httpd is on by running the following command.<\/em><\/p>\n<p><code class=\"\" data-line=\"\">chkconfig --list httpd<\/code><\/p>\n<p>Here httpd is running in levels 2, 3, 4, and 5. You should see:<\/p>\n<p><code class=\"\" data-line=\"\">httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off<\/code><\/p>\n<p>If you see the same output in your shell everything worked fine.<\/p>\n<p>Now that we have installed our web server, we can test it! Enter your <strong>public DNS<\/strong> <strong>address<\/strong> in any&nbsp;browser. You should see the Apache test page. Remember this is the same URL we use for our Jenkins instance only on a different port. <strong>Jenkins<\/strong> is running on <strong>port 8080<\/strong>. <strong>Apache<\/strong> is running by default on <strong>port 80<\/strong>.<\/p>\n<p>If you are not able to see the Apache test page, you probably have a problem with your security groups. The security group you specified for your instance should contain a rule to <strong>allow HTTP traffic on port 80<\/strong>.<\/p>\n<p>Apache httpd serves files that are kept in the Apache document root. The Amazon Linux Apache document root is <strong>\/var\/www\/html<\/strong>, which is by default owned by root.<\/p>\n<p><code class=\"\" data-line=\"\">ls -l \/var\/www<\/code><\/p>\n<pre class=\"prettyprint lang-javascript\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">total 16\ndrwxr-xr-x 2 root root 4096 Jul 12 01:00 cgi-bin\ndrwxr-xr-x 3 root root 4096 Aug  7 00:02 error\ndrwxr-xr-x 2 root root 4096 Jan  6  2012 html\ndrwxr-xr-x 3 root root 4096 Aug  7 00:02 icons<\/pre>\n<p>In the next step we have to set the <strong>owner<\/strong> and the <strong>group<\/strong>&nbsp;which is allowed to <strong>read\/write\/execute<\/strong> this document root.<\/p>\n<p>First we add a new group named <strong>www<\/strong>:<\/p>\n<p><code class=\"\" data-line=\"\">sudo groupadd www<\/code><\/p>\n<p>Next we will add our jenkins and our apache user to the www group:<\/p>\n<p><code class=\"\" data-line=\"\">sudo usermod -G www jenkins<\/code><\/p>\n<p><code class=\"\" data-line=\"\">sudo usermod -G www apache<\/code><\/p>\n<p><em style=\"line-height: 1.7em;\"><strong>Important<\/strong>: You need to log out and log back in to pick up the new group. You can use the exit command or close the terminal window.<\/em><\/p>\n<p><code class=\"\" data-line=\"\">exit<\/code><\/p>\n<p>Reconnect to your instance as <strong>Jenkins user<\/strong>:<\/p>\n<p><code class=\"\" data-line=\"\">su - jenkins<\/code><\/p>\n<p>Run the following command to verify your membership in the <strong>www group<\/strong>:<\/p>\n<p><code class=\"\" data-line=\"\">groups <\/code><\/p>\n<p>Now that our Jenkins user is member of the www group we change the owner of our apache document root. We only want <strong>Jenkins<\/strong>&nbsp;and <strong>Apache<\/strong>&nbsp;to make changes to this folder:<\/p>\n<p><code class=\"\" data-line=\"\">sudo chown -R jenkins:www \/var\/www\/html<\/code><\/p>\n<p>Next we set the permission so that only the owner and the group can read\/write\/execute content (root always has these permissions):<\/p>\n<p><code class=\"\" data-line=\"\">chmod -R 770 \/var\/www\/html<\/code><\/p>\n<p>Now that our web server, permissions and groups are configured we need some version control tool. The most common source control system is git. Install it on your instance by simply running:<\/p>\n<p><code class=\"\" data-line=\"\">yum install git<\/code><\/p>\n<p>At last all the shell stuff is done (Whoop Whoop!). Please switch&nbsp;to your <strong>Jenkins web interface<\/strong>.<\/p>\n<p>Here you will need to install a <strong>plugin<\/strong>. To do this,&nbsp;go to<em> Manage Jenkins \/ Manage Plugins<\/em>, switch to the tab <em>available<\/em> and search for the plugin named <em>github Plug-In<\/em><strong>&nbsp;<\/strong> (see <a href=\"https:\/\/wiki.jenkins-ci.org\/display\/JENKINS\/GitHub+Plugin\">plugin<\/a> page here). After installing the plugin you need to restart your Jenkins.<\/p>\n<p>We are now about to create our very first job! Click on the link and you will be able to configure your first project.<\/p>\n<p><a style=\"line-height: 1.7em;\" href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/3B79204DD05C88F2FFD09779050A6EC7.png\" rel=\"attachment wp-att-204\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"204\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2016\/02\/17\/building_jobs_with_jenkins_and_github_part_3\/3b79204dd05c88f2ffd09779050a6ec7\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/3B79204DD05C88F2FFD09779050A6EC7.png\" data-orig-size=\"1362,283\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"title\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/3B79204DD05C88F2FFD09779050A6EC7-1024x213.png\" class=\"alignnone wp-image-204 size-full\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/3B79204DD05C88F2FFD09779050A6EC7.png\" alt=\"Picture of Jekins' Webinterface\" width=\"1362\" height=\"283\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/3B79204DD05C88F2FFD09779050A6EC7.png 1362w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/3B79204DD05C88F2FFD09779050A6EC7-300x62.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/3B79204DD05C88F2FFD09779050A6EC7-768x160.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/3B79204DD05C88F2FFD09779050A6EC7-1024x213.png 1024w\" sizes=\"auto, (max-width: 1362px) 100vw, 1362px\" \/><\/a><\/p>\n<p>We are going to create a freestyle project called <strong>deploy_dev_branch<\/strong>, to indicate that this job is for the deployment from our dev branch to the environment. You can think of a much more creative name if you like, but in the boring real world it&#8217;s best if the purpose of the job can be guessed from it&#8217;s name.<\/p>\n<p><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/C75DB2ED293D06A1879501A7F9A00BBB.png\" rel=\"attachment wp-att-205\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"205\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2016\/02\/17\/building_jobs_with_jenkins_and_github_part_3\/c75db2ed293d06a1879501a7f9a00bbb\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/C75DB2ED293D06A1879501A7F9A00BBB.png\" data-orig-size=\"1366,743\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"freestyle_project_jekins\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/C75DB2ED293D06A1879501A7F9A00BBB-1024x557.png\" class=\"alignnone size-full wp-image-205\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/C75DB2ED293D06A1879501A7F9A00BBB.png\" alt=\"freestyle_project_jekins\" width=\"1366\" height=\"743\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/C75DB2ED293D06A1879501A7F9A00BBB.png 1366w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/C75DB2ED293D06A1879501A7F9A00BBB-300x163.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/C75DB2ED293D06A1879501A7F9A00BBB-768x418.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/C75DB2ED293D06A1879501A7F9A00BBB-1024x557.png 1024w\" sizes=\"auto, (max-width: 1366px) 100vw, 1366px\" \/><\/a><br \/>\nMay you should first have a quick look at the <a href=\"https:\/\/github.com\/tderleth\/Sesame_Deployment_Street\">repository<\/a>. As you can see the repository contains a simple <a href=\"https:\/\/laravel.com\/\">Laravel<\/a> application. It basically just displays a text on a web page. We also created two branches named <em>dev<\/em> &amp; <em>demo<\/em>. These branches are based on the branching strategy we illustrated in our previous <a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2016\/02\/17\/jenkbird-the-art-of-deployment-tutorial-part-2\/\">post<\/a>.<\/p>\n<p>As the name tells us the <em>dev<\/em> branch is used for development and is allowed to&nbsp;contain broken code. More important is the demo branch which should contain a running and stable version of your application.<\/p>\n<p>Back to topic: You should see the point <strong>Source Code Management<\/strong>&nbsp;somewhere, we are going to use git in this example. Just link to the repository and provide the necessary credentials.<\/p>\n<p><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/EE28150E9929FD18059D89CF87948B50.png\" rel=\"attachment wp-att-206\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"206\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2016\/02\/17\/building_jobs_with_jenkins_and_github_part_3\/ee28150e9929fd18059d89cf87948b50\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/EE28150E9929FD18059D89CF87948B50.png\" data-orig-size=\"1366,743\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"add_master_branch_jenkins\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/EE28150E9929FD18059D89CF87948B50-1024x557.png\" class=\"alignnone size-full wp-image-206\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/EE28150E9929FD18059D89CF87948B50.png\" alt=\"add_master_branch_jenkins\" width=\"1366\" height=\"743\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/EE28150E9929FD18059D89CF87948B50.png 1366w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/EE28150E9929FD18059D89CF87948B50-300x163.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/EE28150E9929FD18059D89CF87948B50-768x418.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/01\/EE28150E9929FD18059D89CF87948B50-1024x557.png 1024w\" sizes=\"auto, (max-width: 1366px) 100vw, 1366px\" \/><\/a><br \/>\nAlthough we are triggering our jobs manually you should know that there is the possibility to trigger a job automatically after a change in the repository. It is also possible to have jobs run periodically. Now we configure Jenkins to pull the code into the HTML folder. In order to do that,&nbsp;add a new build-step and select <em>run shell command<\/em>. Insert the following code:<\/p>\n<pre class=\"prettyprint lang-javascript\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">#!\/bin\/sh\ncd \/var\/www\/html\/\nif [ ! -d \/var\/www\/html\/app ]; then\n    git clone https:\/\/github.com\/tderleth\/Sesame_Deployment_Street.git .\n    git fetch origin\nfi\ngit reset --hard origin\/dev\nexit<\/pre>\n<p>This script is executed when the job is run. First we check if the app folder of our application exists. We haven\u00b4t deployed any version of our application yet? Then just clone it directly from Github and fetch all it\u00b4s branches. For pulling the application we set our local head to the origin of our <em>dev<\/em> branch and finally we exit the script. Everything is done and our job is ready to get executed!<\/p>\n<p>You can select your fresh new job on the dashboard and run it manually via Build now. Feels pretty good, doesn&#8217;t it? Hopefully the small circle icon is blue, which means the built was successful, if its red, it means you should revisit the configuration of the job. Check the console output of your job, as it contains valuable information regarding the execution of the job.<\/p>\n<p>Now we are going to add another job &#8211; namely <strong>deploy_demo_branch<\/strong>. We do it the same way we created the first job except that we pull the demo branch. Congrats you&#8217;ve now configured two Jenkins jobs! Just let one of them run and check if your application is beeing&nbsp;deployed. You should see it at &lt;public-dns&gt;\/public.<\/p>\n<p><strong>What&#8217;s coming up&nbsp;in the next episode?<\/strong><\/p>\n<p>In the next episode we will cover some common approaches for testing and quality assurance. This includes basics about testing and how to set up a simple functional test for our application.<\/p>\n<p>[1] Continuous Integration &#8211; Martin Fowler&nbsp;<a href=\"http:\/\/www.martinfowler.com\/articles\/continuousIntegration.html\">http:\/\/www.martinfowler.com\/articles\/continuousIntegration.html<\/a><\/p>\n<p><em>Blogpost by Thomas Derleth (td036), J\u00f6rg Einfeldt (je051), Marc Stauffer (ms445)<\/em><\/p>\n<hr>\n<p>Read more about Testing in our Tutorial part 4<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Me want&nbsp;Deployment Pipeline. &#8211; Cookie Monster &nbsp; In this blog post we will show you, how to set up your first job using Jenkins CI and Github. We will guide you through every single step of the process &#8211; including all rookie mistakes we made. Without further ado, let&#8217;s begin.<\/p>\n","protected":false},"author":12,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[659,650,651,2],"tags":[],"ppma_author":[692],"class_list":["post-168","post","type-post","status-publish","format-standard","hentry","category-devops","category-scalable-systems","category-system-designs","category-system-engineering"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":1758,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/01\/12\/snakes-exploring-pipelines-a-system-engineering-and-management-project-5\/","url_meta":{"origin":168,"position":0},"title":"Snakes exploring Pipelines &#8211; A \u201cSystem Engineering and Management\u201d Project","author":"Yann Loic Philippczyk","date":"12. January 2017","format":false,"excerpt":"Part 4: Jenkins and Wrap Up This series of blog entries describes a student project focused on developing an application by using methods like pair programming, test driven development and deployment pipelines. Our first blog entry for this year will at the same time be the final one for this\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/01\/jenkins_code-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/01\/jenkins_code-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/01\/jenkins_code-1.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":382,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2016\/02\/21\/wrap-up-seeing-the-bigger-picture-part-5\/","url_meta":{"origin":168,"position":1},"title":"Jenkbird &#8211; Wrap up &#038; seeing the bigger picture &#8211; Part 5","author":"J\u00f6rg Einfeldt","date":"21. February 2016","format":false,"excerpt":"Kchhhhhh, Kchhhhhh, Kchhhhhhh... - Ernie on companies without CI Hello internet and welcome to the last part of our\u00a0tutorial series about\u00a0Continuous Integration, Code Deployment and Automated Testing with Jenkins. If you arrived at this post and have read all the others we are very proud of you, hope you enjoyed\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"bert","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/02\/bert-186x300.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":3822,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2018\/08\/05\/3822\/","url_meta":{"origin":168,"position":2},"title":"Web Performance Optimization for Continuous Deployment &#8211; Move fast and don&#8217;t lose performance","author":"Benjamin Kowatsch","date":"5. August 2018","format":false,"excerpt":"The performance of websites today is a decisive factor in how many users visit them and thus how much money can be earned from them. The impact of this fact is further enhanced by the widespread use of mobile devices and the speed of the mobile Internet. To counteract the\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":26965,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/02\/28\/wie-baut-man-eine-ci-cd-pipeline-mit-jenkins-auf\/","url_meta":{"origin":168,"position":3},"title":"Wie baut man eine CI\/CD Pipeline mit Jenkins auf?","author":"Cedric Gottschalk","date":"28. February 2025","format":false,"excerpt":"Im Rahmen der Vorlesung \"System Engineering und Management (143101a)\" haben wir es uns zum Ziel gesetzt, mehr \u00fcber CI\/CD Pipelines zu lernen und eine eigene Pipeline f\u00fcr ein kleines Projekt aufzusetzen. Wir haben uns dabei entschieden, Jenkins f\u00fcr die CI\/CD Pipeline einzusetzen und eine kleine ToDo App mit dem Framework\u2026","rel":"","context":"In &quot;System Engineering&quot;","block_context":{"text":"System Engineering","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/system-designs\/system-engineering\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/ToDo-List-CICD-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/ToDo-List-CICD-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/ToDo-List-CICD-1.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/ToDo-List-CICD-1.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/ToDo-List-CICD-1.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/ToDo-List-CICD-1.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":79,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2015\/12\/29\/sesame-deployment-street-continuous-integration-with-jenkins-tutorial-part-1\/","url_meta":{"origin":168,"position":4},"title":"Jenkbird \u2013 Continuous Integration with Jenkins Tutorial \u2013 Part 1","author":"Marc Stauffer","date":"29. December 2015","format":false,"excerpt":"Bad days happen to everyone, but when one happens to you, just keep doing your best and never let a bad day make you feel bad about yourself.\u201d \u2014 Big Bird about\u00a0a day with deployment problems \"Continuous Integration\" (CI) and \"Continuous Delivery\" (CD) are topics every modern software developer should\u2026","rel":"","context":"In &quot;DevOps&quot;","block_context":{"text":"DevOps","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/devops\/"},"img":{"alt_text":"Jenkbird","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2015\/12\/Yhfrwka16hgJOdDTrwFaVPWfBhzA72MWv9qwzj-tvdA-217x300.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":1782,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/05\/scheme_interpreter\/","url_meta":{"origin":168,"position":5},"title":"Scheme Interpreter","author":"hb052","date":"5. February 2017","format":false,"excerpt":"Introduction In the the course Software Engineering and Management and Design and implementation progressed programing languages at Stuttgart Media University, I developed an own Interpreter. \u00a0 About the Interpreter The syntax of this interpreter is\u00a0based on the \u201elips\u201c family, a programming language which is structured in lists (definition). This type\u2026","rel":"","context":"In &quot;System Designs&quot;","block_context":{"text":"System Designs","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/system-designs\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_sharing_enabled":true,"authors":[{"term_id":692,"user_id":12,"is_guest":0,"slug":"td036","display_name":"Thomas Derleth","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/96baa052482491040e7a411673fb99628fa7dab61246ae854471e24ad43feb81?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/168","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/comments?post=168"}],"version-history":[{"count":33,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/168\/revisions"}],"predecessor-version":[{"id":24658,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/168\/revisions\/24658"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=168"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=168"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=168"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=168"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}