Mark Huijser

Pastebin van een webdeveloper

Canvas: Upgraden is geen makkie

3 years ago · 4 MIN READ
#Laravel  #Canvas 

In m'n backend van Canvas verschijnt de melding dat er een nieuwe versie van Canvas beschikbaar is. Het wordt aanbevolen om Canvas te upgraden, dus ga ik aan de slag: Als ik hoopvol klik op "Please update now", spring ik naar een pagina met een 4-stappenplan hoe ik Canvas moet updaten. Voor de "gewone" gebruiker zal dit een behoorlijke drempel zijn, maar als doorgewinterde devopper moet dit natuurlijk een makkie worden ... toch ?

Schermafbeelding 2016-11-05 om 08.34.51.png

Methode 1 - de voorgeschreven methode

Als ik het stappenplan eens vluchtig doorlees, besef ik tóch dat dit 'em waarschijnlijk niet gaat worden. Stap 1 - een backup maken van de database - kan ik nog inkomen, maar vanaf stap 2 wordt het upgrade proces behoorllijk rigoureus: Zowel de volledige applicatie áls de database moet worden verwijderd. Binnen dit upgrade-proces moet het installatieproces van 7 stappen ook nog eens opnieuw doorlopen worden, waarna de gebackupte data weer moet worden teruggezet.

Stap 1

En áls ik dan vol goede moed aan stap 1 begin, loop ik direct vast:

Whoops, looks like something went wrong.
1/1
FatalThrowableError in ToolsController.php line 79:
Class 'ZipArchive' not found
in ToolsController.php line 79

Deze foutmelding wordt veroorzaakt door de afhankelijkheid van een php-module waar geen melding van is gemaakt bij het installeren van Canvas. Op mijn Ubuntu systeem is het afdoende om de ontbrekende php module eenvoudig te installeren met apt-get install php7.0-zip. Meteen maar even melding gemaakt bij de ontwikkelaar, zodat hij de documentatie kan updaten. Zo wordt de wereld een betere plaats ... (https://github.com/austintoddj/canvas/issues/245)

Stap 2 - 4

Als ik even goed vooruit lees in het upgrade stappenplan besef ik dat ik (in stap 2) de database moet verwijderen, om vervolgens de in stap 1 gebackupte tabellen in stap 4 weer één voor één te importeren.

De database queries om dit te bewerkstelligen zal ik zelf moeten verzinnen, want ze staan niet in de upgrade guide. Bovendien staat nog op m'n netvlies dat de 7 stappen van het installatieproces opnieuw doorlopen moeten worden. De moed zakt me in de schoenen.

Dit is het moment dat ik besluit om hier niet aan mee te doen. Zonde van m'n tijd (ik begin ook te twijfelen of dit me ook in de beloofde 15 minuten gaat lukken).

Maar hier stopt het niet! Laravel is ontworpen om dit soort processen juist makkelijker te maken :-) We gaan uitzoeken of dat ook met Canvas gaat lukken.

Methode 2 - Upgrade Canvas met git en artisan

Aangezien ik bij installatie van Canvas het Canvas project direct uit git heb getrokken, ben ik in staat om de files op de commandline gemakkelijk te updaten naar een nieuwe versie. Dus : aan de bak.

Stap 1 - maintenance aan

Om de bezoekers niet met een kapotte site te confronteren tijdens het upgrade-proces, zet ik de applicatie eerst in 'maintenance modus'.

> cd <canvasroot> (ik ga er hierna vanuit dat je steeds in deze directory staat)

> php artisan down

Stap 2 - git: switch naar de juiste versie

Ik kan als volgt zien welke branch of tag ik momenteel op m'n server heb staan.

> git status

Het canvas project werkt voor de versioning met een tagging-systeem. Ik besluit de laatste versie (op 5 nov is dat 'v2.1.12') op m'n server uit te checken:

Als volgt kun je de beschikbare versies zien:

> git pull
> git tag -l

Even in de tags zoeken wat de laatste versie is, en switchen naar de laatste:

> git checkout tags/v2.1.12

Stap 3 - Dependencies installeren

Om alle afhankelijkheden te installeren die voor Canvas nodig zijn moeten de volgende commando's worden uitgevoerd:

> composer install
> yarn

Stap 4 - Artisan: Database migratie(s) uitvoeren

Dit is nu - onder andere - zó mooi aan Laravel: de migrations. Uit de sourcecode van het Canvas-project maak ik op dat ook hier met migrations wordt gewerkt. Iedere keer als de database-tabellen worden gewijzigd om nieuwe functies te ondersteunen dan hoort daar ook een "migration" bij.

Op de commandline kunnen we zien welke migrations er al "gedraaid" zijn:

> php artisan migrate:status

Om de (eventuele) ontbrekende migraties uit te voeren gebruik je het volgende commando:

> php artisan migrate

Schermafbeelding 2016-11-05 om 09.25.28.png

Stap 5 - Maintenance mode uit

De "core" van Canvas hebben we nu bijgewerkt naar de laatste versie. Zowel de sourcecode als de database zijn bijgewerkt.

Op één dingetje na, zijn met dit alternatieve upgrade proces alle stappen ondervangen die moeten gebeuren om je Canvas instantie de upgraden.

Dat betekent dat de 'maintenance modus' weer uit kan.

> php artisan up

Voilá : Live 'n kicking met de laatste versie :-)

Stap 6 - Dat éne dingetje

Helaas "denkt" Canvas nog altijd dat 'ie op de "oude" sourcecode draait, omdat dit proces de canvas-versie in de "settings" tabel niet bijwerkt.

In de backend vind je namelijk nog steeds onterecht de melding:

Schermafbeelding 2016-11-05 om 12.03.09.png

Om dit voor nu op te lossen voer ik moet ik "met het handje" de canvas-versie in m'n database updaten (voorbeeld betreft mysql):

> mysql -u <usernaam> -p
mysql> use <databasenaam>
mysql> update settings set setting_value = 'v2.1.12' where setting_name='canvas_version'; 

NB. Let op, het kan nog steeds zijn dat er model/databasewijzigingen zijn doorgevoerd die niet in "migrations" zijn gevat. Totdat canvas een beter upgrade-pad heeft gekozen, moet je hier toch steeds de sourcecode voor bestuderen.

Schermafbeelding 2016-11-05 om 11.42.09.png

NB. vervang uiteraard 'v2.1.12' door de versie die je in Stap 3 uit git hebt getrokken.

Om dit "mooi" op te lossen zal de php migratie actie de settings tabel moeten updaten. Dergelijke functionaliteit zal de ontwikkelaar in Canvas moeten inbouwen.

Conclusie

Het is me gelukt om het migratie-proces terug te brengen tot 6 stappen, die voor mij wellicht ook goed scriptable zijn. Ik ga de komende tijd monitoren of dit upgrade proces voor mij werkbaar blijkt.

Upgraden in een notedop:

> cd <canvasroot>
> php artisan down
> git pull
> git checkout tags/v2.1.12
> composer install
> yarn
> php artisan migrate
> php artisan up
> mysql -u <usernaam> -p
> mysql> use <databasenaam>
> mysql> update settings set setting_value = 'v2.1.12' where setting_name='canvas_version'; 

Ready to go!

···

Mark Huijser


comments powered by Disqus

"When my heart is overwhelmed, lead me to the Rock that is higher than I"

Psalms 61