From 4b3409b7a4fc9064a7c2778305b0ed43793911fa Mon Sep 17 00:00:00 2001 From: "Eloy Lafuente (stronk7)" Date: Sat, 21 Nov 2020 13:05:22 +0100 Subject: [PATCH] MDL-70276 github actions: First cut, phpunit and grunt checks First working version, supports phpunit (using build matrix): - php72 (lowest), running mysql. - php74 (highest), running postgres. Also verifies that the branch has been "gruntified" and there isn't any missing change (build js/css files). TODO: Verify the remaining checks currently in .travis.yml, namely: - CITEST - Add caching - Better health-check for DB images. - Support from the tracker (satus badges and enable check). - Support from CiBoT (status and enable check). - Consider moving both the common setup (git, composer...) and the database (mysql, postgres) to own actions for easier tweaking. --- .github/workflows/config-template.php | 71 ++++++++++++++++++ .github/workflows/push.yml | 103 ++++++++++++++++++++++++++ 2 files changed, 174 insertions(+) create mode 100644 .github/workflows/config-template.php create mode 100644 .github/workflows/push.yml diff --git a/.github/workflows/config-template.php b/.github/workflows/config-template.php new file mode 100644 index 00000000000..dc5f958eb53 --- /dev/null +++ b/.github/workflows/config-template.php @@ -0,0 +1,71 @@ +. + +/** + * Template configuraton file for github actions CI/CD. + * + * @package core + * @copyright 2020 onwards Eloy Lafuente (stronk7) {@link https://stronk7.com} + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +// This cannot be used out from a github actions workflow, so just exit. +getenv('GITHUB_WORKFLOW') || die; // phpcs:ignore moodle.Files.MoodleInternal.MoodleInternalGlobalState + +unset($CFG); +global $CFG; +$CFG = new stdClass(); + +$CFG->dbtype = getenv('dbtype'); +$CFG->dblibrary = 'native'; +$CFG->dbhost = '127.0.0.1'; +$CFG->dbname = 'test'; +$CFG->dbuser = 'test'; +$CFG->dbpass = 'test'; +$CFG->prefix = 'm_'; +$CFG->dboptions = ['dbcollation' => 'utf8mb4_bin']; + +$host = 'localhost'; +$CFG->wwwroot = "http://{$host}"; +$CFG->dataroot = realpath(dirname(__DIR__)) . '/moodledata'; +$CFG->admin = 'admin'; +$CFG->directorypermissions = 0777; + +// Debug options - possible to be controlled by flag in future. +$CFG->debug = (E_ALL | E_STRICT); // DEBUG_DEVELOPER. +$CFG->debugdisplay = 1; +$CFG->debugstringids = 1; // Add strings=1 to url to get string ids. +$CFG->perfdebug = 15; +$CFG->debugpageinfo = 1; +$CFG->allowthemechangeonurl = 1; +$CFG->passwordpolicy = 0; +$CFG->cronclionly = 0; +$CFG->pathtophp = getenv('pathtophp'); + +$CFG->phpunit_dataroot = realpath(dirname(__DIR__)) . '/phpunitdata'; +$CFG->phpunit_prefix = 't_'; + +define('TEST_EXTERNAL_FILES_HTTP_URL', 'http://localhost:8080'); +define('TEST_EXTERNAL_FILES_HTTPS_URL', 'http://localhost:8080'); + +define('TEST_SESSION_REDIS_HOST', 'localhost'); +define('TEST_CACHESTORE_REDIS_TESTSERVERS', 'localhost'); + +// TODO: add others (solr, mongodb, memcached, ldap...). + +// Too much for now: define('PHPUNIT_LONGTEST', true); // Only leaves a few tests out and they are run later by CI. + +require_once(__DIR__ . '/lib/setup.php'); diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml new file mode 100644 index 00000000000..f063803e4a7 --- /dev/null +++ b/.github/workflows/push.yml @@ -0,0 +1,103 @@ +name: Core + +on: [push] + +env: + php: 7.4 + +jobs: + Grunt: + runs-on: ubuntu-18.04 + + steps: + - name: Checking out code + uses: actions/checkout@v2 + + - name: Configuring node & npm + shell: bash -l {0} + run: nvm install + + - name: Installing node stuff + run: npm install + + - name: Running grunt + run: npx grunt + + - name: Looking for uncommitted changes + # Add all files to the git index and then run diff --cached to see all changes. + # This ensures that we get the status of all files, including new files. + # We ignore npm-shrinkwrap.json to make the tasks immune to npm changes. + run: | + git add . + git reset -- npm-shrinkwrap.json + git diff --cached --exit-code + + PHPUnit: + runs-on: ${{ matrix.os }} + services: + exttests: + image: moodlehq/moodle-exttests + ports: + - 8080:80 + redis: + image: redis + ports: + - 6379:6379 + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-18.04 + php: 7.2 + db: mysqli + - os: ubuntu-18.04 + php: 7.4 + db: pgsql + + steps: + - name: Setting up DB mysql + if: ${{ matrix.db == 'mysqli' }} + uses: johanmeiring/mysql-action@tmpfs-patch + with: + collation server: utf8mb4_bin + mysql version: 5.7 + mysql database: test + mysql user: test + mysql password: test + use tmpfs: true + + - name: Setting up DB pgsql + if: ${{ matrix.db == 'pgsql' }} + uses: m4nu56/postgresql-action@v1 + with: + postgresql version: 9.6 + postgresql db: test + postgresql user: test + postgresql password: test + + - name: Configuring git vars + uses: rlespinasse/github-slug-action@v3.x + + - name: Setting up PHP ${{ matrix.php }} + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + + - name: Checking out code from ${{ env.GITHUB_REF_SLUG }} + uses: actions/checkout@v2 + + - name: Setting up PHPUnit + env: + dbtype: ${{ matrix.db }} + run: | + echo "pathtophp=$(which php)" >> $GITHUB_ENV # Inject installed pathtophp to env. The template config needs it. + cp .github/workflows/config-template.php config.php + mkdir ../moodledata + sudo locale-gen en_AU.UTF-8 + php admin/tool/phpunit/cli/init.php --no-composer-self-update + + - name: Running PHPUnit tests + env: + dbtype: ${{ matrix.db }} + run: vendor/bin/phpunit -v -- 2.43.0