{"id":3348,"date":"2018-03-30T19:45:15","date_gmt":"2018-03-30T17:45:15","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=3348"},"modified":"2023-06-09T14:22:37","modified_gmt":"2023-06-09T12:22:37","slug":"continuous-integration-pipeline-for-unity-development-using-gitlab-ci-and-aws","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2018\/03\/30\/continuous-integration-pipeline-for-unity-development-using-gitlab-ci-and-aws\/","title":{"rendered":"Continuous Integration Pipeline for Unity Development using GitLab CI and AWS"},"content":{"rendered":"<div class=\"mceTemp\">&nbsp;<span style=\"font-weight: 400;\">This blog entry describes the implementation of a Continuous Integration (CI) pipeline especially adapted for Unity projects. It makes it possible to automatically execute Unity builds on a configured build server and to provide it for a further deployment process if required.<\/span><\/div>\n<p><span style=\"font-weight: 400;\">You will learn the steps necessary to configure the CI pipeline and best practices in relation to a CI pipeline for Unity projects.<\/span><br \/>\n<!--more--><br \/>\n<span style=\"font-weight: 400;\">The reason for creating our CI pipeline is the development of a Unity AR App (iOS), for which we want to automate the build process in our workflow. The advantages we would like to get from this pipeline for our project and our team of seven developers are:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">automatically test and build code on a suitable build server after each push<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">fast, automated feedback that can be accessed by everyone in the team<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">making the build artifact available after a successful build automatically for every developer<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">It should also be mentioned that we don\u2019t use the available Unity Cloud Build option but decided to implement our own Unity CI pipeline (https:\/\/unity3d.com\/de\/unity\/features\/cloud-build). This results in the following benefits:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">full control over CI process<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">use of known environments like GitLab \/ GitLab CI<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">lower costs for the developer team (license for Cloud Build \/ Unity Teams is about 40\u20ac for 7 developers (https:\/\/unity3d.com\/de\/teams))<\/span><\/li>\n<\/ul>\n<h1><b style=\"font-size: 32px;\">1. GitLab CI<\/b><\/h1>\n<p><span style=\"font-weight: 400;\">Because we already had a GitLab project repository for our application, it was the obvious choice that we use the integrated GitLab CI solution for our CI pipeline. The configuration of GitLAb CI pipeline is described in detail in the provided GitLab documentation (https:\/\/docs.gitlab.com\/ee\/ci\/README.html). All settings of a GitLab CI pipeline generally, are described in a <\/span><b>.gitlab-ci.yml file<\/b><span style=\"font-weight: 400;\">. In our project, we have the following settings:<\/span><\/p>\n<figure id=\"attachment_3523\" aria-describedby=\"caption-attachment-3523\" style=\"width: 1183px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"3523\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2018\/03\/30\/continuous-integration-pipeline-for-unity-development-using-gitlab-ci-and-aws\/bildschirmfoto-2018-03-24-um-13-24-57\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-24-um-13.24.57.jpg\" data-orig-size=\"1183,351\" 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;1521897897&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=\"Gitlab CI file\" data-image-description=\"\" data-image-caption=\"&lt;p&gt;Figure 1: gitlab ci configuration file&lt;\/p&gt;\n\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-24-um-13.24.57-1024x304.jpg\" class=\"size-full wp-image-3523\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-24-um-13.24.57.jpg\" alt=\"\" width=\"1183\" height=\"351\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-24-um-13.24.57.jpg 1183w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-24-um-13.24.57-300x89.jpg 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-24-um-13.24.57-768x228.jpg 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-24-um-13.24.57-1024x304.jpg 1024w\" sizes=\"auto, (max-width: 1183px) 100vw, 1183px\" \/><figcaption id=\"caption-attachment-3523\" class=\"wp-caption-text\">Figure 1: gitlab ci configuration file<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">As you can see in the .gitlab-ci.yml file (Figure 1), we have defined 2 stages, the test and buildIos stage. The two powershell scripts are used to execute the test and the iOS build on our build server. They are described in section 3 (Build Server) in more detail, as well as the configuration of the GitLab CI Runner, which is installed on the build server and runs our build job. Furthermore, the paths for the artifacts of the test results and builds are defined. The saved build artifacts are available for 1 week (expire_in: 1 week). The .gitlab-ci.yml file and the powershell scripts are stored in the GitLab project repository.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Figure 2 and 3 show sections from the GitLab CI web interface. You can see examples of our pipelines a<\/span><span style=\"font-weight: 400;\">nd&nbsp;some executed jobs. To analyze them you can select the desired pipeline and stage. It\u2019s possible to analyze the console output of a build job and see the code changes.<\/span><\/p>\n<figure id=\"attachment_3365\" aria-describedby=\"caption-attachment-3365\" style=\"width: 1421px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"3365\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2018\/03\/30\/continuous-integration-pipeline-for-unity-development-using-gitlab-ci-and-aws\/bildschirmfoto-2018-03-24-um-13-14-35\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-24-um-13.14.35.jpg\" data-orig-size=\"1421,497\" 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;1521897275&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=\"Pipelines\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-24-um-13.14.35-1024x358.jpg\" class=\"wp-image-3365 size-full\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-24-um-13.14.35.jpg\" alt=\"\" width=\"1421\" height=\"497\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-24-um-13.14.35.jpg 1421w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-24-um-13.14.35-300x105.jpg 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-24-um-13.14.35-768x269.jpg 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-24-um-13.14.35-1024x358.jpg 1024w\" sizes=\"auto, (max-width: 1421px) 100vw, 1421px\" \/><figcaption id=\"caption-attachment-3365\" class=\"wp-caption-text\">Figure 2: Pipelines<\/figcaption><\/figure>\n<figure id=\"attachment_3366\" aria-describedby=\"caption-attachment-3366\" style=\"width: 1427px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"3366\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2018\/03\/30\/continuous-integration-pipeline-for-unity-development-using-gitlab-ci-and-aws\/bildschirmfoto-2018-03-24-um-12-06-36\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-24-um-12.06.36.jpg\" data-orig-size=\"1427,497\" 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;1521893196&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=\"Build Jobs\" data-image-description=\"\" data-image-caption=\"&lt;p&gt;Figure 3: executed Build Jobs&lt;\/p&gt;\n\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-24-um-12.06.36-1024x357.jpg\" class=\"size-full wp-image-3366\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-24-um-12.06.36.jpg\" alt=\"\" width=\"1427\" height=\"497\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-24-um-12.06.36.jpg 1427w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-24-um-12.06.36-300x104.jpg 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-24-um-12.06.36-768x267.jpg 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-24-um-12.06.36-1024x357.jpg 1024w\" sizes=\"auto, (max-width: 1427px) 100vw, 1427px\" \/><figcaption id=\"caption-attachment-3366\" class=\"wp-caption-text\">Figure 3: executed Build Jobs<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">After a successful build job, the iOS build artifacts can be downloaded as a ZIP file. When the folder is downloaded and unpacked, the Xcode project (.xcodeproj File) can be opened in Xcode. With an Apple Developer Account you can&nbsp;now build and run the application on a selected iOS device. Figure 4 lists the unzipped build artifacts provided by our build job.<\/span><\/p>\n<figure id=\"attachment_3368\" aria-describedby=\"caption-attachment-3368\" style=\"width: 658px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"3368\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2018\/03\/30\/continuous-integration-pipeline-for-unity-development-using-gitlab-ci-and-aws\/bildschirmfoto-2018-03-24-um-15-53-27\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-24-um-15.53.27.jpg\" data-orig-size=\"688,404\" 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;1521906807&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=\"Build artifact\" data-image-description=\"\" data-image-caption=\"&lt;p&gt;Figure 4: Build artifact&lt;\/p&gt;\n\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-24-um-15.53.27.jpg\" class=\" wp-image-3368\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-24-um-15.53.27.jpg\" alt=\"\" width=\"658\" height=\"386\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-24-um-15.53.27.jpg 688w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-24-um-15.53.27-300x176.jpg 300w\" sizes=\"auto, (max-width: 658px) 100vw, 658px\" \/><figcaption id=\"caption-attachment-3368\" class=\"wp-caption-text\">Figure 4: Build artifact<\/figcaption><\/figure>\n<h1><b>2. Infrastructure and development process<\/b><\/h1>\n<p><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"3369\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2018\/03\/30\/continuous-integration-pipeline-for-unity-development-using-gitlab-ci-and-aws\/infrastructure\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Infrastructure.png\" data-orig-size=\"553,546\" 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=\"Infrastructure\" data-image-description=\"\" data-image-caption=\"&lt;p&gt;Figure 5: Infrastructure&lt;\/p&gt;\n\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Infrastructure.png\" class=\"wp-image-3369 size-full\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Infrastructure.png\" alt=\"\" width=\"553\" height=\"546\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Infrastructure.png 553w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Infrastructure-300x296.png 300w\" sizes=\"auto, (max-width: 553px) 100vw, 553px\" \/><\/p>\n<p>Figure 5: Infrastructure<\/p>\n<p><span style=\"font-weight: 400;\">In Figure 5 you can see our infrastructure for this project. We use two servers for our CI pipeline. One internal server of our university (mi.hdm-stuttgart.de), to run GitLab \/ GitLab CI and another configured VM to run JIRA as separate project management tool. The JIRA configuration is not discussed in this blog. For the other server, the build server, we use an AWS instance whose configuration is explained explicitly in the third section of this blog (Build Server).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The exactly development process we use for our CI pipeline is depicted in the figure below.<\/span><\/p>\n<figure id=\"attachment_3391\" aria-describedby=\"caption-attachment-3391\" style=\"width: 708px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"3391\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2018\/03\/30\/continuous-integration-pipeline-for-unity-development-using-gitlab-ci-and-aws\/ci_process\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/CI_process.png\" data-orig-size=\"708,584\" 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=\"CI_process\" data-image-description=\"\" data-image-caption=\"&lt;p&gt;Figure 6: CI Process&lt;\/p&gt;\n\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/CI_process.png\" class=\"size-full wp-image-3391\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/CI_process.png\" alt=\"\" width=\"708\" height=\"584\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/CI_process.png 708w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/CI_process-300x247.png 300w\" sizes=\"auto, (max-width: 708px) 100vw, 708px\" \/><figcaption id=\"caption-attachment-3391\" class=\"wp-caption-text\">Figure 6: CI Process<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">The visualization&nbsp;again shows that the focus of our CI pipeline is on executing &amp; testing the Unity Build and deploying it as an Xcode project. Explicit device or UI tests as well as a automatically Continous Delivery (CD) process are not planned for our pipeline.<\/span><\/p>\n<h1><b>3. Build Server<\/b><\/h1>\n<p><span style=\"font-weight: 400;\">By building a CI pipeline we want to make the build process independent from each developers developing environment. Therefore we need a build server that is able to automatically build the application whenever it is triggered by Gitlab CI. Unfortunately a build inside Docker seems to be difficult at the moment because Unity Community Edition cannot be activated over command line arguments (<\/span><a href=\"https:\/\/gitlab.com\/gableroux\/unity3d-gitlab-ci-example\/issues\/5\"><span style=\"font-weight: 400;\">https:\/\/gitlab.com\/gableroux\/unity3d-gitlab-ci-example\/issues\/5<\/span><\/a><span style=\"font-weight: 400;\">). Once this issue is resolved, this would be a great option to build Unity apps as well. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">In our setup we chose Amazon AWS as the IaaS platform. We chose AWS because of the wide variety of services, our prior knowledge and to learn more about the market leading cloud platform. For our infrastructure we use an AWS EC2 instance combined with a Elastic GPU. On this machine we have our properly set up Unity environment and everything we need to build the app. <\/span><\/p>\n<figure id=\"attachment_3390\" aria-describedby=\"caption-attachment-3390\" style=\"width: 674px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"3390\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2018\/03\/30\/continuous-integration-pipeline-for-unity-development-using-gitlab-ci-and-aws\/infra\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/infra.png\" data-orig-size=\"674,403\" 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=\"Build server infrastructure\" data-image-description=\"\" data-image-caption=\"&lt;p&gt;Figure 7: Build server infrastructure&lt;\/p&gt;\n\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/infra.png\" class=\"size-full wp-image-3390\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/infra.png\" alt=\"\" width=\"674\" height=\"403\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/infra.png 674w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/infra-300x179.png 300w\" sizes=\"auto, (max-width: 674px) 100vw, 674px\" \/><figcaption id=\"caption-attachment-3390\" class=\"wp-caption-text\">Figure 7: Build server infrastructure<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">The build server itself is a EC2 \u201cT2.Medium\u201d running with Windows Server. On this Windows machine we will have a Unity Instance with installed iOS and Vuforia support in the correct Version to build the app. Each build is triggered by the Gitlab Runner which uses a Powershell script to execute the build process. <\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Steps to setup the Server<\/span><\/h2>\n<h4>1. Launch EC2 Instance<\/h4>\n<p><span style=\"font-weight: 400;\">On the EC2 panel (<\/span><a href=\"https:\/\/console.aws.amazon.com\/ec2\/v2\/home\"><span style=\"font-weight: 400;\">https:\/\/console.aws.amazon.com\/ec2\/v2\/home<\/span><\/a><span style=\"font-weight: 400;\">) choose \u201cLaunch Instance\u201d. In order to use the EC2 GPU (to be able to start the Unity editor) we need to choose a Windows machine. Except of the following settings you can leave standard values. <\/span><\/p>\n<figure id=\"attachment_3372\" aria-describedby=\"caption-attachment-3372\" style=\"width: 2422px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"3372\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2018\/03\/30\/continuous-integration-pipeline-for-unity-development-using-gitlab-ci-and-aws\/bildschirmfoto-2018-03-16-um-15-22-48\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-16-um-15.22.48.png\" data-orig-size=\"2422,362\" 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=\"Machine Type\" data-image-description=\"\" data-image-caption=\"&lt;p&gt;Figure 8: EC2 Machine Type&lt;\/p&gt;\n\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-16-um-15.22.48-1024x153.png\" class=\"wp-image-3372 size-full\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-16-um-15.22.48.png\" alt=\"\" width=\"2422\" height=\"362\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-16-um-15.22.48.png 2422w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-16-um-15.22.48-300x45.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-16-um-15.22.48-768x115.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-16-um-15.22.48-1024x153.png 1024w\" sizes=\"auto, (max-width: 2422px) 100vw, 2422px\" \/><figcaption id=\"caption-attachment-3372\" class=\"wp-caption-text\">Figure 8: EC2 Machine image<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">Elastic GPU service is only available for EC2 Instances t2.medium and above. So at least choose t2.medium as your machine type.<\/span><\/p>\n<figure id=\"attachment_3373\" aria-describedby=\"caption-attachment-3373\" style=\"width: 2862px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"3373\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2018\/03\/30\/continuous-integration-pipeline-for-unity-development-using-gitlab-ci-and-aws\/bildschirmfoto-2018-03-16-um-15-23-17\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-16-um-15.23.17.png\" data-orig-size=\"2862,1076\" 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=\"Machine size\" data-image-description=\"\" data-image-caption=\"&lt;p&gt;Figure 9: EC2 Machine size&lt;\/p&gt;\n\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-16-um-15.23.17-1024x385.png\" class=\"wp-image-3373 size-full\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-16-um-15.23.17.png\" alt=\"\" width=\"2862\" height=\"1076\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-16-um-15.23.17.png 2862w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-16-um-15.23.17-300x113.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-16-um-15.23.17-768x289.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-16-um-15.23.17-1024x385.png 1024w\" sizes=\"auto, (max-width: 2862px) 100vw, 2862px\" \/><figcaption id=\"caption-attachment-3373\" class=\"wp-caption-text\">Figure 9: EC2 Machine type<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">Now in step 3 you can activate Elastic GPU and choose <\/span><i><span style=\"font-weight: 400;\">eg1.large<\/span><\/i><span style=\"font-weight: 400;\">.<\/span><\/p>\n<figure id=\"attachment_3374\" aria-describedby=\"caption-attachment-3374\" style=\"width: 2304px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"3374\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2018\/03\/30\/continuous-integration-pipeline-for-unity-development-using-gitlab-ci-and-aws\/bildschirmfoto-2018-03-16-um-15-23-44\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-16-um-15.23.44.png\" data-orig-size=\"2304,830\" 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=\"Elastic GPU\" data-image-description=\"\" data-image-caption=\"&lt;p&gt;Figure 10: Elastic GPU&lt;\/p&gt;\n\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-16-um-15.23.44-1024x369.png\" class=\"size-full wp-image-3374\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-16-um-15.23.44.png\" alt=\"\" width=\"2304\" height=\"830\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-16-um-15.23.44.png 2304w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-16-um-15.23.44-300x108.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-16-um-15.23.44-768x277.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Bildschirmfoto-2018-03-16-um-15.23.44-1024x369.png 1024w\" sizes=\"auto, (max-width: 2304px) 100vw, 2304px\" \/><figcaption id=\"caption-attachment-3374\" class=\"wp-caption-text\">Figure 10: Elastic GPU<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">Because the Unity installation needs a lot of space, we need to increase the SSD size to 50GB. So we have enough space left on the disk to run all needed software.<\/span><\/p>\n<h4>2. Setup Unity<\/h4>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Once your machine is ready to use, download&nbsp; and open a Remote Desktop Session to the Windows Server. <\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Download Unity Installer<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Install Unity, Vuforia and iOS Support \/ Android Support<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">launch and activate Unity once using your Unity account<\/span><\/li>\n<\/ul>\n<h4><span style=\"font-weight: 400;\">3. Setup GitLab Runner <\/span><\/h4>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Download and install GitLab Runner <\/span><a href=\"https:\/\/docs.gitlab.com\/runner\/install\/windows.html\"><span style=\"font-weight: 400;\">https:\/\/docs.gitlab.com\/runner\/install\/windows.html<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Register the runner with your project <\/span><a href=\"https:\/\/docs.gitlab.com\/runner\/register\/index.html\"><span style=\"font-weight: 400;\">https:\/\/docs.gitlab.com\/runner\/register\/index.html<\/span><\/a><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">The Gitlab Runner is now registered with your project and will be able to execute the script to build the software whenever a build is triggered. The build files (XCode Project) will then be submitted to Gitlab where it can be downloaded and built for your device. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">In the Powershell script to start the build process, we need to call Unity with the following command line options:<\/span><\/p>\n<table>\n<tbody>\n<tr>\n<td><span style=\"font-weight: 400;\">C:\\&#8217;Program Files&#8217;\\Unity\\Editor\\Unity.exe <\/span><\/td>\n<td><span style=\"font-weight: 400;\">call unity executable <\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">-batchmode<\/span><\/td>\n<td><span style=\"font-weight: 400;\">execute in batchmode to prevent the editor from opening<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">-nographics <\/span><\/td>\n<td><span style=\"font-weight: 400;\">needed on windows to really make sure there is no GUI<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">-executeMethod BuildScript.Build <\/span><\/td>\n<td><span style=\"font-weight: 400;\">calls the Method \u201cBuild()\u201d in the Unity BuildScript<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">-projectPath $(pwd) <\/span><\/td>\n<td><span style=\"font-weight: 400;\">sets the project path to current directory (repository downloaded by GitLab Runner)<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">-quit<\/span><\/td>\n<td><span style=\"font-weight: 400;\">quit Unity after execution of the buil<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">-logFile build.log<\/span><\/td>\n<td><span style=\"font-weight: 400;\">specify log file<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Now the method of the Unity Build Script is executed. For iOS the Unity build method looks like this:<\/span><\/p>\n<pre class=\"prettyprint lang-csharp\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">public static readonly string[] scenes = { \"Assets\/Scenes\/LandingPageScene.unity\", \u2026 };\/\/add all Scenes to include in Build\n\npublic static void Build()\n\n{\n\n    Console.Write(\"build for Ios\");\n\n    BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions();\n\n    buildPlayerOptions.scenes = scenes; \/\/ add scenes\n\n    buildPlayerOptions.locationPathName = \".\/iOSProdBuild\"; \/\/set location\n\n    buildPlayerOptions.target = BuildTarget.iOS; \/\/ build for iOS\n\n    buildPlayerOptions.options = BuildOptions.None; \/\/ set default for others \n\n    BuildPipeline.BuildPlayer(buildPlayerOptions); \/\/build\n\n}<\/pre>\n<h2><b><br \/>\nLessons learned<\/b><\/h2>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">related to our Unity project: Start to configure your CI pipeline as soon as possible to benefit from it right from the start of the development process<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Unity installation and configuration on server can be very time-consuming (e.g. the installation of required Unity packages)<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">maybe consider Docker Container (in combination with X Server) or&nbsp; Infrastructure as Code (IAC) to get easier environment setup for Unity <\/span><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>This blog entry describes the implementation of a Continous Integration (CI) pipeline especially adapted for Unity projects. It makes it possible to automatically execute Unity builds on a configured build server and provide it for a further deployment process if required.<\/p>\n","protected":false},"author":867,"featured_media":3391,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[659,650,651,2,657],"tags":[144,145,146],"ppma_author":[748],"class_list":["post-3348","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops","category-scalable-systems","category-system-designs","category-system-engineering","category-teaching-and-learning","tag-ci-pipeline","tag-gitlab-ci","tag-unity"],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/CI_process.png","jetpack-related-posts":[{"id":3496,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2018\/03\/30\/ci-cd-with-gitlab-ci-for-a-web-application-part-1\/","url_meta":{"origin":3348,"position":0},"title":"CI\/CD with GitLab CI for a web application &#8211; Part 1","author":"Nina Schaaf","date":"30. March 2018","format":false,"excerpt":"Introduction When it comes to software development, chances are high that you're not doing this on your own. The main reason for this is often that implementing components like UI, frontend, backend, servers and more is just too much to handle for a single person leading to a slow development\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":"Shaky architecture","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/01_shaky-architecture-300x106.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":3491,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2018\/03\/31\/continuous-integration-deployment-for-a-cross-platform-application-part-2\/","url_meta":{"origin":3348,"position":1},"title":"Continuous Integration &#038; Deployment for a Cross-Platform Application &#8211; Part 2","author":"Tobias Eberle, Marco Maisel, Tobias Staib, Mario Walz","date":"31. March 2018","format":false,"excerpt":"In the first part we pointed out how we set up the infrastructure for our CI system. Now we would like to explain how we build a pipeline for our cross-platform application and what features of GitLab CI we made use of. Building a Pipeline in GitLab CI Our first\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":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/flora-app.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/flora-app.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/flora-app.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/flora-app.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/flora-app.jpg?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/flora-app.jpg?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":5163,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2019\/02\/24\/migrating-to-kubernetes-part-1-introduction\/","url_meta":{"origin":3348,"position":2},"title":"Migrating to Kubernetes Part 1 &#8211; Introduction","author":"Can Kattwinkel","date":"24. February 2019","format":false,"excerpt":"Written by: Pirmin Gersbacher, Can Kattwinkel, Mario Sallat Introduction The great challenge of collaborative working in a software developer team is to enable a high level of developer activity while ensuring a high product quality. In order to achieve this often CI\/CD processes are utilized. Talking about modern development techniques\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\/2019\/02\/pexels-photo-379964.jpeg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2019\/02\/pexels-photo-379964.jpeg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2019\/02\/pexels-photo-379964.jpeg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2019\/02\/pexels-photo-379964.jpeg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2019\/02\/pexels-photo-379964.jpeg?resize=1050%2C600&ssl=1 3x"},"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":3348,"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":7154,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2019\/08\/31\/setting-up-a-ci-cd-pipeline-in-gitlab\/","url_meta":{"origin":3348,"position":4},"title":"Setting up a CI\/CD pipeline in Gitlab","author":"nr037","date":"31. August 2019","format":false,"excerpt":"Introduction For all my university software projects, I use the HdM Gitlab instance for version control. But Gitlab offers much more such as easy and good ways to operate a pipeline. In this article, I will show how we can use the CI\/CD functionality in a university project to perform\u2026","rel":"","context":"In &quot;Cloud Technologies&quot;","block_context":{"text":"Cloud Technologies","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/cloud-technologies\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2019\/08\/Screenshot-2019-08-26-at-09.53.13.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2019\/08\/Screenshot-2019-08-26-at-09.53.13.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2019\/08\/Screenshot-2019-08-26-at-09.53.13.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2019\/08\/Screenshot-2019-08-26-at-09.53.13.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2019\/08\/Screenshot-2019-08-26-at-09.53.13.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2019\/08\/Screenshot-2019-08-26-at-09.53.13.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":10392,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2020\/02\/29\/attempts-at-automating-the-build-process-of-a-net-wpf-application-with-gitlabs-ci-cd-pipeline\/","url_meta":{"origin":3348,"position":5},"title":"Attempts at automating the build process of a .NET WPF application with GitLab&#8217;s CI\/CD pipeline","author":"Felix Messner","date":"29. February 2020","format":false,"excerpt":"(Originally written for System Engineering and Management in 02\/2020) Introduction In the System Engineering course of WS1920, I took the opportunity to look into automating the build process of a Windows desktop application. Specifically, the application in question is built in C#, targeting .NET Framework 4.0 and using Windows Presentation\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\/2020\/08\/windows_runner_Tree.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2020\/08\/windows_runner_Tree.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2020\/08\/windows_runner_Tree.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2020\/08\/windows_runner_Tree.jpg?resize=700%2C400&ssl=1 2x"},"classes":[]}],"jetpack_sharing_enabled":true,"authors":[{"term_id":748,"user_id":867,"is_guest":0,"slug":"jg115","display_name":"Jonas Graf, Christian Gutwein","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/cc68dcd623579afc05e644d9dba2eda417388ef4a4056d0c80835e57e7e26530?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\/3348","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\/867"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/comments?post=3348"}],"version-history":[{"count":19,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/3348\/revisions"}],"predecessor-version":[{"id":24753,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/3348\/revisions\/24753"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media\/3391"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=3348"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=3348"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=3348"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=3348"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}