{"id":12,"date":"2019-11-05T09:00:20","date_gmt":"2019-11-05T09:00:20","guid":{"rendered":"https:\/\/intern.quizu.de\/?p=12"},"modified":"2020-08-06T10:24:10","modified_gmt":"2020-08-06T10:24:10","slug":"deployment-live","status":"publish","type":"post","link":"https:\/\/intern.quizu.de\/?p=12","title":{"rendered":"Deployment Live"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Vorbereitung des Releases<\/h2>\n\n\n\n<p>Wir unterscheiden zwischen Feature Release und Hotfix Release.<\/p>\n\n\n\n<p>Bei einem Feature Release wird der normale Development Prozess durchlaufen und auf dem Dev und Staging getestet.<\/p>\n\n\n\n<p>Die Hotfixes werden dann direkt im release branch commited\/gepusht und auf der Release Env getestet.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Feature Release<\/h3>\n\n\n\n<p>Nachdem das Release auf dem Staging erfolgreich getestet wurde, muss der staging in den master branch gemerged werden sowie die Version getaggt werden. Dazu gibt es auf dem Dev Server ein entsprechendes Script.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/scripts\/deployment\/build-release-core.sh<\/code><\/pre>\n\n\n\n<p>Hier bitte <code>&lt;minor&gt;<\/code> eins hochz\u00e4hlen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;major>.&lt;minor>.&lt;bugfixes><\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Hotfix Release<\/h3>\n\n\n\n<p>Nachdem der Fix auf dem Release erfolgreich getestet wurde, muss der release in den master branch gemerged werden sowie die Version getaggt werden. Dazu gibt es auf dem Dev Server ein entsprechendes Script.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/scripts\/deployment\/build-hotfix-release-core.sh<\/code><\/pre>\n\n\n\n<p>Hier <code>&lt;bugfixes&gt;<\/code> eins hochz\u00e4hlen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;major>.&lt;minor>.&lt;bugfixes><\/code><\/pre>\n\n\n\n<p>Abschlie\u00dfend wird noch gepr\u00fcft ob \u00c4nderungen au\u00dferhalb des Repositories erforderlich sind. Dies wird durch ein kurzes Kommentar auf der Console ausgegeben.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Schritte auf dem Live Server<\/h2>\n\n\n\n<p>Als erstes m\u00fcssen wir checken ob es Datenbank Updates etc. gibt. Dazu gibt es im Repository den Folder <code>bin\/riddle\/releases\/updates\/current<\/code>. Darin befinden sich drei Files: <code>current.cron<\/code>, <code>current.notes<\/code> sowie <code>current.sql<\/code>. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Updates au\u00dferhalb vom Repository<\/h3>\n\n\n\n<p>In <code>current.sql<\/code> befinden sich die SQL Updates &#8211; sofern es welche gibt. Diese m\u00fcssen dann von Hand \u00fcber die MySQL Console ausgef\u00fchrt werden. Die Updates m\u00fcssen <strong>vor<\/strong> dem eigentlichen Deploy ausgef\u00fchrt werden. Man kann das File zwar auch automatisch vom Deployment Script ausf\u00fchren lassen aber aufgrund der Historie w\u00fcrde ich das lieber noch eine Zeit lang selbst machen.<\/p>\n\n\n\n<p>Sofern im <code>current.cron<\/code> file Commands stehen m\u00fcssen diese \u00fcber das default Command <code>crontab -e<\/code> in die Crontab eingetragen werden. Die Crons m\u00fcssen <strong>nach<\/strong> dem eigentlichen Deploy eingetragen werden.<\/p>\n\n\n\n<p>In <code>current.notes<\/code> stehen dann allgemeine Infos drin &#8211; je nach dem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Deploy commands<\/h3>\n\n\n\n<p>Wir unterscheiden zwei Deployments: einmal alles komplett (Backend und Frontend) und einmal nur das Frontend.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Backend und Frontend<\/h4>\n\n\n\n<p>Das folgende Script macht ein <code>git pull<\/code> im master branch und leert die Caches (Symfony, Riddle und OPcache).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/scripts\/deployment\/deploy-core.sh<\/code><\/pre>\n\n\n\n<p>W\u00e4hrend die Caches geleert und aufgew\u00e4rmt werden ist der Maintenance Mode aktiv. Das Leeren \/ Aufw\u00e4rmen dauert in der Regel 1-3 Sekunden.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Frontend only<\/h4>\n\n\n\n<p>Das folgende Script macht nur ein <code>git pull<\/code> im master branch. Dadurch dass nur JS und CSS files aktualisiert wurden, ist kein Cache Clear im Backend erforderlich. Dadurch haben wir auch keine Downtime.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/scripts\/deployment\/deploy-core-frontend.sh<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Probleme nach einem Deploy<\/h2>\n\n\n\n<p>Es kann vorkommen, dass mal was h\u00e4ngt. In der Regel kann man dies durch erneutes Leeren der Caches beheben.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Symfony und Riddle Cache<\/h3>\n\n\n\n<p>Das Command leert den Symfony Cache, den OPcache und ein paar eigene Settings (im Memcached).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>php72 bin\/console riddle:cache-clear --env=prod --subdomain=www --symfony=1<\/code><\/pre>\n\n\n\n<p>Wenn Fehler beim Leeren des Symfony Caches auftreten hilft auch oft ein manuelles L\u00f6schen des Cache Folders.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>rm -rf var\/log\/cache\/*<\/code><\/pre>\n\n\n\n<p>Mit diesem Command sollten wir aber vorsichtig umgehen, da die Masse an Requests das System im ungecachten Zustand lahm legen kann.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">OPcache<\/h3>\n\n\n\n<p>Der OPcache speichert PHP classes. Beispielsweise sind hier alte Entity Classes gecacht (neue Getter und Setter funktionieren ohne Leeren des OPcaches nicht).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/scripts\/deployment\/opcache-reset-by-vhost.sh live<\/code><\/pre>\n\n\n\n<p>Manchmal auch zwischendurch ganz hilfreich wenn Probleme auftreten.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Maintenance mode <\/h3>\n\n\n\n<p>Die folgenden Commands togglen den Maintenance mode.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>php72 bin\/console riddle:maintenance-mode on<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>php72 bin\/console riddle:maintenance-mode off<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Verbesserungen<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Rollback<\/li><li>Update-Paket (Build) anstatt <code>git pull<\/code><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Vorbereitung des Releases Wir unterscheiden zwischen Feature Release und Hotfix Release. Bei einem Feature Release wird der normale Development Prozess durchlaufen und auf dem Dev&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/intern.quizu.de\/?p=12\">Weiterlesen<span class=\"screen-reader-text\">Deployment Live<\/span><\/a><\/div>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-12","post","type-post","status-publish","format-standard","hentry","category-deployment","entry"],"_links":{"self":[{"href":"https:\/\/intern.quizu.de\/index.php?rest_route=\/wp\/v2\/posts\/12","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/intern.quizu.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/intern.quizu.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/intern.quizu.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/intern.quizu.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=12"}],"version-history":[{"count":34,"href":"https:\/\/intern.quizu.de\/index.php?rest_route=\/wp\/v2\/posts\/12\/revisions"}],"predecessor-version":[{"id":152,"href":"https:\/\/intern.quizu.de\/index.php?rest_route=\/wp\/v2\/posts\/12\/revisions\/152"}],"wp:attachment":[{"href":"https:\/\/intern.quizu.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=12"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/intern.quizu.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=12"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/intern.quizu.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=12"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}