Browse Source

Merge pull request #13644 from ADmad/gh-actions-ci

Add GH action for CI
Mark Story 6 years ago
parent
commit
3ea4ef841a

+ 127 - 0
.github/workflows/ci.yml

@@ -0,0 +1,127 @@
+name: CakePHP CI
+
+on: [pull_request]
+
+jobs:
+  testsuite:
+    runs-on: ubuntu-18.04
+    strategy:
+      fail-fast: false
+      matrix:
+        php-version: ['7.2', '7.3']
+        db-type: [sqlite, mysql, postgres]
+    name: PHP ${{ matrix.php-version }} & ${{ matrix.db-type }}
+
+    services:
+      redis:
+        image: redis
+        ports:
+          - 6379/tcp
+      postgres:
+        image: postgres
+        ports:
+          - 5432/tcp
+
+    steps:
+    - uses: actions/checkout@v1
+      with:
+        fetch-depth: 1
+
+    - name: Install packages
+      run: |
+        # Without removing php-fpm extensions installation fails for some reason
+        sudo apt remove php${{ matrix.php-version }}-fpm
+
+        sudo apt install php${{ matrix.php-version }}-intl
+
+        sudo update-alternatives --set php /usr/bin/php${{ matrix.php-version }}
+        sudo update-alternatives --set phar /usr/bin/phar${{ matrix.php-version }}
+        sudo update-alternatives --set phar.phar /usr/bin/phar.phar${{ matrix.php-version }}
+
+        sudo phpenmod apcu
+        echo 'apc.enable_cli = 1' | sudo tee -a /etc/php/${{ matrix.php-version }}/php.ini
+
+        sudo phpdismod xdebug
+
+        # memcached installation fails without updating packages.
+        # Packages updating is not done earlier to avoid all wasting time as all
+        # php packages get updated when installing php-intl.
+        sudo apt update
+        sudo apt install memcached
+
+        sudo locale-gen da_DK.UTF-8
+        sudo locale-gen de_DE.UTF-8
+
+        if [[ ${{ matrix.php-version }} == '7.2' ]]; then sudo apt install php-pcov; fi
+
+    - name: Set ENV vars
+      run: |
+        if [[ ${{ matrix.db-type }} == 'sqlite' ]]; then export DB_DSN='sqlite:///:memory:'; fi
+        if [[ ${{ matrix.db-type }} == 'mysql' ]]; then export DB_DSN='mysql://root@127.0.0.1/cakephp_test?init[]=SET sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"'; fi
+        if [[ ${{ matrix.db-type }} == 'postgres' ]]; then export DB_DSN='postgres://postgres@127.0.0.1:${{ job.services.postgres.ports['5432'] }}/cakephp_test'; fi
+
+    - name: composer install
+      run: composer install
+
+    - name: Run PHPUnit
+      env:
+        REDIS_PORT: ${{ job.services.redis.ports['6379'] }}
+      run: |
+        if [[ ${{ matrix.php-version }} == '7.2' ]]; then
+          vendor/bin/phpunit
+        else
+          vendor/bin/phpunit --verbose
+        fi
+
+  coding-standard:
+    name: Coding Standard
+    runs-on: ubuntu-18.04
+
+    steps:
+    - uses: actions/checkout@v1
+      with:
+        fetch-depth: 1
+
+    - name: Setup PHP
+      run: |
+        # Without removing php-fpm extensions installation fails for some reason
+        sudo apt remove php7.2-fpm
+        sudo apt install php7.2-intl
+        sudo update-alternatives --set php /usr/bin/php7.2
+        sudo update-alternatives --set phar /usr/bin/phar7.2
+        sudo update-alternatives --set phar.phar /usr/bin/phar.phar7.2
+        sudo phpdismod xdebug
+
+    - name: composer install
+      run: composer stan-setup
+
+    - name: Run PHP CodeSniffer
+      run: composer cs-check
+
+  static-analysis:
+    name: Static Analysis
+    runs-on: ubuntu-18.04
+
+    steps:
+    - uses: actions/checkout@v1
+      with:
+        fetch-depth: 1
+
+    - name: Setup PHP
+      run: |
+        # Without removing php-fpm extensions installation fails for some reason
+        sudo apt remove php7.2-fpm
+        sudo apt install php7.2-intl
+        sudo update-alternatives --set php /usr/bin/php7.2
+        sudo update-alternatives --set phar /usr/bin/phar7.2
+        sudo update-alternatives --set phar.phar /usr/bin/phar.phar7.2
+        sudo phpdismod xdebug
+
+    - name: composer install
+      run: composer stan-setup
+
+    - name: Run psalm
+      run: vendor/bin/psalm.phar --show-info=false
+
+    - name: Run phpstan
+      run: vendor/bin/phpstan.phar analyse src/

+ 0 - 30
.scrutinizer.yml

@@ -1,30 +0,0 @@
-build:
-  environment:
-    php:
-      version: 7.2
-
-  nodes:
-    phpcs:
-      tests:
-        override:
-          - phpcs-run src/ tests/
-
-    static-analysis:
-      environment:
-        php:
-          ini:
-            'memory_limit': -1
-      dependencies:
-        override:
-          - pecl install apcu
-          - pecl install redis
-          - pecl install memcached
-          - composer stan-setup
-      tests:
-        override:
-          - vendor/bin/phpstan.phar analyse src/
-          - vendor/bin/psalm.phar --show-info=false --no-cache
-
-build_failure_conditions:
-  # Issues reported by any analyzer (which generates report in checkstyle format) like phpcs
-  - 'issues.count > 0'

+ 5 - 7
.travis.yml

@@ -17,8 +17,6 @@ cache:
     - $HOME/.composer/cache
 
 php:
-  - 7.2
-  - 7.3
   - 7.4snapshot
 
 env:
@@ -39,29 +37,29 @@ before_install:
   - if [[ $TRAVIS_PHP_VERSION != '7.4snapshot' ]]; then phpenv config-rm xdebug.ini; fi
 
   - pecl channel-update pecl.php.net
-  - if [[ $TRAVIS_PHP_VERSION == '7.2' ]]; then pecl install pcov; fi
+  - if [[ $TRAVIS_PHP_VERSION == '7.4snapshot' ]]; then pecl install pcov; fi
   - echo 'extension = memcached.so' >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini;
   - echo 'extension = redis.so' >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini
   - echo 'extension = apcu.so' >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini
   - echo 'apc.enable_cli = 1' >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini
 
-  - sudo locale-gen da_DK
+  - sudo locale-gen da_DK.UTF-8
 
 install:
   - composer install --prefer-dist --no-interaction
 
 script:
   - |
-      if [[ $TRAVIS_PHP_VERSION == '7.2' ]]; then
+      if [[ $TRAVIS_PHP_VERSION == '7.4snapshot' ]]; then
         # This is necessary to skip memory usage tests
-        CODECOVERAGE=1 vendor/bin/phpunit --coverage-clover=clover.xml
+        CODECOVERAGE=1 vendor/bin/phpunit --verbose --coverage-clover=clover.xml
       else
         vendor/bin/phpunit
       fi
 
 after_success:
   - |
-      if [[ $TRAVIS_PHP_VERSION == '7.2' ]]; then
+      if [[ $TRAVIS_PHP_VERSION == '7.4snapshot' ]]; then
         wget https://github.com/php-coveralls/php-coveralls/releases/download/v2.1.0/php-coveralls.phar
         chmod +x php-coveralls.phar
         ./php-coveralls.phar

+ 2 - 2
src/Cache/Engine/RedisEngine.php

@@ -102,8 +102,8 @@ class RedisEngine extends CacheEngine
             } elseif (empty($this->_config['persistent'])) {
                 $return = $this->_Redis->connect(
                     $this->_config['server'],
-                    $this->_config['port'],
-                    $this->_config['timeout']
+                    (int)$this->_config['port'],
+                    (int)$this->_config['timeout']
                 );
             } else {
                 $persistentId = $this->_config['port'] . $this->_config['timeout'] . $this->_config['database'];

+ 33 - 20
tests/TestCase/Cache/Engine/MemcachedEngineTest.php

@@ -28,6 +28,11 @@ use Memcached;
 class MemcachedEngineTest extends TestCase
 {
     /**
+     * @var string
+     */
+    protected $port = '11211';
+
+    /**
      * setUp method
      *
      * @return void
@@ -37,8 +42,10 @@ class MemcachedEngineTest extends TestCase
         parent::setUp();
         $this->skipIf(!class_exists('Memcached'), 'Memcached is not installed or configured properly.');
 
+        $this->port = env('MEMCACHED_PORT', $this->port);
+
         // phpcs:disable
-        $socket = @fsockopen('127.0.0.1', 11211, $errno, $errstr, 1);
+        $socket = @fsockopen('127.0.0.1', (int)$this->port, $errno, $errstr, 1);
         // phpcs:enable
         $this->skipIf(!$socket, 'Memcached is not running.');
         fclose($socket);
@@ -58,6 +65,7 @@ class MemcachedEngineTest extends TestCase
             'className' => 'Memcached',
             'prefix' => 'cake_',
             'duration' => 3600,
+            'servers' => ['127.0.0.1:' . $this->port],
         ];
         Cache::drop('memcached');
         Cache::setConfig('memcached', array_merge($defaults, $config));
@@ -92,7 +100,7 @@ class MemcachedEngineTest extends TestCase
         $expecting = [
             'prefix' => 'cake_',
             'duration' => 3600,
-            'servers' => ['127.0.0.1'],
+            'servers' => ['127.0.0.1:' . $this->port],
             'persistent' => false,
             'compress' => false,
             'username' => null,
@@ -116,7 +124,7 @@ class MemcachedEngineTest extends TestCase
         $Memcached = new MemcachedEngine();
         $Memcached->init([
             'engine' => 'Memcached',
-            'servers' => ['127.0.0.1:11211'],
+            'servers' => ['127.0.0.1:' . $this->port],
             'compress' => false,
         ]);
 
@@ -125,7 +133,7 @@ class MemcachedEngineTest extends TestCase
         $MemcachedCompressed = new MemcachedEngine();
         $MemcachedCompressed->init([
             'engine' => 'Memcached',
-            'servers' => ['127.0.0.1:11211'],
+            'servers' => ['127.0.0.1:' . $this->port],
             'compress' => true,
         ]);
 
@@ -142,7 +150,7 @@ class MemcachedEngineTest extends TestCase
         $memcached = new MemcachedEngine();
         $memcached->init([
             'engine' => 'Memcached',
-            'servers' => ['127.0.0.1:11211'],
+            'servers' => ['127.0.0.1:' . $this->port],
             'options' => [
                 Memcached::OPT_BINARY_PROTOCOL => true,
             ],
@@ -162,7 +170,7 @@ class MemcachedEngineTest extends TestCase
         $Memcached = new MemcachedEngine();
         $config = [
             'className' => 'Memcached',
-            'servers' => ['127.0.0.1:11211'],
+            'servers' => ['127.0.0.1:' . $this->port],
             'persistent' => false,
             'serialize' => 'invalid_serializer',
         ];
@@ -179,7 +187,7 @@ class MemcachedEngineTest extends TestCase
         $Memcached = new MemcachedEngine();
         $config = [
             'className' => 'Memcached',
-            'servers' => ['127.0.0.1:11211'],
+            'servers' => ['127.0.0.1:' . $this->port],
             'persistent' => false,
             'serialize' => 'php',
         ];
@@ -203,7 +211,7 @@ class MemcachedEngineTest extends TestCase
         $Memcached = new MemcachedEngine();
         $config = [
             'engine' => 'Memcached',
-            'servers' => ['127.0.0.1:11211'],
+            'servers' => ['127.0.0.1:' . $this->port],
             'persistent' => false,
             'serialize' => 'json',
         ];
@@ -227,7 +235,7 @@ class MemcachedEngineTest extends TestCase
         $Memcached = new MemcachedEngine();
         $config = [
             'engine' => 'Memcached',
-            'servers' => ['127.0.0.1:11211'],
+            'servers' => ['127.0.0.1:' . $this->port],
             'persistent' => false,
             'serialize' => 'igbinary',
         ];
@@ -251,7 +259,7 @@ class MemcachedEngineTest extends TestCase
         $Memcached = new MemcachedEngine();
         $config = [
             'engine' => 'Memcached',
-            'servers' => ['127.0.0.1:11211'],
+            'servers' => ['127.0.0.1:' . $this->port],
             'persistent' => false,
             'serialize' => 'msgpack',
         ];
@@ -275,7 +283,7 @@ class MemcachedEngineTest extends TestCase
         $Memcached = new MemcachedEngine();
         $config = [
             'className' => 'Memcached',
-            'servers' => ['127.0.0.1:11211'],
+            'servers' => ['127.0.0.1:' . $this->port],
             'persistent' => false,
             'serialize' => 'json',
         ];
@@ -304,7 +312,7 @@ class MemcachedEngineTest extends TestCase
         $Memcached = new MemcachedEngine();
         $config = [
             'engine' => 'Memcached',
-            'servers' => ['127.0.0.1:11211'],
+            'servers' => ['127.0.0.1:' . $this->port],
             'persistent' => false,
             'serialize' => 'msgpack',
         ];
@@ -329,7 +337,7 @@ class MemcachedEngineTest extends TestCase
         $Memcached = new MemcachedEngine();
         $config = [
             'engine' => 'Memcached',
-            'servers' => ['127.0.0.1:11211'],
+            'servers' => ['127.0.0.1:' . $this->port],
             'persistent' => false,
             'serialize' => 'igbinary',
         ];
@@ -356,7 +364,7 @@ class MemcachedEngineTest extends TestCase
         $MemcachedEngine = new MemcachedEngine();
         $config = [
             'engine' => 'Memcached',
-            'servers' => ['127.0.0.1:11211'],
+            'servers' => ['127.0.0.1:' . $this->port],
             'persistent' => false,
             'username' => 'test',
             'password' => 'password',
@@ -373,7 +381,7 @@ class MemcachedEngineTest extends TestCase
      */
     public function testMultipleServers()
     {
-        $servers = ['127.0.0.1:11211', '127.0.0.1:11222'];
+        $servers = ['127.0.0.1:' . $this->port, '127.0.0.1:11222'];
         $available = true;
         $Memcached = new \Memcached();
 
@@ -409,7 +417,7 @@ class MemcachedEngineTest extends TestCase
             'duration' => 200,
             'engine' => 'Memcached',
             'servers' => [
-                '[::1]:11211',
+                '[::1]:' . $this->port,
             ],
         ]);
         $this->assertTrue($result);
@@ -695,7 +703,7 @@ class MemcachedEngineTest extends TestCase
         Cache::setConfig('compressed_memcached', [
             'engine' => 'Memcached',
             'duration' => '+2 seconds',
-            'servers' => ['127.0.0.1:11211'],
+            'servers' => ['127.0.0.1:' . $this->port],
             'compress' => true,
         ]);
 
@@ -772,7 +780,7 @@ class MemcachedEngineTest extends TestCase
         Cache::setConfig('compressed_memcached', [
             'engine' => 'Memcached',
             'duration' => '+2 seconds',
-            'servers' => ['127.0.0.1:11211'],
+            'servers' => ['127.0.0.1:' . $this->port],
             'compress' => true,
         ]);
 
@@ -804,12 +812,12 @@ class MemcachedEngineTest extends TestCase
         Cache::setConfig('long_memcached', [
             'engine' => 'Memcached',
             'duration' => '+3 seconds',
-            'servers' => ['127.0.0.1:11211'],
+            'servers' => ['127.0.0.1:' . $this->port],
         ]);
         Cache::setConfig('short_memcached', [
             'engine' => 'Memcached',
             'duration' => '+2 seconds',
-            'servers' => ['127.0.0.1:11211'],
+            'servers' => ['127.0.0.1:' . $this->port],
         ]);
 
         $this->assertTrue(Cache::write('duration_test', 'yay', 'long_memcached'));
@@ -840,6 +848,7 @@ class MemcachedEngineTest extends TestCase
             'engine' => 'Memcached',
             'prefix' => 'cake2_',
             'duration' => 3600,
+            'servers' => ['127.0.0.1:' . $this->port],
         ]);
 
         Cache::write('some_value', 'cache1', 'memcached');
