Verified Commit 8e77123c authored by Ingo Pfennigstorf's avatar Ingo Pfennigstorf 💅
Browse files

WIP Article

parent fc372b5f
---
layout: post
current: post
cover: assets/images/Tolbachik_volcano_1975_cone_pano_Kamchatka_on_2015-07-28.png
cover-credits: CC BY-SA 4.0 WikiCommons:Rftblr
navigation: True
title: Deployments mit Jenkins oder Gitlab CI
date: 2017-01-10 00:00:01
tags:
class: post-template
subclass: 'post tag-deployments'
author: ingo
---
# Deployments
Was ist Deployment? Nun ja, sicher gibt es zu dem Begriff viele Definitionen, hier gibt es selbstverständlich auch Eine.
Deployment ist das Übertragen von Code oder einer Anwendung auf einen Server, auf dem die Anwendung zu Testzwecken oder im Livebetrieb stattfindet.
Deployment bei uns ist vor allem eins: Automatisiert.
Damit das alles funktioniert sind nicht nur technische Herausforderungen zu meistern. Welche noch? Eine Infrastruktur die eine möglichst reibungslose Integration des Codes der Entwickler in die Systeme ermöglicht. Dazu gehört, das alles reproduzierbar ist, Code regelmäßig in das Source Code Repository eingecheckt wird und alles (automatisiert) testbar und getestet ist.
Doch begeben wir uns kurz auf eine kleine Zeitreise.
## Früher - the Jenkins way
Ok, ganz so "Früher" ist es nicht. Es laufen noch etliche Deployments so.
Jenkins ist ein auf Java basiertes Build Werkzeug, das historisch gesehen (Java-) Software testet und zusammenbaut.
Jenkins kann sehr viel mehr, es gibt etliche Plugins die fast alle Bedürfnisse abdecken.
Als Beispiel für ein Deployment muss jetzt eine Website auf Basis des PHP CMS TYPO3 herhalten.
TYPO3 besteht aus einem Core und je nach Anwendungsfall beliebig vielen Extensions.
Der TYPO3 Core wurde bei uns zentral auf einem Server abgelegt und in die vielen Instanzen die wir haben als Symlink zur Verfügung gestellt. Somit konnte man auf einen Schlag alle Instanzen von z.B. TYPO3 8.7.1 auf TYPO3 8.7.2 aktualisieren.
Die eigenen Extensions befinden sich in einem Source Code Repository. Durch Code Änderungen in bestimmten Zweigen des Repositorys reagiert der Jenkins Server und baut die Software zusammen und verteilt sie. Doch was heißt das?
Da der Jenkins Server auf Java läuft und idealerweise nicht alle möglichen Sprachen und Interpreter auf dem Build-Server vorhanden sein sollten, muss er die Tests auf dem Zielsystem ausführen und die Abhängigkeiten eben dort mittels Composer zusammen bauen; Also SSH Login auf den Server, Scripte ausführen und dahin kopieren (SCP, rsync, ...), wo sie hin sollen und hoffen das alles läuft.
Dem geneigten Leser werden schon ein paar Unzulänglichkeiten bei dieser Methode auffallen. Darum gehen wir einen Schritt und ein Tool weiter.
## Heute - Gitlab CI
Gitlab startete als Github-Klon zum selber hosten, mittlerweile ist dieses Label nicht mehr ganz zutreffend, weil es schon sehr viel mehr ist und sich stetig weiterentwickelt.
In Gitlab steht der Code innerhalb eine Git Repositorys im Vordergrund. Statt zu Github kann der Code genauso in Gitlab landen.
Gitlab bietet ein Modul "CI" an, was wohl für "Continuous Integration" steht. Wer möchte, kann das gerne ergoogeln.
Dieses CI Modul ermöglicht es, wie Jenkins auch, gewisse Build Aufgaben auszuführen und entfaltet zusammen mit der Container Registry (Docker) ungeahnte Möglichkeiten.
Man stelle sich vor, man hat ein komplett einfach so lauffähiges Paket seine Anwendung oder Website. Ohne dass man Apache, PHP, usw. installieren muss. Und das immer aktuell. Überall betreibbar. Einzige Voraussetzung: Ein Docker Daemon. Ok, und ein Server vielleicht mit Netzwerkanschluss.
Aber jetzt sind schon einige Schritte übersprungen.
### Vorbereitungen
Als Vorbereitung muss unsere TYPO3 Website einmal komplett umgestellt werden, und zwar nehmen wir das PHP Tool "Composer" zu Hilfe, in dem wir unsere gesamten Abhängigkeiten der TYPO3 Website definieren können. Dazu gehört die Version des Cores und alle benötigten Extensions. Das liegt alles in einer `composer.json` Datei, die wie folgt aussehen könnte:
```json
{
"name": "subugoe/fidmath-site",
"description": "TYPO3 Website",
"license": "GPL-2.0+",
"type": "project",
"require": {
"typo3/cms": "8.7.*",
"helhum/typo3-console": "^4.4",
"georgringer/news": "^6.0.0",
"sjbr/static-info-tables": "^6.4",
"subugoe/tmpl-fidmath": "@dev",
"subugoe/nkwgok": "^5.1",
"subugoe/mathematicians": "^2.1",
"subugoe/pazpar2": "8.0.x-dev",
"subugoe/zamn": "^3.0",
"dmitryd/typo3-realurl": "^2.2.0",
"subugoe/ezbrequest": "^3.2",
"in2code/powermail": "^4.0",
"webdevops/metaseo": "^3.0"
},
"scripts": {
"typo3-cms-scripts": [
"typo3cms install:fixfolderstructure"
],
"post-install-cmd": [
"@typo3-cms-scripts"
],
"post-update-cmd": [
"@typo3-cms-scripts"
]
},
"extra": {
"typo3/cms": {
"cms-package-dir": "{$vendor-dir}/typo3/cms",
"web-dir": "web"
}
}
}
```
Anhand dieser Definition kann mittels `composer install` das TYPO3 zusammengebaut werden, composer fragt seinen Dienst [Packagist](https://packagist.org), wie die Abhängigkeiten aufgelöst werden und installiert sie, kümmert sich innerhalb der Anwendung um Autoloading und führt die angegebenen Scripte aus.
Ebenso benötigt man ein Dockerfile, in dem steht, wie die Anwendung zum Laufen gebracht wird.
```
FROM php:7.2-apache
ENV COMPOSER_ALLOW_SUPERUSER 1
WORKDIR /var/www/html/
RUN apt-get update -yqq
RUN apt-get install -yqq git zlib1g-dev zip unzip libicu-dev apt-transport-https ca-certificates libcurl4-gnutls-dev gnupg
ENV APACHE_DOCUMENT_ROOT /var/www/html/public/
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
RUN a2enmod rewrite http2
COPY . /var/www/html/
RUN docker-php-ext-install -j$(nproc) iconv zip intl
RUN curl --silent --show-error https://getcomposer.org/installer | php
RUN php composer.phar install --prefer-dist --no-progress --no-suggest --optimize-autoloader --classmap-authoritative --no-interaction
```
\ No newline at end of file
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment