Travis integration

Jump to: navigation, search

Given the two notes below, you probably don't want to read this page. Github actions integration is much more likely to be what you want.

Travis has announced that travis-ci.org will be closed down completely on December 31st 2020, with travis-ci.com becoming the unified place for all projects. More information can be found at:
Travis has announced, November 2, 2020, that travis-ci.com won't be (unlimitedly) free anymore, with everybody getting some credits (processing time) once and, after using them, you must change to some of their (paid) plans. Few weeks later, November 24, 2020, they have published an update specifically for Open Source. There, they recommend to contact them "for anything relating with your open source account". Up to you!

More information can be found at:

Moodle core

Background

Moodle is regularly tested against a matrix of Databases, PHP Versions, and operating systems, however many developers do not have the resources available to run on many of these combinations before pushing an issue for integration as they are time-consuming to both set up and to run.

There are many Continuous Integration tools available to developers, and Travis-CI is just one of those available to the Open Source community.

Since version 3.0, Moodle includes a Travis configuration file in its repository. This configuration file configures and controls a Travis build across a matrix of testing environments. This allows developers pushing patches to Moodle to have their code unit tested before it reaches integration. The hope is that the availability of this integration should reduce the number of unit test failures seen during Integration.

Note: Moodle HQ uses the Jenkins CI platform and this should be seen as the canonical CI server for Moodle. The Travis integration aims is to provide early warning to developers of any issues with their code.

Usage

Travis-CI is available and is usually configured to run automatically when pushing code, but it must be configured before first use.

For the purpose of this documentation, it is assumed that you are pushing to a public Moodle repository on GitHub. Other integrations are supported, but the service available from Travis is only available to public repositories.

Setup

  1. Sign in to Travis CI using your GitHub account
  2. Once you’re signed in, and the initial synchronisation of your GitHub repositories has completed, go to your profile page
  3. Enable Travis CI for your clone of the Moodle repository moodle-travis-enable.png
  4. Click on the cog icon to configure the Integration
  5. Ensure that "Build pushed branches" is enabled moodle-travis-settings-2020.png
  6. Email notifications will be sent by default to the committer and the commit author. If you want to turn off email notifications for this repository, you can define an environment variable with name MOODLE_EMAIL and "no" as value.
  7. By default, the following jobs will be executed for each branch sent to github:
    1. GRUNT: 1 job that will check that all your javascript and scss has been properly built (see Grunt) and is part of the patch.
    2. CITESTS: 1 job that will perform a lightweight linting of your branch.
    3. PHPUNIT: 1 job that will run all the unit tests on your branch (using the lowest PHP version supported by the branch and PostgreSQL as database).
  8. If you want to change those defaults, you can use the following environment variables:
    1. MOODLE_DATABASE: With value "mysqli" to switch your runs to that database. With value "all" to run both PostgreSQL and MySQL unit tests.
    2. MOODLE_PHP: With value "all", to run the unit tests both with the lowest and the highest PHP versions supported by the branch.

Note that adding more jobs will increase the time needed (and the credits consumed) for processing each branch, so be careful picking your fav configuration. Define an environment variable


How do I start a build?

It won't build immediately after setup. Builds start automatically when you push a change.

Moodle plugins

See Moodle Plugin CI repository for setup instructions.

Related discussions:

Ignoring files and folders

For some of the code analysis tools, it is important to ignore some files within the plugin because they might not be fixable, like a third party library. The all code analysis commands in this project ignore files and directories listed in the thirdpartylibs.xml plugin file. See https://docs.moodle.org/dev/Plugin_files#thirdpartylibs.xml for more info.

Ignoring files

Specifically for the codechecker command, you can ignore a single line, a section of a file or the whole file by using specific PHP comments. For details see this CodeSniffer wiki page. In addition, you can ignore additional files by defining IGNORE_PATHS and/or IGNORE_NAMES environment variables in your .travis.yml file. These environment variables wont work for Grunt tasks, but will for everything else. Example:

env:
 global:
  - MOODLE_BRANCH=MOODLE_35_STABLE
  - IGNORE_PATHS=vendor/widget,javascript/min-lib.js
  - IGNORE_NAMES=*-m.js,bad_lib.php
 matrix:
  - DB=pgsql
  - DB=mysqli

Both environment variables take a CSV value. For IGNORE_PATHS, it takes relative file paths to ignore. File paths can be a simple string like foo/bar or a regular expression like /^foo\/bar/. For IGNORE_NAMES, it takes file names to ignore. File names can be a simple string like foo.php, a glob like *.php or a regular expression like /\.php$/.

If you need to specify ignore paths for a specific command, then you can define additional environment variables. The variable names are the same as above, but prefixed with COMMANDNAME_. Example:

env:
 global:
  - MOODLE_BRANCH=MOODLE_35_STABLE
  - IGNORE_PATHS=vendor/widget,javascript/min-lib.js
  - IGNORE_NAMES=*-m.js,bad_lib.php
  - PHPUNIT_IGNORE_PATHS=$IGNORE_PATHS,cli
 matrix:
  - DB=pgsql
  - DB=mysqli

In the above example, we are adding the cli path to our ignore paths for the PHPUnit command (this is also how you can ignore files for code coverage). Please note that this is a complete override and there is no merging with IGNORE_PATHS and IGNORE_NAMES. So, in the above, the PHPUnit command would not ignore the file names defined in IGNORE_NAMES.

See also