Bonjour, je viens vers vous car je n'arrive pas à faire fonctionner Travis Continuous Integration avec une application CakePHP.
Voici le projet sur lequel je travaille : https://github.com/Okimi/okimi-webapp/
Voici mon fichier .travis.yml

language: php
php:
  - 5.3
  - 5.4
before_script :
  - sh -c "mysql -e 'CREATE DATABASE cakephp_test;'"
  - chmod -R 777 ./app/webroot
  - mkdir ./app/tmp
  - chmod -R 777 ./app/tmp
  - echo "<?php
    class DATABASE_CONFIG {
      public \$test = array(
          'datasource' => 'Database/Mysql',
          'database' => 'cakephp_test',
          'host' => '127.0.0.1',
          'login' => 'travis',
          'persistent' => false
      );
    }" > app/Config/database.php
script:
  - ./lib/Cake/Console/cake test app AllTests --stderr

Avec cette configuration, j'ai l'erreur suivante :

Error: The datasource configuration "default" was not found in database.php

Si je rajoute une configuration $default, j'obtiens l'erreur suivante :

Error: Database connection "Mysql" is missing, or could not be created.

Avez vous une idée d'où pourrait provenir le problème ?

Merci d'avance.

4 réponses


Maenhyr
Auteur
Réponse acceptée

Ok après plusieurs heures sur le problème j'ai enfin trouvé. Je vous donne la solution, au cas où qulqu'un souhaite réaliser la même chose.

La problématique
Faire fonctionner Travis avec un projet CakePHP

Le repository
Il ne faut mettre que le contenu du dossier app dans votre repository GitHub, il vaut mieux ne pas intégrer les librairies de CakePHP. Pourquoi ? Cela permettra de faire une mise à jour plus facilement, et de permettre à plusieurs développeurs de travailler avec des versions de CakePHP différentes.

Pourquoi le .travis.yml des plugins de Grafikart ne fonctionnent pas ?
La raison est que nous ne déplaçons pas un plugin mais carrément le dossier app. Cela va influer sur certains points assez importants, notamment la gestion de la base de données.

Le code

language: php
php:
  - 5.3
before_script:
  - sh -c "cd .. ; git clone --depth 1 git://github.com/cakephp/cakephp -b master"
  - sh -c "cd ..; rm -r cakephp/app"
  - sh -c "cd ..; mv okimi-webapp cakephp/app"
  - sh -c "chmod -R 777 tmp"
  - sh -c "chmod -R 777 webroot"
  - sh -c "mysql -e 'CREATE DATABASE okimi; USE okimi; CREATE TABLE pages (id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(40) NOT NULL, PRIMARY KEY (id));'"
  - sh -c "mysql -e 'CREATE DATABASE okimi_test;'"
  - echo "<?php
     class DATABASE_CONFIG {
       public \$default = array(
            'datasource' => 'Database/Mysql',
            'database' => 'okimi',
            'host' => '127.0.0.1',
            'login' => 'travis',
            'persistent' => false,
       );
       public \$test = array(
            'datasource' => 'Database/Mysql',
            'database' => 'okimi_test',
            'host' => '127.0.0.1',
            'login' => 'travis',
            'persistent' => false,
        );
     }" > Config/database.php
script:
  - Console/cake test app AllTests --stderr

Explications
Je vais expliquer les différentes lignes du before_script.

  1. on se met dans le dossier parent (exemple, pour moi l'application s'apelle okimi-webapp et l'organisation Okimi. Le chemin est donc /Okimi/web-app, comme on remonte d'un cran, on se retrouve dans Okimi). Ensuite on clone le framework cakephp dans un dossier appelé cakephp (par défaut le nom du repo).
  2. on supprime le dossier cakephp/app. Notez que chaque ligne vous ramène au chemin (/Okimi/okimi-webapp). Il faut donc se remettre dans le bon dossier par des cd ...
  3. on déplace le repository dans le dossier cakephp et on le renomme en app.
  4. on autorise tous les droits sur le dossier tmp et les sous dossiers.
  5. on autorise tous les droits sur le dossier webroot et les sous dossiers.
  6. on créé une base de production avec une table (ici la table est donnée à titre d'exemple).
  7. on crée la base de test
  8. on créé le ficher database.php

Ce qui me gêne
J'ai un soucis avec la ligne 12 car elle ne rend pas le code modulable, il me faudrait créer chaque table dès que je rajoute un Model, ce n'est pas viable à mon sens. Je vois donc 2 solutions :

  1. créer un dump de ma base de production que je place dans le repository et que j'importe à la ligne 12. Ce dump contiendrait une création de base + création de toutes les tables. Je trouve cette façon de faire peu intuitive et ingérable dans le temps. Surtout que cette base ne nous sert à rien pour les tests de Travis.
  2. ne pas créer de Model dans le dossier Model mais réaliser des plugins (ex, Users, Pages, Posts, ...). Cela me permettra de ne pas avoir la ligne 12. C'est la solution que réalise Croogo et j'y vois deux avantages : Le premier c'est que l'on a pas à se soucier de cette base de production. Le deuxième, c'est que l'on découpe le code en plugins ce qui revient à utiliser CakePHP comme Symfony. Le code devient plus réutilisable.

En espérant que cela permette d'aider quelqu'un et de lui éviter les prises de têtes.

Question méga con mais cette ligne de commande fonctionne en local sur ta machine ?

Maenhyr
Auteur

Oui, j'ai oublié de préciser, que tout fonctionne en local, que ce soit depuis l'interface web ou depuis la ligne de commande.

Maenhyr
Auteur

Petit up, je bloque vraiment dessus.

Après plusieurs tests, il s'avère que les erreurs citées dans le premier post viennent du fait que j'avais intégré le framework dans mon application. Maintenant je le charge via github. J'obtiens l'erreur suivante :
Cannot open file "/home/travis/build/Okimi/cakephp/app/Test/Case/AllTestsTest.php".

Je n'arrive pas à comprendre d'où vient mon erreur.