Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MNT Add GitHub Actions CI #10416

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
16 changes: 16 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
name: CI

on:
push:
pull_request:
workflow_dispatch:
# Every Tuesday at 2:20pm UTC
schedule:
- cron: '20 14 * * 2'

jobs:
ci:
uses: silverstripe/gha-ci/.github/workflows/ci.yml@v1
with:
# Turn phpcoverage off because it causes a segfault
phpcoverage_force_off: true
16 changes: 16 additions & 0 deletions .github/workflows/keepalive.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@

name: Keepalive

on:
# The 4th of every month at 10:50am UTC
schedule:
- cron: '50 10 4 * *'
workflow_dispatch:

jobs:
keepalive:
name: Keepalive
runs-on: ubuntu-latest
steps:
- name: Keepalive
uses: silverstripe/gha-keepalive@v1
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
## SilverStripe Framework

[![Build Status](https://api.travis-ci.com/silverstripe/silverstripe-framework.svg?branch=4)](https://travis-ci.com/silverstripe/silverstripe-framework)
[![CI](https://github.com/silverstripe/silverstripe-framework/actions/workflows/ci.yml/badge.svg)](https://github.com/silverstripe/silverstripe-framework/actions/workflows/ci.yml)
[![Build Docs](https://github.com/silverstripe/silverstripe-framework/workflows/Build%20Docs/badge.svg)](https://docs.silverstripe.org/)
[![Latest Stable Version](https://poser.pugx.org/silverstripe/framework/version.svg)](https://www.silverstripe.org/stable-download/)
[![Latest Unstable Version](https://poser.pugx.org/silverstripe/framework/v/unstable.svg)](https://packagist.org/packages/silverstripe/framework)
Expand Down
34 changes: 0 additions & 34 deletions behat.yml

This file was deleted.

20 changes: 20 additions & 0 deletions tests/php/ORM/DataObjectSchemaGenerationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use SilverStripe\ORM\FieldType\DBEnum;
use SilverStripe\ORM\DataObject;
use SilverStripe\Dev\SapphireTest;
use SilverStripe\ORM\Connect\MySQLiConnector;
use SilverStripe\ORM\Tests\DataObjectSchemaGenerationTest\SortedObject;
use SilverStripe\ORM\Tests\DataObjectSchemaGenerationTest\TestIndexObject;
use SilverStripe\ORM\Tests\DataObjectSchemaGenerationTest\TestObject;
Expand Down Expand Up @@ -67,11 +68,26 @@ function () {
);
}

private function isMySQL8(): bool
{
$connector = DB::get_conn()->getConnector();
if ($connector instanceof MySQLiConnector &&
preg_match('#^8\.#', $connector->getVersion())
GuySartorelli marked this conversation as resolved.
Show resolved Hide resolved
) {
return true;
}
return false;
}

/**
* Check that once a schema has been generated, then it doesn't need any more updating
*/
public function testFieldsDontRerequestChanges()
{
// TODO: remove the MySQL8 skip when `int(11)` is no longer the default field type for integers and has been replaced with `int`
if ($this->isMySQL8()) {
$this->markTestSkipped();
}
$schema = DB::get_schema();
$test = $this;
DB::quiet();
Expand Down Expand Up @@ -126,6 +142,10 @@ function () use ($test, $schema) {
*/
public function testIndexesDontRerequestChanges()
{
// TODO: remove the MySQL8 skip when `int(11)` is no longer the default field type for integers and has been replaced with `int`
if ($this->isMySQL8()) {
$this->markTestSkipped();
}
$schema = DB::get_schema();
$test = $this;
DB::quiet();
Expand Down
11 changes: 7 additions & 4 deletions tests/php/ORM/MySQLPDOConnectorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use SilverStripe\Dev\TestOnly;
use SilverStripe\ORM\Tests\MySQLPDOConnectorTest\PDOConnector;
use SilverStripe\ORM\DB;
use SilverStripe\Tests\ORM\Utf8\Utf8TestHelper;

/**
* @requires extension PDO
Expand Down Expand Up @@ -38,8 +39,9 @@ public function testConnectionCharsetControl($charset, $defaultCollation)
$cset = $connection->query('show variables like "character_set_connection"')->fetch(PDO::FETCH_NUM)[1];
$collation = $connection->query('show variables like "collation_connection"')->fetch(PDO::FETCH_NUM)[1];

$this->assertEquals($charset, $cset);
$this->assertEquals($defaultCollation, $collation);
$helper = new Utf8TestHelper();
$this->assertEquals($helper->getUpdatedUtfCharsetForCurrentDB($charset), $cset);
$this->assertEquals($helper->getUpdatedUtfCollationForCurrentDB($defaultCollation), $collation);

unset($cset, $connection, $connector, $config);
}
Expand All @@ -66,8 +68,9 @@ public function testConnectionCollationControl($charset, $defaultCollation, $cus
$cset = $connection->query('show variables like "character_set_connection"')->fetch(PDO::FETCH_NUM)[1];
$collation = $connection->query('show variables like "collation_connection"')->fetch(PDO::FETCH_NUM)[1];

$this->assertEquals($charset, $cset);
$this->assertEquals($customCollation, $collation);
$helper = new Utf8TestHelper();
$this->assertEquals($helper->getUpdatedUtfCharsetForCurrentDB($charset), $cset);
$this->assertEquals($helper->getUpdatedUtfCollationForCurrentDB($customCollation), $collation);

unset($cset, $connection, $connector, $config);
}
Expand Down
10 changes: 8 additions & 2 deletions tests/php/ORM/MySQLiConnectorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use SilverStripe\Dev\TestOnly;
use SilverStripe\ORM\Tests\MySQLiConnectorTest\MySQLiConnector;
use SilverStripe\ORM\DB;
use SilverStripe\Tests\ORM\Utf8\Utf8TestHelper;

/**
* @requires extension mysqli
Expand All @@ -31,6 +32,10 @@ public function testConnectionCharsetControl($charset, $defaultCollation)

$cset = $connection->get_charset();

// Note: we do not need to update the utf charset here because mysqli with newer
// version of mysql/mariadb still self-reports as 'utf8' rather than 'utf8mb3'
// This is unlike self::testConnectionCollationControl()
// And also unlike MySQLPDOConnectorTest::testConnectionCharsetControl()
$this->assertEquals($charset, $cset->charset);
$this->assertEquals($defaultCollation, $cset->collation);

Expand Down Expand Up @@ -77,8 +82,9 @@ public function testConnectionCollationControl($charset, $defaultCollation, $cus
$cset = $connection->query('show variables like "character_set_connection"')->fetch_array()[1];
$collation = $connection->query('show variables like "collation_connection"')->fetch_array()[1];

$this->assertEquals($charset, $cset);
$this->assertEquals($customCollation, $collation);
$helper = new Utf8TestHelper();
$this->assertEquals($helper->getUpdatedUtfCharsetForCurrentDB($charset), $cset);
$this->assertEquals($helper->getUpdatedUtfCollationForCurrentDB($customCollation), $collation);

$connection->close();
unset($cset, $connection, $connector, $config);
Expand Down
69 changes: 69 additions & 0 deletions tests/php/ORM/Utf8/Utf8TestHelper.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
<?php

namespace SilverStripe\Tests\ORM\Utf8;

use SilverStripe\Dev\TestOnly;
use SilverStripe\ORM\DB;

class Utf8TestHelper implements TestOnly
{
/**
* @var string|null
*/
private $dbVersion = null;

public function getUpdatedUtfCharsetForCurrentDB(string $charset): string
{
if ($charset !== 'utf8') {
return $charset;
}
return $this->isMySqlGte80() || $this->isMariaDBGte106() ? 'utf8mb3' : 'utf8';
}

public function getUpdatedUtfCollationForCurrentDB(string $collation): string
{
if ($collation === 'utf8_general_ci') {
return $this->isMariaDBGte106() ? 'utf8mb3_general_ci' : 'utf8_general_ci';
}
if ($collation === 'utf8_unicode_520_ci') {
return $this->isMariaDBGte106() ? 'utf8mb3_unicode_520_ci' : 'utf8_unicode_520_ci';
}
return $collation;
}

/**
* MySQL has used utf8 as an alias for utf8mb3
* Beginning with MySQL 8.0.28, utf8mb3 is used
* https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8mb3.html
*/
private function isMySqlGte80(): bool
{
// Example MySQL version: 8.0.29
if (preg_match('#^([0-9]+)\.[0-9]+\.[0-9]+$#', $this->getDBVersion(), $m)) {
return (int) $m[1] >= 8;
}
return false;
}

/**
* Until MariaDB 10.5, utf8mb3 was an alias for utf8.
* From MariaDB 10.6, utf8 is by default an alias for utf8mb3
* https://mariadb.com/kb/en/unicode/
*/
private function isMariaDBGte106(): bool
{
// Example mariadb version: 5.5.5-10.6.8-mariadb-1:10.6.8+maria~focal
if (preg_match('#([0-9]+)\.([0-9]+)\.[0-9]+-mariadb#', $this->getDBVersion(), $m)) {
return (int) $m[1] >= 11 || ((int) $m[1] >= 10 && (int) $m[2] >= 6);
}
return false;
}

private function getDBVersion(): string
{
if (is_null($this->dbVersion)) {
$this->dbVersion = strtolower(DB::get_conn()->getVersion());
}
return $this->dbVersion;
}
}