@@ -882,11 +891,13 @@ class MemcachedEngineTest extends TestCase
             'duration' => 3600,
             'groups' => ['group_a', 'group_b'],
             'prefix' => 'test_',
+            'servers' => ['127.0.0.1:' . $this->port],
         ]);
         Cache::setConfig('memcached_helper', [
             'engine' => 'Memcached',
             'duration' => 3600,
             'prefix' => 'test_',
+            'servers' => ['127.0.0.1:' . $this->port],
         ]);
         $this->assertTrue(Cache::write('test_groups', 'value', 'memcached_groups'));
         $this->assertSame('value', Cache::read('test_groups', 'memcached_groups'));
@@ -913,6 +924,7 @@ class MemcachedEngineTest extends TestCase
             'engine' => 'Memcached',
             'duration' => 3600,
             'groups' => ['group_a', 'group_b'],
+            'servers' => ['127.0.0.1:' . $this->port],
         ]);
         $this->assertTrue(Cache::write('test_groups', 'value', 'memcached_groups'));
         $this->assertSame('value', Cache::read('test_groups', 'memcached_groups'));
@@ -932,6 +944,7 @@ class MemcachedEngineTest extends TestCase
             'engine' => 'Memcached',
             'duration' => 3600,
             'groups' => ['group_a', 'group_b'],
+            'servers' => ['127.0.0.1:' . $this->port],
         ]);
 
         $this->assertTrue(Cache::write('test_groups', 'value', 'memcached_groups'));

+ 19 - 4
tests/TestCase/Cache/Engine/RedisEngineTest.php

@@ -27,6 +27,11 @@ use DateInterval;
 class RedisEngineTest extends TestCase
 {
     /**
+     * @var string
+     */
+    protected $port = '6379';
+
+    /**
      * setUp method
      *
      * @return void
@@ -36,8 +41,10 @@ class RedisEngineTest extends TestCase
         parent::setUp();
         $this->skipIf(!class_exists('Redis'), 'Redis extension is not installed or configured properly.');
 
+        $this->port = env('REDIS_PORT', $this->port);
+
         // phpcs:disable
-        $socket = @fsockopen('127.0.0.1', 6379, $errno, $errstr, 1);
+        $socket = @fsockopen('127.0.0.1', (int)$this->port, $errno, $errstr, 1);
         // phpcs:enable
         $this->skipIf(!$socket, 'Redis is not running.');
         fclose($socket);
@@ -71,6 +78,7 @@ class RedisEngineTest extends TestCase
             'className' => 'Redis',
             'prefix' => 'cake_',
             'duration' => 3600,
+            'port' => $this->port,
         ];
         Cache::drop('redis');
         Cache::setConfig('redis', array_merge($defaults, $config));
@@ -89,7 +97,7 @@ class RedisEngineTest extends TestCase
             'duration' => 3600,
             'groups' => [],
             'server' => '127.0.0.1',
-            'port' => 6379,
+            'port' => $this->port,
             'timeout' => 0,
             'persistent' => true,
             'password' => false,
@@ -108,7 +116,7 @@ class RedisEngineTest extends TestCase
     public function testConfigDsn()
     {
         Cache::setConfig('redis_dsn', [
-            'url' => 'redis://localhost:6379?database=1&prefix=redis_',
+            'url' => 'redis://localhost:' . $this->port . '?database=1&prefix=redis_',
         ]);
 
         $config = Cache::pool('redis_dsn')->getConfig();
@@ -117,7 +125,7 @@ class RedisEngineTest extends TestCase
             'duration' => 3600,
             'groups' => [],
             'server' => 'localhost',
-            'port' => 6379,
+            'port' => $this->port,
             'timeout' => 0,
             'persistent' => true,
             'password' => false,
@@ -154,6 +162,7 @@ class RedisEngineTest extends TestCase
             'prefix' => 'cake2_',
             'duration' => 3600,
             'persistent' => false,
+            'port' => $this->port,
         ]);
 
         Cache::setConfig('redisdb1', [
@@ -162,6 +171,7 @@ class RedisEngineTest extends TestCase
             'prefix' => 'cake2_',
             'duration' => 3600,
             'persistent' => false,
+            'port' => $this->port,
         ]);
 
         $result = Cache::write('save_in_0', true, 'redisdb0');
@@ -461,6 +471,7 @@ class RedisEngineTest extends TestCase
             'engine' => 'Redis',
             'prefix' => 'cake2_',
             'duration' => 3600,
+            'port' => $this->port,
         ]);
 
         Cache::write('some_value', 'cache1', 'redis');
@@ -506,11 +517,13 @@ class RedisEngineTest extends TestCase
             'duration' => 3600,
             'groups' => ['group_a', 'group_b'],
             'prefix' => 'test_',
+            'port' => $this->port,
         ]);
         Cache::setConfig('redis_helper', [
             'engine' => 'Redis',
             'duration' => 3600,
             'prefix' => 'test_',
+            'port' => $this->port,
         ]);
         $this->assertTrue(Cache::write('test_groups', 'value', 'redis_groups'));
         $this->assertSame('value', Cache::read('test_groups', 'redis_groups'));
@@ -537,6 +550,7 @@ class RedisEngineTest extends TestCase
             'engine' => 'Redis',
             'duration' => 3600,
             'groups' => ['group_a', 'group_b'],
+            'port' => $this->port,
         ]);
         $this->assertTrue(Cache::write('test_groups', 'value', 'redis_groups'));
         $this->assertSame('value', Cache::read('test_groups', 'redis_groups'));
@@ -556,6 +570,7 @@ class RedisEngineTest extends TestCase
             'engine' => 'Redis',
             'duration' => 3600,
             'groups' => ['group_a', 'group_b'],
+            'port' => $this->port,
         ]);
 
         $this->assertTrue(Cache::write('test_groups', 'value', 'redis_groups'));

+ 5 - 0
tests/TestCase/Console/ConsoleInputTest.php

@@ -49,6 +49,11 @@ class ConsoleInputTest extends TestCase
             'Skip ConsoleInput tests on Windows as they fail on AppVeyor.'
         );
 
+        $this->skipIf(
+            (bool)env('GITHUB_ACTIONS'),
+            'Skip test for ConsoleInput::dataAvailable() on Github VM as stream_select() incorrectly return 1 even though no data is available on STDIN.'
+        );
+
         try {
             $this->assertFalse($this->in->dataAvailable());
         } catch (ConsoleException $e) {