Deploy pe Heroku la o aplicație Symfony 5

Foarte pe scurt, am o aplicație pe Symfony 5 cu o mică bază de date. Nimic prea mare, doar ce am început să mă joc cu Symfony.

Sînt curios cum ați reușit să faceți deploy pe Heroku, pe curat. Adică, am creat aplicația pe Heroku, am aprovizionat-o cu un add-on PostgreSQL, variabila de mediu DATABASE_URL a fost automat creată și populată cu informațiile corecte de conectare, toate bune.

Dacă execut:
git push heroku-staging master

Primesc asta:

Executing script cache:clear [KO]
remote:         [KO]
remote:        Script cache:clear returned with error code 7
remote:        !!  
remote:        !!   // Clearing the cache for the prod environment with debug                      
remote:        !!   // false                                                                       
remote:        !!  
remote:        !!  
remote:        !!  In ExceptionConverter.php line 75:
remote:        !!                                                                                 
remote:        !!    An exception occurred while executing a query: SQLSTATE[42P01]: Undefined t  
remote:        !!    able: 7 ERROR:  relation "user" does not exist                               
remote:        !!    LINE 1: ...created_at_8, u0_.updated_at AS updated_at_9 FROM "user" u0_...   
remote:        !!                                                                 ^               
remote:        !!                                                                                 
remote:        !!  
remote:        !!  In Exception.php line 26:
remote:        !!                                                                                
remote:        !!    SQLSTATE[42P01]: Undefined table: 7 ERROR:  relation "user" does not exist  
remote:        !!    LINE 1: ...created_at_8, u0_.updated_at AS updated_at_9 FROM "user" u0_...  
remote:        !!                                                                 ^              
remote:        !!                                                                                
remote:        !!  
remote:        !!  In Connection.php line 72:
remote:        !!                                                                                
remote:        !!    SQLSTATE[42P01]: Undefined table: 7 ERROR:  relation "user" does not exist  
remote:        !!    LINE 1: ...created_at_8, u0_.updated_at AS updated_at_9 FROM "user" u0_...  
remote:        !!                                                                 ^              
remote:        !!                                                                                
remote:        !!  
remote:        !!  cache:clear [--no-warmup] [--no-optional-warmers]
remote:        !!  
remote:        !!  

Mi se pare puțin ciudat și nu găsesc în online o metodă prin care aș putea să:

  1. Fac deploy la cod pe Heroku
  2. Să rulez migrațiile
  3. Să rulez Data Fixtures ca să pun ceva date de test pt. aplicație

La punctul 1. crapă fiindcă nu găsește tabele în baza de date. E normal, fiindcă baza de date o migrez abia la punctul 2. Dar nu înțeleg cine și de ce încearcă să acceseze baza de date la 1.

Voi ai încercat asta pînă acum? Ăsta momentan este un mediu staging, deci da, vreau acces la toate astea, fără să le mut în require.

"require-dev": {
    "doctrine/doctrine-fixtures-bundle": "^3.4",
    "fakerphp/faker": "^1.16",
    "symfony/debug-bundle": "5.4.*",
    "symfony/maker-bundle": "^1.33",
    "symfony/stopwatch": "5.4.*",
    "symfony/web-profiler-bundle": "5.4.*"
}

PS: Bănuiesc că de aici pleacă problema:

"scripts": {
    "auto-scripts": {
        "cache:clear": "symfony-cmd",
        "assets:install %PUBLIC_DIR%": "symfony-cmd"
    },
    "post-install-cmd": [
        "@auto-scripts"
    ],
    "post-update-cmd": [
        "@auto-scripts"
    ]
},

Deci în spate încearcă să ruleze probabil
php bin/console cache:clear

Dar cum nu am mai lucrat cu Symfony, mă întreb de ce oare accesează baza de date, cînd vrea să golească cache-ul?

Esti pe environment de PROD de asta incearca sa faca si warm up la cache sau ceva de genul.

Vezi solutia asta.

1 Like

Salut Cătălin! Oh, da, așa este, am ajuns și eu la acea adresă tîrziu în noapte ieri. :smiley: Așa tîrziu, încît am prins și un outage al Heroku de cîteva ore bune. :crazy_face:

Știu de soluția respectivă, dar… cum toate nu se pupă cu socoteala din tîrg, la Heroku, atunci cînd pui o provizie de PostgreSQL să zicem, el generează o variabilă de mediu, DATABASE_URL, variabilă care nu mai poate fi modificată (este modificată dinamic de către instanța care servește baza de date). Deci iese din discuție să pot pune acolo acel ?serverVersion=<mysql_version>. În altă ordine de idei, eu am scris în doctrine.yml, acel server_version: '13'. Dar se pare că pe acela, Heroku îl ignoră. Naiba știe.

Oricum, din ce am reușit să citesc deja aseară, cîțiva inși de pe interneți, recomandau să șterg din composer acel clear:cache și să-l fac manual, după ce codul se urcă cu succes. Momentan, cel mai probabil așa voi face.

Partea a doua, o las scrisă aici, poate ajută pe cineva în viitor. Legat de necesitatea de a putea avea dependințele din require-dev de care aminteam mai sus pe un mediu special de staging din Heroku. Ei bine, Heroku rulează orice mediu, ca fiind de producție. Niciodată nu ține dependințele din require-dev, chiar dacă le poate descărca în anumite cazuri, sînt izolate și nu există acces la ele. Punct. Am găsit totuși prin documentația de la Composer, că se poate crea o variabilă de mediu, COMPOSER, în care să specifici un alt nume de fișier pentru composer.json.

Așadar, pt. mediul de staging, am set COMPOSER=composer-staging.json, în care, normal, (aproape) tot ce era în require-dev a trecut în require. Așa, pot avea aces pe acel mediu și la Fixtures, și la MakerBundle sau Profiler, chestii de genul.

Simt că la cît am citit despre asta, aș putea deja aplica pentru vreun post de dev ops. :rofl: Las întrebarea deschisă totuși, dacă ați reușit să faceți un tunel de deploy pe Heroku, de la urcare cod, pînă la migrare bază de date, orice sugestie e binevenită. Momentan, am șters clear:cache din auto-scripts, și fac tot manual. :star_struck: