Laravel Dusk - не могу запустить его на GitLab CI - PullRequest
2 голосов
/ 26 июня 2019

Кто-нибудь заставлял Laravel Dusk работать на GitLab CI?

Я использую этот образ докера, который удивителен, но я просто не могу выполнить ./vendor/laravel/dusk/bin/chromedriver-linux, он говорит:

/bin/bash: line 102: ./vendor/laravel/dusk/bin/chromedriver-linux: No such file or directory

Когда я вхожу в ./vendor/laravel/dusk/bin, я вижу, что chromedriver-linux есть и он исполняемый, но не может его запустить.

К настоящему времени строки сценария, составляющие этот этап:

- mv .env.testing .env
- php artisan key:generate
- ./vendor/bin/phpunit --colors=never
- php artisan dusk:install
- chmod -R 0755 vendor/laravel/dusk/bin
- ./vendor/laravel/dusk/bin/chromedriver-linux
- php artisan dusk

Я также попробовал подходы в документации , хотя они не для GitLab CI, но ни один из них не работал.

Обновление:

Запуск ls -l ./vendor/laravel/dusk/bin Возвращает:

total 33560
-rwxr-xr-x    1 root     root      10885776 Jun 26 13:10 chromedriver-linux
-rwxr-xr-x    1 root     root      14994520 Jun 26 13:10 chromedriver-mac
-rwxr-xr-x    1 root     root       8393728 Jun 26 13:10 chromedriver-win.exe
-rwxr-xr-x    1 root     root         69309 Jun 25 22:59 jquery.js

Я пытался скопировать файл на текущий PATH машины, но тоже не работал:

Тестирование переменной $ PATH

$ echo $PATH
./vendor/bin:/composer/vendor/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Копирование двоичного файла в /usr/local/bin

$ CHROME_DRIVER_PATH_BIN=./vendor/laravel/dusk/bin/chromedriver-linux
$ cp $CHROME_DRIVER_PATH_BIN /usr/local/bin

Проверка наличия файла на самом деле

$ ls -lha /usr/local/bin
total 56564
drwxr-xr-x    1 root     root        4.0K Jun 26 17:33 .
drwxr-xr-x    1 root     root        4.0K Feb 21 23:08 ..
-rwxr-xr-x    1 root     root       10.4M Jun 26 17:33 chromedriver-linux
-rwxr-xr-x    1 root     root        1.8M Feb 22 06:40 composer
-rwxrwxr-x    1 root     root         118 Feb 21 23:02 docker-php-entrypoint
-rwxrwxr-x    1 root     root        1.4K Feb 21 23:02 docker-php-ext-configure
-rwxrwxr-x    1 root     root        2.4K Feb 21 23:02 docker-php-ext-enable
-rwxrwxr-x    1 root     root        2.3K Feb 21 23:02 docker-php-ext-install
-rwxrwxr-x    1 root     root         587 Feb  9 01:57 docker-php-source
lrwxrwxrwx    1 root     root          32 Jun 26 17:33 heroku -> /usr/local/lib/heroku/bin/heroku
-rwxr-xr-x    1 root     root         817 Feb 21 23:08 pear
-rwxr-xr-x    1 root     root         838 Feb 21 23:08 peardev
-rwxr-xr-x    1 root     root         751 Feb 21 23:08 pecl
lrwxrwxrwx    1 root     root           9 Feb 21 23:08 phar -> phar.phar
-rwxr-xr-x    1 root     root       14.5K Feb 21 23:08 phar.phar
-rwxr-xr-x    1 root     root       14.3M Feb 21 23:08 php
-rwxr-xr-x    1 root     root       14.2M Feb 21 23:08 php-cgi
-rwxr-xr-x    1 root     root        2.6K Feb 21 23:08 php-config
-rwxr-xr-x    1 root     root       14.4M Feb 21 23:08 phpdbg
-rwxr-xr-x    1 root     root        4.5K Feb 21 23:08 phpize

В любом случае, запуск chromedriver-linux не работает, я получил ошибку nohup: can't execute 'chromedriver-linux': No such file or directory

Я протестировал ту же концепцию на моей macOS: создал исполняемый файл, поместил его в папку, которая находится в моей переменной PATH, используя символическую ссылку, и она отлично работает.

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Я могу решить эту установку пакетов chromium и chromium-chromedriver, поскольку они доступны в Alpine Linux.

Ниже приведена соответствующая часть моего .gitlab-ci.yml файла:

image: lorisleiva/laravel-docker

before_script:
  - apk add chromium-chromedriver -y
  - apk add chromium -y

phptest:
  stage: test
  script:
    - mv .env.testing .env
    - php artisan key:generate
    - ./vendor/bin/phpunit --colors=never
    - chromedriver 2>&1 &
    - sleep 5
    - nohup php artisan serve &
    - php artisan dusk

Кроме того, действительно важной частью является добавление аргумента --no-sandbox при создании RemoteWebDriver. Это можно сделать, изменив функцию driver в файле tests/DuskTestCase.php:

<?php
    // tests/DuskTestCase.php
    protected function driver()
    {
        $options = (new ChromeOptions)->addArguments([
            '--disable-gpu',
            '--headless',
            '--no-sandbox', // # Add this # //
            '--window-size=1920,1080',
        ]);

        return RemoteWebDriver::create(
            'http://localhost:9515',
            DesiredCapabilities::chrome()->setCapability(
                ChromeOptions::CAPABILITY,
                $options
            )
        );
    }

Именно это решило мою проблему, и теперь я могу тестировать с Dusk на GitLab CI, используя lorisleiva/laravel-docker изображение Docker.

0 голосов
/ 26 июня 2019

Файл Docker для этого lorisleiva/laravel-docker образа делает:

ENV PATH ./vendor/bin:/composer/vendor/bin:$PATH
...
WORKDIR /var/www

Таким образом, когда ваш скрипт действительно выполняется, '.' в './vendor' может не ссылаться на текущий рабочий каталог, который вы ожидаете.

Поскольку установлено PATH, было бы лучше, если бы chromedriver-linux было вместо ./vendor/bin.
Таким образом, ваш скрипт может просто вызвать chromedriver-linux (без начального пути)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...