Giter Club home page Giter Club logo

ydeploy's Introduction

YDeploy

Das Addon bietet Tools für die Datenbank-Migration während des Deployments von REDAXO-Projekten. Zusätzlich bietet es eine auf REDAXO abgestimmte Konfiguration für deployer.

Migration

Das Addon bietet zwei Konsolen-Befehle für die Migration:

redaxo/bin/console ydeploy:diff

Beim ersten Aufruf dieses Kommandos werden in redaxo/data/addons/ydeploy zwei Dateien angelegt:

  • schema.yml mit den Tabellendefinitionen der Datenbank
  • fixtures.yml mit allen Datensätzen der Tabellen, deren Daten mit synchronisiert werden sollen (Metainfo-Definitionen, MediaManager-Typen, YForm-Manager-Defintionen etc.)

Beim erneuten Aufruf wird dann die aktuelle Datenbank-Struktur mit der aus der schema.yml verglichen, und die relevanten Daten mit der fixtures.yml. Sollte es Abweichungen geben, werden die beiden Dateien aktualisiert und eine Migrationsdatei in redaxo/data/addons/ydeploy/migrations/ erstellt, die alle Änderungen enthält.

Details des Kommandos erhält man über redaxo/bin/console help ydeploy:diff.

Templates, Module und Actions werden nicht über die fixtures.yml synchronisiert, sondern dafür sollte das Developer-Addon genutzt werden.

redaxo/bin/console ydeploy:migrate

Dieses Kommando führt alle noch ausstehenden Migrationsdateien aus.

Bei Nutzung von deployer (siehe unten) wird dieses Kommando automatisch während des Deployments ausgeführt. Es ist aber auch geeignet, um Datenbank-Änderungen der anderen Entwickler in die lokale Entwicklungsumgebung zu übernehmen.

Details des Kommandos erhält man über redaxo/bin/console help ydeploy:migrate.

Deployment über deployer

Zunächst sollte man sich mit den Grundlagen von deployer vertraut machen: https://deployer.org

Das Addon liefert deployer selbst nicht mit. Es kann über verschiedene Wege instaliert werden:

  • Lokal im Projekt (ggf. in separatem .tools-Ordner: composer require deployer/deployer
  • Global über composer: composer global require deployer/deployer
  • Als Phar-Archive: https://deployer.org/download

Konfiguration

Im Projekt-Root sollte die Konfigurationsdatei deploy.php angelegt werden, die die auf REDAXO abgestimmte Basis-Konfiguration aus diesem Addon einbindet:

<?php

namespace Deployer;

if ('cli' !== PHP_SAPI) {
    throw new \Exception('The deployer configuration must be used in cli.');
}

// Der Pfad ist ggf. anzupassen, falls der Projekt-Root nicht dem REDAXO-Root entspricht
// Falls die Yak-Struktur (https://github.com/yakamara/yak) verwendet wird, sollte stattdessen die `deploy_yak.php` eingebunden werden
// require __DIR__ . '/redaxo/src/addons/ydeploy/deploy_yak.php';
require __DIR__ . '/redaxo/src/addons/ydeploy/deploy.php';

set('repository', '[email protected]:user/repo.git');

host('servername')
    ->setHostname('example.com')
    ->setDeployPath('/var/www/com.example')
;

In dieser Datei kann die Konfiguration individuell auf das Projekt abgestimmt werden, sowie durch eigene weitere Tasks ergänzt werden. Siehe dazu:

.gitignore

Die folgende .gitignore hat sich als Basis bewährt bei Nutzung von deployer:

/.build
/media/*
!/media/.redaxo
/redaxo/cache/*
!/redaxo/cache/.*
/redaxo/data/addons/*/*
!/redaxo/data/addons/developer/*
!/redaxo/data/addons/mblock/*
!/redaxo/data/addons/mform/*
!/redaxo/data/addons/ydeploy/*
/redaxo/data/core/*
/redaxo/data/log/*

Sollte REDAXO nicht direkt im Projekt-Root liegen, müssen die Pfade entsprechend angepasst werden.

Deployment

Führe dep deploy aus, um das Deployment auf den Zielserver zu starten. Dieser Befehl besteht aus zwei Teilen, die sich auch einzeln ausführen lassen:

  1. Lokal vorbereiten: dep build local
  2. Vorbereitetes Paket auf den Server spielen: dep release [host]

So lässt sich bspw. über dep deploy staging auf den staging-Server deployen, testen und anschließend mit dem bereits vorliegenden Build auf den Produktivserver aufspielen: dep release production.

ydeploy's People

Contributors

alxndr-w avatar gharlan avatar staabm avatar tbaddade avatar tyrant88 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ydeploy's Issues

ydeploy:migrate - FULLTEXT Indexes benötigen einzelnes ALTER

Error while executing statement "ALTER TABLE `rex_search_it_index`                                                                                                                           
        ADD INDEX `fid` (`fid`),                                                                                                                                                                 
        ADD FULLTEXT `plaintext` (`plaintext`),                                                                                                                                                  
        ADD FULLTEXT `unchangedtext` (`unchangedtext`),                                                                                                                                          
        ADD FULLTEXT `plaintext_2` (`plaintext`, `unchangedtext`);"! SQLSTATE[HY000]: General error: 1795 InnoDB presently supports one FULLTEXT index creation at a time 

Sonst klappt das migrieren nicht.

Developer file resourcen via web sperren

Wenn man ydeploy mit developer benutzt sollte man die möglichkeit haben das bearbeiten von modulen/templates etc. Via weboberfläche zu sperren.

Man möchte die single source of truth der developer-addon resourcen in diesem fall ja in einem entfernten entwicklungssystem haben bzw. Im git/svn aber nicht auf der produktiv instanz

Yform Templates "lock"en

Müssten die YForm Templates nicht auch wie die Module, Templates und Actions im Live-Backend ausgeblendet werden, wenn sie mit dem developer synchronisert werden?
Oder ist das Absicht?

Ideensammlung

  • Deployment-Mode: Readonly Installer, Addons, Templates, Module...
  • Lint von Migrationsdateien, oder auch alle Projektdateien (außer vendor?)
  • Cache-Warmup nach deploy:unlock, mit Abbrechmöglichkeit (ctrl+c)
  • Spalten in richtiger Reihenfolge anlegen/ergänzen: #5
  • Spaltenumbenennungen erkennen #6
  • Unique Keys, Fulltext Index etc.
  • Foreign Keys
  • Bessere Möglichkeit, Projekt initial aufzusetzen und zu kennzeichnen (lokal und live)
  • Automatisiert Backup erstellen
  • shared_dirs via AddOns hinzufügen, Bsp. web/redaxo/data/addons/yform

falscher Befehl führt Command aus

Der Befehl ydeploy:dif löste ydeploy:diff aus. Habe jetzt nirgends ein Alias dif gefunden.
Wenn das Verhalten richtig ist, kannst gern schließen. Finde es nur seltsam.

Initiales deploy legt den media Ordner falsch an

der media Ordner liegt doppelt in der Struktur. Die .redaxo Datei ist dabei nur einmal vorhanden

/shared/media/.redaxo
/shared/public/media/

Der richtig Platz wäre in /shared/public/media/inkl. der .redaxo Datei

In die Doku aufnehmen

default_stage

Wenn man dep deploy aufruft, greift der default_stage und nicht mehr alle Host .
Vorteil: Man deployed nicht durch Unachtsamkeit den Live-Server sondern nur die Testserver. Will man auch live deployen, muss man das immer explizit angeben dep deploy live

deploy.php

default_stage setzen:
set('default_stage', 'test');

im Host stage setzen (kann mehrfach gesetzt werden)

host('yakamara')
    ->stage('test')

host('preview')
    ->stage('test')

Best Practice

zu Info: dep deploy besteht nun aus 2 Parts, lokal vorbereiten und aufspielen:
https://github.com/yakamara/ydeploy/blob/master/deploy.php#L92-L95

die kann man auch einzeln ausführen.
dep build
und danach
dep release [host]

oder was ich manchmal mache:
dep deploy
(aufspielen auf Testserver gemäß default_stage)

dann testen, und wenn alles passt, den gleichen build, der lokal ja noch bereit liegt, auf live aufspielen:
dep release live

Setup commando

Commando um ein „remote“ aufzusetzen (terminologie von GIT geklaut).

  • "ssh/scp" zugangsdaten erfragen
  • Redaxo wird hochgeladen
  • interactives setup via commandline...
  • user fragen, ob developer so eingestellt werden soll dass man via weboverfläche die module/templates nicht mehr bearbeiten kann (damit keine konflikte file vs. db entstehen können)

ggf. macht es auch sinn ein separates commando zu haben nur um die requirements zu checken, aber vllt auch nicht nötig wenn man ja dann ein "richtiges" cli-setup hat.

Ausblick: mehrere remotes erlauben (staging, prod,..)

yform im Backend auf live nicht mehr aufrufbar

Der Tablemanager ist ja ausgeblendet auf dem Server. Allerdings wurde er in yform 4.0 zur yform-Startseite befördert...
Deshalb erscheint beim Klick auf yform dann die yeploy lock page und die anderen yform pages sind dadurch nicht mehr zu erreichen.
Zwischenablage-1

Migration von Update-Skripten

Wenn der Core oder Addons über die update.php Änderungen an Tabelleninhalten vornehmen in Tabellen, deren Inhalte eigentlich nicht von ydeploy synchronisiert werden, dann werden diese Änderungen beim Deployen nicht übertragen.

Ich bin mir noch unsicher, wie man das lösen kann.
Solange versuche ich hier zumindest aufzulisten, welche händischen Anpassungen jeweils nach dem Deployen der Updates nötig sind (um das bisherige Verhalten beizubehalten).

REDAXO Änderungen
5.9.0 Allen existierenden Rollen müssen folgende Rechte hinzugefügt werden: addCategory[], editCategory[], deleteCategory[], addArticle[], editArticle[], deleteArticle[]
5.11.0 Allen existierenden Rollen muss folgendes Recht hinzugefügt werden: publishSlice[]
5.11.0 Allen existierenden Rollen, die Zugriff auf alle Medienkategorien haben, muss folgendes Recht hinzugefügt werden: media[sync]
yrewrite Änderungen
2.7.0 Bei einsprachigen Websites muss in der Domain die Checkbox "Bevorzugte Sprache nicht in URL" angehakt werden/sein

tasks/setup.php copyDatabase lädt SQL dump nicht aus release Ordner hoch

Damit der Task tasks/setup.php bei mir durchläuft, musst ich die Methode copyDatabase leicht anpassen und zwar musste ich auf Zeile 211 folgende Zeile entfernen:

cd('{{current_path}}');

Das Problem ist, dass mit dieser Zeile der Export in /.build/release/ landet, die Funktion upload weiter unten aber als Quelle vom Projekt-Root ausgehnt /:

upload($path, "{{release_path}}/$path");

Wenn man die angegebene Zeile 211 entfernt, landet der Dump ebenfalls im korrekten Ordner, aber vom Root ausgehend (nicht im Release).

Man könnte auch umgekehrt die Zeile hier auf upload("{{current_path}}/$path", "{{release_path}}/$path"); ändern, also den current_path mitgeben, aber da bin ich unsicher, ob der SQL dump besser im Release ist oder doch im Root (Entwicklungsumgebung). Jedenfalls hat das mein Problem gelöst.

neue Developerfiles unterschiedlicher Developer

@dergel und ich hatten gestern kurz das Thema und vermuten, dass es dazu aktuell keine Lösung gibt.

2 Developer arbeiten gleichzeitig am Projekt und legen neue Module/Templates etc an. Wie kann man hier eine Lösung finden, dass die Ids nicht doppelt vergeben werden bzw. YDeploy das korrekt migrieren kann?

MetaInfo - Media - Standardfelder erzeugt in der Migrationsdatei einen SQL Fehler

Generierte Migration

rex_sql_table::get('rex_media')
        ->ensureColumn(new rex_sql_column('med_description', 'text', true, '\'\'', null), 'med_focuspoint')
        ->ensureColumn(new rex_sql_column('med_copyright', 'text', true, '\'\'', null), 'med_description')
        ->alter();

Dies Part '\'\'' schlägt fehl

Lösung: Migrationsdatei direkt anpassen und nochmals deployen.

deployment auf Webhoster cyon.ch schlägt fehlt

Bei Cyon klappt das deployment bei mir mit der vanilla ydeploy deployer config nicht. Git wird von deployer nicht gefunden.
Augenscheinlich weil deployer Git mit which git auf dem Remote sucht, aber lokal ausführt. Auf dem remote gibt es kein Repo ... Ähnliches Problem wie bei meinem anderen Issue.

Das ist das erste Mal, dass ich deployer mit Cyon verwende. Irgendwas ist an deployer faul.
@gharlan wir können das gerne im Detail testen, ich muss das nämlich heute oder morgen deployen.

[remote] run command -v 'git' || which 'git' || type -p 'git'
[remote] /usr/local/cpanel/3rdparty/lib/path-bin/git
[localhost] run /usr/local/cpanel/3rdparty/lib/path-bin/git rev-parse --abbrev-ref HEAD
[localhost] bash: line 1: /usr/local/cpanel/3rdparty/lib/path-bin/git: No such file or directory
[remote]  error  in info.php on line 8:
[remote] exit code 127 (Command not found)
done deploy:info 167ms

Fehler beim Update auf 2.0

Zwischenablage-ydeployupdate1

liegt an:
rex_type::string($info['stage']);
$info kommt aus der cache Datei, die gibt es, aber ich habe bisher die config var "stage" nicht benutzt, also ist es null.... whoops.

PR dazu kommt gleich. Weiß aber nich, ob das so genehm ist -schau mal.

Indizes werden nicht angelegt

Bsp. Nach dem search_it Live gespielt wurde kommt folgende SQL-Fehler

General error: 1191 Can't find FULLTEXT index matching the column list

runLocally bin/git nimmt Pfad aus Remote

Vielleicht mache ich etwas falsch, aber folgende Zeile gibt nicht den Pfad zur lokalen Git bin zurück, sondern den remote Pfad:

set('branch', static fn () => runLocally('{{bin/git}} rev-parse --abbrev-ref HEAD'));

Bei mir ist Git lokal unter /usr/bin/git installiert. Es wird aber versucht Git von /usr/local/bin/git aufzurufen. Auf remote wäre letzterer Pfad auch korrekt.

Wenn ich direkt in der Zeile davor folgendes einfüge, klappt es:

set('bin/git', static fn () => runLocally('which git'));

es scheint mir als ob das ein Fehler ist, der bisher möglicherweise nicht aufgefallen ist, da Git üblicherweise unter /usr/bin/git installiert ist.

Module : wie auf live löschen?

Problem:
Lokal löscht man ein Modul, da es nicht mehr gebraucht wird und verwendet wird. Auf der Live Umgebung kann in der Zwischenzeit das Modul aber vom Redakteur eingesetzt worden sein.

eventuelle Lösung:
Ich fände es sinnvoll, das man Module offline setzen sollte und eine Übersicht anbringt wo genau das Modul verwendet wird. Ein Offline Modul würde dann auch den Slice offline nehmen und im Dropdown "Block hinzufügen" nicht mehr angezeigt werden ( Umsetzung der Idee gehört aber in den Core.).

Als Highlight könnte das Developer Addon ggf. das alte zu einem neuen Modul konvertieren (Modul-Id in der DB austauschen).

Whoops - Unlock system/lang

TypeError thrown with message "Argument 2 passed to rex_ydeploy_handler::handleUnlockedPage() must be of the type array or null, boolean given, called in /src/addons/ydeploy/lib/handler.php on line 64"

Stacktrace:
TypeError: Argument 2 passed to rex_ydeploy_handler::handleUnlockedPage() must be of the type array or null, boolean given, called in /src/addons/ydeploy/lib/handler.php on line 64
File: src/addons/ydeploy/lib/handler.php
Line: 130

Stacktrace
Function File Line
rex_ydeploy_handler::handleUnlockedPage src/addons/ydeploy/lib/handler.php 64
rex_ydeploy_handler::protectPages src/core/lib/extension.php 45
rex_extension::registerPoint src/core/backend.php 192
require src/core/boot.php 135
require public/redaxo/index.php 13
System report (REDAXO 5.7.1, PHP 7.1.23)
REDAXO
Version 5.7.1
PHP
Version 7.1.23
OPcache yes
Xdebug no
Packages
ydeploy 1.0-beta7

Verwaltung der Artikel-Ids für local, staging, live

Aktuell mache ich das auf einer eigenen Seite im Project-AddOn via Link-Widgets.

Beispiele

Artikel der Suchausgabe

Kategorie Ids
wenn Kinkategorien als Navigation ausgegeben werden

YForm Templates

$url = rex::getServer().rex_getUrl(18,'',[ 'activation_key' => REX_YFORM_DATA[field="activation_key"]], '&'); 

Migration von Live zu Lokal

Hintergrund ist, dass via YFormbuilder neue Felder in der Datenbank angelegt werden. Normalerweise passiert das Lokal durch den Tablemanager, der auf einer Liveumgebung nicht erreichbar ist.

Via YFormbuilder (was durchaus ein Redakteur bedienen kann) und der Action create_table können jetzt neue Felder in den Tabellen landen und die Live-Datenbank ist nicht gleich der lokalen Datenbank.

Man benötigt jetzt Migrationsdateien die Live erstellt werden und die man sich dann Lokal migriert.

Multicore gzip

Wir verwenden pigz als alternative für tar - nach feature detect. Damit werden mehr cpu cores verwendet und komprimierung/dekomprimierung geht daher schneller

https://zlib.net/pigz/

.

Falsches Repo

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.