Während ich schon viele Projekte mit TravisCI eingerichtet habe, hatte ich noch nie mit GitLab CI gearbeitet. Ich wußte, dass ich analog zu TravisCI, eine Konfigurationsdatei benötige, die die Automatisierung steuert. GitLab sagt, dass es super einfach ist - man muss nur eine .gitlab-ci.yml in seinem Projektverzeichnis erstellen. Aber je mehr ich die Dokumentation und die Blogbeiträge von GitLab las, desto mehr Fragen kamen auf.
Muss ich einen Docker-Container erstellen?
Wo soll ich ihn speichern?
Wo muss ich ihn registrieren?
Einen Gitlab-Runner installieren? Was ist das? Wo? Warum?
Was sind gemeinsam genutzte Runner?
Ich dachte, da Sylius auf Symfony 4 aka Flex basiert, hat irgendjemand bereits eine Konfigurationsdatei dafür geschrieben und so habe dann im Sylius Slack gefragt, aber die Antwort war negativ. In meiner Recherche im Netz habe ich auch nur veraltete oder irreführende Informationen gefunden, aus denen ich mir Stück für Stück die Snippets herausgepickt und buchstäblich Zeile für Zeile in GitLab übertragen.
Unten seht ihr das Ergebnis und ich werde kurz meine Konfigurationsdatei erklären. Sie kann für ein Sylius 1.3 Projekt verwendet werden.
TLDR: Wenn Du es eilig hast, kannst Du die Datei einfach kopieren.
1stages: 2 - test 3 4variables: 5 MYSQL_DATABASE: sylius_test_cached 6 MYSQL_ROOT_PASSWORD: root 7 MYSQL_USER: root 8 # This is normally provided by the .env file. But since we have to use "mysql" as host name, its defined 9 # here. We not using any .env file!10 # The pattern is: mysql://user:password@host/database11 DATABASE_URL: mysql://$MYSQL_USER:$MYSQL_ROOT_PASSWORD@mysql/$MYSQL_DATABASE12 13 # Set memory limit to infinite to avoid running out of memory issues14 COMPOSER_MEMORY_LIMIT: -115 16 # Set the environments variables manually17 APP_ENV: test_cached18 APP_DEBUG: 119 APP_SECRET: 154275231420 MAILER_URL: smtp://localhost21 22 PHP_DATE_TIMEZONE: Europe/Copenhagen23 24cache:25 key: $CI_COMMIT_REF_NAME26 paths:27 - vendor28 - node_modules29 - public30 - .yarn31 32test:33 stage: test34 35 allow_failure: false # Its there for easy switching36 37 services:38 - mysql:5.739 - memcached40 41 # This image was made for Laravel but works for Sylius as well42 # https://github.com/edbizarro/gitlab-ci-pipeline-php43 image: edbizarro/gitlab-ci-pipeline-php:7.2-alpine44 45 before_script:46 - sudo yarn config set cache-folder .yarn47 - mkdir -p public/media/cache && mkdir -p public/media/image # Avoiding error: public/media/image folder not found48 49 script:50 # Install the dependencies. Don't execute scripts because the cache clean up take too long, sometimes times out51 - composer install --prefer-dist --no-ansi --no-scripts --no-interaction --no-progress --no-suggest52 - bin/console doctrine:database:create --if-not-exists --env=test_cached -vvv # Have to run with debug = true, to omit generation proxies before setting up the database53 - yarn install54 - bin/console sylius:theme:assets:install public55 - bin/console sylius:install:assets56 - yarn build57 - bin/console cache:warmup --env=test_cached --no-debug -vvv58 - bin/console doctrine:migrations:migrate --no-interaction --env=test_cached --no-debug -vvv59 60 # Running checks61 - vendor/bin/phpcs -n --standard=PSR2 src62 - vendor/bin/security-checker security:chec63 - vendor/bin/phpspec run --no-interaction -f dot64 65 # Set up a frontend with fixture data66 - bin/console sylius:fixtures:load --no-interaction --env=test_cached --no-debug -vvv67 - bin/console server:run 127.0.0.1:8080 -d web --env test_cached > /dev/null 2>&1 &68 69 # Running tests70 - echo "Starting BEHAT tests."71 - cp behat.yml.dist behat.yml72 - php bin/behat73 - echo "BEHAT tests done."
Den Docker-Container musste ich nicht selbst erstellen, sondern es wurde einer von anderen großartigen Menschen erstellt und ich konnte diesen einfach nutzen. Auf der Suche nach dem richtigen Container habe ich zunächst Alpine versucht, aber da fehlte eine ganze Menge Pakete. Ich endete mit dem Image von edbizarro/gitlab-ci-pipeline-php, der zwar für Laravel gemacht wurde, aber sehr gut für Flex/Sylius funktioniert.
Ich habe eine Weile gebraucht, um die Verbindung zur Datenbank zu konfigurieren. Bei der Verwendung von localhost
oder 127.0.0.1
für die Option --host
erhielt ich immer die Fehlermeldung Connection refused
. Erst als ich mysql
für die Host-Option verwendet habe (da ich einen MySQL-Docker-Container importiere, wenn ich mysql
als Dienst in .gitlab-ci.yml
angebe), klappte die Verbindung.
Eine der Quellen für meine .gitlab-ci.yml
war die Datei .travis.yml
auf https://github.com/Sylius/Sylius-Standard/blob/master/.travis.yml. Von dort habe ich die grobe Struktur und die Umgebung übernommen ... für den Fall, Du fragst Dich, warum ich --env=test_cached
verwende ... jetzt weißt Du es :-)
Wenn Du die Datei ließt, siehst Du, dass sie eine bestimmte .env.test_cached
-Datei verwendet, die auf die test_cached
-Umgebung reagiert. Die Datei wird kopiert und als Quelle verwendet, um die Umgebungsvariablen verfügbar zu machen.
1- cp .env.test_cached.dist .env.test_cached2- set -a && source .env.test_cached && set +a
Du wirst das in meiner Konfiguration vermissen, weil Umgebungsvariable DATABASE_URL
auf mysql:://root@127.0.0.1/sylius_test_cached
zeigt. Das war mir zu statisch und ich habe deswegen die Umgebungsvariablen manuell definiert um diese Variablen zur Erstellung der Logindaten für Datenbank zu verwenden.
Alle Abhängigkeiten von Sylius werden via Composer verwaltet. In der Konfiguration gibt es zwei Punkte, die ich hervorheben möchte:
Composer run out of memory: Dieser Fehler habe ich zum einen erhalten, als Composer die Abhängigkeiten von Upstream holte und zum anderen während er den Cache nach der Installation der Abhängigkeiten geleert hat. Deshalb habe ich in Zeile 14 das Speicherlimit auf unendlich gesetzt.
Composer hit max execution time: Auch hier war der Befehl composer clear cache
der Übeltäter. Es dauert eine Ewigkeit, einen - vermutlich bereits leeren - Cache zu leeren, was den gesamten Prozess verlangsamt und manchmal sogar das max_execution_time
-Limit erreicht hat. Ich entschied mich, composer install mit der Option --no-scripts
auszuführen (Zeile 51).
Ich denke, der Rest ist ziemlich grundlegend und selbsterklärend.