https://wiki.mahara.org/api.php?action=feedcontributions&user=Robertl&feedformat=atomMahara Wiki - User contributions [en-gb]2024-03-19T05:13:14ZUser contributionsMediaWiki 1.35.10https://wiki.mahara.org/index.php?title=Developer_Area/Developer_Environment&diff=13913Developer Area/Developer Environment2023-11-30T00:06:48Z<p>Robertl: /* Node */</p>
<hr />
<div>{{:Developer_Area/tabs}} <!-- to add further tabs, update the following page https://wiki.mahara.org/wiki/Developer_Area/tabs ... this will automatically cascade the changes to all relevant pages --><br />
<br />
<div style="float:right">__TOC__</div><br />
<br />
🚧 Note: this wiki is in the process of migrating to our GitLab Wiki.<br />
<br />
This page explains how to set up a copy of Mahara for development purposes.<br />
<br />
==The Docker version==<br />
<br />
Included in the main codebase is a docker version of Mahara with Behat capabilities. Before you try this, you will need to have Docker installed.<br />
See: https://docs.docker.com/engine/install/ubuntu/<br />
<br />
The instructions for running the docker version are here:<br><br />
https://git.mahara.org/mahara/mahara/-/blob/main/docker/README.md<br />
<br />
Please feel free to update if there are missing instructions that would be helpful to others.<br />
<br />
==The short version==<br />
<br />
Mahara is a fairly standard PHP web application. You mainly need to place it in your web server and give it a database, and a file storage directory. If you haven't set up a PHP web application before, skip to [[the long version]] down below.<br />
<br />
#Set up your Apache web server. For development purposes, it is often handy to have the web root sitting inside your home directory.<br />
#Retrieve a copy of the Mahara codebase. Place it in your Apache web root.<br />
#Create a Mahara <code>dataroot</code> directory '''outside''' your web root. Make it read/writeable by Apache.<br />
#Create a database instance and database user for Mahara to use.<br />
#Edit the Mahara <code>config.php</code> file so that Mahara knows the location of its <code>dataroot</code> directory, and its database login credentials.<br />
#Run the Mahara installer by visiting your Mahara site in your web browser. If you are missing any required PHP modules, Mahara should tell you. Depending on what you have already installed, you may need one or more of these:<br />
##<syntaxhighlight lang="text" inline="">php-pgsql</syntaxhighlight><br />
##<syntaxhighlight lang="text" inline="">php-gd</syntaxhighlight><br />
##<syntaxhighlight lang="text" inline="">php-curl</syntaxhighlight><br />
##<syntaxhighlight lang="text" inline="">php-intl</syntaxhighlight><br />
##<syntaxhighlight lang="text" inline="">php-json</syntaxhighlight><br />
##<syntaxhighlight lang="text" inline="">php-zip</syntaxhighlight><br />
#If you are using MySQL instead of Postgres<br />
##<syntaxhighlight lang="text" inline="">php7.4-mysql</syntaxhighlight> or<br />
##<syntaxhighlight lang="text" inline="">php-mysql</syntaxhighlight><br />
<br />
==The long version (for Windows)==<br />
<br />
If you want to install your developer environment on Windows, please [[Developer_Area/Developer_Environment_(Windows) | check the Windows instructions]].<br />
<br />
==The long version (for Linux)==<br />
<br />
The instructions explain one way to set up an installation of Mahara for development purposes. These instructions are specifically for Ubuntu Linux, although the process will probably be quite similar in other Linux versions.<br />
<br />
Note: Please have an apache2 installed on your server<br />
<syntaxhighlight lang="bash"><br />
sudo apt install apache2<br />
</syntaxhighlight><br />
<br />
'''The following instructions are for Ubuntu 22.10 and above, unless otherwise noted.'''<br />
<br />
=== Install required packages: ===<br />
<br />
==== PHP 7.4 ====<br />
<syntaxhighlight lang="bash"><br />
sudo apt install \<br />
make curl wget xvfb git gitk postgresql php7.4-common php-cli libapache2-mod-php7.4 \<br />
php7.4-curl php7.4-gd php-json php-ldap php-pgsql php-xmlrpc php-zip php-xml php-mbstring \<br />
nodejs php7.4-pgsql php7.4-xml php7.4-xmlrpc php7.4-mbstring php7.4-intl libssl-dev pdo_sqlite php7.4-zip <br />
<br />
# Set 7.4 as apache2's version of php<br />
sudo a2enmod php7.4<br />
</syntaxhighlight><br />
<br />
==== PHP 8.1 ====<br />
<syntaxhighlight lang="bash"><br />
sudo apt install \<br />
make curl wget xvfb git gitk postgresql php8.1-common php-cli libapache2-mod-php8.1 \<br />
php8.1-curl php8.1-gd php-json php-ldap php-pgsql php-xmlrpc php-zip php-xml php-mbstring \<br />
nodejs php8.1-pgsql php8.1-xml php8.1-xmlrpc php8.1-mbstring php8.1-intl libssl-dev pdo_sqlite php8.1-zip<br />
<br />
# Set 8.1 as apache2's version of php<br />
sudo a2enmod php8.1<br />
</syntaxhighlight>If you encounter any errors with the installation, you may want to try installing in chunks. See the [https://wiki.mahara.org/wiki/Developer_Area/Developer_Environment?section=8#Trouble-shooting Troubleshooting] section.<br />
<br />
==== To switch between PHP versions ====<br />
<code>sudo a2dismod php7.4</code><br />
<br />
<code>sudo a2enmod php8.1</code><br />
<br />
<code>sudo update-alternatives --config php</code><br />
<br />
<code>sudo service apache2 restart</code><br />
<br />
==== Node ====<br />
Check which version of Node you are running with <syntaxhighlight lang="bash" inline="">node -v</syntaxhighlight> To install: <code>sudo apt install nodejs</code><br />
<br />
=== Get a copy of the codebase ===<br />
Get a copy of the Mahara code from git. We'll put it under your home directory, in a new directory called <code>code</code>: See also [[Developer_Area/Getting_Code_from_Git|Getting Code from Git]]<br />
<br />
<syntaxhighlight lang="bash"><br />
cd ~<br />
mkdir code<br />
cd code<br />
<br />
# if you have an account on git.mahara.org ...<br />
git clone git@git.mahara.org:mahara/mahara.git<br />
<br />
# else, use http...<br />
git clone https://git.mahara.org/mahara/mahara.git<br />
<br />
# if that doesn't work, try...<br />
git clone https://github.com/MaharaProject/mahara.git<br />
<br />
<br />
</syntaxhighlight><br />
<br />
==== Fix permissions ====<br />
Give the Apache web server access to your Mahara code directory:<syntaxhighlight lang="bash"><br />
# Give all users read access + executable (if required) to the mahara directory<br />
sudo chmod a+rX ~/code/mahara<br />
<br />
# To avoid a possible 403 error later, confirm that your code directory permissions are also drwxr-xr-x<br />
ls -la ~/<br />
<br />
# To fix, run:<br />
sudo chmod a+rX ~/code<br />
<br />
# Your home directory permissions should be drwx--x--x<br />
ls -la /home # to check<br />
<br />
# To fix, run:<br />
sudo chmod a+X /home/[name of your home directory]<br />
</syntaxhighlight><br />
<br />
=== Create a Mahara database ===<br />
<br />
==== Create a PostgreSQL database user ====<br />
<syntaxhighlight lang="bash"><br />
# Use maharapassword as the password<br />
sudo -u postgres createuser -P -D -R -S maharauser<br />
</syntaxhighlight><br />
<br />
If Postgres is not available, check its status and if it says that it's inactive, start the service:<br />
<br />
<syntaxhighlight lang="bash"><br />
# Check status<br />
service postgresql status<br />
# Restart service<br />
sudo service postgresql start<br />
</syntaxhighlight><br />
<br />
==== Create a database ====<br />
<syntaxhighlight lang="bash"><br />
sudo -u postgres createdb -Omaharauser mahara-main<br />
</syntaxhighlight><br />
<br />
'''5.''' Using a text editor, copy these contents into a file and save it to <syntaxhighlight lang="text" inline="">~/code/mahara/htdocs/config.php</syntaxhighlight>:<br />
<br />
<syntaxhighlight lang="php"><br />
<?php<br />
$cfg = new stdClass();<br />
<br />
$branch = 'main';<br />
<br />
// database connection details<br />
// valid values for dbtype are 'postgres8' and 'mysql5'<br />
$cfg->dbtype = 'postgres';<br />
$cfg->dbhost = 'localhost';<br />
$cfg->dbuser = 'maharauser';<br />
$cfg->dbname = "mahara-$branch";<br />
$cfg->dbpass = 'maharapassword'; <br />
<br />
$cfg->dataroot = "/var/lib/maharadata/$branch";<br />
<br />
$cfg->sendemail = true;<br />
$cfg->sendallemailto = '<your email address>';<br />
<br />
$cfg->productionmode = false;<br />
$cfg->perftofoot = true;<br />
</syntaxhighlight><br />
<br />
Make sure to replace <syntaxhighlight lang="text" inline=""><your email address></syntaxhighlight> with your email address.<br />
<br />
If you're mainly testing, and you don't find the stack traces in these screen messages particularly useful, adding <syntaxhighlight lang="text" inline="">$cfg->log_backtrace_levels = LOG_LEVEL_ENVIRON;</syntaxhighlight> to config.php will display important warning messages on a single line, without stack traces.<br />
<br />
=== Set up <code>dataroot</code>, host, and site ===<br />
<br />
==== Create a <code>dataroot</code> directory ====<br />
This is where Mahara stores uploaded files):<syntaxhighlight lang="bash"><br />
sudo mkdir /var/lib/maharadata<br />
sudo mkdir /var/lib/maharadata/main<br />
sudo chown www-data:www-data /var/lib/maharadata/main<br />
</syntaxhighlight><br />
<br />
==== Set up local domain ====<br />
Set up a new local domain name <code>mahara</code> for your Mahara site, in <code>/etc/hosts:</code><syntaxhighlight lang="bash"><br />
sudo sh -c "echo '127.0.0.1 mahara' >> /etc/hosts"<br />
</syntaxhighlight><br />
<br />
==== Increase your PHP <code>post_max_size</code> ====<br />
These files will be under the version of php you are using, e.g. /etc/php/<PHP version>:<syntaxhighlight lang="bash"><br />
# for PHP 7.4<br />
sudo sh -c "echo 'post_max_size = 37M' >> /etc/php/7.4/cli/php.ini"<br />
sudo sh -c "echo 'upload_max_filesize = 32M' >> /etc/php/7.4/cli/php.ini"<br />
sudo sh -c "echo 'post_max_size = 37M' >> /etc/php/7.4/apache2/php.ini"<br />
sudo sh -c "echo 'upload_max_filesize = 32M' >> /etc/php/7.4/apache2/php.ini"<br />
<br />
# for PHP 8.1<br />
sudo sh -c "echo 'post_max_size = 37M' >> /etc/php/8.1/cli/php.ini"<br />
sudo sh -c "echo 'upload_max_filesize = 32M' >> /etc/php/8.1/cli/php.ini"<br />
sudo sh -c "echo 'post_max_size = 37M' >> /etc/php/8.1/apache2/php.ini"<br />
sudo sh -c "echo 'upload_max_filesize = 32M' >> /etc/php/8.1/apache2/php.ini"<br />
</syntaxhighlight><br />
<br />
Note: The 'post_max_size' is slightly bigger, as a POST command also contains some wrapper information. That wrapper is just text strings and relates to how much the form submits. So usually, 1 MB should be enough, but to be on the safe side, 5 MB would be better, which then also works for larger uploads.<br />
<br />
==== Create an Apache config file ====<br />
You can do this by first copying the following contents into a file called <code>mahara.conf</code>, saved in your home directory.<br />
<br />
See also: [[Developer_Area/Changing_Hostnames|Changing Hostnames]]<br />
<br />
<syntaxhighlight lang="apache"><br />
<VirtualHost *:80><br />
ServerName mahara<br />
DocumentRoot /home/<your username>/code/mahara/htdocs<br />
<br />
<Directory /home/<your username>/code><br />
Options Indexes FollowSymLinks MultiViews<br />
Require all granted<br />
</Directory><br />
<br />
ErrorLog /var/log/apache2/error.log<br />
LogLevel info<br />
<br />
CustomLog /var/log/apache2/access.log combined<br />
DirectoryIndex index.php index.html<br />
</VirtualHost><br />
</syntaxhighlight><br />
<br />
Then copy the file into your Apache sites-enable directory. The name to give the file will also vary depending on what version of Ubuntu you are using.<br />
<br />
<syntaxhighlight lang="text" inline="">sudo cp ~/mahara.conf /etc/apache2/sites-available/mahara.conf</syntaxhighlight><br />
<br />
==== Enable the site in Apache ====<br />
<syntaxhighlight lang="bash"><br />
sudo a2ensite mahara<br />
sudo apache2ctl configtest<br />
sudo apache2ctl graceful<br />
</syntaxhighlight><br />
<br />
<code>composer update && make initcomposerdev</code><br />
<br />
=== Set up <code>cron</code>: ===<br />
<syntaxhighlight lang="bash"><br />
# To get cron emails every minute:<br />
sudo vim /etc/cron.d/mahara<br />
* * * * * www-data /usr/bin/php /home/<your username>/code/mahara/htdocs/lib/cron.php<br />
<br />
# Otherwise:<br />
sudo vim /etc/cron.d/mahara<br />
* * * * * www-data /usr/bin/php /home/<your username>/code/mahara/htdocs/lib/cron.php >/dev/null 2>&1<br />
</syntaxhighlight><br />
<br />
=== Set up <code>npm</code> and <code>gulp</code> for theming ===<br />
The main Mahara git repository includes SCSS files that compile into CSS files, instead of including CSS files directly. We compile these using a Gulp (NodeJS) script that's included with the code. This can easily be invoked via our Makefile by doing "<code>make css</code>, but it requires setting up a couple of additional items first.<br />
<br />
<syntaxhighlight lang="bash"><br />
# First you'll need to run "npm install" from within the Mahara code directory<br />
# to get npm to properly set up all the proper caches and such.<br />
<br />
cd /home/<your username>/code/mahara<br />
npm install<br />
<br />
# Once that's finished, you'll need to install the npm "gulp" package using the "-g" <br />
# (global) flag, so that "gulp" can be run as a CLI command. This requires using sudo.<br />
<br />
cd /home/<your username>/code/mahara<br />
sudo npm install -g gulp<br />
<br />
# Mahara runs with at least version 14.x of node.<br />
<br />
sudo npm cache clean -f<br />
sudo npm install -g n <br />
sudo nvm use stable<br />
<br />
<br />
# Then update node-sass bindings:<br />
<br />
sudo npm rebuild node-sass<br />
</syntaxhighlight><br />
<br />
==== Build the themes (CSS) ====<br />
Run <code>make css</code> in the Mahara code directory to compile the CSS for Mahara themes. This will run the necessary series of instructions written out in the Makefile (including <code>npm install</code> for both the development and production JS libraries.<br />
<br />
<syntaxhighlight lang="bash"><br />
cd /home/<your username>/code/mahara<br />
make css<br />
<br />
# If you see a lot of errors, such as depreciation warnings for .css files:<br />
# Delete your /home/<your username>/code/mahara/package-lock.json<br />
# Then re-run "nvm install" and "make css", which should resolve the issues.<br />
<br />
# If you run 'make css' and see the following "ERROR: Can't find the "nvm" executable ..." try the following:<br />
<br />
# Steps (for me) to get nvm working<br />
<br />
## First Install nvm<br />
<br />
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash<br />
<br />
## Then make the .nvm.sh executable<br />
<br />
cd ~/.nvm && chmod 755 nvm.sh<br />
<br />
## Then reload your .bashrc file<br />
<br />
source ~/.bashrc<br />
<br />
## The set the first nvm version manually to create a default<br />
<br />
./nvm.sh && nvm install 12<br />
<br />
</syntaxhighlight><br />
<br />
==== Build the CSS in non-production mode ====<br />
Sometimes it gets confusing where the SASS info comes from to compile the css files. To make things easier, you can edit the 'Makefile' and change the production mode to false.<br />
<br />
<code>production = false</code><br />
<br />
Then run the <code>make css</code> again - this will compile the theming files to create <code>*.css</code> files in an easier to read format with comments about which sass file contributed to the chuck of CSS code, e.g.:<br />
<br />
<syntaxhighlight lang="css"><br />
/* line 27, /home/robertl/code/mahara-devel/mahara/htdocs/theme/raw/sass/layout/_footer.scss */<br />
.admin .footer .footer-inner {<br />
padding: 10px; }<br />
/* line 36, /home/robertl/code/mahara-devel/mahara/htdocs/theme/default/sass/layout/_footer.scss */<br />
.admin .footer .footer-inner {<br />
padding: 20px 10px;<br />
background: none;<br />
border: 0;<br />
border-radius: 0; }<br />
</syntaxhighlight><br />
<br />
=== Go to the site in your browser ===<br />
[http://mahara/ https://mahara/]<br />
<br />
You should see the Mahara installer page. If you do, congratulations! Your development environment is now set up.<br />
<br />
==Trouble-shooting==<br />
<br />
=== Checking what version of PHP is running on your site ===<br />
The PHP version on the CLI can be different to what is running on the site, especially if you run php-fpm which allows having two PHP servers of different serving different PHP versions.<br />
<br />
To check the PHP version your site is serving, create the file <code>/htdocs/test.php</code> and populate it with following lines.<syntaxhighlight lang="php"><br />
<?php<br />
phpinfo();<br />
<br />
// In your browser go to <your wwwroot>/test.php<br />
</syntaxhighlight><br />
<br />
=== Ubuntu 22.04 & PHP 8.x ===<br />
By default Ubuntu 22.04 will have PHP 8.2 enabled<br />
<br />
To run commands on a different PHP version (e.g. 8.x) run: <code>sudo update-alternatives --set php /usr/bin/php8.x</code><br />
<br />
Run <code>composer update && make initcomposerdev</code> so the composer.lock file matches your PHP version.<br />
===Enabling apache2's version of PHP===<br />
<br />
When you do:<br />
<syntaxhighlight lang="bash"><br />
# for PHP 7.4<br />
sudo a2enmod php7.4<br />
# for PHP 8.1<br />
sudo a2enmod php8.1<br />
<br />
</syntaxhighlight><br />
===Using MySql8===<br />
<br />
If you are going to be using '''MySql 8''' or later, you will need to do the following:<br />
<br />
*To install MySql 8 on Ubuntu 16.04 see https://www.digitalocean.com/community/tutorials/how-to-install-the-latest-mysql-on-ubuntu-16-04<br />
<br />
We need to add a line to our mysql conf file so that we can log in with older format passwords, so edit:<br />
<syntaxhighlight lang="bash"><br />
vi /etc/mysql/mysql.conf.d/mysqld.cnf<br />
</syntaxhighlight><br />
And make sure we have<br />
<syntaxhighlight lang="bash"><br />
[mysqld]<br />
default_authentication_plugin=mysql_native_password<br />
</syntaxhighlight><br />
<br />
You will need to set the db user to use the native password<br />
<br />
CREATE USER 'maharauser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mahara';<br />
<br />
=====MySQL in Docker=====<br />
If you have Docker available you can [[System Administrator's Guide/Installing Mahara/MySQL and Docker|spin it up a dedicated container for it]].<br />
<br />
===Installing Node versions===<br />
<br />
Check which version of Node you are running with<br />
<syntaxhighlight lang="bash"><br />
node -v<br />
</syntaxhighlight><br />
If you are running one of the long term service (lts) versions, 8.x or 10.x, that should work with Mahara fine. If you are running a higher version, or Node is not installed, you will need to add a version to run with Mahara.<br />
<br />
You can find various instructions on how to upgrade NodeJS on your distribution depending on your preference on package manager. (There are a couple of links at the bottom of this section.)<br />
<br />
A straight-forward way to manage multiple versions of Node is to use NVM:<br />
<br />
*[https://github.com/creationix/nvm#install-script/ How to install NVM]<br />
<br />
Once you have it installed run:<br />
<syntaxhighlight lang="bash"><br />
nvm install --lts<br />
nvm use --lts<br />
</syntaxhighlight><br />
This will download the latest lts version of Node and set it to default. Then if you need to switch versions for other projects, you can do so with "nvm use <version>".<br />
<br />
Links to alternative ways of installing Node:<br />
<br />
*[https://nodejs.org/en/download/package-manager/ Installing Node.js via package manager]<br />
*[https://tecadmin.net/install-latest-nodejs-npm-on-ubuntu/ How to Install Latest Nodejs & Npm on Ubuntu 16.04 & 14.04]<br />
ts-php versions - also add set alternatives here<br />
Note on changing versions: you can see which version apache is using by adding phpinfo() in your code.<br />
<br />
==Adding another branch==<br />
<br />
'''1.''' Create a new local branch for it in git (replace '''1.10 / 110''' with the version of Mahara for which you want to add a branch)<br />
<syntaxhighlight lang="bash"><br />
$ cd ~/code/mahara<br />
$ git checkout -t origin/1.10_STABLE<br />
</syntaxhighlight><br />
<br />
'''2.''' Create the sitedata directory for the new branch:<br />
<syntaxhighlight lang="bash"><br />
$ sudo mkdir /var/lib/maharadata/110stable<br />
$ sudo chown www-data:www-data /var/lib/maharadata/110stable<br />
</syntaxhighlight><br />
<br />
'''3.''' Create a database:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres createdb -Omaharauser mahara-110stable<br />
</syntaxhighlight><br />
<br />
'''4.''' Change your ~/code/mahara/htdocs/config.php to point to the 1.10 branch:<br />
<syntaxhighlight lang="php"><br />
$branch = '110stable';<br />
</syntaxhighlight><br />
<br />
'''5.''' Go to the site in your browser to run the Mahara installer:<br />
<br />
http://mahara/<br />
<br />
==Switching back to the main branch==<br />
<br />
'''1.''' Change the config.php file:<br />
<syntaxhighlight lang="php"><br />
$branch = 'main';<br />
</syntaxhighlight><br />
<br />
'''2.''' Switch to the right git branch:<br />
<syntaxhighlight lang="bash"><br />
$ cd ~/code/mahara/<br />
$ git checkout main<br />
</syntaxhighlight><br />
<br />
&nbsp;<br />
==Reset the database==<br />
<br />
'''1.''' Delete the old database:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres dropdb mahara-main<br />
</syntaxhighlight><br />
<br />
'''2.''' Create a new one with the same name:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres createdb -Omaharauser mahara-main<br />
</syntaxhighlight><br />
<br />
'''3.''' Go to the site in your browser to run the Mahara installer again:<br />
<br />
http://mahara/<br />
<br />
If you reset the database a lot, you might want to try out the "maharawipe.sh" utility at https://github.com/agwells/mahara-devtools<br />
<br />
==Testing a change submitted to Gerrit==<br />
<br />
'''1.''' Go to the change page, for example:<br />
<syntaxhighlight lang="bash"><br />
https://reviews.mahara.org/#change,230<br />
</syntaxhighlight><br />
<br />
'''2.''' In your local repository, switch to the branch listed in the Gerrit change (in this case: main):<br />
<syntaxhighlight lang="bash"><br />
$ cd ~/code/mahara<br />
$ git checkout main<br />
</syntaxhighlight><br />
<br />
'''3.''' Update your config.php to use the right branch, too.<br />
<br />
'''4.''' Copy the "Anonymous Git" URL in the "Download" section of "Patch Set X" and run it in ~/code/mahara to check the branch out, for example:<br />
<syntaxhighlight lang="bash"><br />
$ git fetch git://reviews.mahara.org/git/mahara refs/changes/30/230/1 && git checkout FETCH_HEAD<br />
$ make css<br />
</syntaxhighlight><br />
<br />
'''5.''' After finishing the testing, go back to main:<br />
<syntaxhighlight lang="bash"><br />
$ git checkout main<br />
$ make css<br />
</syntaxhighlight><br />
<br />
&nbsp;<br />
<br />
==Submitting a change to Gerrit==<br />
<br />
If you want to contribute a patch to the Mahara project yourself, please check out the wiki page on [[Developer_Area/Contributing_Code | contributing code]]. There is also a [[Developer_Area/Contributing_Code/Troubleshooting_your_Gerrit_connection | troubleshooting page]] in case you run into issues pushing code to Gerrit.<br />
<br />
&nbsp;<br />
==Copying a local install to another==<br />
<br />
This example uses the directory 15stable as an example for the new install and the 14stable install as database and sitedata directory to copy.<br />
<br />
'''1.''' Do a checkout of the code into a new directory:<br />
<syntaxhighlight lang="bash"><br />
$ cd ~<br />
$ mkdir code<br />
$ cd code<br />
$ git clone git@git.mahara.org:mahara/mahara.git 15stable<br />
</syntaxhighlight><br />
<br />
'''2.''' Copy the database:<br />
<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres pg_dump -Fc mahara-14stable > 14stable.pg<br />
$ sudo -u postgres createdb -Omaharauser mahara-15stable<br />
$ sudo -u postgres pg_restore -O -j4 -d mahara-15stable -U maharauser -W -h localhost 14stable.pg<br />
</syntaxhighlight><br />
<br />
If you've not given the user 'maharauser' full privileges yet (should only need to do this once)<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON SCHEMA public TO maharauser;'<br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO maharauser;'<br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO maharauser;'<br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO maharauser;'<br />
</syntaxhighlight><br />
<br />
'''3.''' Change the wwwroot in the new database:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres psql mahara-15stable<br />
delete from config where field = 'wwwroot';<br />
Ctrl + d to exit<br />
</syntaxhighlight><br />
<br />
'''4.''' Create the config file ~/code/mahara/htdocs/config.php:<br />
<syntaxhighlight lang="php"><br />
<?php<br />
$cfg = new StdClass;<br />
<br />
$branch = '15stable';<br />
<br />
// database connection details<br />
// valid values for dbtype are 'postgres8' and 'mysql5'<br />
$cfg->dbtype = 'postgres8';<br />
$cfg->dbhost = 'localhost';<br />
$cfg->dbuser = 'maharauser';<br />
$cfg->dbname = "mahara-$branch";<br />
$cfg->dbpass = 'mahara'; <br />
$cfg->dbprefix = '''''''; <br />
<br />
$cfg->dataroot = "/var/lib/maharadata/$branch";<br />
<br />
$cfg->sendemail = true;<br />
$cfg->sendallemailto = 'your email address';<br />
<br />
$cfg->log_dbg_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->log_info_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->log_warn_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->log_environ_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->perftofoot = true;<br />
</syntaxhighlight> <br />
<br />
'''5.''' Copy the source sitedata directory into the new sitedata folder:<br />
<syntaxhighlight lang="bash"><br />
$ sudo cp -r /var/lib/maharadata/14stable/ /var/lib/maharadata/15stable<br />
$ sudo chown -R www-data:www-data /var/lib/maharadata/15stable<br />
</syntaxhighlight><br />
<br />
'''6.''' Add a new entry to /etc/hosts:<br />
<syntaxhighlight lang="bash"><br />
127.0.0.1 15stable<br />
</syntaxhighlight><br />
<br />
'''7.''' Create a new Apache vhost file in /etc/apache2/sites-available/15stable.conf:<br />
<syntaxhighlight lang="apacheconf"><br />
<VirtualHost *:80><br />
ServerName 15stable<br />
DocumentRoot /home/<your username>/code/15stable/htdocs<br />
<br />
<Directory /home/<your username>/code><br />
Options Indexes FollowSymLinks MultiViews<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
<br />
ErrorLog /var/log/apache2/error.log<br />
LogLevel info<br />
<br />
CustomLog /var/log/apache2/access.log combined<br />
DirectoryIndex index.php index.html<br />
</VirtualHost><br />
</syntaxhighlight><br />
<br />
'''8.''' Enable the site in Apache:<br />
<syntaxhighlight lang="bash"><br />
$ sudo a2ensite 15stable<br />
$ sudo apache2ctl configtest<br />
$ sudo apache2ctl graceful<br />
</syntaxhighlight><br />
<br />
'''9.''' Go to the site in your browser to run the Mahara installer:<br />
<syntaxhighlight lang="bash"><br />
http://15stable/<br />
</syntaxhighlight><br />
<br />
'''10.''' Resetting the admin password:<br />
<br />
If you do not know the login info for the copied site's database or the new site uses a different 'passwordsaltmain' from the old one you can reset a users password via the CLI script "reset_password.php", for example if you need to reset the 'admin' user's password you can go:<br />
<br />
sudo -u www-data php htdocs/admin/cli/reset_password.php -u=admin -p=changeme<br />
<br />
This will reset the password and on next login you will be prompted to change the password again to something more robust.<br />
<br />
&nbsp;<br />
<br />
==Elasticsearch==<br />
<br />
If you want to test the Elasticsearch search plugin, you'll also need to set up and run an Elasticsearch server. See [[Developer Area/Setting up Elasticsearch]].<br />
&nbsp;<br />
==ClamAV==<br />
If you want to test the ClamAV virus protection see [[Developer Area/Setting up ClamAV|Setting up ClamAV]]<br />
<br />
&nbsp;<br />
==Set up site for local https://==<br />
<br />
You will need to set up your Mahara developer site with an SSL certificate if you want to use the web services functionality as that is only available over https.<br />
<br />
You should already have Apache 2 installed on your computer. Otherwise, Mahara wouldn't run. Install the openssl and ssl-cert packages:<br />
<br />
<syntaxhighlight lang="bash"><br />
$ sudo apt-get install openssl ssl-cert<br />
</syntaxhighlight><br />
<br />
'''1.''' Enable SSL in Apache 2:<br />
<syntaxhighlight lang="bash"><br />
$ cd /etc/apache2/mods-enabled/<br />
$ ls<br />
$ sudo a2enmod ssl<br />
$ service apache2 restart<br />
$ ls<br />
</syntaxhighlight><br />
<br />
You should see "ssl.conf" and "ssl.load"<br />
<br />
'''2.''' You'll need to check that the port for SSL traffic is configured.<br />
<syntaxhighlight lang="bash"><br />
$ cd ..<br />
$ cat ports.conf<br />
</syntaxhighlight><br />
<br />
If you see '''<IfModule ssl_module> Listen 443''', you are good to go.<br />
<br />
'''3.''' Enable SSL also in your Mahara Apache 2 config file.<br />
<syntaxhighlight lang="bash"><br />
$ vim sites-available/mahara.conf (or the name of your config file of the site for which you want to enable SSL)<br />
</syntaxhighlight><br />
<br />
Paste the following into the .conf file after the </VirtualHost> for port 80. The last re-write rules are only necessary if you use the "Clean URL" functionality.<br />
<syntaxhighlight lang="apache"><br />
<IfModule mod_ssl.c><br />
<VirtualHost *:443><br />
ServerName mahara<br />
<br />
DocumentRoot /home/'''<your username>'''/code/mahara/htdocs<br />
<Directory /home/'''<your username>'''/code><br />
Options Indexes FollowSymLinks MultiViews<br />
AllowOverride None<br />
Require all granted<br />
</Directory><br />
<br />
ErrorLog /var/log/apache2/mahara-ssl-error.log<br />
LogLevel info<br />
<br />
CustomLog /var/log/apache2/mahara-ssl-access.log combined<br />
<br />
# SSL Engine Switch:<br />
# Enable/Disable SSL for this virtual host.<br />
SSLEngine on<br />
<br />
# A self-signed (snakeoil) certificate can be created by installing<br />
# the ssl-cert package. See<br />
# /usr/share/doc/apache2.2-common/README.Debian.gz for more info.<br />
# If both key and certificate are stored in the same file, only the<br />
# SSLCertificateFile directive is needed.<br />
SSLCertificateFile /etc/apache2/ssl/apache.pem<br />
SSLCertificateKeyFile /etc/apache2/ssl/apache.key<br />
<br />
# Server Certificate Chain:<br />
# Point SSLCertificateChainFile at a file containing the<br />
# concatenation of PEM encoded CA certificates which form the<br />
# certificate chain for the server certificate. Alternatively<br />
# the referenced file can be the same as SSLCertificateFile<br />
# when the CA certificates are directly appended to the server<br />
# certificate for convinience.<br />
#SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt<br />
<br />
# Certificate Authority (CA):<br />
# Set the CA certificate verification path where to find CA<br />
# certificates for client authentication or alternatively one<br />
# huge file containing all of them (file must be PEM encoded)<br />
# Note: Inside SSLCACertificatePath you need hash symlinks<br />
# to point to the certificate files. Use the provided<br />
# Makefile to update the hash symlinks after changes.<br />
#SSLCACertificatePath /etc/ssl/certs/<br />
#SSLCACertificateFile /etc/apache2/ssl.crt/ca-bundle.crt<br />
# Certificate Revocation Lists (CRL):<br />
# Set the CA revocation path where to find CA CRLs for client<br />
# authentication or alternatively one huge file containing all<br />
# of them (file must be PEM encoded)<br />
# Note: Inside SSLCARevocationPath you need hash symlinks<br />
# to point to the certificate files. Use the provided<br />
# Makefile to update the hash symlinks after changes.<br />
#SSLCARevocationPath /etc/apache2/ssl.crl/<br />
#SSLCARevocationFile /etc/apache2/ssl.crl/ca-bundle.crl<br />
<br />
# Client Authentication (Type):<br />
# Client certificate verification type and depth. Types are<br />
# none, optional, require and optional_no_ca. Depth is a<br />
# number which specifies how deeply to verify the certificate<br />
# issuer chain before deciding the certificate is not valid.<br />
#SSLVerifyClient require<br />
#SSLVerifyDepth 10<br />
<br />
# Access Control:<br />
# With SSLRequire you can do per-directory access control based<br />
# on arbitrary complex boolean expressions containing server<br />
# variable checks and other lookup directives. The syntax is a<br />
# mixture between C and Perl. See the mod_ssl documentation<br />
# for more details.<br />
#<Location /><br />
#SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \<br />
# and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \<br />
# and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \<br />
# and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \<br />
# and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20 ) \<br />
# or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/<br />
#</Location><br />
<br />
# SSL Engine Options:<br />
# Set various options for the SSL engine.<br />
# o FakeBasicAuth:<br />
# Translate the client X.509 into a Basic Authorisation. This means that<br />
# the standard Auth/DBMAuth methods can be used for access control. The<br />
# user name is the `one line' version of the client's X.509 certificate.<br />
# Note that no password is obtained from the user. Every entry in the user<br />
# file needs this password: `xxj31ZMTZzkVA'.<br />
# o ExportCertData:<br />
# This exports two additional environment variables: SSL_CLIENT_CERT and<br />
# SSL_SERVER_CERT. These contain the PEM-encoded certificates of the<br />
# server (always existing) and the client (only existing when client<br />
# authentication is used). This can be used to import the certificates<br />
# into CGI scripts.<br />
# o StdEnvVars:<br />
# This exports the standard SSL/TLS related `SSL_*' environment variables.<br />
# Per default this exportation is switched off for performance reasons,<br />
# because the extraction step is an expensive operation and is usually<br />
# useless for serving static content. So one usually enables the<br />
# exportation for CGI and SSI requests only.<br />
# o StrictRequire:<br />
# This denies access when "SSLRequireSSL" or "SSLRequire" applied even<br />
# under a "Satisfy any" situation, i.e. when it applies access is denied<br />
# and no other module can change it.<br />
# o OptRenegotiate:<br />
# This enables optimized SSL connection renegotiation handling when SSL<br />
# directives are used in per-directory context.<br />
#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire<br />
<FilesMatch "\.(cgi|shtml|phtml|php)$"><br />
SSLOptions +StdEnvVars<br />
</FilesMatch><br />
<br />
# SSL Protocol Adjustments:<br />
# The safe and default but still SSL/TLS standard compliant shutdown<br />
# approach is that mod_ssl sends the close notify alert but doesn't wait for<br />
# the close notify alert from client. When you need a different shutdown<br />
# approach you can use one of the following variables:<br />
# o ssl-unclean-shutdown:<br />
# This forces an unclean shutdown when the connection is closed, i.e. no<br />
# SSL close notify alert is send or allowed to received. This violates<br />
# the SSL/TLS standard but is needed for some brain-dead browsers. Use<br />
# this when you receive I/O errors because of the standard approach where<br />
# mod_ssl sends the close notify alert.<br />
# o ssl-accurate-shutdown:<br />
# This forces an accurate shutdown when the connection is closed, i.e. a<br />
# SSL close notify alert is send and mod_ssl waits for the close notify<br />
# alert of the client. This is 100% SSL/TLS standard compliant, but in<br />
# practice often causes hanging connections with brain-dead browsers. Use<br />
# this only for browsers where you know that their SSL implementation<br />
# works correctly.<br />
# Notice: Most problems of broken clients are also related to the HTTP<br />
# keep-alive facility, so you usually additionally want to disable<br />
# keep-alive for those clients, too. Use variable "nokeepalive" for this.<br />
# Similarly, one has to force some clients to use HTTP/1.0 to workaround<br />
# their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and<br />
# "force-response-1.0" for this.<br />
BrowserMatch "MSIE [2-6]" \<br />
nokeepalive ssl-unclean-shutdown \<br />
downgrade-1.0 force-response-1.0<br />
# MSIE 7 and newer should be able to use keepalive<br />
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown<br />
<br />
<IfModule mod_rewrite.c><br />
RewriteEngine on<br />
RewriteRule ^/user/([a-z0-9-]+)/?$ /user/view.php?profile=$1&%{QUERY_STRING}<br />
RewriteRule ^/user/([a-z0-9-]+)/([a-z0-9-]+)/?$ /view/view.php?profile=$1&page=$2&%{QUERY_STRING}<br />
RewriteRule ^/group/([a-z0-9-]+)/?$ /group/view.php?homepage=$1&%{QUERY_STRING}<br />
RewriteRule ^/group/([a-z0-9-]+)/([a-z0-9-]+)/?$ /view/view.php?homepage=$1&page=$2&%{QUERY_STRING}<br />
</IfModule><br />
</VirtualHost><br />
</IfModule><br />
</syntaxhighlight><br />
<br />
'''4.''' Create the SSL folder in /etc/apache2/ if it doesn't already exist:<br />
<syntaxhighlight lang="bash"><br />
$ sudo mkdir /etc/apache2/ssl<br />
</syntaxhighlight><br />
<br />
'''5.''' Run the following command to set up your local cert and follow the ensuing steps for generating it:<br />
<syntaxhighlight lang="bash"><br />
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.pem<br />
</syntaxhighlight><br />
<br />
When it asks you for the "Common name", you can put your local server's name.<br />
<br />
'''6.''' Restart Apache.<br />
<syntaxhighlight lang="bash"><br />
$ sudo service apache2 restart<br />
</syntaxhighlight><br />
<br />
If you have an error message that pertains to your SSL site, you'll need to fix it first before continuing.<br />
<br />
'''7.''' Test the Apache config:<br />
<syntaxhighlight lang="bash"><br />
$ sudo apache2ctl configtest<br />
</syntaxhighlight><br />
<br />
'''8.''' Delete the old wwwroot as that still points to http://. If you left it, you wouldn't see all assetts.<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres psql mahara-main<br />
delete from config where field = 'wwwroot';<br />
Ctrl + d to exit<br />
</syntaxhighlight><br />
<br />
'''9.''' Go to your Mahara URL and use '''https://'''. Since you created a self-signed cert, your connection will be untrusted. Proceed anyway.<br />
<br />
'''10.''' Now you can use your developer site with web services as well.<br />
<br />
==Set up Behat==<br />
<br />
You can use the automated testing suite from Mahara 15.04 on. There is a [[Testing/Behat_Testing/Setup | separate installation page for Behat]].<br />
<br />
== XDebug ==<br />
<br />
=== VS Codium ===<br />
Install the extension PHP Debug <syntaxhighlight><br />
Name: PHP Debug<br />
Id: xdebug.php-debug<br />
Description: Debug support for PHP with Xdebug<br />
Version: 1.32.0<br />
Publisher: Xdebug<br />
VS Marketplace Link: https://marketplace.visualstudio.com/items?itemName=xdebug.php-debug<br />
</syntaxhighlight>Use the Xdebug wizard to help you with installation https://xdebug.org/wizard<br />
<br />
To use with Behat, make sure in your <code>99-xdebug.ini</code> file<syntaxhighlight lang="ini"><br />
# in /etc/php/8.1/mods-available<br />
zend_extension = xdebug <br />
xdebug.mode = debug<br />
<br />
# This will not work in Behat tests however, triggering it in VS Code will work<br />
xdebug.start_with_request = trigger<br />
# This will work with Behat tests as well as in VS Code - use this one for Behat<br />
# xdebug.start_with_request = yes<br />
<br />
</syntaxhighlight>Remember to restart your PHP server if applicable <code>sudo service php8.x-fpm restart</code></div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Developer_Environment&diff=13912Developer Area/Developer Environment2023-11-30T00:04:49Z<p>Robertl: /* To switch between PHP versions */</p>
<hr />
<div>{{:Developer_Area/tabs}} <!-- to add further tabs, update the following page https://wiki.mahara.org/wiki/Developer_Area/tabs ... this will automatically cascade the changes to all relevant pages --><br />
<br />
<div style="float:right">__TOC__</div><br />
<br />
🚧 Note: this wiki is in the process of migrating to our GitLab Wiki.<br />
<br />
This page explains how to set up a copy of Mahara for development purposes.<br />
<br />
==The Docker version==<br />
<br />
Included in the main codebase is a docker version of Mahara with Behat capabilities. Before you try this, you will need to have Docker installed.<br />
See: https://docs.docker.com/engine/install/ubuntu/<br />
<br />
The instructions for running the docker version are here:<br><br />
https://git.mahara.org/mahara/mahara/-/blob/main/docker/README.md<br />
<br />
Please feel free to update if there are missing instructions that would be helpful to others.<br />
<br />
==The short version==<br />
<br />
Mahara is a fairly standard PHP web application. You mainly need to place it in your web server and give it a database, and a file storage directory. If you haven't set up a PHP web application before, skip to [[the long version]] down below.<br />
<br />
#Set up your Apache web server. For development purposes, it is often handy to have the web root sitting inside your home directory.<br />
#Retrieve a copy of the Mahara codebase. Place it in your Apache web root.<br />
#Create a Mahara <code>dataroot</code> directory '''outside''' your web root. Make it read/writeable by Apache.<br />
#Create a database instance and database user for Mahara to use.<br />
#Edit the Mahara <code>config.php</code> file so that Mahara knows the location of its <code>dataroot</code> directory, and its database login credentials.<br />
#Run the Mahara installer by visiting your Mahara site in your web browser. If you are missing any required PHP modules, Mahara should tell you. Depending on what you have already installed, you may need one or more of these:<br />
##<syntaxhighlight lang="text" inline="">php-pgsql</syntaxhighlight><br />
##<syntaxhighlight lang="text" inline="">php-gd</syntaxhighlight><br />
##<syntaxhighlight lang="text" inline="">php-curl</syntaxhighlight><br />
##<syntaxhighlight lang="text" inline="">php-intl</syntaxhighlight><br />
##<syntaxhighlight lang="text" inline="">php-json</syntaxhighlight><br />
##<syntaxhighlight lang="text" inline="">php-zip</syntaxhighlight><br />
#If you are using MySQL instead of Postgres<br />
##<syntaxhighlight lang="text" inline="">php7.4-mysql</syntaxhighlight> or<br />
##<syntaxhighlight lang="text" inline="">php-mysql</syntaxhighlight><br />
<br />
==The long version (for Windows)==<br />
<br />
If you want to install your developer environment on Windows, please [[Developer_Area/Developer_Environment_(Windows) | check the Windows instructions]].<br />
<br />
==The long version (for Linux)==<br />
<br />
The instructions explain one way to set up an installation of Mahara for development purposes. These instructions are specifically for Ubuntu Linux, although the process will probably be quite similar in other Linux versions.<br />
<br />
Note: Please have an apache2 installed on your server<br />
<syntaxhighlight lang="bash"><br />
sudo apt install apache2<br />
</syntaxhighlight><br />
<br />
'''The following instructions are for Ubuntu 22.10 and above, unless otherwise noted.'''<br />
<br />
=== Install required packages: ===<br />
<br />
==== PHP 7.4 ====<br />
<syntaxhighlight lang="bash"><br />
sudo apt install \<br />
make curl wget xvfb git gitk postgresql php7.4-common php-cli libapache2-mod-php7.4 \<br />
php7.4-curl php7.4-gd php-json php-ldap php-pgsql php-xmlrpc php-zip php-xml php-mbstring \<br />
nodejs php7.4-pgsql php7.4-xml php7.4-xmlrpc php7.4-mbstring php7.4-intl libssl-dev pdo_sqlite php7.4-zip <br />
<br />
# Set 7.4 as apache2's version of php<br />
sudo a2enmod php7.4<br />
</syntaxhighlight><br />
<br />
==== PHP 8.1 ====<br />
<syntaxhighlight lang="bash"><br />
sudo apt install \<br />
make curl wget xvfb git gitk postgresql php8.1-common php-cli libapache2-mod-php8.1 \<br />
php8.1-curl php8.1-gd php-json php-ldap php-pgsql php-xmlrpc php-zip php-xml php-mbstring \<br />
nodejs php8.1-pgsql php8.1-xml php8.1-xmlrpc php8.1-mbstring php8.1-intl libssl-dev pdo_sqlite php8.1-zip<br />
<br />
# Set 8.1 as apache2's version of php<br />
sudo a2enmod php8.1<br />
</syntaxhighlight>If you encounter any errors with the installation, you may want to try installing in chunks. See the [https://wiki.mahara.org/wiki/Developer_Area/Developer_Environment?section=8#Trouble-shooting Troubleshooting] section.<br />
<br />
==== To switch between PHP versions ====<br />
<code>sudo a2dismod php7.4</code><br />
<br />
<code>sudo a2enmod php8.1</code><br />
<br />
<code>sudo update-alternatives --config php</code><br />
<br />
<code>restart apache2</code><br />
<br />
==== Node ====<br />
Check which version of Node you are running with <syntaxhighlight lang="bash" inline="">node -v</syntaxhighlight> To install: <code>sudo apt install nodejs</code><br />
<br />
=== Get a copy of the codebase ===<br />
Get a copy of the Mahara code from git. We'll put it under your home directory, in a new directory called <code>code</code>: See also [[Developer_Area/Getting_Code_from_Git|Getting Code from Git]]<br />
<br />
<syntaxhighlight lang="bash"><br />
cd ~<br />
mkdir code<br />
cd code<br />
<br />
# if you have an account on git.mahara.org ...<br />
git clone git@git.mahara.org:mahara/mahara.git<br />
<br />
# else, use http...<br />
git clone https://git.mahara.org/mahara/mahara.git<br />
<br />
# if that doesn't work, try...<br />
git clone https://github.com/MaharaProject/mahara.git<br />
<br />
<br />
</syntaxhighlight><br />
<br />
==== Fix permissions ====<br />
Give the Apache web server access to your Mahara code directory:<syntaxhighlight lang="bash"><br />
# Give all users read access + executable (if required) to the mahara directory<br />
sudo chmod a+rX ~/code/mahara<br />
<br />
# To avoid a possible 403 error later, confirm that your code directory permissions are also drwxr-xr-x<br />
ls -la ~/<br />
<br />
# To fix, run:<br />
sudo chmod a+rX ~/code<br />
<br />
# Your home directory permissions should be drwx--x--x<br />
ls -la /home # to check<br />
<br />
# To fix, run:<br />
sudo chmod a+X /home/[name of your home directory]<br />
</syntaxhighlight><br />
<br />
=== Create a Mahara database ===<br />
<br />
==== Create a PostgreSQL database user ====<br />
<syntaxhighlight lang="bash"><br />
# Use maharapassword as the password<br />
sudo -u postgres createuser -P -D -R -S maharauser<br />
</syntaxhighlight><br />
<br />
If Postgres is not available, check its status and if it says that it's inactive, start the service:<br />
<br />
<syntaxhighlight lang="bash"><br />
# Check status<br />
service postgresql status<br />
# Restart service<br />
sudo service postgresql start<br />
</syntaxhighlight><br />
<br />
==== Create a database ====<br />
<syntaxhighlight lang="bash"><br />
sudo -u postgres createdb -Omaharauser mahara-main<br />
</syntaxhighlight><br />
<br />
'''5.''' Using a text editor, copy these contents into a file and save it to <syntaxhighlight lang="text" inline="">~/code/mahara/htdocs/config.php</syntaxhighlight>:<br />
<br />
<syntaxhighlight lang="php"><br />
<?php<br />
$cfg = new stdClass();<br />
<br />
$branch = 'main';<br />
<br />
// database connection details<br />
// valid values for dbtype are 'postgres8' and 'mysql5'<br />
$cfg->dbtype = 'postgres';<br />
$cfg->dbhost = 'localhost';<br />
$cfg->dbuser = 'maharauser';<br />
$cfg->dbname = "mahara-$branch";<br />
$cfg->dbpass = 'maharapassword'; <br />
<br />
$cfg->dataroot = "/var/lib/maharadata/$branch";<br />
<br />
$cfg->sendemail = true;<br />
$cfg->sendallemailto = '<your email address>';<br />
<br />
$cfg->productionmode = false;<br />
$cfg->perftofoot = true;<br />
</syntaxhighlight><br />
<br />
Make sure to replace <syntaxhighlight lang="text" inline=""><your email address></syntaxhighlight> with your email address.<br />
<br />
If you're mainly testing, and you don't find the stack traces in these screen messages particularly useful, adding <syntaxhighlight lang="text" inline="">$cfg->log_backtrace_levels = LOG_LEVEL_ENVIRON;</syntaxhighlight> to config.php will display important warning messages on a single line, without stack traces.<br />
<br />
=== Set up <code>dataroot</code>, host, and site ===<br />
<br />
==== Create a <code>dataroot</code> directory ====<br />
This is where Mahara stores uploaded files):<syntaxhighlight lang="bash"><br />
sudo mkdir /var/lib/maharadata<br />
sudo mkdir /var/lib/maharadata/main<br />
sudo chown www-data:www-data /var/lib/maharadata/main<br />
</syntaxhighlight><br />
<br />
==== Set up local domain ====<br />
Set up a new local domain name <code>mahara</code> for your Mahara site, in <code>/etc/hosts:</code><syntaxhighlight lang="bash"><br />
sudo sh -c "echo '127.0.0.1 mahara' >> /etc/hosts"<br />
</syntaxhighlight><br />
<br />
==== Increase your PHP <code>post_max_size</code> ====<br />
These files will be under the version of php you are using, e.g. /etc/php/<PHP version>:<syntaxhighlight lang="bash"><br />
# for PHP 7.4<br />
sudo sh -c "echo 'post_max_size = 37M' >> /etc/php/7.4/cli/php.ini"<br />
sudo sh -c "echo 'upload_max_filesize = 32M' >> /etc/php/7.4/cli/php.ini"<br />
sudo sh -c "echo 'post_max_size = 37M' >> /etc/php/7.4/apache2/php.ini"<br />
sudo sh -c "echo 'upload_max_filesize = 32M' >> /etc/php/7.4/apache2/php.ini"<br />
<br />
# for PHP 8.1<br />
sudo sh -c "echo 'post_max_size = 37M' >> /etc/php/8.1/cli/php.ini"<br />
sudo sh -c "echo 'upload_max_filesize = 32M' >> /etc/php/8.1/cli/php.ini"<br />
sudo sh -c "echo 'post_max_size = 37M' >> /etc/php/8.1/apache2/php.ini"<br />
sudo sh -c "echo 'upload_max_filesize = 32M' >> /etc/php/8.1/apache2/php.ini"<br />
</syntaxhighlight><br />
<br />
Note: The 'post_max_size' is slightly bigger, as a POST command also contains some wrapper information. That wrapper is just text strings and relates to how much the form submits. So usually, 1 MB should be enough, but to be on the safe side, 5 MB would be better, which then also works for larger uploads.<br />
<br />
==== Create an Apache config file ====<br />
You can do this by first copying the following contents into a file called <code>mahara.conf</code>, saved in your home directory.<br />
<br />
See also: [[Developer_Area/Changing_Hostnames|Changing Hostnames]]<br />
<br />
<syntaxhighlight lang="apache"><br />
<VirtualHost *:80><br />
ServerName mahara<br />
DocumentRoot /home/<your username>/code/mahara/htdocs<br />
<br />
<Directory /home/<your username>/code><br />
Options Indexes FollowSymLinks MultiViews<br />
Require all granted<br />
</Directory><br />
<br />
ErrorLog /var/log/apache2/error.log<br />
LogLevel info<br />
<br />
CustomLog /var/log/apache2/access.log combined<br />
DirectoryIndex index.php index.html<br />
</VirtualHost><br />
</syntaxhighlight><br />
<br />
Then copy the file into your Apache sites-enable directory. The name to give the file will also vary depending on what version of Ubuntu you are using.<br />
<br />
<syntaxhighlight lang="text" inline="">sudo cp ~/mahara.conf /etc/apache2/sites-available/mahara.conf</syntaxhighlight><br />
<br />
==== Enable the site in Apache ====<br />
<syntaxhighlight lang="bash"><br />
sudo a2ensite mahara<br />
sudo apache2ctl configtest<br />
sudo apache2ctl graceful<br />
</syntaxhighlight><br />
<br />
<code>composer update && make initcomposerdev</code><br />
<br />
=== Set up <code>cron</code>: ===<br />
<syntaxhighlight lang="bash"><br />
# To get cron emails every minute:<br />
sudo vim /etc/cron.d/mahara<br />
* * * * * www-data /usr/bin/php /home/<your username>/code/mahara/htdocs/lib/cron.php<br />
<br />
# Otherwise:<br />
sudo vim /etc/cron.d/mahara<br />
* * * * * www-data /usr/bin/php /home/<your username>/code/mahara/htdocs/lib/cron.php >/dev/null 2>&1<br />
</syntaxhighlight><br />
<br />
=== Set up <code>npm</code> and <code>gulp</code> for theming ===<br />
The main Mahara git repository includes SCSS files that compile into CSS files, instead of including CSS files directly. We compile these using a Gulp (NodeJS) script that's included with the code. This can easily be invoked via our Makefile by doing "<code>make css</code>, but it requires setting up a couple of additional items first.<br />
<br />
<syntaxhighlight lang="bash"><br />
# First you'll need to run "npm install" from within the Mahara code directory<br />
# to get npm to properly set up all the proper caches and such.<br />
<br />
cd /home/<your username>/code/mahara<br />
npm install<br />
<br />
# Once that's finished, you'll need to install the npm "gulp" package using the "-g" <br />
# (global) flag, so that "gulp" can be run as a CLI command. This requires using sudo.<br />
<br />
cd /home/<your username>/code/mahara<br />
sudo npm install -g gulp<br />
<br />
# Mahara runs with at least version 14.x of node.<br />
<br />
sudo npm cache clean -f<br />
sudo npm install -g n <br />
sudo nvm use stable<br />
<br />
<br />
# Then update node-sass bindings:<br />
<br />
sudo npm rebuild node-sass<br />
</syntaxhighlight><br />
<br />
==== Build the themes (CSS) ====<br />
Run <code>make css</code> in the Mahara code directory to compile the CSS for Mahara themes. This will run the necessary series of instructions written out in the Makefile (including <code>npm install</code> for both the development and production JS libraries.<br />
<br />
<syntaxhighlight lang="bash"><br />
cd /home/<your username>/code/mahara<br />
make css<br />
<br />
# If you see a lot of errors, such as depreciation warnings for .css files:<br />
# Delete your /home/<your username>/code/mahara/package-lock.json<br />
# Then re-run "nvm install" and "make css", which should resolve the issues.<br />
<br />
# If you run 'make css' and see the following "ERROR: Can't find the "nvm" executable ..." try the following:<br />
<br />
# Steps (for me) to get nvm working<br />
<br />
## First Install nvm<br />
<br />
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash<br />
<br />
## Then make the .nvm.sh executable<br />
<br />
cd ~/.nvm && chmod 755 nvm.sh<br />
<br />
## Then reload your .bashrc file<br />
<br />
source ~/.bashrc<br />
<br />
## The set the first nvm version manually to create a default<br />
<br />
./nvm.sh && nvm install 12<br />
<br />
</syntaxhighlight><br />
<br />
==== Build the CSS in non-production mode ====<br />
Sometimes it gets confusing where the SASS info comes from to compile the css files. To make things easier, you can edit the 'Makefile' and change the production mode to false.<br />
<br />
<code>production = false</code><br />
<br />
Then run the <code>make css</code> again - this will compile the theming files to create <code>*.css</code> files in an easier to read format with comments about which sass file contributed to the chuck of CSS code, e.g.:<br />
<br />
<syntaxhighlight lang="css"><br />
/* line 27, /home/robertl/code/mahara-devel/mahara/htdocs/theme/raw/sass/layout/_footer.scss */<br />
.admin .footer .footer-inner {<br />
padding: 10px; }<br />
/* line 36, /home/robertl/code/mahara-devel/mahara/htdocs/theme/default/sass/layout/_footer.scss */<br />
.admin .footer .footer-inner {<br />
padding: 20px 10px;<br />
background: none;<br />
border: 0;<br />
border-radius: 0; }<br />
</syntaxhighlight><br />
<br />
=== Go to the site in your browser ===<br />
[http://mahara/ https://mahara/]<br />
<br />
You should see the Mahara installer page. If you do, congratulations! Your development environment is now set up.<br />
<br />
==Trouble-shooting==<br />
<br />
=== Checking what version of PHP is running on your site ===<br />
The PHP version on the CLI can be different to what is running on the site, especially if you run php-fpm which allows having two PHP servers of different serving different PHP versions.<br />
<br />
To check the PHP version your site is serving, create the file <code>/htdocs/test.php</code> and populate it with following lines.<syntaxhighlight lang="php"><br />
<?php<br />
phpinfo();<br />
<br />
// In your browser go to <your wwwroot>/test.php<br />
</syntaxhighlight><br />
<br />
=== Ubuntu 22.04 & PHP 8.x ===<br />
By default Ubuntu 22.04 will have PHP 8.2 enabled<br />
<br />
To run commands on a different PHP version (e.g. 8.x) run: <code>sudo update-alternatives --set php /usr/bin/php8.x</code><br />
<br />
Run <code>composer update && make initcomposerdev</code> so the composer.lock file matches your PHP version.<br />
===Enabling apache2's version of PHP===<br />
<br />
When you do:<br />
<syntaxhighlight lang="bash"><br />
# for PHP 7.4<br />
sudo a2enmod php7.4<br />
# for PHP 8.1<br />
sudo a2enmod php8.1<br />
<br />
</syntaxhighlight><br />
===Using MySql8===<br />
<br />
If you are going to be using '''MySql 8''' or later, you will need to do the following:<br />
<br />
*To install MySql 8 on Ubuntu 16.04 see https://www.digitalocean.com/community/tutorials/how-to-install-the-latest-mysql-on-ubuntu-16-04<br />
<br />
We need to add a line to our mysql conf file so that we can log in with older format passwords, so edit:<br />
<syntaxhighlight lang="bash"><br />
vi /etc/mysql/mysql.conf.d/mysqld.cnf<br />
</syntaxhighlight><br />
And make sure we have<br />
<syntaxhighlight lang="bash"><br />
[mysqld]<br />
default_authentication_plugin=mysql_native_password<br />
</syntaxhighlight><br />
<br />
You will need to set the db user to use the native password<br />
<br />
CREATE USER 'maharauser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mahara';<br />
<br />
=====MySQL in Docker=====<br />
If you have Docker available you can [[System Administrator's Guide/Installing Mahara/MySQL and Docker|spin it up a dedicated container for it]].<br />
<br />
===Installing Node versions===<br />
<br />
Check which version of Node you are running with<br />
<syntaxhighlight lang="bash"><br />
node -v<br />
</syntaxhighlight><br />
If you are running one of the long term service (lts) versions, 8.x or 10.x, that should work with Mahara fine. If you are running a higher version, or Node is not installed, you will need to add a version to run with Mahara.<br />
<br />
You can find various instructions on how to upgrade NodeJS on your distribution depending on your preference on package manager. (There are a couple of links at the bottom of this section.)<br />
<br />
A straight-forward way to manage multiple versions of Node is to use NVM:<br />
<br />
*[https://github.com/creationix/nvm#install-script/ How to install NVM]<br />
<br />
Once you have it installed run:<br />
<syntaxhighlight lang="bash"><br />
nvm install --lts<br />
nvm use --lts<br />
</syntaxhighlight><br />
This will download the latest lts version of Node and set it to default. Then if you need to switch versions for other projects, you can do so with "nvm use <version>".<br />
<br />
Links to alternative ways of installing Node:<br />
<br />
*[https://nodejs.org/en/download/package-manager/ Installing Node.js via package manager]<br />
*[https://tecadmin.net/install-latest-nodejs-npm-on-ubuntu/ How to Install Latest Nodejs & Npm on Ubuntu 16.04 & 14.04]<br />
ts-php versions - also add set alternatives here<br />
Note on changing versions: you can see which version apache is using by adding phpinfo() in your code.<br />
<br />
==Adding another branch==<br />
<br />
'''1.''' Create a new local branch for it in git (replace '''1.10 / 110''' with the version of Mahara for which you want to add a branch)<br />
<syntaxhighlight lang="bash"><br />
$ cd ~/code/mahara<br />
$ git checkout -t origin/1.10_STABLE<br />
</syntaxhighlight><br />
<br />
'''2.''' Create the sitedata directory for the new branch:<br />
<syntaxhighlight lang="bash"><br />
$ sudo mkdir /var/lib/maharadata/110stable<br />
$ sudo chown www-data:www-data /var/lib/maharadata/110stable<br />
</syntaxhighlight><br />
<br />
'''3.''' Create a database:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres createdb -Omaharauser mahara-110stable<br />
</syntaxhighlight><br />
<br />
'''4.''' Change your ~/code/mahara/htdocs/config.php to point to the 1.10 branch:<br />
<syntaxhighlight lang="php"><br />
$branch = '110stable';<br />
</syntaxhighlight><br />
<br />
'''5.''' Go to the site in your browser to run the Mahara installer:<br />
<br />
http://mahara/<br />
<br />
==Switching back to the main branch==<br />
<br />
'''1.''' Change the config.php file:<br />
<syntaxhighlight lang="php"><br />
$branch = 'main';<br />
</syntaxhighlight><br />
<br />
'''2.''' Switch to the right git branch:<br />
<syntaxhighlight lang="bash"><br />
$ cd ~/code/mahara/<br />
$ git checkout main<br />
</syntaxhighlight><br />
<br />
&nbsp;<br />
==Reset the database==<br />
<br />
'''1.''' Delete the old database:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres dropdb mahara-main<br />
</syntaxhighlight><br />
<br />
'''2.''' Create a new one with the same name:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres createdb -Omaharauser mahara-main<br />
</syntaxhighlight><br />
<br />
'''3.''' Go to the site in your browser to run the Mahara installer again:<br />
<br />
http://mahara/<br />
<br />
If you reset the database a lot, you might want to try out the "maharawipe.sh" utility at https://github.com/agwells/mahara-devtools<br />
<br />
==Testing a change submitted to Gerrit==<br />
<br />
'''1.''' Go to the change page, for example:<br />
<syntaxhighlight lang="bash"><br />
https://reviews.mahara.org/#change,230<br />
</syntaxhighlight><br />
<br />
'''2.''' In your local repository, switch to the branch listed in the Gerrit change (in this case: main):<br />
<syntaxhighlight lang="bash"><br />
$ cd ~/code/mahara<br />
$ git checkout main<br />
</syntaxhighlight><br />
<br />
'''3.''' Update your config.php to use the right branch, too.<br />
<br />
'''4.''' Copy the "Anonymous Git" URL in the "Download" section of "Patch Set X" and run it in ~/code/mahara to check the branch out, for example:<br />
<syntaxhighlight lang="bash"><br />
$ git fetch git://reviews.mahara.org/git/mahara refs/changes/30/230/1 && git checkout FETCH_HEAD<br />
$ make css<br />
</syntaxhighlight><br />
<br />
'''5.''' After finishing the testing, go back to main:<br />
<syntaxhighlight lang="bash"><br />
$ git checkout main<br />
$ make css<br />
</syntaxhighlight><br />
<br />
&nbsp;<br />
<br />
==Submitting a change to Gerrit==<br />
<br />
If you want to contribute a patch to the Mahara project yourself, please check out the wiki page on [[Developer_Area/Contributing_Code | contributing code]]. There is also a [[Developer_Area/Contributing_Code/Troubleshooting_your_Gerrit_connection | troubleshooting page]] in case you run into issues pushing code to Gerrit.<br />
<br />
&nbsp;<br />
==Copying a local install to another==<br />
<br />
This example uses the directory 15stable as an example for the new install and the 14stable install as database and sitedata directory to copy.<br />
<br />
'''1.''' Do a checkout of the code into a new directory:<br />
<syntaxhighlight lang="bash"><br />
$ cd ~<br />
$ mkdir code<br />
$ cd code<br />
$ git clone git@git.mahara.org:mahara/mahara.git 15stable<br />
</syntaxhighlight><br />
<br />
'''2.''' Copy the database:<br />
<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres pg_dump -Fc mahara-14stable > 14stable.pg<br />
$ sudo -u postgres createdb -Omaharauser mahara-15stable<br />
$ sudo -u postgres pg_restore -O -j4 -d mahara-15stable -U maharauser -W -h localhost 14stable.pg<br />
</syntaxhighlight><br />
<br />
If you've not given the user 'maharauser' full privileges yet (should only need to do this once)<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON SCHEMA public TO maharauser;'<br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO maharauser;'<br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO maharauser;'<br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO maharauser;'<br />
</syntaxhighlight><br />
<br />
'''3.''' Change the wwwroot in the new database:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres psql mahara-15stable<br />
delete from config where field = 'wwwroot';<br />
Ctrl + d to exit<br />
</syntaxhighlight><br />
<br />
'''4.''' Create the config file ~/code/mahara/htdocs/config.php:<br />
<syntaxhighlight lang="php"><br />
<?php<br />
$cfg = new StdClass;<br />
<br />
$branch = '15stable';<br />
<br />
// database connection details<br />
// valid values for dbtype are 'postgres8' and 'mysql5'<br />
$cfg->dbtype = 'postgres8';<br />
$cfg->dbhost = 'localhost';<br />
$cfg->dbuser = 'maharauser';<br />
$cfg->dbname = "mahara-$branch";<br />
$cfg->dbpass = 'mahara'; <br />
$cfg->dbprefix = '''''''; <br />
<br />
$cfg->dataroot = "/var/lib/maharadata/$branch";<br />
<br />
$cfg->sendemail = true;<br />
$cfg->sendallemailto = 'your email address';<br />
<br />
$cfg->log_dbg_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->log_info_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->log_warn_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->log_environ_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->perftofoot = true;<br />
</syntaxhighlight> <br />
<br />
'''5.''' Copy the source sitedata directory into the new sitedata folder:<br />
<syntaxhighlight lang="bash"><br />
$ sudo cp -r /var/lib/maharadata/14stable/ /var/lib/maharadata/15stable<br />
$ sudo chown -R www-data:www-data /var/lib/maharadata/15stable<br />
</syntaxhighlight><br />
<br />
'''6.''' Add a new entry to /etc/hosts:<br />
<syntaxhighlight lang="bash"><br />
127.0.0.1 15stable<br />
</syntaxhighlight><br />
<br />
'''7.''' Create a new Apache vhost file in /etc/apache2/sites-available/15stable.conf:<br />
<syntaxhighlight lang="apacheconf"><br />
<VirtualHost *:80><br />
ServerName 15stable<br />
DocumentRoot /home/<your username>/code/15stable/htdocs<br />
<br />
<Directory /home/<your username>/code><br />
Options Indexes FollowSymLinks MultiViews<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
<br />
ErrorLog /var/log/apache2/error.log<br />
LogLevel info<br />
<br />
CustomLog /var/log/apache2/access.log combined<br />
DirectoryIndex index.php index.html<br />
</VirtualHost><br />
</syntaxhighlight><br />
<br />
'''8.''' Enable the site in Apache:<br />
<syntaxhighlight lang="bash"><br />
$ sudo a2ensite 15stable<br />
$ sudo apache2ctl configtest<br />
$ sudo apache2ctl graceful<br />
</syntaxhighlight><br />
<br />
'''9.''' Go to the site in your browser to run the Mahara installer:<br />
<syntaxhighlight lang="bash"><br />
http://15stable/<br />
</syntaxhighlight><br />
<br />
'''10.''' Resetting the admin password:<br />
<br />
If you do not know the login info for the copied site's database or the new site uses a different 'passwordsaltmain' from the old one you can reset a users password via the CLI script "reset_password.php", for example if you need to reset the 'admin' user's password you can go:<br />
<br />
sudo -u www-data php htdocs/admin/cli/reset_password.php -u=admin -p=changeme<br />
<br />
This will reset the password and on next login you will be prompted to change the password again to something more robust.<br />
<br />
&nbsp;<br />
<br />
==Elasticsearch==<br />
<br />
If you want to test the Elasticsearch search plugin, you'll also need to set up and run an Elasticsearch server. See [[Developer Area/Setting up Elasticsearch]].<br />
&nbsp;<br />
==ClamAV==<br />
If you want to test the ClamAV virus protection see [[Developer Area/Setting up ClamAV|Setting up ClamAV]]<br />
<br />
&nbsp;<br />
==Set up site for local https://==<br />
<br />
You will need to set up your Mahara developer site with an SSL certificate if you want to use the web services functionality as that is only available over https.<br />
<br />
You should already have Apache 2 installed on your computer. Otherwise, Mahara wouldn't run. Install the openssl and ssl-cert packages:<br />
<br />
<syntaxhighlight lang="bash"><br />
$ sudo apt-get install openssl ssl-cert<br />
</syntaxhighlight><br />
<br />
'''1.''' Enable SSL in Apache 2:<br />
<syntaxhighlight lang="bash"><br />
$ cd /etc/apache2/mods-enabled/<br />
$ ls<br />
$ sudo a2enmod ssl<br />
$ service apache2 restart<br />
$ ls<br />
</syntaxhighlight><br />
<br />
You should see "ssl.conf" and "ssl.load"<br />
<br />
'''2.''' You'll need to check that the port for SSL traffic is configured.<br />
<syntaxhighlight lang="bash"><br />
$ cd ..<br />
$ cat ports.conf<br />
</syntaxhighlight><br />
<br />
If you see '''<IfModule ssl_module> Listen 443''', you are good to go.<br />
<br />
'''3.''' Enable SSL also in your Mahara Apache 2 config file.<br />
<syntaxhighlight lang="bash"><br />
$ vim sites-available/mahara.conf (or the name of your config file of the site for which you want to enable SSL)<br />
</syntaxhighlight><br />
<br />
Paste the following into the .conf file after the </VirtualHost> for port 80. The last re-write rules are only necessary if you use the "Clean URL" functionality.<br />
<syntaxhighlight lang="apache"><br />
<IfModule mod_ssl.c><br />
<VirtualHost *:443><br />
ServerName mahara<br />
<br />
DocumentRoot /home/'''<your username>'''/code/mahara/htdocs<br />
<Directory /home/'''<your username>'''/code><br />
Options Indexes FollowSymLinks MultiViews<br />
AllowOverride None<br />
Require all granted<br />
</Directory><br />
<br />
ErrorLog /var/log/apache2/mahara-ssl-error.log<br />
LogLevel info<br />
<br />
CustomLog /var/log/apache2/mahara-ssl-access.log combined<br />
<br />
# SSL Engine Switch:<br />
# Enable/Disable SSL for this virtual host.<br />
SSLEngine on<br />
<br />
# A self-signed (snakeoil) certificate can be created by installing<br />
# the ssl-cert package. See<br />
# /usr/share/doc/apache2.2-common/README.Debian.gz for more info.<br />
# If both key and certificate are stored in the same file, only the<br />
# SSLCertificateFile directive is needed.<br />
SSLCertificateFile /etc/apache2/ssl/apache.pem<br />
SSLCertificateKeyFile /etc/apache2/ssl/apache.key<br />
<br />
# Server Certificate Chain:<br />
# Point SSLCertificateChainFile at a file containing the<br />
# concatenation of PEM encoded CA certificates which form the<br />
# certificate chain for the server certificate. Alternatively<br />
# the referenced file can be the same as SSLCertificateFile<br />
# when the CA certificates are directly appended to the server<br />
# certificate for convinience.<br />
#SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt<br />
<br />
# Certificate Authority (CA):<br />
# Set the CA certificate verification path where to find CA<br />
# certificates for client authentication or alternatively one<br />
# huge file containing all of them (file must be PEM encoded)<br />
# Note: Inside SSLCACertificatePath you need hash symlinks<br />
# to point to the certificate files. Use the provided<br />
# Makefile to update the hash symlinks after changes.<br />
#SSLCACertificatePath /etc/ssl/certs/<br />
#SSLCACertificateFile /etc/apache2/ssl.crt/ca-bundle.crt<br />
# Certificate Revocation Lists (CRL):<br />
# Set the CA revocation path where to find CA CRLs for client<br />
# authentication or alternatively one huge file containing all<br />
# of them (file must be PEM encoded)<br />
# Note: Inside SSLCARevocationPath you need hash symlinks<br />
# to point to the certificate files. Use the provided<br />
# Makefile to update the hash symlinks after changes.<br />
#SSLCARevocationPath /etc/apache2/ssl.crl/<br />
#SSLCARevocationFile /etc/apache2/ssl.crl/ca-bundle.crl<br />
<br />
# Client Authentication (Type):<br />
# Client certificate verification type and depth. Types are<br />
# none, optional, require and optional_no_ca. Depth is a<br />
# number which specifies how deeply to verify the certificate<br />
# issuer chain before deciding the certificate is not valid.<br />
#SSLVerifyClient require<br />
#SSLVerifyDepth 10<br />
<br />
# Access Control:<br />
# With SSLRequire you can do per-directory access control based<br />
# on arbitrary complex boolean expressions containing server<br />
# variable checks and other lookup directives. The syntax is a<br />
# mixture between C and Perl. See the mod_ssl documentation<br />
# for more details.<br />
#<Location /><br />
#SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \<br />
# and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \<br />
# and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \<br />
# and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \<br />
# and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20 ) \<br />
# or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/<br />
#</Location><br />
<br />
# SSL Engine Options:<br />
# Set various options for the SSL engine.<br />
# o FakeBasicAuth:<br />
# Translate the client X.509 into a Basic Authorisation. This means that<br />
# the standard Auth/DBMAuth methods can be used for access control. The<br />
# user name is the `one line' version of the client's X.509 certificate.<br />
# Note that no password is obtained from the user. Every entry in the user<br />
# file needs this password: `xxj31ZMTZzkVA'.<br />
# o ExportCertData:<br />
# This exports two additional environment variables: SSL_CLIENT_CERT and<br />
# SSL_SERVER_CERT. These contain the PEM-encoded certificates of the<br />
# server (always existing) and the client (only existing when client<br />
# authentication is used). This can be used to import the certificates<br />
# into CGI scripts.<br />
# o StdEnvVars:<br />
# This exports the standard SSL/TLS related `SSL_*' environment variables.<br />
# Per default this exportation is switched off for performance reasons,<br />
# because the extraction step is an expensive operation and is usually<br />
# useless for serving static content. So one usually enables the<br />
# exportation for CGI and SSI requests only.<br />
# o StrictRequire:<br />
# This denies access when "SSLRequireSSL" or "SSLRequire" applied even<br />
# under a "Satisfy any" situation, i.e. when it applies access is denied<br />
# and no other module can change it.<br />
# o OptRenegotiate:<br />
# This enables optimized SSL connection renegotiation handling when SSL<br />
# directives are used in per-directory context.<br />
#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire<br />
<FilesMatch "\.(cgi|shtml|phtml|php)$"><br />
SSLOptions +StdEnvVars<br />
</FilesMatch><br />
<br />
# SSL Protocol Adjustments:<br />
# The safe and default but still SSL/TLS standard compliant shutdown<br />
# approach is that mod_ssl sends the close notify alert but doesn't wait for<br />
# the close notify alert from client. When you need a different shutdown<br />
# approach you can use one of the following variables:<br />
# o ssl-unclean-shutdown:<br />
# This forces an unclean shutdown when the connection is closed, i.e. no<br />
# SSL close notify alert is send or allowed to received. This violates<br />
# the SSL/TLS standard but is needed for some brain-dead browsers. Use<br />
# this when you receive I/O errors because of the standard approach where<br />
# mod_ssl sends the close notify alert.<br />
# o ssl-accurate-shutdown:<br />
# This forces an accurate shutdown when the connection is closed, i.e. a<br />
# SSL close notify alert is send and mod_ssl waits for the close notify<br />
# alert of the client. This is 100% SSL/TLS standard compliant, but in<br />
# practice often causes hanging connections with brain-dead browsers. Use<br />
# this only for browsers where you know that their SSL implementation<br />
# works correctly.<br />
# Notice: Most problems of broken clients are also related to the HTTP<br />
# keep-alive facility, so you usually additionally want to disable<br />
# keep-alive for those clients, too. Use variable "nokeepalive" for this.<br />
# Similarly, one has to force some clients to use HTTP/1.0 to workaround<br />
# their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and<br />
# "force-response-1.0" for this.<br />
BrowserMatch "MSIE [2-6]" \<br />
nokeepalive ssl-unclean-shutdown \<br />
downgrade-1.0 force-response-1.0<br />
# MSIE 7 and newer should be able to use keepalive<br />
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown<br />
<br />
<IfModule mod_rewrite.c><br />
RewriteEngine on<br />
RewriteRule ^/user/([a-z0-9-]+)/?$ /user/view.php?profile=$1&%{QUERY_STRING}<br />
RewriteRule ^/user/([a-z0-9-]+)/([a-z0-9-]+)/?$ /view/view.php?profile=$1&page=$2&%{QUERY_STRING}<br />
RewriteRule ^/group/([a-z0-9-]+)/?$ /group/view.php?homepage=$1&%{QUERY_STRING}<br />
RewriteRule ^/group/([a-z0-9-]+)/([a-z0-9-]+)/?$ /view/view.php?homepage=$1&page=$2&%{QUERY_STRING}<br />
</IfModule><br />
</VirtualHost><br />
</IfModule><br />
</syntaxhighlight><br />
<br />
'''4.''' Create the SSL folder in /etc/apache2/ if it doesn't already exist:<br />
<syntaxhighlight lang="bash"><br />
$ sudo mkdir /etc/apache2/ssl<br />
</syntaxhighlight><br />
<br />
'''5.''' Run the following command to set up your local cert and follow the ensuing steps for generating it:<br />
<syntaxhighlight lang="bash"><br />
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.pem<br />
</syntaxhighlight><br />
<br />
When it asks you for the "Common name", you can put your local server's name.<br />
<br />
'''6.''' Restart Apache.<br />
<syntaxhighlight lang="bash"><br />
$ sudo service apache2 restart<br />
</syntaxhighlight><br />
<br />
If you have an error message that pertains to your SSL site, you'll need to fix it first before continuing.<br />
<br />
'''7.''' Test the Apache config:<br />
<syntaxhighlight lang="bash"><br />
$ sudo apache2ctl configtest<br />
</syntaxhighlight><br />
<br />
'''8.''' Delete the old wwwroot as that still points to http://. If you left it, you wouldn't see all assetts.<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres psql mahara-main<br />
delete from config where field = 'wwwroot';<br />
Ctrl + d to exit<br />
</syntaxhighlight><br />
<br />
'''9.''' Go to your Mahara URL and use '''https://'''. Since you created a self-signed cert, your connection will be untrusted. Proceed anyway.<br />
<br />
'''10.''' Now you can use your developer site with web services as well.<br />
<br />
==Set up Behat==<br />
<br />
You can use the automated testing suite from Mahara 15.04 on. There is a [[Testing/Behat_Testing/Setup | separate installation page for Behat]].<br />
<br />
== XDebug ==<br />
<br />
=== VS Codium ===<br />
Install the extension PHP Debug <syntaxhighlight><br />
Name: PHP Debug<br />
Id: xdebug.php-debug<br />
Description: Debug support for PHP with Xdebug<br />
Version: 1.32.0<br />
Publisher: Xdebug<br />
VS Marketplace Link: https://marketplace.visualstudio.com/items?itemName=xdebug.php-debug<br />
</syntaxhighlight>Use the Xdebug wizard to help you with installation https://xdebug.org/wizard<br />
<br />
To use with Behat, make sure in your <code>99-xdebug.ini</code> file<syntaxhighlight lang="ini"><br />
# in /etc/php/8.1/mods-available<br />
zend_extension = xdebug <br />
xdebug.mode = debug<br />
<br />
# This will not work in Behat tests however, triggering it in VS Code will work<br />
xdebug.start_with_request = trigger<br />
# This will work with Behat tests as well as in VS Code - use this one for Behat<br />
# xdebug.start_with_request = yes<br />
<br />
</syntaxhighlight>Remember to restart your PHP server if applicable <code>sudo service php8.x-fpm restart</code></div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Developer_Environment&diff=13911Developer Area/Developer Environment2023-11-30T00:03:27Z<p>Robertl: /* To switch between PHP versions */</p>
<hr />
<div>{{:Developer_Area/tabs}} <!-- to add further tabs, update the following page https://wiki.mahara.org/wiki/Developer_Area/tabs ... this will automatically cascade the changes to all relevant pages --><br />
<br />
<div style="float:right">__TOC__</div><br />
<br />
🚧 Note: this wiki is in the process of migrating to our GitLab Wiki.<br />
<br />
This page explains how to set up a copy of Mahara for development purposes.<br />
<br />
==The Docker version==<br />
<br />
Included in the main codebase is a docker version of Mahara with Behat capabilities. Before you try this, you will need to have Docker installed.<br />
See: https://docs.docker.com/engine/install/ubuntu/<br />
<br />
The instructions for running the docker version are here:<br><br />
https://git.mahara.org/mahara/mahara/-/blob/main/docker/README.md<br />
<br />
Please feel free to update if there are missing instructions that would be helpful to others.<br />
<br />
==The short version==<br />
<br />
Mahara is a fairly standard PHP web application. You mainly need to place it in your web server and give it a database, and a file storage directory. If you haven't set up a PHP web application before, skip to [[the long version]] down below.<br />
<br />
#Set up your Apache web server. For development purposes, it is often handy to have the web root sitting inside your home directory.<br />
#Retrieve a copy of the Mahara codebase. Place it in your Apache web root.<br />
#Create a Mahara <code>dataroot</code> directory '''outside''' your web root. Make it read/writeable by Apache.<br />
#Create a database instance and database user for Mahara to use.<br />
#Edit the Mahara <code>config.php</code> file so that Mahara knows the location of its <code>dataroot</code> directory, and its database login credentials.<br />
#Run the Mahara installer by visiting your Mahara site in your web browser. If you are missing any required PHP modules, Mahara should tell you. Depending on what you have already installed, you may need one or more of these:<br />
##<syntaxhighlight lang="text" inline="">php-pgsql</syntaxhighlight><br />
##<syntaxhighlight lang="text" inline="">php-gd</syntaxhighlight><br />
##<syntaxhighlight lang="text" inline="">php-curl</syntaxhighlight><br />
##<syntaxhighlight lang="text" inline="">php-intl</syntaxhighlight><br />
##<syntaxhighlight lang="text" inline="">php-json</syntaxhighlight><br />
##<syntaxhighlight lang="text" inline="">php-zip</syntaxhighlight><br />
#If you are using MySQL instead of Postgres<br />
##<syntaxhighlight lang="text" inline="">php7.4-mysql</syntaxhighlight> or<br />
##<syntaxhighlight lang="text" inline="">php-mysql</syntaxhighlight><br />
<br />
==The long version (for Windows)==<br />
<br />
If you want to install your developer environment on Windows, please [[Developer_Area/Developer_Environment_(Windows) | check the Windows instructions]].<br />
<br />
==The long version (for Linux)==<br />
<br />
The instructions explain one way to set up an installation of Mahara for development purposes. These instructions are specifically for Ubuntu Linux, although the process will probably be quite similar in other Linux versions.<br />
<br />
Note: Please have an apache2 installed on your server<br />
<syntaxhighlight lang="bash"><br />
sudo apt install apache2<br />
</syntaxhighlight><br />
<br />
'''The following instructions are for Ubuntu 22.10 and above, unless otherwise noted.'''<br />
<br />
=== Install required packages: ===<br />
<br />
==== PHP 7.4 ====<br />
<syntaxhighlight lang="bash"><br />
sudo apt install \<br />
make curl wget xvfb git gitk postgresql php7.4-common php-cli libapache2-mod-php7.4 \<br />
php7.4-curl php7.4-gd php-json php-ldap php-pgsql php-xmlrpc php-zip php-xml php-mbstring \<br />
nodejs php7.4-pgsql php7.4-xml php7.4-xmlrpc php7.4-mbstring php7.4-intl libssl-dev pdo_sqlite php7.4-zip <br />
<br />
# Set 7.4 as apache2's version of php<br />
sudo a2enmod php7.4<br />
</syntaxhighlight><br />
<br />
==== PHP 8.1 ====<br />
<syntaxhighlight lang="bash"><br />
sudo apt install \<br />
make curl wget xvfb git gitk postgresql php8.1-common php-cli libapache2-mod-php8.1 \<br />
php8.1-curl php8.1-gd php-json php-ldap php-pgsql php-xmlrpc php-zip php-xml php-mbstring \<br />
nodejs php8.1-pgsql php8.1-xml php8.1-xmlrpc php8.1-mbstring php8.1-intl libssl-dev pdo_sqlite php8.1-zip<br />
<br />
# Set 8.1 as apache2's version of php<br />
sudo a2enmod php8.1<br />
</syntaxhighlight>If you encounter any errors with the installation, you may want to try installing in chunks. See the [https://wiki.mahara.org/wiki/Developer_Area/Developer_Environment?section=8#Trouble-shooting Troubleshooting] section.<br />
<br />
==== To switch between PHP versions ====<br />
<code><br />
sudo a2dismod php7.4<br />
sudo a2enmod php8.1<br />
sudo update-alternatives --config php<br />
restart apache2<br />
</code><br />
<br />
==== Node ====<br />
Check which version of Node you are running with <syntaxhighlight lang="bash" inline="">node -v</syntaxhighlight> To install: <code>sudo apt install nodejs</code><br />
<br />
=== Get a copy of the codebase ===<br />
Get a copy of the Mahara code from git. We'll put it under your home directory, in a new directory called <code>code</code>: See also [[Developer_Area/Getting_Code_from_Git|Getting Code from Git]]<br />
<br />
<syntaxhighlight lang="bash"><br />
cd ~<br />
mkdir code<br />
cd code<br />
<br />
# if you have an account on git.mahara.org ...<br />
git clone git@git.mahara.org:mahara/mahara.git<br />
<br />
# else, use http...<br />
git clone https://git.mahara.org/mahara/mahara.git<br />
<br />
# if that doesn't work, try...<br />
git clone https://github.com/MaharaProject/mahara.git<br />
<br />
<br />
</syntaxhighlight><br />
<br />
==== Fix permissions ====<br />
Give the Apache web server access to your Mahara code directory:<syntaxhighlight lang="bash"><br />
# Give all users read access + executable (if required) to the mahara directory<br />
sudo chmod a+rX ~/code/mahara<br />
<br />
# To avoid a possible 403 error later, confirm that your code directory permissions are also drwxr-xr-x<br />
ls -la ~/<br />
<br />
# To fix, run:<br />
sudo chmod a+rX ~/code<br />
<br />
# Your home directory permissions should be drwx--x--x<br />
ls -la /home # to check<br />
<br />
# To fix, run:<br />
sudo chmod a+X /home/[name of your home directory]<br />
</syntaxhighlight><br />
<br />
=== Create a Mahara database ===<br />
<br />
==== Create a PostgreSQL database user ====<br />
<syntaxhighlight lang="bash"><br />
# Use maharapassword as the password<br />
sudo -u postgres createuser -P -D -R -S maharauser<br />
</syntaxhighlight><br />
<br />
If Postgres is not available, check its status and if it says that it's inactive, start the service:<br />
<br />
<syntaxhighlight lang="bash"><br />
# Check status<br />
service postgresql status<br />
# Restart service<br />
sudo service postgresql start<br />
</syntaxhighlight><br />
<br />
==== Create a database ====<br />
<syntaxhighlight lang="bash"><br />
sudo -u postgres createdb -Omaharauser mahara-main<br />
</syntaxhighlight><br />
<br />
'''5.''' Using a text editor, copy these contents into a file and save it to <syntaxhighlight lang="text" inline="">~/code/mahara/htdocs/config.php</syntaxhighlight>:<br />
<br />
<syntaxhighlight lang="php"><br />
<?php<br />
$cfg = new stdClass();<br />
<br />
$branch = 'main';<br />
<br />
// database connection details<br />
// valid values for dbtype are 'postgres8' and 'mysql5'<br />
$cfg->dbtype = 'postgres';<br />
$cfg->dbhost = 'localhost';<br />
$cfg->dbuser = 'maharauser';<br />
$cfg->dbname = "mahara-$branch";<br />
$cfg->dbpass = 'maharapassword'; <br />
<br />
$cfg->dataroot = "/var/lib/maharadata/$branch";<br />
<br />
$cfg->sendemail = true;<br />
$cfg->sendallemailto = '<your email address>';<br />
<br />
$cfg->productionmode = false;<br />
$cfg->perftofoot = true;<br />
</syntaxhighlight><br />
<br />
Make sure to replace <syntaxhighlight lang="text" inline=""><your email address></syntaxhighlight> with your email address.<br />
<br />
If you're mainly testing, and you don't find the stack traces in these screen messages particularly useful, adding <syntaxhighlight lang="text" inline="">$cfg->log_backtrace_levels = LOG_LEVEL_ENVIRON;</syntaxhighlight> to config.php will display important warning messages on a single line, without stack traces.<br />
<br />
=== Set up <code>dataroot</code>, host, and site ===<br />
<br />
==== Create a <code>dataroot</code> directory ====<br />
This is where Mahara stores uploaded files):<syntaxhighlight lang="bash"><br />
sudo mkdir /var/lib/maharadata<br />
sudo mkdir /var/lib/maharadata/main<br />
sudo chown www-data:www-data /var/lib/maharadata/main<br />
</syntaxhighlight><br />
<br />
==== Set up local domain ====<br />
Set up a new local domain name <code>mahara</code> for your Mahara site, in <code>/etc/hosts:</code><syntaxhighlight lang="bash"><br />
sudo sh -c "echo '127.0.0.1 mahara' >> /etc/hosts"<br />
</syntaxhighlight><br />
<br />
==== Increase your PHP <code>post_max_size</code> ====<br />
These files will be under the version of php you are using, e.g. /etc/php/<PHP version>:<syntaxhighlight lang="bash"><br />
# for PHP 7.4<br />
sudo sh -c "echo 'post_max_size = 37M' >> /etc/php/7.4/cli/php.ini"<br />
sudo sh -c "echo 'upload_max_filesize = 32M' >> /etc/php/7.4/cli/php.ini"<br />
sudo sh -c "echo 'post_max_size = 37M' >> /etc/php/7.4/apache2/php.ini"<br />
sudo sh -c "echo 'upload_max_filesize = 32M' >> /etc/php/7.4/apache2/php.ini"<br />
<br />
# for PHP 8.1<br />
sudo sh -c "echo 'post_max_size = 37M' >> /etc/php/8.1/cli/php.ini"<br />
sudo sh -c "echo 'upload_max_filesize = 32M' >> /etc/php/8.1/cli/php.ini"<br />
sudo sh -c "echo 'post_max_size = 37M' >> /etc/php/8.1/apache2/php.ini"<br />
sudo sh -c "echo 'upload_max_filesize = 32M' >> /etc/php/8.1/apache2/php.ini"<br />
</syntaxhighlight><br />
<br />
Note: The 'post_max_size' is slightly bigger, as a POST command also contains some wrapper information. That wrapper is just text strings and relates to how much the form submits. So usually, 1 MB should be enough, but to be on the safe side, 5 MB would be better, which then also works for larger uploads.<br />
<br />
==== Create an Apache config file ====<br />
You can do this by first copying the following contents into a file called <code>mahara.conf</code>, saved in your home directory.<br />
<br />
See also: [[Developer_Area/Changing_Hostnames|Changing Hostnames]]<br />
<br />
<syntaxhighlight lang="apache"><br />
<VirtualHost *:80><br />
ServerName mahara<br />
DocumentRoot /home/<your username>/code/mahara/htdocs<br />
<br />
<Directory /home/<your username>/code><br />
Options Indexes FollowSymLinks MultiViews<br />
Require all granted<br />
</Directory><br />
<br />
ErrorLog /var/log/apache2/error.log<br />
LogLevel info<br />
<br />
CustomLog /var/log/apache2/access.log combined<br />
DirectoryIndex index.php index.html<br />
</VirtualHost><br />
</syntaxhighlight><br />
<br />
Then copy the file into your Apache sites-enable directory. The name to give the file will also vary depending on what version of Ubuntu you are using.<br />
<br />
<syntaxhighlight lang="text" inline="">sudo cp ~/mahara.conf /etc/apache2/sites-available/mahara.conf</syntaxhighlight><br />
<br />
==== Enable the site in Apache ====<br />
<syntaxhighlight lang="bash"><br />
sudo a2ensite mahara<br />
sudo apache2ctl configtest<br />
sudo apache2ctl graceful<br />
</syntaxhighlight><br />
<br />
<code>composer update && make initcomposerdev</code><br />
<br />
=== Set up <code>cron</code>: ===<br />
<syntaxhighlight lang="bash"><br />
# To get cron emails every minute:<br />
sudo vim /etc/cron.d/mahara<br />
* * * * * www-data /usr/bin/php /home/<your username>/code/mahara/htdocs/lib/cron.php<br />
<br />
# Otherwise:<br />
sudo vim /etc/cron.d/mahara<br />
* * * * * www-data /usr/bin/php /home/<your username>/code/mahara/htdocs/lib/cron.php >/dev/null 2>&1<br />
</syntaxhighlight><br />
<br />
=== Set up <code>npm</code> and <code>gulp</code> for theming ===<br />
The main Mahara git repository includes SCSS files that compile into CSS files, instead of including CSS files directly. We compile these using a Gulp (NodeJS) script that's included with the code. This can easily be invoked via our Makefile by doing "<code>make css</code>, but it requires setting up a couple of additional items first.<br />
<br />
<syntaxhighlight lang="bash"><br />
# First you'll need to run "npm install" from within the Mahara code directory<br />
# to get npm to properly set up all the proper caches and such.<br />
<br />
cd /home/<your username>/code/mahara<br />
npm install<br />
<br />
# Once that's finished, you'll need to install the npm "gulp" package using the "-g" <br />
# (global) flag, so that "gulp" can be run as a CLI command. This requires using sudo.<br />
<br />
cd /home/<your username>/code/mahara<br />
sudo npm install -g gulp<br />
<br />
# Mahara runs with at least version 14.x of node.<br />
<br />
sudo npm cache clean -f<br />
sudo npm install -g n <br />
sudo nvm use stable<br />
<br />
<br />
# Then update node-sass bindings:<br />
<br />
sudo npm rebuild node-sass<br />
</syntaxhighlight><br />
<br />
==== Build the themes (CSS) ====<br />
Run <code>make css</code> in the Mahara code directory to compile the CSS for Mahara themes. This will run the necessary series of instructions written out in the Makefile (including <code>npm install</code> for both the development and production JS libraries.<br />
<br />
<syntaxhighlight lang="bash"><br />
cd /home/<your username>/code/mahara<br />
make css<br />
<br />
# If you see a lot of errors, such as depreciation warnings for .css files:<br />
# Delete your /home/<your username>/code/mahara/package-lock.json<br />
# Then re-run "nvm install" and "make css", which should resolve the issues.<br />
<br />
# If you run 'make css' and see the following "ERROR: Can't find the "nvm" executable ..." try the following:<br />
<br />
# Steps (for me) to get nvm working<br />
<br />
## First Install nvm<br />
<br />
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash<br />
<br />
## Then make the .nvm.sh executable<br />
<br />
cd ~/.nvm && chmod 755 nvm.sh<br />
<br />
## Then reload your .bashrc file<br />
<br />
source ~/.bashrc<br />
<br />
## The set the first nvm version manually to create a default<br />
<br />
./nvm.sh && nvm install 12<br />
<br />
</syntaxhighlight><br />
<br />
==== Build the CSS in non-production mode ====<br />
Sometimes it gets confusing where the SASS info comes from to compile the css files. To make things easier, you can edit the 'Makefile' and change the production mode to false.<br />
<br />
<code>production = false</code><br />
<br />
Then run the <code>make css</code> again - this will compile the theming files to create <code>*.css</code> files in an easier to read format with comments about which sass file contributed to the chuck of CSS code, e.g.:<br />
<br />
<syntaxhighlight lang="css"><br />
/* line 27, /home/robertl/code/mahara-devel/mahara/htdocs/theme/raw/sass/layout/_footer.scss */<br />
.admin .footer .footer-inner {<br />
padding: 10px; }<br />
/* line 36, /home/robertl/code/mahara-devel/mahara/htdocs/theme/default/sass/layout/_footer.scss */<br />
.admin .footer .footer-inner {<br />
padding: 20px 10px;<br />
background: none;<br />
border: 0;<br />
border-radius: 0; }<br />
</syntaxhighlight><br />
<br />
=== Go to the site in your browser ===<br />
[http://mahara/ https://mahara/]<br />
<br />
You should see the Mahara installer page. If you do, congratulations! Your development environment is now set up.<br />
<br />
==Trouble-shooting==<br />
<br />
=== Checking what version of PHP is running on your site ===<br />
The PHP version on the CLI can be different to what is running on the site, especially if you run php-fpm which allows having two PHP servers of different serving different PHP versions.<br />
<br />
To check the PHP version your site is serving, create the file <code>/htdocs/test.php</code> and populate it with following lines.<syntaxhighlight lang="php"><br />
<?php<br />
phpinfo();<br />
<br />
// In your browser go to <your wwwroot>/test.php<br />
</syntaxhighlight><br />
<br />
=== Ubuntu 22.04 & PHP 8.x ===<br />
By default Ubuntu 22.04 will have PHP 8.2 enabled<br />
<br />
To run commands on a different PHP version (e.g. 8.x) run: <code>sudo update-alternatives --set php /usr/bin/php8.x</code><br />
<br />
Run <code>composer update && make initcomposerdev</code> so the composer.lock file matches your PHP version.<br />
===Enabling apache2's version of PHP===<br />
<br />
When you do:<br />
<syntaxhighlight lang="bash"><br />
# for PHP 7.4<br />
sudo a2enmod php7.4<br />
# for PHP 8.1<br />
sudo a2enmod php8.1<br />
<br />
</syntaxhighlight><br />
===Using MySql8===<br />
<br />
If you are going to be using '''MySql 8''' or later, you will need to do the following:<br />
<br />
*To install MySql 8 on Ubuntu 16.04 see https://www.digitalocean.com/community/tutorials/how-to-install-the-latest-mysql-on-ubuntu-16-04<br />
<br />
We need to add a line to our mysql conf file so that we can log in with older format passwords, so edit:<br />
<syntaxhighlight lang="bash"><br />
vi /etc/mysql/mysql.conf.d/mysqld.cnf<br />
</syntaxhighlight><br />
And make sure we have<br />
<syntaxhighlight lang="bash"><br />
[mysqld]<br />
default_authentication_plugin=mysql_native_password<br />
</syntaxhighlight><br />
<br />
You will need to set the db user to use the native password<br />
<br />
CREATE USER 'maharauser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mahara';<br />
<br />
=====MySQL in Docker=====<br />
If you have Docker available you can [[System Administrator's Guide/Installing Mahara/MySQL and Docker|spin it up a dedicated container for it]].<br />
<br />
===Installing Node versions===<br />
<br />
Check which version of Node you are running with<br />
<syntaxhighlight lang="bash"><br />
node -v<br />
</syntaxhighlight><br />
If you are running one of the long term service (lts) versions, 8.x or 10.x, that should work with Mahara fine. If you are running a higher version, or Node is not installed, you will need to add a version to run with Mahara.<br />
<br />
You can find various instructions on how to upgrade NodeJS on your distribution depending on your preference on package manager. (There are a couple of links at the bottom of this section.)<br />
<br />
A straight-forward way to manage multiple versions of Node is to use NVM:<br />
<br />
*[https://github.com/creationix/nvm#install-script/ How to install NVM]<br />
<br />
Once you have it installed run:<br />
<syntaxhighlight lang="bash"><br />
nvm install --lts<br />
nvm use --lts<br />
</syntaxhighlight><br />
This will download the latest lts version of Node and set it to default. Then if you need to switch versions for other projects, you can do so with "nvm use <version>".<br />
<br />
Links to alternative ways of installing Node:<br />
<br />
*[https://nodejs.org/en/download/package-manager/ Installing Node.js via package manager]<br />
*[https://tecadmin.net/install-latest-nodejs-npm-on-ubuntu/ How to Install Latest Nodejs & Npm on Ubuntu 16.04 & 14.04]<br />
ts-php versions - also add set alternatives here<br />
Note on changing versions: you can see which version apache is using by adding phpinfo() in your code.<br />
<br />
==Adding another branch==<br />
<br />
'''1.''' Create a new local branch for it in git (replace '''1.10 / 110''' with the version of Mahara for which you want to add a branch)<br />
<syntaxhighlight lang="bash"><br />
$ cd ~/code/mahara<br />
$ git checkout -t origin/1.10_STABLE<br />
</syntaxhighlight><br />
<br />
'''2.''' Create the sitedata directory for the new branch:<br />
<syntaxhighlight lang="bash"><br />
$ sudo mkdir /var/lib/maharadata/110stable<br />
$ sudo chown www-data:www-data /var/lib/maharadata/110stable<br />
</syntaxhighlight><br />
<br />
'''3.''' Create a database:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres createdb -Omaharauser mahara-110stable<br />
</syntaxhighlight><br />
<br />
'''4.''' Change your ~/code/mahara/htdocs/config.php to point to the 1.10 branch:<br />
<syntaxhighlight lang="php"><br />
$branch = '110stable';<br />
</syntaxhighlight><br />
<br />
'''5.''' Go to the site in your browser to run the Mahara installer:<br />
<br />
http://mahara/<br />
<br />
==Switching back to the main branch==<br />
<br />
'''1.''' Change the config.php file:<br />
<syntaxhighlight lang="php"><br />
$branch = 'main';<br />
</syntaxhighlight><br />
<br />
'''2.''' Switch to the right git branch:<br />
<syntaxhighlight lang="bash"><br />
$ cd ~/code/mahara/<br />
$ git checkout main<br />
</syntaxhighlight><br />
<br />
&nbsp;<br />
==Reset the database==<br />
<br />
'''1.''' Delete the old database:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres dropdb mahara-main<br />
</syntaxhighlight><br />
<br />
'''2.''' Create a new one with the same name:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres createdb -Omaharauser mahara-main<br />
</syntaxhighlight><br />
<br />
'''3.''' Go to the site in your browser to run the Mahara installer again:<br />
<br />
http://mahara/<br />
<br />
If you reset the database a lot, you might want to try out the "maharawipe.sh" utility at https://github.com/agwells/mahara-devtools<br />
<br />
==Testing a change submitted to Gerrit==<br />
<br />
'''1.''' Go to the change page, for example:<br />
<syntaxhighlight lang="bash"><br />
https://reviews.mahara.org/#change,230<br />
</syntaxhighlight><br />
<br />
'''2.''' In your local repository, switch to the branch listed in the Gerrit change (in this case: main):<br />
<syntaxhighlight lang="bash"><br />
$ cd ~/code/mahara<br />
$ git checkout main<br />
</syntaxhighlight><br />
<br />
'''3.''' Update your config.php to use the right branch, too.<br />
<br />
'''4.''' Copy the "Anonymous Git" URL in the "Download" section of "Patch Set X" and run it in ~/code/mahara to check the branch out, for example:<br />
<syntaxhighlight lang="bash"><br />
$ git fetch git://reviews.mahara.org/git/mahara refs/changes/30/230/1 && git checkout FETCH_HEAD<br />
$ make css<br />
</syntaxhighlight><br />
<br />
'''5.''' After finishing the testing, go back to main:<br />
<syntaxhighlight lang="bash"><br />
$ git checkout main<br />
$ make css<br />
</syntaxhighlight><br />
<br />
&nbsp;<br />
<br />
==Submitting a change to Gerrit==<br />
<br />
If you want to contribute a patch to the Mahara project yourself, please check out the wiki page on [[Developer_Area/Contributing_Code | contributing code]]. There is also a [[Developer_Area/Contributing_Code/Troubleshooting_your_Gerrit_connection | troubleshooting page]] in case you run into issues pushing code to Gerrit.<br />
<br />
&nbsp;<br />
==Copying a local install to another==<br />
<br />
This example uses the directory 15stable as an example for the new install and the 14stable install as database and sitedata directory to copy.<br />
<br />
'''1.''' Do a checkout of the code into a new directory:<br />
<syntaxhighlight lang="bash"><br />
$ cd ~<br />
$ mkdir code<br />
$ cd code<br />
$ git clone git@git.mahara.org:mahara/mahara.git 15stable<br />
</syntaxhighlight><br />
<br />
'''2.''' Copy the database:<br />
<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres pg_dump -Fc mahara-14stable > 14stable.pg<br />
$ sudo -u postgres createdb -Omaharauser mahara-15stable<br />
$ sudo -u postgres pg_restore -O -j4 -d mahara-15stable -U maharauser -W -h localhost 14stable.pg<br />
</syntaxhighlight><br />
<br />
If you've not given the user 'maharauser' full privileges yet (should only need to do this once)<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON SCHEMA public TO maharauser;'<br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO maharauser;'<br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO maharauser;'<br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO maharauser;'<br />
</syntaxhighlight><br />
<br />
'''3.''' Change the wwwroot in the new database:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres psql mahara-15stable<br />
delete from config where field = 'wwwroot';<br />
Ctrl + d to exit<br />
</syntaxhighlight><br />
<br />
'''4.''' Create the config file ~/code/mahara/htdocs/config.php:<br />
<syntaxhighlight lang="php"><br />
<?php<br />
$cfg = new StdClass;<br />
<br />
$branch = '15stable';<br />
<br />
// database connection details<br />
// valid values for dbtype are 'postgres8' and 'mysql5'<br />
$cfg->dbtype = 'postgres8';<br />
$cfg->dbhost = 'localhost';<br />
$cfg->dbuser = 'maharauser';<br />
$cfg->dbname = "mahara-$branch";<br />
$cfg->dbpass = 'mahara'; <br />
$cfg->dbprefix = '''''''; <br />
<br />
$cfg->dataroot = "/var/lib/maharadata/$branch";<br />
<br />
$cfg->sendemail = true;<br />
$cfg->sendallemailto = 'your email address';<br />
<br />
$cfg->log_dbg_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->log_info_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->log_warn_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->log_environ_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->perftofoot = true;<br />
</syntaxhighlight> <br />
<br />
'''5.''' Copy the source sitedata directory into the new sitedata folder:<br />
<syntaxhighlight lang="bash"><br />
$ sudo cp -r /var/lib/maharadata/14stable/ /var/lib/maharadata/15stable<br />
$ sudo chown -R www-data:www-data /var/lib/maharadata/15stable<br />
</syntaxhighlight><br />
<br />
'''6.''' Add a new entry to /etc/hosts:<br />
<syntaxhighlight lang="bash"><br />
127.0.0.1 15stable<br />
</syntaxhighlight><br />
<br />
'''7.''' Create a new Apache vhost file in /etc/apache2/sites-available/15stable.conf:<br />
<syntaxhighlight lang="apacheconf"><br />
<VirtualHost *:80><br />
ServerName 15stable<br />
DocumentRoot /home/<your username>/code/15stable/htdocs<br />
<br />
<Directory /home/<your username>/code><br />
Options Indexes FollowSymLinks MultiViews<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
<br />
ErrorLog /var/log/apache2/error.log<br />
LogLevel info<br />
<br />
CustomLog /var/log/apache2/access.log combined<br />
DirectoryIndex index.php index.html<br />
</VirtualHost><br />
</syntaxhighlight><br />
<br />
'''8.''' Enable the site in Apache:<br />
<syntaxhighlight lang="bash"><br />
$ sudo a2ensite 15stable<br />
$ sudo apache2ctl configtest<br />
$ sudo apache2ctl graceful<br />
</syntaxhighlight><br />
<br />
'''9.''' Go to the site in your browser to run the Mahara installer:<br />
<syntaxhighlight lang="bash"><br />
http://15stable/<br />
</syntaxhighlight><br />
<br />
'''10.''' Resetting the admin password:<br />
<br />
If you do not know the login info for the copied site's database or the new site uses a different 'passwordsaltmain' from the old one you can reset a users password via the CLI script "reset_password.php", for example if you need to reset the 'admin' user's password you can go:<br />
<br />
sudo -u www-data php htdocs/admin/cli/reset_password.php -u=admin -p=changeme<br />
<br />
This will reset the password and on next login you will be prompted to change the password again to something more robust.<br />
<br />
&nbsp;<br />
<br />
==Elasticsearch==<br />
<br />
If you want to test the Elasticsearch search plugin, you'll also need to set up and run an Elasticsearch server. See [[Developer Area/Setting up Elasticsearch]].<br />
&nbsp;<br />
==ClamAV==<br />
If you want to test the ClamAV virus protection see [[Developer Area/Setting up ClamAV|Setting up ClamAV]]<br />
<br />
&nbsp;<br />
==Set up site for local https://==<br />
<br />
You will need to set up your Mahara developer site with an SSL certificate if you want to use the web services functionality as that is only available over https.<br />
<br />
You should already have Apache 2 installed on your computer. Otherwise, Mahara wouldn't run. Install the openssl and ssl-cert packages:<br />
<br />
<syntaxhighlight lang="bash"><br />
$ sudo apt-get install openssl ssl-cert<br />
</syntaxhighlight><br />
<br />
'''1.''' Enable SSL in Apache 2:<br />
<syntaxhighlight lang="bash"><br />
$ cd /etc/apache2/mods-enabled/<br />
$ ls<br />
$ sudo a2enmod ssl<br />
$ service apache2 restart<br />
$ ls<br />
</syntaxhighlight><br />
<br />
You should see "ssl.conf" and "ssl.load"<br />
<br />
'''2.''' You'll need to check that the port for SSL traffic is configured.<br />
<syntaxhighlight lang="bash"><br />
$ cd ..<br />
$ cat ports.conf<br />
</syntaxhighlight><br />
<br />
If you see '''<IfModule ssl_module> Listen 443''', you are good to go.<br />
<br />
'''3.''' Enable SSL also in your Mahara Apache 2 config file.<br />
<syntaxhighlight lang="bash"><br />
$ vim sites-available/mahara.conf (or the name of your config file of the site for which you want to enable SSL)<br />
</syntaxhighlight><br />
<br />
Paste the following into the .conf file after the </VirtualHost> for port 80. The last re-write rules are only necessary if you use the "Clean URL" functionality.<br />
<syntaxhighlight lang="apache"><br />
<IfModule mod_ssl.c><br />
<VirtualHost *:443><br />
ServerName mahara<br />
<br />
DocumentRoot /home/'''<your username>'''/code/mahara/htdocs<br />
<Directory /home/'''<your username>'''/code><br />
Options Indexes FollowSymLinks MultiViews<br />
AllowOverride None<br />
Require all granted<br />
</Directory><br />
<br />
ErrorLog /var/log/apache2/mahara-ssl-error.log<br />
LogLevel info<br />
<br />
CustomLog /var/log/apache2/mahara-ssl-access.log combined<br />
<br />
# SSL Engine Switch:<br />
# Enable/Disable SSL for this virtual host.<br />
SSLEngine on<br />
<br />
# A self-signed (snakeoil) certificate can be created by installing<br />
# the ssl-cert package. See<br />
# /usr/share/doc/apache2.2-common/README.Debian.gz for more info.<br />
# If both key and certificate are stored in the same file, only the<br />
# SSLCertificateFile directive is needed.<br />
SSLCertificateFile /etc/apache2/ssl/apache.pem<br />
SSLCertificateKeyFile /etc/apache2/ssl/apache.key<br />
<br />
# Server Certificate Chain:<br />
# Point SSLCertificateChainFile at a file containing the<br />
# concatenation of PEM encoded CA certificates which form the<br />
# certificate chain for the server certificate. Alternatively<br />
# the referenced file can be the same as SSLCertificateFile<br />
# when the CA certificates are directly appended to the server<br />
# certificate for convinience.<br />
#SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt<br />
<br />
# Certificate Authority (CA):<br />
# Set the CA certificate verification path where to find CA<br />
# certificates for client authentication or alternatively one<br />
# huge file containing all of them (file must be PEM encoded)<br />
# Note: Inside SSLCACertificatePath you need hash symlinks<br />
# to point to the certificate files. Use the provided<br />
# Makefile to update the hash symlinks after changes.<br />
#SSLCACertificatePath /etc/ssl/certs/<br />
#SSLCACertificateFile /etc/apache2/ssl.crt/ca-bundle.crt<br />
# Certificate Revocation Lists (CRL):<br />
# Set the CA revocation path where to find CA CRLs for client<br />
# authentication or alternatively one huge file containing all<br />
# of them (file must be PEM encoded)<br />
# Note: Inside SSLCARevocationPath you need hash symlinks<br />
# to point to the certificate files. Use the provided<br />
# Makefile to update the hash symlinks after changes.<br />
#SSLCARevocationPath /etc/apache2/ssl.crl/<br />
#SSLCARevocationFile /etc/apache2/ssl.crl/ca-bundle.crl<br />
<br />
# Client Authentication (Type):<br />
# Client certificate verification type and depth. Types are<br />
# none, optional, require and optional_no_ca. Depth is a<br />
# number which specifies how deeply to verify the certificate<br />
# issuer chain before deciding the certificate is not valid.<br />
#SSLVerifyClient require<br />
#SSLVerifyDepth 10<br />
<br />
# Access Control:<br />
# With SSLRequire you can do per-directory access control based<br />
# on arbitrary complex boolean expressions containing server<br />
# variable checks and other lookup directives. The syntax is a<br />
# mixture between C and Perl. See the mod_ssl documentation<br />
# for more details.<br />
#<Location /><br />
#SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \<br />
# and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \<br />
# and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \<br />
# and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \<br />
# and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20 ) \<br />
# or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/<br />
#</Location><br />
<br />
# SSL Engine Options:<br />
# Set various options for the SSL engine.<br />
# o FakeBasicAuth:<br />
# Translate the client X.509 into a Basic Authorisation. This means that<br />
# the standard Auth/DBMAuth methods can be used for access control. The<br />
# user name is the `one line' version of the client's X.509 certificate.<br />
# Note that no password is obtained from the user. Every entry in the user<br />
# file needs this password: `xxj31ZMTZzkVA'.<br />
# o ExportCertData:<br />
# This exports two additional environment variables: SSL_CLIENT_CERT and<br />
# SSL_SERVER_CERT. These contain the PEM-encoded certificates of the<br />
# server (always existing) and the client (only existing when client<br />
# authentication is used). This can be used to import the certificates<br />
# into CGI scripts.<br />
# o StdEnvVars:<br />
# This exports the standard SSL/TLS related `SSL_*' environment variables.<br />
# Per default this exportation is switched off for performance reasons,<br />
# because the extraction step is an expensive operation and is usually<br />
# useless for serving static content. So one usually enables the<br />
# exportation for CGI and SSI requests only.<br />
# o StrictRequire:<br />
# This denies access when "SSLRequireSSL" or "SSLRequire" applied even<br />
# under a "Satisfy any" situation, i.e. when it applies access is denied<br />
# and no other module can change it.<br />
# o OptRenegotiate:<br />
# This enables optimized SSL connection renegotiation handling when SSL<br />
# directives are used in per-directory context.<br />
#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire<br />
<FilesMatch "\.(cgi|shtml|phtml|php)$"><br />
SSLOptions +StdEnvVars<br />
</FilesMatch><br />
<br />
# SSL Protocol Adjustments:<br />
# The safe and default but still SSL/TLS standard compliant shutdown<br />
# approach is that mod_ssl sends the close notify alert but doesn't wait for<br />
# the close notify alert from client. When you need a different shutdown<br />
# approach you can use one of the following variables:<br />
# o ssl-unclean-shutdown:<br />
# This forces an unclean shutdown when the connection is closed, i.e. no<br />
# SSL close notify alert is send or allowed to received. This violates<br />
# the SSL/TLS standard but is needed for some brain-dead browsers. Use<br />
# this when you receive I/O errors because of the standard approach where<br />
# mod_ssl sends the close notify alert.<br />
# o ssl-accurate-shutdown:<br />
# This forces an accurate shutdown when the connection is closed, i.e. a<br />
# SSL close notify alert is send and mod_ssl waits for the close notify<br />
# alert of the client. This is 100% SSL/TLS standard compliant, but in<br />
# practice often causes hanging connections with brain-dead browsers. Use<br />
# this only for browsers where you know that their SSL implementation<br />
# works correctly.<br />
# Notice: Most problems of broken clients are also related to the HTTP<br />
# keep-alive facility, so you usually additionally want to disable<br />
# keep-alive for those clients, too. Use variable "nokeepalive" for this.<br />
# Similarly, one has to force some clients to use HTTP/1.0 to workaround<br />
# their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and<br />
# "force-response-1.0" for this.<br />
BrowserMatch "MSIE [2-6]" \<br />
nokeepalive ssl-unclean-shutdown \<br />
downgrade-1.0 force-response-1.0<br />
# MSIE 7 and newer should be able to use keepalive<br />
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown<br />
<br />
<IfModule mod_rewrite.c><br />
RewriteEngine on<br />
RewriteRule ^/user/([a-z0-9-]+)/?$ /user/view.php?profile=$1&%{QUERY_STRING}<br />
RewriteRule ^/user/([a-z0-9-]+)/([a-z0-9-]+)/?$ /view/view.php?profile=$1&page=$2&%{QUERY_STRING}<br />
RewriteRule ^/group/([a-z0-9-]+)/?$ /group/view.php?homepage=$1&%{QUERY_STRING}<br />
RewriteRule ^/group/([a-z0-9-]+)/([a-z0-9-]+)/?$ /view/view.php?homepage=$1&page=$2&%{QUERY_STRING}<br />
</IfModule><br />
</VirtualHost><br />
</IfModule><br />
</syntaxhighlight><br />
<br />
'''4.''' Create the SSL folder in /etc/apache2/ if it doesn't already exist:<br />
<syntaxhighlight lang="bash"><br />
$ sudo mkdir /etc/apache2/ssl<br />
</syntaxhighlight><br />
<br />
'''5.''' Run the following command to set up your local cert and follow the ensuing steps for generating it:<br />
<syntaxhighlight lang="bash"><br />
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.pem<br />
</syntaxhighlight><br />
<br />
When it asks you for the "Common name", you can put your local server's name.<br />
<br />
'''6.''' Restart Apache.<br />
<syntaxhighlight lang="bash"><br />
$ sudo service apache2 restart<br />
</syntaxhighlight><br />
<br />
If you have an error message that pertains to your SSL site, you'll need to fix it first before continuing.<br />
<br />
'''7.''' Test the Apache config:<br />
<syntaxhighlight lang="bash"><br />
$ sudo apache2ctl configtest<br />
</syntaxhighlight><br />
<br />
'''8.''' Delete the old wwwroot as that still points to http://. If you left it, you wouldn't see all assetts.<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres psql mahara-main<br />
delete from config where field = 'wwwroot';<br />
Ctrl + d to exit<br />
</syntaxhighlight><br />
<br />
'''9.''' Go to your Mahara URL and use '''https://'''. Since you created a self-signed cert, your connection will be untrusted. Proceed anyway.<br />
<br />
'''10.''' Now you can use your developer site with web services as well.<br />
<br />
==Set up Behat==<br />
<br />
You can use the automated testing suite from Mahara 15.04 on. There is a [[Testing/Behat_Testing/Setup | separate installation page for Behat]].<br />
<br />
== XDebug ==<br />
<br />
=== VS Codium ===<br />
Install the extension PHP Debug <syntaxhighlight><br />
Name: PHP Debug<br />
Id: xdebug.php-debug<br />
Description: Debug support for PHP with Xdebug<br />
Version: 1.32.0<br />
Publisher: Xdebug<br />
VS Marketplace Link: https://marketplace.visualstudio.com/items?itemName=xdebug.php-debug<br />
</syntaxhighlight>Use the Xdebug wizard to help you with installation https://xdebug.org/wizard<br />
<br />
To use with Behat, make sure in your <code>99-xdebug.ini</code> file<syntaxhighlight lang="ini"><br />
# in /etc/php/8.1/mods-available<br />
zend_extension = xdebug <br />
xdebug.mode = debug<br />
<br />
# This will not work in Behat tests however, triggering it in VS Code will work<br />
xdebug.start_with_request = trigger<br />
# This will work with Behat tests as well as in VS Code - use this one for Behat<br />
# xdebug.start_with_request = yes<br />
<br />
</syntaxhighlight>Remember to restart your PHP server if applicable <code>sudo service php8.x-fpm restart</code></div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Developer_Environment&diff=13910Developer Area/Developer Environment2023-11-30T00:02:50Z<p>Robertl: /* PHP 8.1 */</p>
<hr />
<div>{{:Developer_Area/tabs}} <!-- to add further tabs, update the following page https://wiki.mahara.org/wiki/Developer_Area/tabs ... this will automatically cascade the changes to all relevant pages --><br />
<br />
<div style="float:right">__TOC__</div><br />
<br />
🚧 Note: this wiki is in the process of migrating to our GitLab Wiki.<br />
<br />
This page explains how to set up a copy of Mahara for development purposes.<br />
<br />
==The Docker version==<br />
<br />
Included in the main codebase is a docker version of Mahara with Behat capabilities. Before you try this, you will need to have Docker installed.<br />
See: https://docs.docker.com/engine/install/ubuntu/<br />
<br />
The instructions for running the docker version are here:<br><br />
https://git.mahara.org/mahara/mahara/-/blob/main/docker/README.md<br />
<br />
Please feel free to update if there are missing instructions that would be helpful to others.<br />
<br />
==The short version==<br />
<br />
Mahara is a fairly standard PHP web application. You mainly need to place it in your web server and give it a database, and a file storage directory. If you haven't set up a PHP web application before, skip to [[the long version]] down below.<br />
<br />
#Set up your Apache web server. For development purposes, it is often handy to have the web root sitting inside your home directory.<br />
#Retrieve a copy of the Mahara codebase. Place it in your Apache web root.<br />
#Create a Mahara <code>dataroot</code> directory '''outside''' your web root. Make it read/writeable by Apache.<br />
#Create a database instance and database user for Mahara to use.<br />
#Edit the Mahara <code>config.php</code> file so that Mahara knows the location of its <code>dataroot</code> directory, and its database login credentials.<br />
#Run the Mahara installer by visiting your Mahara site in your web browser. If you are missing any required PHP modules, Mahara should tell you. Depending on what you have already installed, you may need one or more of these:<br />
##<syntaxhighlight lang="text" inline="">php-pgsql</syntaxhighlight><br />
##<syntaxhighlight lang="text" inline="">php-gd</syntaxhighlight><br />
##<syntaxhighlight lang="text" inline="">php-curl</syntaxhighlight><br />
##<syntaxhighlight lang="text" inline="">php-intl</syntaxhighlight><br />
##<syntaxhighlight lang="text" inline="">php-json</syntaxhighlight><br />
##<syntaxhighlight lang="text" inline="">php-zip</syntaxhighlight><br />
#If you are using MySQL instead of Postgres<br />
##<syntaxhighlight lang="text" inline="">php7.4-mysql</syntaxhighlight> or<br />
##<syntaxhighlight lang="text" inline="">php-mysql</syntaxhighlight><br />
<br />
==The long version (for Windows)==<br />
<br />
If you want to install your developer environment on Windows, please [[Developer_Area/Developer_Environment_(Windows) | check the Windows instructions]].<br />
<br />
==The long version (for Linux)==<br />
<br />
The instructions explain one way to set up an installation of Mahara for development purposes. These instructions are specifically for Ubuntu Linux, although the process will probably be quite similar in other Linux versions.<br />
<br />
Note: Please have an apache2 installed on your server<br />
<syntaxhighlight lang="bash"><br />
sudo apt install apache2<br />
</syntaxhighlight><br />
<br />
'''The following instructions are for Ubuntu 22.10 and above, unless otherwise noted.'''<br />
<br />
=== Install required packages: ===<br />
<br />
==== PHP 7.4 ====<br />
<syntaxhighlight lang="bash"><br />
sudo apt install \<br />
make curl wget xvfb git gitk postgresql php7.4-common php-cli libapache2-mod-php7.4 \<br />
php7.4-curl php7.4-gd php-json php-ldap php-pgsql php-xmlrpc php-zip php-xml php-mbstring \<br />
nodejs php7.4-pgsql php7.4-xml php7.4-xmlrpc php7.4-mbstring php7.4-intl libssl-dev pdo_sqlite php7.4-zip <br />
<br />
# Set 7.4 as apache2's version of php<br />
sudo a2enmod php7.4<br />
</syntaxhighlight><br />
<br />
==== PHP 8.1 ====<br />
<syntaxhighlight lang="bash"><br />
sudo apt install \<br />
make curl wget xvfb git gitk postgresql php8.1-common php-cli libapache2-mod-php8.1 \<br />
php8.1-curl php8.1-gd php-json php-ldap php-pgsql php-xmlrpc php-zip php-xml php-mbstring \<br />
nodejs php8.1-pgsql php8.1-xml php8.1-xmlrpc php8.1-mbstring php8.1-intl libssl-dev pdo_sqlite php8.1-zip<br />
<br />
# Set 8.1 as apache2's version of php<br />
sudo a2enmod php8.1<br />
</syntaxhighlight>If you encounter any errors with the installation, you may want to try installing in chunks. See the [https://wiki.mahara.org/wiki/Developer_Area/Developer_Environment?section=8#Trouble-shooting Troubleshooting] section.<br />
<br />
==== To switch between PHP versions ====<br />
sudo a2dismod php7.4<br />
<br />
sudo a2enmod php8.1<br />
<br />
sudo<code>update-alternatives --config php</code><br />
<br />
restart apache2<br />
<br />
==== Node ====<br />
Check which version of Node you are running with <syntaxhighlight lang="bash" inline="">node -v</syntaxhighlight> To install: <code>sudo apt install nodejs</code><br />
<br />
=== Get a copy of the codebase ===<br />
Get a copy of the Mahara code from git. We'll put it under your home directory, in a new directory called <code>code</code>: See also [[Developer_Area/Getting_Code_from_Git|Getting Code from Git]]<br />
<br />
<syntaxhighlight lang="bash"><br />
cd ~<br />
mkdir code<br />
cd code<br />
<br />
# if you have an account on git.mahara.org ...<br />
git clone git@git.mahara.org:mahara/mahara.git<br />
<br />
# else, use http...<br />
git clone https://git.mahara.org/mahara/mahara.git<br />
<br />
# if that doesn't work, try...<br />
git clone https://github.com/MaharaProject/mahara.git<br />
<br />
<br />
</syntaxhighlight><br />
<br />
==== Fix permissions ====<br />
Give the Apache web server access to your Mahara code directory:<syntaxhighlight lang="bash"><br />
# Give all users read access + executable (if required) to the mahara directory<br />
sudo chmod a+rX ~/code/mahara<br />
<br />
# To avoid a possible 403 error later, confirm that your code directory permissions are also drwxr-xr-x<br />
ls -la ~/<br />
<br />
# To fix, run:<br />
sudo chmod a+rX ~/code<br />
<br />
# Your home directory permissions should be drwx--x--x<br />
ls -la /home # to check<br />
<br />
# To fix, run:<br />
sudo chmod a+X /home/[name of your home directory]<br />
</syntaxhighlight><br />
<br />
=== Create a Mahara database ===<br />
<br />
==== Create a PostgreSQL database user ====<br />
<syntaxhighlight lang="bash"><br />
# Use maharapassword as the password<br />
sudo -u postgres createuser -P -D -R -S maharauser<br />
</syntaxhighlight><br />
<br />
If Postgres is not available, check its status and if it says that it's inactive, start the service:<br />
<br />
<syntaxhighlight lang="bash"><br />
# Check status<br />
service postgresql status<br />
# Restart service<br />
sudo service postgresql start<br />
</syntaxhighlight><br />
<br />
==== Create a database ====<br />
<syntaxhighlight lang="bash"><br />
sudo -u postgres createdb -Omaharauser mahara-main<br />
</syntaxhighlight><br />
<br />
'''5.''' Using a text editor, copy these contents into a file and save it to <syntaxhighlight lang="text" inline="">~/code/mahara/htdocs/config.php</syntaxhighlight>:<br />
<br />
<syntaxhighlight lang="php"><br />
<?php<br />
$cfg = new stdClass();<br />
<br />
$branch = 'main';<br />
<br />
// database connection details<br />
// valid values for dbtype are 'postgres8' and 'mysql5'<br />
$cfg->dbtype = 'postgres';<br />
$cfg->dbhost = 'localhost';<br />
$cfg->dbuser = 'maharauser';<br />
$cfg->dbname = "mahara-$branch";<br />
$cfg->dbpass = 'maharapassword'; <br />
<br />
$cfg->dataroot = "/var/lib/maharadata/$branch";<br />
<br />
$cfg->sendemail = true;<br />
$cfg->sendallemailto = '<your email address>';<br />
<br />
$cfg->productionmode = false;<br />
$cfg->perftofoot = true;<br />
</syntaxhighlight><br />
<br />
Make sure to replace <syntaxhighlight lang="text" inline=""><your email address></syntaxhighlight> with your email address.<br />
<br />
If you're mainly testing, and you don't find the stack traces in these screen messages particularly useful, adding <syntaxhighlight lang="text" inline="">$cfg->log_backtrace_levels = LOG_LEVEL_ENVIRON;</syntaxhighlight> to config.php will display important warning messages on a single line, without stack traces.<br />
<br />
=== Set up <code>dataroot</code>, host, and site ===<br />
<br />
==== Create a <code>dataroot</code> directory ====<br />
This is where Mahara stores uploaded files):<syntaxhighlight lang="bash"><br />
sudo mkdir /var/lib/maharadata<br />
sudo mkdir /var/lib/maharadata/main<br />
sudo chown www-data:www-data /var/lib/maharadata/main<br />
</syntaxhighlight><br />
<br />
==== Set up local domain ====<br />
Set up a new local domain name <code>mahara</code> for your Mahara site, in <code>/etc/hosts:</code><syntaxhighlight lang="bash"><br />
sudo sh -c "echo '127.0.0.1 mahara' >> /etc/hosts"<br />
</syntaxhighlight><br />
<br />
==== Increase your PHP <code>post_max_size</code> ====<br />
These files will be under the version of php you are using, e.g. /etc/php/<PHP version>:<syntaxhighlight lang="bash"><br />
# for PHP 7.4<br />
sudo sh -c "echo 'post_max_size = 37M' >> /etc/php/7.4/cli/php.ini"<br />
sudo sh -c "echo 'upload_max_filesize = 32M' >> /etc/php/7.4/cli/php.ini"<br />
sudo sh -c "echo 'post_max_size = 37M' >> /etc/php/7.4/apache2/php.ini"<br />
sudo sh -c "echo 'upload_max_filesize = 32M' >> /etc/php/7.4/apache2/php.ini"<br />
<br />
# for PHP 8.1<br />
sudo sh -c "echo 'post_max_size = 37M' >> /etc/php/8.1/cli/php.ini"<br />
sudo sh -c "echo 'upload_max_filesize = 32M' >> /etc/php/8.1/cli/php.ini"<br />
sudo sh -c "echo 'post_max_size = 37M' >> /etc/php/8.1/apache2/php.ini"<br />
sudo sh -c "echo 'upload_max_filesize = 32M' >> /etc/php/8.1/apache2/php.ini"<br />
</syntaxhighlight><br />
<br />
Note: The 'post_max_size' is slightly bigger, as a POST command also contains some wrapper information. That wrapper is just text strings and relates to how much the form submits. So usually, 1 MB should be enough, but to be on the safe side, 5 MB would be better, which then also works for larger uploads.<br />
<br />
==== Create an Apache config file ====<br />
You can do this by first copying the following contents into a file called <code>mahara.conf</code>, saved in your home directory.<br />
<br />
See also: [[Developer_Area/Changing_Hostnames|Changing Hostnames]]<br />
<br />
<syntaxhighlight lang="apache"><br />
<VirtualHost *:80><br />
ServerName mahara<br />
DocumentRoot /home/<your username>/code/mahara/htdocs<br />
<br />
<Directory /home/<your username>/code><br />
Options Indexes FollowSymLinks MultiViews<br />
Require all granted<br />
</Directory><br />
<br />
ErrorLog /var/log/apache2/error.log<br />
LogLevel info<br />
<br />
CustomLog /var/log/apache2/access.log combined<br />
DirectoryIndex index.php index.html<br />
</VirtualHost><br />
</syntaxhighlight><br />
<br />
Then copy the file into your Apache sites-enable directory. The name to give the file will also vary depending on what version of Ubuntu you are using.<br />
<br />
<syntaxhighlight lang="text" inline="">sudo cp ~/mahara.conf /etc/apache2/sites-available/mahara.conf</syntaxhighlight><br />
<br />
==== Enable the site in Apache ====<br />
<syntaxhighlight lang="bash"><br />
sudo a2ensite mahara<br />
sudo apache2ctl configtest<br />
sudo apache2ctl graceful<br />
</syntaxhighlight><br />
<br />
<code>composer update && make initcomposerdev</code><br />
<br />
=== Set up <code>cron</code>: ===<br />
<syntaxhighlight lang="bash"><br />
# To get cron emails every minute:<br />
sudo vim /etc/cron.d/mahara<br />
* * * * * www-data /usr/bin/php /home/<your username>/code/mahara/htdocs/lib/cron.php<br />
<br />
# Otherwise:<br />
sudo vim /etc/cron.d/mahara<br />
* * * * * www-data /usr/bin/php /home/<your username>/code/mahara/htdocs/lib/cron.php >/dev/null 2>&1<br />
</syntaxhighlight><br />
<br />
=== Set up <code>npm</code> and <code>gulp</code> for theming ===<br />
The main Mahara git repository includes SCSS files that compile into CSS files, instead of including CSS files directly. We compile these using a Gulp (NodeJS) script that's included with the code. This can easily be invoked via our Makefile by doing "<code>make css</code>, but it requires setting up a couple of additional items first.<br />
<br />
<syntaxhighlight lang="bash"><br />
# First you'll need to run "npm install" from within the Mahara code directory<br />
# to get npm to properly set up all the proper caches and such.<br />
<br />
cd /home/<your username>/code/mahara<br />
npm install<br />
<br />
# Once that's finished, you'll need to install the npm "gulp" package using the "-g" <br />
# (global) flag, so that "gulp" can be run as a CLI command. This requires using sudo.<br />
<br />
cd /home/<your username>/code/mahara<br />
sudo npm install -g gulp<br />
<br />
# Mahara runs with at least version 14.x of node.<br />
<br />
sudo npm cache clean -f<br />
sudo npm install -g n <br />
sudo nvm use stable<br />
<br />
<br />
# Then update node-sass bindings:<br />
<br />
sudo npm rebuild node-sass<br />
</syntaxhighlight><br />
<br />
==== Build the themes (CSS) ====<br />
Run <code>make css</code> in the Mahara code directory to compile the CSS for Mahara themes. This will run the necessary series of instructions written out in the Makefile (including <code>npm install</code> for both the development and production JS libraries.<br />
<br />
<syntaxhighlight lang="bash"><br />
cd /home/<your username>/code/mahara<br />
make css<br />
<br />
# If you see a lot of errors, such as depreciation warnings for .css files:<br />
# Delete your /home/<your username>/code/mahara/package-lock.json<br />
# Then re-run "nvm install" and "make css", which should resolve the issues.<br />
<br />
# If you run 'make css' and see the following "ERROR: Can't find the "nvm" executable ..." try the following:<br />
<br />
# Steps (for me) to get nvm working<br />
<br />
## First Install nvm<br />
<br />
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash<br />
<br />
## Then make the .nvm.sh executable<br />
<br />
cd ~/.nvm && chmod 755 nvm.sh<br />
<br />
## Then reload your .bashrc file<br />
<br />
source ~/.bashrc<br />
<br />
## The set the first nvm version manually to create a default<br />
<br />
./nvm.sh && nvm install 12<br />
<br />
</syntaxhighlight><br />
<br />
==== Build the CSS in non-production mode ====<br />
Sometimes it gets confusing where the SASS info comes from to compile the css files. To make things easier, you can edit the 'Makefile' and change the production mode to false.<br />
<br />
<code>production = false</code><br />
<br />
Then run the <code>make css</code> again - this will compile the theming files to create <code>*.css</code> files in an easier to read format with comments about which sass file contributed to the chuck of CSS code, e.g.:<br />
<br />
<syntaxhighlight lang="css"><br />
/* line 27, /home/robertl/code/mahara-devel/mahara/htdocs/theme/raw/sass/layout/_footer.scss */<br />
.admin .footer .footer-inner {<br />
padding: 10px; }<br />
/* line 36, /home/robertl/code/mahara-devel/mahara/htdocs/theme/default/sass/layout/_footer.scss */<br />
.admin .footer .footer-inner {<br />
padding: 20px 10px;<br />
background: none;<br />
border: 0;<br />
border-radius: 0; }<br />
</syntaxhighlight><br />
<br />
=== Go to the site in your browser ===<br />
[http://mahara/ https://mahara/]<br />
<br />
You should see the Mahara installer page. If you do, congratulations! Your development environment is now set up.<br />
<br />
==Trouble-shooting==<br />
<br />
=== Checking what version of PHP is running on your site ===<br />
The PHP version on the CLI can be different to what is running on the site, especially if you run php-fpm which allows having two PHP servers of different serving different PHP versions.<br />
<br />
To check the PHP version your site is serving, create the file <code>/htdocs/test.php</code> and populate it with following lines.<syntaxhighlight lang="php"><br />
<?php<br />
phpinfo();<br />
<br />
// In your browser go to <your wwwroot>/test.php<br />
</syntaxhighlight><br />
<br />
=== Ubuntu 22.04 & PHP 8.x ===<br />
By default Ubuntu 22.04 will have PHP 8.2 enabled<br />
<br />
To run commands on a different PHP version (e.g. 8.x) run: <code>sudo update-alternatives --set php /usr/bin/php8.x</code><br />
<br />
Run <code>composer update && make initcomposerdev</code> so the composer.lock file matches your PHP version.<br />
===Enabling apache2's version of PHP===<br />
<br />
When you do:<br />
<syntaxhighlight lang="bash"><br />
# for PHP 7.4<br />
sudo a2enmod php7.4<br />
# for PHP 8.1<br />
sudo a2enmod php8.1<br />
<br />
</syntaxhighlight><br />
===Using MySql8===<br />
<br />
If you are going to be using '''MySql 8''' or later, you will need to do the following:<br />
<br />
*To install MySql 8 on Ubuntu 16.04 see https://www.digitalocean.com/community/tutorials/how-to-install-the-latest-mysql-on-ubuntu-16-04<br />
<br />
We need to add a line to our mysql conf file so that we can log in with older format passwords, so edit:<br />
<syntaxhighlight lang="bash"><br />
vi /etc/mysql/mysql.conf.d/mysqld.cnf<br />
</syntaxhighlight><br />
And make sure we have<br />
<syntaxhighlight lang="bash"><br />
[mysqld]<br />
default_authentication_plugin=mysql_native_password<br />
</syntaxhighlight><br />
<br />
You will need to set the db user to use the native password<br />
<br />
CREATE USER 'maharauser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mahara';<br />
<br />
=====MySQL in Docker=====<br />
If you have Docker available you can [[System Administrator's Guide/Installing Mahara/MySQL and Docker|spin it up a dedicated container for it]].<br />
<br />
===Installing Node versions===<br />
<br />
Check which version of Node you are running with<br />
<syntaxhighlight lang="bash"><br />
node -v<br />
</syntaxhighlight><br />
If you are running one of the long term service (lts) versions, 8.x or 10.x, that should work with Mahara fine. If you are running a higher version, or Node is not installed, you will need to add a version to run with Mahara.<br />
<br />
You can find various instructions on how to upgrade NodeJS on your distribution depending on your preference on package manager. (There are a couple of links at the bottom of this section.)<br />
<br />
A straight-forward way to manage multiple versions of Node is to use NVM:<br />
<br />
*[https://github.com/creationix/nvm#install-script/ How to install NVM]<br />
<br />
Once you have it installed run:<br />
<syntaxhighlight lang="bash"><br />
nvm install --lts<br />
nvm use --lts<br />
</syntaxhighlight><br />
This will download the latest lts version of Node and set it to default. Then if you need to switch versions for other projects, you can do so with "nvm use <version>".<br />
<br />
Links to alternative ways of installing Node:<br />
<br />
*[https://nodejs.org/en/download/package-manager/ Installing Node.js via package manager]<br />
*[https://tecadmin.net/install-latest-nodejs-npm-on-ubuntu/ How to Install Latest Nodejs & Npm on Ubuntu 16.04 & 14.04]<br />
ts-php versions - also add set alternatives here<br />
Note on changing versions: you can see which version apache is using by adding phpinfo() in your code.<br />
<br />
==Adding another branch==<br />
<br />
'''1.''' Create a new local branch for it in git (replace '''1.10 / 110''' with the version of Mahara for which you want to add a branch)<br />
<syntaxhighlight lang="bash"><br />
$ cd ~/code/mahara<br />
$ git checkout -t origin/1.10_STABLE<br />
</syntaxhighlight><br />
<br />
'''2.''' Create the sitedata directory for the new branch:<br />
<syntaxhighlight lang="bash"><br />
$ sudo mkdir /var/lib/maharadata/110stable<br />
$ sudo chown www-data:www-data /var/lib/maharadata/110stable<br />
</syntaxhighlight><br />
<br />
'''3.''' Create a database:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres createdb -Omaharauser mahara-110stable<br />
</syntaxhighlight><br />
<br />
'''4.''' Change your ~/code/mahara/htdocs/config.php to point to the 1.10 branch:<br />
<syntaxhighlight lang="php"><br />
$branch = '110stable';<br />
</syntaxhighlight><br />
<br />
'''5.''' Go to the site in your browser to run the Mahara installer:<br />
<br />
http://mahara/<br />
<br />
==Switching back to the main branch==<br />
<br />
'''1.''' Change the config.php file:<br />
<syntaxhighlight lang="php"><br />
$branch = 'main';<br />
</syntaxhighlight><br />
<br />
'''2.''' Switch to the right git branch:<br />
<syntaxhighlight lang="bash"><br />
$ cd ~/code/mahara/<br />
$ git checkout main<br />
</syntaxhighlight><br />
<br />
&nbsp;<br />
==Reset the database==<br />
<br />
'''1.''' Delete the old database:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres dropdb mahara-main<br />
</syntaxhighlight><br />
<br />
'''2.''' Create a new one with the same name:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres createdb -Omaharauser mahara-main<br />
</syntaxhighlight><br />
<br />
'''3.''' Go to the site in your browser to run the Mahara installer again:<br />
<br />
http://mahara/<br />
<br />
If you reset the database a lot, you might want to try out the "maharawipe.sh" utility at https://github.com/agwells/mahara-devtools<br />
<br />
==Testing a change submitted to Gerrit==<br />
<br />
'''1.''' Go to the change page, for example:<br />
<syntaxhighlight lang="bash"><br />
https://reviews.mahara.org/#change,230<br />
</syntaxhighlight><br />
<br />
'''2.''' In your local repository, switch to the branch listed in the Gerrit change (in this case: main):<br />
<syntaxhighlight lang="bash"><br />
$ cd ~/code/mahara<br />
$ git checkout main<br />
</syntaxhighlight><br />
<br />
'''3.''' Update your config.php to use the right branch, too.<br />
<br />
'''4.''' Copy the "Anonymous Git" URL in the "Download" section of "Patch Set X" and run it in ~/code/mahara to check the branch out, for example:<br />
<syntaxhighlight lang="bash"><br />
$ git fetch git://reviews.mahara.org/git/mahara refs/changes/30/230/1 && git checkout FETCH_HEAD<br />
$ make css<br />
</syntaxhighlight><br />
<br />
'''5.''' After finishing the testing, go back to main:<br />
<syntaxhighlight lang="bash"><br />
$ git checkout main<br />
$ make css<br />
</syntaxhighlight><br />
<br />
&nbsp;<br />
<br />
==Submitting a change to Gerrit==<br />
<br />
If you want to contribute a patch to the Mahara project yourself, please check out the wiki page on [[Developer_Area/Contributing_Code | contributing code]]. There is also a [[Developer_Area/Contributing_Code/Troubleshooting_your_Gerrit_connection | troubleshooting page]] in case you run into issues pushing code to Gerrit.<br />
<br />
&nbsp;<br />
==Copying a local install to another==<br />
<br />
This example uses the directory 15stable as an example for the new install and the 14stable install as database and sitedata directory to copy.<br />
<br />
'''1.''' Do a checkout of the code into a new directory:<br />
<syntaxhighlight lang="bash"><br />
$ cd ~<br />
$ mkdir code<br />
$ cd code<br />
$ git clone git@git.mahara.org:mahara/mahara.git 15stable<br />
</syntaxhighlight><br />
<br />
'''2.''' Copy the database:<br />
<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres pg_dump -Fc mahara-14stable > 14stable.pg<br />
$ sudo -u postgres createdb -Omaharauser mahara-15stable<br />
$ sudo -u postgres pg_restore -O -j4 -d mahara-15stable -U maharauser -W -h localhost 14stable.pg<br />
</syntaxhighlight><br />
<br />
If you've not given the user 'maharauser' full privileges yet (should only need to do this once)<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON SCHEMA public TO maharauser;'<br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO maharauser;'<br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO maharauser;'<br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO maharauser;'<br />
</syntaxhighlight><br />
<br />
'''3.''' Change the wwwroot in the new database:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres psql mahara-15stable<br />
delete from config where field = 'wwwroot';<br />
Ctrl + d to exit<br />
</syntaxhighlight><br />
<br />
'''4.''' Create the config file ~/code/mahara/htdocs/config.php:<br />
<syntaxhighlight lang="php"><br />
<?php<br />
$cfg = new StdClass;<br />
<br />
$branch = '15stable';<br />
<br />
// database connection details<br />
// valid values for dbtype are 'postgres8' and 'mysql5'<br />
$cfg->dbtype = 'postgres8';<br />
$cfg->dbhost = 'localhost';<br />
$cfg->dbuser = 'maharauser';<br />
$cfg->dbname = "mahara-$branch";<br />
$cfg->dbpass = 'mahara'; <br />
$cfg->dbprefix = '''''''; <br />
<br />
$cfg->dataroot = "/var/lib/maharadata/$branch";<br />
<br />
$cfg->sendemail = true;<br />
$cfg->sendallemailto = 'your email address';<br />
<br />
$cfg->log_dbg_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->log_info_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->log_warn_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->log_environ_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->perftofoot = true;<br />
</syntaxhighlight> <br />
<br />
'''5.''' Copy the source sitedata directory into the new sitedata folder:<br />
<syntaxhighlight lang="bash"><br />
$ sudo cp -r /var/lib/maharadata/14stable/ /var/lib/maharadata/15stable<br />
$ sudo chown -R www-data:www-data /var/lib/maharadata/15stable<br />
</syntaxhighlight><br />
<br />
'''6.''' Add a new entry to /etc/hosts:<br />
<syntaxhighlight lang="bash"><br />
127.0.0.1 15stable<br />
</syntaxhighlight><br />
<br />
'''7.''' Create a new Apache vhost file in /etc/apache2/sites-available/15stable.conf:<br />
<syntaxhighlight lang="apacheconf"><br />
<VirtualHost *:80><br />
ServerName 15stable<br />
DocumentRoot /home/<your username>/code/15stable/htdocs<br />
<br />
<Directory /home/<your username>/code><br />
Options Indexes FollowSymLinks MultiViews<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
<br />
ErrorLog /var/log/apache2/error.log<br />
LogLevel info<br />
<br />
CustomLog /var/log/apache2/access.log combined<br />
DirectoryIndex index.php index.html<br />
</VirtualHost><br />
</syntaxhighlight><br />
<br />
'''8.''' Enable the site in Apache:<br />
<syntaxhighlight lang="bash"><br />
$ sudo a2ensite 15stable<br />
$ sudo apache2ctl configtest<br />
$ sudo apache2ctl graceful<br />
</syntaxhighlight><br />
<br />
'''9.''' Go to the site in your browser to run the Mahara installer:<br />
<syntaxhighlight lang="bash"><br />
http://15stable/<br />
</syntaxhighlight><br />
<br />
'''10.''' Resetting the admin password:<br />
<br />
If you do not know the login info for the copied site's database or the new site uses a different 'passwordsaltmain' from the old one you can reset a users password via the CLI script "reset_password.php", for example if you need to reset the 'admin' user's password you can go:<br />
<br />
sudo -u www-data php htdocs/admin/cli/reset_password.php -u=admin -p=changeme<br />
<br />
This will reset the password and on next login you will be prompted to change the password again to something more robust.<br />
<br />
&nbsp;<br />
<br />
==Elasticsearch==<br />
<br />
If you want to test the Elasticsearch search plugin, you'll also need to set up and run an Elasticsearch server. See [[Developer Area/Setting up Elasticsearch]].<br />
&nbsp;<br />
==ClamAV==<br />
If you want to test the ClamAV virus protection see [[Developer Area/Setting up ClamAV|Setting up ClamAV]]<br />
<br />
&nbsp;<br />
==Set up site for local https://==<br />
<br />
You will need to set up your Mahara developer site with an SSL certificate if you want to use the web services functionality as that is only available over https.<br />
<br />
You should already have Apache 2 installed on your computer. Otherwise, Mahara wouldn't run. Install the openssl and ssl-cert packages:<br />
<br />
<syntaxhighlight lang="bash"><br />
$ sudo apt-get install openssl ssl-cert<br />
</syntaxhighlight><br />
<br />
'''1.''' Enable SSL in Apache 2:<br />
<syntaxhighlight lang="bash"><br />
$ cd /etc/apache2/mods-enabled/<br />
$ ls<br />
$ sudo a2enmod ssl<br />
$ service apache2 restart<br />
$ ls<br />
</syntaxhighlight><br />
<br />
You should see "ssl.conf" and "ssl.load"<br />
<br />
'''2.''' You'll need to check that the port for SSL traffic is configured.<br />
<syntaxhighlight lang="bash"><br />
$ cd ..<br />
$ cat ports.conf<br />
</syntaxhighlight><br />
<br />
If you see '''<IfModule ssl_module> Listen 443''', you are good to go.<br />
<br />
'''3.''' Enable SSL also in your Mahara Apache 2 config file.<br />
<syntaxhighlight lang="bash"><br />
$ vim sites-available/mahara.conf (or the name of your config file of the site for which you want to enable SSL)<br />
</syntaxhighlight><br />
<br />
Paste the following into the .conf file after the </VirtualHost> for port 80. The last re-write rules are only necessary if you use the "Clean URL" functionality.<br />
<syntaxhighlight lang="apache"><br />
<IfModule mod_ssl.c><br />
<VirtualHost *:443><br />
ServerName mahara<br />
<br />
DocumentRoot /home/'''<your username>'''/code/mahara/htdocs<br />
<Directory /home/'''<your username>'''/code><br />
Options Indexes FollowSymLinks MultiViews<br />
AllowOverride None<br />
Require all granted<br />
</Directory><br />
<br />
ErrorLog /var/log/apache2/mahara-ssl-error.log<br />
LogLevel info<br />
<br />
CustomLog /var/log/apache2/mahara-ssl-access.log combined<br />
<br />
# SSL Engine Switch:<br />
# Enable/Disable SSL for this virtual host.<br />
SSLEngine on<br />
<br />
# A self-signed (snakeoil) certificate can be created by installing<br />
# the ssl-cert package. See<br />
# /usr/share/doc/apache2.2-common/README.Debian.gz for more info.<br />
# If both key and certificate are stored in the same file, only the<br />
# SSLCertificateFile directive is needed.<br />
SSLCertificateFile /etc/apache2/ssl/apache.pem<br />
SSLCertificateKeyFile /etc/apache2/ssl/apache.key<br />
<br />
# Server Certificate Chain:<br />
# Point SSLCertificateChainFile at a file containing the<br />
# concatenation of PEM encoded CA certificates which form the<br />
# certificate chain for the server certificate. Alternatively<br />
# the referenced file can be the same as SSLCertificateFile<br />
# when the CA certificates are directly appended to the server<br />
# certificate for convinience.<br />
#SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt<br />
<br />
# Certificate Authority (CA):<br />
# Set the CA certificate verification path where to find CA<br />
# certificates for client authentication or alternatively one<br />
# huge file containing all of them (file must be PEM encoded)<br />
# Note: Inside SSLCACertificatePath you need hash symlinks<br />
# to point to the certificate files. Use the provided<br />
# Makefile to update the hash symlinks after changes.<br />
#SSLCACertificatePath /etc/ssl/certs/<br />
#SSLCACertificateFile /etc/apache2/ssl.crt/ca-bundle.crt<br />
# Certificate Revocation Lists (CRL):<br />
# Set the CA revocation path where to find CA CRLs for client<br />
# authentication or alternatively one huge file containing all<br />
# of them (file must be PEM encoded)<br />
# Note: Inside SSLCARevocationPath you need hash symlinks<br />
# to point to the certificate files. Use the provided<br />
# Makefile to update the hash symlinks after changes.<br />
#SSLCARevocationPath /etc/apache2/ssl.crl/<br />
#SSLCARevocationFile /etc/apache2/ssl.crl/ca-bundle.crl<br />
<br />
# Client Authentication (Type):<br />
# Client certificate verification type and depth. Types are<br />
# none, optional, require and optional_no_ca. Depth is a<br />
# number which specifies how deeply to verify the certificate<br />
# issuer chain before deciding the certificate is not valid.<br />
#SSLVerifyClient require<br />
#SSLVerifyDepth 10<br />
<br />
# Access Control:<br />
# With SSLRequire you can do per-directory access control based<br />
# on arbitrary complex boolean expressions containing server<br />
# variable checks and other lookup directives. The syntax is a<br />
# mixture between C and Perl. See the mod_ssl documentation<br />
# for more details.<br />
#<Location /><br />
#SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \<br />
# and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \<br />
# and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \<br />
# and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \<br />
# and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20 ) \<br />
# or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/<br />
#</Location><br />
<br />
# SSL Engine Options:<br />
# Set various options for the SSL engine.<br />
# o FakeBasicAuth:<br />
# Translate the client X.509 into a Basic Authorisation. This means that<br />
# the standard Auth/DBMAuth methods can be used for access control. The<br />
# user name is the `one line' version of the client's X.509 certificate.<br />
# Note that no password is obtained from the user. Every entry in the user<br />
# file needs this password: `xxj31ZMTZzkVA'.<br />
# o ExportCertData:<br />
# This exports two additional environment variables: SSL_CLIENT_CERT and<br />
# SSL_SERVER_CERT. These contain the PEM-encoded certificates of the<br />
# server (always existing) and the client (only existing when client<br />
# authentication is used). This can be used to import the certificates<br />
# into CGI scripts.<br />
# o StdEnvVars:<br />
# This exports the standard SSL/TLS related `SSL_*' environment variables.<br />
# Per default this exportation is switched off for performance reasons,<br />
# because the extraction step is an expensive operation and is usually<br />
# useless for serving static content. So one usually enables the<br />
# exportation for CGI and SSI requests only.<br />
# o StrictRequire:<br />
# This denies access when "SSLRequireSSL" or "SSLRequire" applied even<br />
# under a "Satisfy any" situation, i.e. when it applies access is denied<br />
# and no other module can change it.<br />
# o OptRenegotiate:<br />
# This enables optimized SSL connection renegotiation handling when SSL<br />
# directives are used in per-directory context.<br />
#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire<br />
<FilesMatch "\.(cgi|shtml|phtml|php)$"><br />
SSLOptions +StdEnvVars<br />
</FilesMatch><br />
<br />
# SSL Protocol Adjustments:<br />
# The safe and default but still SSL/TLS standard compliant shutdown<br />
# approach is that mod_ssl sends the close notify alert but doesn't wait for<br />
# the close notify alert from client. When you need a different shutdown<br />
# approach you can use one of the following variables:<br />
# o ssl-unclean-shutdown:<br />
# This forces an unclean shutdown when the connection is closed, i.e. no<br />
# SSL close notify alert is send or allowed to received. This violates<br />
# the SSL/TLS standard but is needed for some brain-dead browsers. Use<br />
# this when you receive I/O errors because of the standard approach where<br />
# mod_ssl sends the close notify alert.<br />
# o ssl-accurate-shutdown:<br />
# This forces an accurate shutdown when the connection is closed, i.e. a<br />
# SSL close notify alert is send and mod_ssl waits for the close notify<br />
# alert of the client. This is 100% SSL/TLS standard compliant, but in<br />
# practice often causes hanging connections with brain-dead browsers. Use<br />
# this only for browsers where you know that their SSL implementation<br />
# works correctly.<br />
# Notice: Most problems of broken clients are also related to the HTTP<br />
# keep-alive facility, so you usually additionally want to disable<br />
# keep-alive for those clients, too. Use variable "nokeepalive" for this.<br />
# Similarly, one has to force some clients to use HTTP/1.0 to workaround<br />
# their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and<br />
# "force-response-1.0" for this.<br />
BrowserMatch "MSIE [2-6]" \<br />
nokeepalive ssl-unclean-shutdown \<br />
downgrade-1.0 force-response-1.0<br />
# MSIE 7 and newer should be able to use keepalive<br />
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown<br />
<br />
<IfModule mod_rewrite.c><br />
RewriteEngine on<br />
RewriteRule ^/user/([a-z0-9-]+)/?$ /user/view.php?profile=$1&%{QUERY_STRING}<br />
RewriteRule ^/user/([a-z0-9-]+)/([a-z0-9-]+)/?$ /view/view.php?profile=$1&page=$2&%{QUERY_STRING}<br />
RewriteRule ^/group/([a-z0-9-]+)/?$ /group/view.php?homepage=$1&%{QUERY_STRING}<br />
RewriteRule ^/group/([a-z0-9-]+)/([a-z0-9-]+)/?$ /view/view.php?homepage=$1&page=$2&%{QUERY_STRING}<br />
</IfModule><br />
</VirtualHost><br />
</IfModule><br />
</syntaxhighlight><br />
<br />
'''4.''' Create the SSL folder in /etc/apache2/ if it doesn't already exist:<br />
<syntaxhighlight lang="bash"><br />
$ sudo mkdir /etc/apache2/ssl<br />
</syntaxhighlight><br />
<br />
'''5.''' Run the following command to set up your local cert and follow the ensuing steps for generating it:<br />
<syntaxhighlight lang="bash"><br />
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.pem<br />
</syntaxhighlight><br />
<br />
When it asks you for the "Common name", you can put your local server's name.<br />
<br />
'''6.''' Restart Apache.<br />
<syntaxhighlight lang="bash"><br />
$ sudo service apache2 restart<br />
</syntaxhighlight><br />
<br />
If you have an error message that pertains to your SSL site, you'll need to fix it first before continuing.<br />
<br />
'''7.''' Test the Apache config:<br />
<syntaxhighlight lang="bash"><br />
$ sudo apache2ctl configtest<br />
</syntaxhighlight><br />
<br />
'''8.''' Delete the old wwwroot as that still points to http://. If you left it, you wouldn't see all assetts.<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres psql mahara-main<br />
delete from config where field = 'wwwroot';<br />
Ctrl + d to exit<br />
</syntaxhighlight><br />
<br />
'''9.''' Go to your Mahara URL and use '''https://'''. Since you created a self-signed cert, your connection will be untrusted. Proceed anyway.<br />
<br />
'''10.''' Now you can use your developer site with web services as well.<br />
<br />
==Set up Behat==<br />
<br />
You can use the automated testing suite from Mahara 15.04 on. There is a [[Testing/Behat_Testing/Setup | separate installation page for Behat]].<br />
<br />
== XDebug ==<br />
<br />
=== VS Codium ===<br />
Install the extension PHP Debug <syntaxhighlight><br />
Name: PHP Debug<br />
Id: xdebug.php-debug<br />
Description: Debug support for PHP with Xdebug<br />
Version: 1.32.0<br />
Publisher: Xdebug<br />
VS Marketplace Link: https://marketplace.visualstudio.com/items?itemName=xdebug.php-debug<br />
</syntaxhighlight>Use the Xdebug wizard to help you with installation https://xdebug.org/wizard<br />
<br />
To use with Behat, make sure in your <code>99-xdebug.ini</code> file<syntaxhighlight lang="ini"><br />
# in /etc/php/8.1/mods-available<br />
zend_extension = xdebug <br />
xdebug.mode = debug<br />
<br />
# This will not work in Behat tests however, triggering it in VS Code will work<br />
xdebug.start_with_request = trigger<br />
# This will work with Behat tests as well as in VS Code - use this one for Behat<br />
# xdebug.start_with_request = yes<br />
<br />
</syntaxhighlight>Remember to restart your PHP server if applicable <code>sudo service php8.x-fpm restart</code></div>Robertlhttps://wiki.mahara.org/index.php?title=Testing_Area/Manual_item_testing&diff=13640Testing Area/Manual item testing2023-03-24T02:14:58Z<p>Robertl: </p>
<hr />
<div><br />
The Mahara community uses Launchpad to track two main items relating to development:<br />
* wish list items - new features (initially reflected as a roadmaps, larger pieces of development work) or changed behaviour to improve Mahara,<br />
and,<br />
* bug items - incorrect behaviour (see on this pages' parent).<br />
<br />
Under construction at present</div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Testing/Unit_Testing&diff=13639Developer Area/Testing/Unit Testing2023-03-24T02:13:41Z<p>Robertl: /* New instructions */</p>
<hr />
<div>=Unit Test Introduction=<br />
Work is currently underway to integrate phpunit unit testing in to Mahara.<br />
Documentation for phpunit is available at http://www.phpunit.de/manual/current/en/<br />
<br />
=Setup and Running=<br />
You'll need to already have mahara set up and installed. Default settings are copied from your running configuration and overridden with unit test settings.<br />
<br />
==Old instructions==<br />
<br />
*Install phpunit on your development machine<br />
*Switch to a user with permission to access your dataroot directory. In debian this would be:<br />
<br />
sudo su - www-data<br />
<br />
*Change directory to the root of the mahara git tree (the directory that htdocs is in)<br />
<br />
cd $path_to_mahara<br />
<br />
*Run phpunit, first option only if you have set up your cli for php properly:<br />
<br />
phpunit .<br />
OR<br />
php -c /etc/php5/apache2/php.ini /usr/bin/phpunit .<br />
OR<br />
php -c /etc/php5/php-fpm/php.ini /usr/bin/phpunit .<br />
<br />
<br />
==New instructions==<br />
This requires phpunit 3.7 or later which is installed by running:<br />
<br />
make initcomposer<br />
<br />
Unit tests can be run by:<br />
<br />
make phpunit<br />
<br />
From the main directory of mahara (eg, parent directory of htdocs)<br />
<br />
If it complains about 'session data directory' not being writable then run as follows:<br />
<br />
sudo -u www-data make phpunit<br />
<br />
=Best Practices=<br />
TODO</div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Bug_Status&diff=13638Developer Area/Bug Status2023-03-24T02:07:16Z<p>Robertl: /* Status */</p>
<hr />
<div>The status, priority, milestone, tags in [https://bugs.launchpad.net/mahara Launchpad] are used by the Mahara core team for effective bug management. This page describe the current use of these features.<br />
<br />
== Status ==<br />
<br />
The bug status reflects the current state of the bug. When the new bug is reported it obtains "New" status automatically (unless specified otherwise) and then usually goes through a number other statuses depending on developer actions and decisions. The list below describes each of the statuses and provides useful hints on status changes.<br />
<br />
*'''New''' - The status field is automatically set to "new" when a bug is created.<br />
*'''Triaged''' - Once we've looked at a bug and decided on a priority and a milestone, it's changed to "triaged". Triaged is for bugs we haven't tried to reproduce.<br />
*'''Confirmed/Incomplete''' - Status is changed to "confirmed" once we've been able to reproduce it or to "incomplete" if we need more information to be able to reproduce it.<br />
* '''Invalid , Wont fix, Opinion''' - These are statuses that effectively close the bug. "Invalid" is for things we don't really think are bugs at all, or maybe they're bugs but not bugs in Mahara. "Won't fix" is self-explanatory. "Opinion" is a softer version of "won't fix" and indicates to the reporter that there is reasonable disagreement about whether the bug is a bug or should be fixed (and invites more comments).<br />
*'''In progress''' - The bug is currently being worked on.<br />
*'''Fix committed''' - A fix is committed to git. Bugs which have been fixed only in the commit author's local branch or personal clone repository, or [[Developer_Area/Contributing_Code|submitted for revision]] should not be marked as "Fix Committed" until they appear in the master (or stable) branch from which releases are created (which will happen when the change on [https://reviews.mahara.org/ the revision system] is marked as merged). '''Any time a bug is marked as "fix committed", the milestone field must also be updated''' to the next planned release milestone on the appropriate branch, and if the bug is still unassigned, it should be assigned to whoever provided the patch.<br />
*'''Fix Released''' - Status is flipped to "Fix Released" once there is a stable release (i.e. a tarball), which includes the fix (alphas, betas and release candidates don't count).<br />
<br />
Periodically, the core development team will go through the open bugs, decide what should be fixed before the next release and update the status and milestone fields accordingly.<br />
<br />
== Importance ==<br />
<br />
Importance is highly subjective, but here are some rough guidelines for how we use them in Mahara. A bug with the following importance might have some of these characteristics:<br />
<br />
* '''Critical''': Use only when we should drop everything and fix this ASAP<br />
** Prevents Mahara from functioning entirely<br />
** Causes data loss or other irreversible problems<br />
** Likely to be encountered by many users<br />
** Security flaw that doesn't require any user account on the site<br />
** Something that '''must''' get done before the next release<br />
<br />
* '''High'''<br />
** Obviously "broken" to end user. Visible error messages, wrong item being deleted, etc.<br />
** Likely to be encountered by many users<br />
** Security flaw that requires a logged-in user account on the site<br />
** Usability problem that causes extreme inconvenience<br />
<br />
* '''Medium'''<br />
** Incorrect behavior, but a workaround is possible<br />
** Unlikely to be encountered by most users<br />
** Security flaw that requires an admin account and/or has limited consequences<br />
** Usability problem that causes major inconvenience<br />
<br />
* '''Low'''<br />
** Works correctly, but doesn't follow best practices<br />
** Affects very few users<br />
** Easy workaround is available<br />
** A minor deviation from security "best practices", but not close to exploitable by itself<br />
** Usability problem that causes moderate or minor inconvenience<br />
<br />
* '''Wishlist'''<br />
** Not a bug<br />
** Suggestions for new features & functionality<br />
<br />
== Tags ==<br />
<br />
We encourage the use of tags to group bugs together! Some recommended tags:<br />
<br />
* '''bite-sized''': A bug with a trivial fix. We use these during training to introduce new developers to Mahara's development process.<br />
<br />
* '''snack-sized''': A bug that is slightly harder than bite-sized. We use these during more advanced Mahara development training events.<br />
<br />
* '''ie9''', '''ie10''', '''ff''', '''chrome''', '''opera''', '''safari''', etc.: A tag that indicates a browser-specific bug.<br />
<br />
* '''front-end''': A bug that requires a front-end developer, i.e. for CSS, HTML and Javascript changes.<br />
<br />
* '''mysql''', '''postgres''': A bug that only affects one type of database.<br />
<br />
* '''fastcgi''', '''nginx''', '''windows''': A bug that's only present when running Mahara in a non-standard environment.<br />
<br />
* '''usability''': Indicates a problem area in Mahara's user interface; i.e. things that are difficult for users to figure out, or tasks that are annoying or difficult to accomplish.<br />
<br />
* '''ldap''', '''note''', '''blogs''', '''tinymce''', '''groups''', etc.: Tags that indicate which plugin or part of Mahara a bug affects.<br />
<br />
* '''regression''':<br />
** Functionality that used to work, but [https://en.wikipedia.org/wiki/Software_regression stopped working] after a known code change.<br />
** It's helpful to use '''[https://git-scm.com/docs/git-bisect git bisect]''' to find the exact code change that introduced the bug, so that you can correct the underlying problem.<br />
<br />
== Security ==<br />
<br />
Bugs with security implications should be marked as '''Private Security''' in the '''This report contains information that is...''' option. See this page for more info: [[Security]]<br />
<br />
When the bug fix for a security bug is released, its status should be changed to '''Public Security'''. Or, if a bug is already widely known, or if it's a very low-priority security bug, it may be advisable to change it to '''Public Security''' even before its release.<br />
<br />
== Milestone & "Affects" ==<br />
<br />
=== Affected versions ===<br />
<br />
The "Affects" column indicates which series' of Mahara the bug is present in. In most cases this will include the current development series. You should check to see whether the bug is also present in the current three [[SupportedVersions|supported releases]].<br />
<br />
=== Milestone ===<br />
<br />
The milestone is used for three main things:<br />
<br />
# as a TODO list for an upcoming release<br />
# as a record of when a bug was fixed<br />
# as an extended changelog for a given release<br />
<br />
You can decide whether & which milestone to apply based on the bug's status:<br />
<br />
* '''Triaged''', '''Confirmed''', or '''In Progress''': Assign a milestone if:<br />
** We want to get it in the next possible release<br />
** And/or a developer has actually started implementation on it<br />
<br />
* '''Fix committed''': Always assign a milestone, indicating the next stable release for the branch.<br />
<br />
* '''Fix released'''<br />
** Usually a bug in this status will have passed through "Fix committed" first, so it will already have a milestone.<br />
** Exception: Sometimes an old bug in the tracker turns out to be no longer present in the latest release because some unrelated piece of code solved the problem. In those cases, you can change the bug's status to "Fix released" but give no milestone.<br />
<br />
* '''Won't fix''': A bug in "Won't Fix" status should not have a milestone.<br />
<br />
=== Backporting ===<br />
<br />
We don't backport all bug fixes to all versions of Mahara. For the full details see: "[[SupportedVersions#Definition_of_support|Supported Versions: Definition of support]]"<br />
<br />
Here's how we record backporting decisions in Launchpad. If you know a bug is present in older Mahara release:<br />
<br />
* '''Supported''' release, '''Will''' backport: Mark the series as "affected" and give it a Milestone.<br />
* '''Supported''' release, '''Won't''' backport: Mark as "affected", no Milestone, status "Won't Fix". Marking it as affected and "Won't fix" lets us know we already made a backporting decision, so we don't accidentally rehash the same discussion.<br />
* '''Unsupported''' release: These are never backported. Sometimes, for informational purposes, it can be useful to mark the most recent unsupported & non-fixed branch as affected and "Won't Fix". But it's entirely optional. Example:<br />
** If the current stable release is 22.10 Older supported releases are 22.04 and 21.10.<br />
** I find a bug that turns out to be a regression introduced in Mahara 21.04, then it will be backported to 22.10, 22.04, and 21.10 dev branches to be added to those stable releases.<br />
** Result: I may mark the 21.04 release as affected and "Won't Fix", to let people know at a glance that the bug goes back earlier than 21.10.<br />
<br />
== Relevant links ==<br />
<br />
* Ubuntu's similar rules for prioritizing bugs: https://wiki.ubuntu.com/Bugs/Importance</div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Accessibility_Checklist&diff=13637Developer Area/Accessibility Checklist2023-03-24T01:56:54Z<p>Robertl: /* Checklist for developers: Things to think about when designing for accessibility */</p>
<hr />
<div>See also [[Accessibility]] for an overview of Mahara's stance on accessibility.<br />
<br />
== Checklist for developers: Things to think about when designing for accessibility ==<br />
<br />
Note: Any explanatory text (text which should be hidden from sighted users but available to screen readers) should be in an element with class '''sr-only''' (for Mahara 15.10 through to 22.04) or '''visually-hidden''' (for Mahara 22.10+).<br />
<br />
=== Testing ===<br />
<br />
* Always test with a screen reader, preferably more than one (Orca in Linux, JAWS or NVDA in Windows, VoiceOver in OS X, etc.) Often this will give different results than testing for keyboard accessibility without a screen reader<br />
* Use HTML validators (such as [http://wave.webaim.org/ WAVE Accessibility Checker] or the [http://validator.w3.org/ W3C Validation Service]) to make sure there are no serious errors<br />
<br />
http://accessibility.psu.edu/protocol has a good overview of various ways you can test.<br />
<br />
=== General ===<br />
<br />
* All images need alt text, unless it would mean duplicating the text beside them (in which case have alt=""). If the image is a link or button, the text should describe what it links to. Otherwise, it should just say what the image is/shows. Note that this covers both <img> and <input type="image"> elements<br />
<br />
Example:<br />
{* describing what an image shows *}<br />
<img src="{theme_url images/success_small.png}" alt="{str tag=completed section=artefact.plans}"><br />
<br />
{* identifying where a link goes *}<br />
<source lang="php" container="div"><a href="/account/activity/index.php"><img src="{theme_url images/message.png}" alt="{str tag=inbox}"></a></source><br />
<br />
{* showing what a button does *}<br />
<input type="image" src="{theme_url images/btn_configure.png}" alt="{str tag=configure}"><br />
<br />
A helpful guide for '''alt''' text can be found here: [https://4syllables.com.au/articles/text-alternatives-decision-tree/ 4syllables - Text alternatives – a decision tree]<br />
<br />
* Use descriptive text in links and buttons - no "Click here" links. You should be able to work out what the link does without looking at the surrounding text<br />
* Use buttons and links consistently.<br />
** Use a ''link'' if you're navigating to a predefined page or section (navigation, tabs, etc.)<br />
** Use a ''button'' if you're changing information or state (submitting a form, editing or deleting content, searching, etc.)<br />
* Never use a positive tabindex, but do use tabindex="0" or tabindex="-1" for elements which should be focusable but aren't by default<br />
** tabindex="-1" means it can take focus (via Javascript) but cannot be reached by sequential focus navigation (i.e. tabbing)<br />
** tabindex="0" means it can take focus and '''can''' be reached by tabbing<br />
** Elements that are by default focusable and can be reached by tabbing are mainly links and form elements. See http://www.w3.org/TR/html5/editing.html#sequential-focus-navigation-and-the-tabindex-attribute<br />
* Make sure everything that can be done with a mouse can also be done with a keyboard. Common pitfalls include<br />
** Drag and drop (an accessible alternative should be provided)<br />
** Elements that are clickable but are actually '''divs''' or '''spans''' (either they should be changed to be either '''button''' or '''a''' tags, or tabindex="0" and the "keydown" event should be used)<br />
<br />
Example:<br />
'''(OK)'''<br />
&lt;span class="button" tabindex="0">Create group<br />
<br />
jQuery('.button').on('click keydown', function(event) {<br />
// This will fire when the button is clicked or when the user presses Space or Enter on it<br />
if ((event.type == 'click' && event.buttons > 0) || event.keyCode == 32 || event.keyCode == 13) {<br />
// Do something<br />
}<br />
});<br />
<br />
'''(Better)'''<br />
<button type="button" class="button">Create group</button><br />
<br />
jQuery('.button').click(function(event) {<br />
// For buttons, the 'click' event will catch Space/Enter as well<br />
// Do something<br />
});<br />
<br />
* Generally speaking, use the smallest number of elements necessary to achieve your purpose, and use semantic ones where appropriate<br />
<br />
=== Forms ===<br />
<br />
* All form elements need labels, without exception. If a label wouldn't look good then make it hidden (if you're using pieforms to do this just set 'hiddenlabel' to true)<br />
<br />
Example:<br />
{* in a template *}<br />
<input id="username" type="text" name="username" /><br />
<label for="username" class="sr-only">{str tag=username}</label><br />
<br />
// Using pieforms<br />
'username' => array(<br />
'type' => 'text',<br />
'title' => get_string('username'),<br />
'hiddenlabel' => true,<br />
// ...<br />
)<br />
<br />
* Include a description of the format you expect when creating format-specific text boxes such as date entries or colour pickers. Something like "Use the format YYYY/MM/DD" is enough. It's also nice to accept multiple formats even if you only describe one, accepting either YYYY/MM/DD or YY/MM/DD in a date entry for example<br />
<br />
=== JavaScript and AJAX ===<br />
<br />
* If you load content with AJAX or hide/show content, move focus to the start (first element or first focusable element) of what you loaded<br />
<br />
Example:<br />
jQuery('.expandable-head a.toggle').click(function() {<br />
var body = jQuery(this).next('.expandable-body')<br />
body.toggle();<br />
if (body.is(':visible')) {<br />
// Set focus<br />
body.find('a').first().focus();<br />
}<br />
});<br />
<br />
* Small dialogs (such as help boxes) should be inserted into the tab order after the element which activates them. Large ones should open outside the main content (ie. at the end of the <body>), set focus to their close button and set the aria-hidden attribute on the rest of the page (usually #container)<br />
<br />
Example:<br />
jQuery('#dialog').appendTo('body').show();<br />
jQuery('#dialog .closebutton').focus();<br />
jQuery('#container').attr('aria-hidden', true);<br />
<br />
* Widgets like tabs, accordions, etc. need hidden text to show their state. Basically, whenever you programmatically change the state of a widget (active, inactive, disabled, etc.) you should use hidden text to show which state the widget is in<br />
<br />
Example:<nowiki><br />
<li class="current-tab"><a href="#">First tab <span class="sr-only">(tab selected)</span></a></li><br />
<li><a href="#">Second tab <span class="sr-only">(tab)</span></a></li></nowiki><br />
<br />
When the second tab is clicked, its accessible text should change to "(tab selected)" and that of the first tab should change to "(tab)"</div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Accessibility_Checklist&diff=13636Developer Area/Accessibility Checklist2023-03-24T01:56:33Z<p>Robertl: /* Checklist for developers: Things to think about when designing for accessibility */</p>
<hr />
<div>See also [[Accessibility]] for an overview of Mahara's stance on accessibility.<br />
<br />
== Checklist for developers: Things to think about when designing for accessibility ==<br />
<br />
Note: Any explanatory text (text which should be hidden from sighted users but available to screen readers) should be in an element with class '''sr-only''' (for Mahara 15.10 through to 22.04) or '''visually-hidden''' (for Mahara 22.1+).<br />
<br />
=== Testing ===<br />
<br />
* Always test with a screen reader, preferably more than one (Orca in Linux, JAWS or NVDA in Windows, VoiceOver in OS X, etc.) Often this will give different results than testing for keyboard accessibility without a screen reader<br />
* Use HTML validators (such as [http://wave.webaim.org/ WAVE Accessibility Checker] or the [http://validator.w3.org/ W3C Validation Service]) to make sure there are no serious errors<br />
<br />
http://accessibility.psu.edu/protocol has a good overview of various ways you can test.<br />
<br />
=== General ===<br />
<br />
* All images need alt text, unless it would mean duplicating the text beside them (in which case have alt=""). If the image is a link or button, the text should describe what it links to. Otherwise, it should just say what the image is/shows. Note that this covers both <img> and <input type="image"> elements<br />
<br />
Example:<br />
{* describing what an image shows *}<br />
<img src="{theme_url images/success_small.png}" alt="{str tag=completed section=artefact.plans}"><br />
<br />
{* identifying where a link goes *}<br />
<source lang="php" container="div"><a href="/account/activity/index.php"><img src="{theme_url images/message.png}" alt="{str tag=inbox}"></a></source><br />
<br />
{* showing what a button does *}<br />
<input type="image" src="{theme_url images/btn_configure.png}" alt="{str tag=configure}"><br />
<br />
A helpful guide for '''alt''' text can be found here: [https://4syllables.com.au/articles/text-alternatives-decision-tree/ 4syllables - Text alternatives – a decision tree]<br />
<br />
* Use descriptive text in links and buttons - no "Click here" links. You should be able to work out what the link does without looking at the surrounding text<br />
* Use buttons and links consistently.<br />
** Use a ''link'' if you're navigating to a predefined page or section (navigation, tabs, etc.)<br />
** Use a ''button'' if you're changing information or state (submitting a form, editing or deleting content, searching, etc.)<br />
* Never use a positive tabindex, but do use tabindex="0" or tabindex="-1" for elements which should be focusable but aren't by default<br />
** tabindex="-1" means it can take focus (via Javascript) but cannot be reached by sequential focus navigation (i.e. tabbing)<br />
** tabindex="0" means it can take focus and '''can''' be reached by tabbing<br />
** Elements that are by default focusable and can be reached by tabbing are mainly links and form elements. See http://www.w3.org/TR/html5/editing.html#sequential-focus-navigation-and-the-tabindex-attribute<br />
* Make sure everything that can be done with a mouse can also be done with a keyboard. Common pitfalls include<br />
** Drag and drop (an accessible alternative should be provided)<br />
** Elements that are clickable but are actually '''divs''' or '''spans''' (either they should be changed to be either '''button''' or '''a''' tags, or tabindex="0" and the "keydown" event should be used)<br />
<br />
Example:<br />
'''(OK)'''<br />
&lt;span class="button" tabindex="0">Create group</span><br />
<br />
jQuery('.button').on('click keydown', function(event) {<br />
// This will fire when the button is clicked or when the user presses Space or Enter on it<br />
if ((event.type == 'click' && event.buttons > 0) || event.keyCode == 32 || event.keyCode == 13) {<br />
// Do something<br />
}<br />
});<br />
<br />
'''(Better)'''<br />
<button type="button" class="button">Create group</button><br />
<br />
jQuery('.button').click(function(event) {<br />
// For buttons, the 'click' event will catch Space/Enter as well<br />
// Do something<br />
});<br />
<br />
* Generally speaking, use the smallest number of elements necessary to achieve your purpose, and use semantic ones where appropriate<br />
<br />
=== Forms ===<br />
<br />
* All form elements need labels, without exception. If a label wouldn't look good then make it hidden (if you're using pieforms to do this just set 'hiddenlabel' to true)<br />
<br />
Example:<br />
{* in a template *}<br />
<input id="username" type="text" name="username" /><br />
<label for="username" class="sr-only">{str tag=username}</label><br />
<br />
// Using pieforms<br />
'username' => array(<br />
'type' => 'text',<br />
'title' => get_string('username'),<br />
'hiddenlabel' => true,<br />
// ...<br />
)<br />
<br />
* Include a description of the format you expect when creating format-specific text boxes such as date entries or colour pickers. Something like "Use the format YYYY/MM/DD" is enough. It's also nice to accept multiple formats even if you only describe one, accepting either YYYY/MM/DD or YY/MM/DD in a date entry for example<br />
<br />
=== JavaScript and AJAX ===<br />
<br />
* If you load content with AJAX or hide/show content, move focus to the start (first element or first focusable element) of what you loaded<br />
<br />
Example:<br />
jQuery('.expandable-head a.toggle').click(function() {<br />
var body = jQuery(this).next('.expandable-body')<br />
body.toggle();<br />
if (body.is(':visible')) {<br />
// Set focus<br />
body.find('a').first().focus();<br />
}<br />
});<br />
<br />
* Small dialogs (such as help boxes) should be inserted into the tab order after the element which activates them. Large ones should open outside the main content (ie. at the end of the <body>), set focus to their close button and set the aria-hidden attribute on the rest of the page (usually #container)<br />
<br />
Example:<br />
jQuery('#dialog').appendTo('body').show();<br />
jQuery('#dialog .closebutton').focus();<br />
jQuery('#container').attr('aria-hidden', true);<br />
<br />
* Widgets like tabs, accordions, etc. need hidden text to show their state. Basically, whenever you programmatically change the state of a widget (active, inactive, disabled, etc.) you should use hidden text to show which state the widget is in<br />
<br />
Example:<nowiki><br />
<li class="current-tab"><a href="#">First tab <span class="sr-only">(tab selected)</span></a></li><br />
<li><a href="#">Second tab <span class="sr-only">(tab)</span></a></li></nowiki><br />
<br />
When the second tab is clicked, its accessible text should change to "(tab selected)" and that of the first tab should change to "(tab)"</div>Robertlhttps://wiki.mahara.org/index.php?title=System_Administrator%27s_Guide/Requirements&diff=13634System Administrator's Guide/Requirements2023-03-24T01:37:05Z<p>Robertl: /* PHP */</p>
<hr />
<div>The following article lists the software and hardware requirements for Mahara. There is a sister article on [[System Administrator's Guide/Scalability|scalability]] that provides more details in particular about the hardware.<br />
<br />
== Mahara version ==<br />
<br />
We attempt to keep this article up to date to reflect the [[SupportedVersions|latest stable release]] of Mahara. For the system requirements for older Mahara versions, check the README file in the release's zip file, or look in the git repository for your branch or release, for example:<br />
<br />
; 22.10 : https://git.mahara.org/mahara/mahara/blob/22.10_STABLE/README.md<br />
; development : https://git.mahara.org/mahara/mahara/blob/main/README.md<br />
<br />
==Software==<br />
<br />
===Recommended Platform===<br />
<br />
Please see the README file in the code that you downloaded for up-to-date information on the system requirements that Mahara supports for the particular version that you are installing.<br />
<br />
Mahara is designed to run on variants of the popular LAMP stack. Apart from the PHP requirement, all other parts can be swapped for alternatives if necessary. However, the platform used by the core developers (and so most thoroughly tested) is:<br />
<br />
* Server OS: '''Ubuntu Linux''' latest LTS<br />
* Web Server: '''Apache2''' latest 2.4.x version<br />
* Database Server: '''PostgreSQL''' latest 12.x version<br />
* Language: '''PHP''' - PHP 7.4+, 8.1+<br />
* Web Browser: latest version of<br />
** '''Firefox'''<br />
** '''Chrome'''<br />
** '''Safari'''<br />
** '''MS Edge'''<br />
<br />
===All Possible Software Options===<br />
<br />
While we have a recommended platform, Mahara will run successfully using replacements for parts of the stack. All possible options, supported and unsupported, are listed here.<br />
<br />
====Server OS====<br />
<br />
Mahara is '''officially supported''' on the following operating systems:<br />
<br />
* '''[http://www.debian.org/ Debian GNU/Linux]''', all versions from 11/"Bullseye"<br />
* '''[http://www.ubuntu.com/ Ubuntu GNU/Linux]''', all versions from 20.04/"Focal Fossa"<br />
<br />
Mahara is not officially supported, but '''known to work or mostly work''', on the following operating systems:<br />
<br />
* '''Most other variants of Linux''', including Red Hat Enterprise Linux, CentOS, Slackware, Fedora and SUSE.<br />
* '''Microsoft Windows''' - all desktop versions from XP, all server versions from Windows Server 2003.<br />
* '''Mac OS X Server''', from Tiger upwards (note that people seem to be having more luck with Leopard and above).<br />
<br />
Currently, we're not certain of the status of Mahara on other operating systems (Solaris springs to mind). If you know more, feel free to add them to the above list!<br />
<br />
====Web Server====<br />
<br />
Mahara is '''officially supported''' on the following web servers:<br />
<br />
* '''[http://httpd.apache.org/ Apache]''', all versions from 2.4<br />
<br />
Mahara is not officially supported, but '''known to work or mostly work''', on the following web servers:<br />
<br />
* '''[http://nginx.net/ nginx]''' (using fastcgi)<br />
<br />
====Database Server====<br />
<br />
Mahara is officially supported on the following database servers:<br />
<br />
* '''[http://www.postgresql.org/ PostgreSQL]''', all versions from 9.5<br />
* '''[http://www.mysql.com/ MySQL]''', all versions from 5.6. Note that you will need InnoDB table support<br />
** (And equivalent '''[https://mariadb.org MariaDB]''' versions)<br />
<br />
Mahara's database must be in UTF8 encoding. In MySQL, you can use any UTF8 collation you like - generally, you'll pick the one that suits your locale.<br />
<br />
If you are using MySQL 5.1.5 or older, you need to add the SUPER privilege to Mahara's database user in order to enable the Elasticsearch search plugin. (IF you will not be using Elasticsearch, you don't need this.)<br />
<br />
Mahara is not supported or known to work on any other database server.<br />
<br />
====PHP====<br />
<br />
PHP version 7.4.x or later is required. In addition, you'll need the following extensions:<br />
<br />
* gd (include Freetype support)<br />
* curl<br />
* pgsql OR mysqli<br />
* For networking support: openssl and xmlrpc<br />
* mcrypt<br />
* intl - For language internationalisation<br />
* zip and unzip utilities (necessary for portfolio exports)<br />
* Optionally: imagick<br />
* Optionally: adodb (improves performance)<br />
** The ADOdb PHP extension, written in C, which Mahara will automatically detect and use to improve the performance of its database layer.<br />
* Recommended: zlib, zip, bz2<br />
<br />
You should make sure that <code>magic_quotes_gpc</code> is off, and that <code>register_globals</code> is off. Mahara will work around these settings if they're on, but it's better if you turn them off.<br />
<br />
====Web Browser====<br />
<br />
Mahara should work in any modern web browser with JavaScript. However current stable is only actively tested in the following browsers:<br />
<br />
* Firefox - latest version<br />
* Chrome - latest version<br />
* Safari - latest version<br />
* Opera - latest version<br />
* Microsoft Edge - latest version<br />
* Mobile (phone or tablet)<br />
** Safara for iOS<br />
** Chrome for Android<br />
<br />
Some Mahara plugins may require browser plugins for full functionality. For instance, the copy button on the secret URL screen requires the Adobe Flash browser plugin.<br />
<br />
==Hardware==<br />
<br />
Mahara has hardware requirements that are extremely similar to other PHP-based web applications. A detailed analysis of this is provided in the [[System Administrator's Guide/Scalability|scalability]] article, but here are some guiding principles:<br />
<br />
* Mahara comprises a PHP application, which is CPU bound, and a database, which is IO bound. If you can put the database on a separate host to the web server(s), you'll be able to tune the machines more appropriately, but this isn't necessary for "small" installations (anything up to a few thousand users).<br />
* Mahara requires somewhere between 8 and 32M of RAM for most script invocations. This means that you'll need a decent amount of RAM for your web server(s) in order to support the most number of '''concurrent''' connections. So don't be too stingy with the amount of RAM you allocate if you're going to use virtualisation, else the system will crash and burn when you get more than one user using it at once :). Consider at least 1G if you can.<br />
* If possible, putting a reverse proxy in front of Apache is a great idea - it'll allow your site to handle more concurrent users, as Apache processes won't have to stick around while serving data to clients.<br />
* Installing Mahara alongside other webapps like Moodle makes sense - they have similar performance profiles. But remember, this will increase the amount of load you're putting on the system. So again, if installing Mahara in a limited resource environment, you might have to increase some limits.<br />
<br />
The minimum requirements are:<br />
<br />
* CPU: any modern CPU produced in the last few years is fine, the faster the better naturally. PHP pages are CPU limited, so faster CPUs mean quicker response times.<br />
* Memory: 256MB at an absolute minimum. 1G or more is recommended.<br />
* Disk: This will depend largely on how much disk quota you want each user to have. For a site of 1000 users, each with a 250M quota, you might need 50G to start with.<br />
<br />
For more detailed information about choosing the right hardware, check out the [[System Administrator's Guide/Scalability|scalability]] article.<br />
<br />
==Requirements FAQ==<br />
<br />
Here are some commonly asked questions about the requirements:<br />
<br />
===Can I use Mahara on Windows?===<br />
<br />
Yes, absolutely!<br />
<br />
Mahara can be used on Windows, by accessing a Mahara site (such as https://mahara.org) on a web browser running on a Windows machine. We regularly test Mahara against recent versions of Internet Explorer and Edge, and actively fix any bugs found for users accessing Mahara from a Windows computer.<br />
<br />
===Can I host Mahara on Windows?===<br />
<br />
Hosting Mahara on Windows (in other words, running Mahara in IIS or Apache via XAMPP, running on a Windows server), is more complicated. For hosting solutions, Mahara has been designed for Linux, Apache, PHP and an SQL database, and currently there has been very little testing for Windows hosted environments. Some people have done it successfully. You might want to search this wiki and the mahara.org forum for the instructions they've used. Because Mahara was designed to run on Apache, you will probably find it easier to use Apache in XAMPP than to use IIS or another webserver software.<br />
<br />
Because [[Developer_Area/Mahara_project_overview#Who_makes_Mahara.3F|Catalyst IT]] is an all-open-source software company, it is very unlikely the Mahara core team will have the resources to support hosting on Windows any time soon. So while you may be able to install Mahara on a Windows server without too much bother, be aware that we do not officially support this and may not be able to assist you if you have any issues.<br />
<br />
===What about hosting Mahara on Solaris/Mac/BSD/Other *nix OS?===<br />
<br />
The developers do not explicitly test for these OSes. While they may well work, there may be issues that the developers cannot help you with. If you come across an issue and work out why it doesn't work, please consider posting in the forums or opening a bug report, so that others may benefit too!<br />
<br />
===Will Mahara ever support Windows/Solaris/Other webservers/Other databases===<br />
<br />
Unfortunately, the answer is probably not, unless someone wants to fund this, or offers their own time and services to implement and maintain this functionality.<br />
<br />
Mahara is [[Developer_Area/Mahara_project_overview#Who_makes_Mahara.3F|primarily maintained and developed]] by the Mahara team at [https://www.catalyst.net.nz Catalyst IT] in New Zealand. The Catalyst IT Mahara team (often referred to as "Mahara HQ") is funded primarily by paid client support, hosting, and customization requests. So our highest priority goes to implementing features or bug fixes that are specifically funded by our clients. If you would like to help support the Mahara project by sponsoring a feature or bug fix, you can buy a [https://www.catalyst.net.nz/what-we-offer/learning-and-development/mahara-support-packages Mahara support package], or contract with Catalyst for larger requests.<br />
<br />
Beyond that, we have a limited number of resources for unfunded maintenance and expansion of the Mahara project. (Catalyst IT is committed to open source software, but is not a charity.) We try to use these resources in areas where they will produce the greatest benefit for the greatest number of Mahara users, and testing Mahara on other hosting platforms is probably not one of those areas.<br />
<br />
However, we are very willing to accept patches or implement small code adaptations to make Mahara run more smoothly on other systems. If you can help with this, see [[Developer Area/Contributing Code]].<br />
<br />
===Can I use shared hosting?===<br />
<br />
Maybe. It depends on your host. Some hosts disable certain functions (e.g. <code>exec</code>) or use safe mode, and these things can badly impact on Mahara functionality. '''Mahara is not explicitly designed to run on shared hosting''' - while it is a goal we keep in mind, and will accept patches for, '''shared hosting by its nature limits what you can do''', and you should endeavour to obtain a VPS or dedicated host if at all possible.<br />
<br />
If you would still like to install Mahara on shared hosting, you can [http://linx.ml/view/view.php?t=4LvhtJH8NgEMfy1Ii3R5 follow the instructions]. This guide will show you how to install Mahara via cPanel and is designed for users who don't have any previous experience with creating websites or setting up databases.<br />
<br />
===npm and nodejs are not available in the Debian repo. How do I install them on my Debian server?===<br />
<br />
You will only need npm or nodejs if you are attempting to compile Mahara's theme CSS for Mahara 15.10 or later, after cloning the Mahara git repository. If you're using an earlier version of Mahara, or you downloaded Mahara from the zip file on Launchpad, the CSS files will already be included and this question probably does not apply to you.<br />
<br />
To install npm and nodejs on Debian, you'll need sudo access:<br />
<pre><br />
echo "deb https://deb.nodesource.com/node_0.12 wheezy main" > /etc/apt/sources.list.d/nodesource.list<br />
curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add -<br />
apt-get install apt-transport-https<br />
apt-get update; apt-get install nodejs; npm install -g gulp<br />
</pre><br />
<br />
===I am confused by all of this, where do I go to get help now?===<br />
<br />
To the [http://mahara.org/interaction/forum/view.php?id=2 Mahara Support forums], or #mahara:matrix.org</div>Robertlhttps://wiki.mahara.org/index.php?title=System_Administrator%27s_Guide/Requirements&diff=13633System Administrator's Guide/Requirements2023-03-24T01:34:10Z<p>Robertl: /* Database Server */</p>
<hr />
<div>The following article lists the software and hardware requirements for Mahara. There is a sister article on [[System Administrator's Guide/Scalability|scalability]] that provides more details in particular about the hardware.<br />
<br />
== Mahara version ==<br />
<br />
We attempt to keep this article up to date to reflect the [[SupportedVersions|latest stable release]] of Mahara. For the system requirements for older Mahara versions, check the README file in the release's zip file, or look in the git repository for your branch or release, for example:<br />
<br />
; 22.10 : https://git.mahara.org/mahara/mahara/blob/22.10_STABLE/README.md<br />
; development : https://git.mahara.org/mahara/mahara/blob/main/README.md<br />
<br />
==Software==<br />
<br />
===Recommended Platform===<br />
<br />
Please see the README file in the code that you downloaded for up-to-date information on the system requirements that Mahara supports for the particular version that you are installing.<br />
<br />
Mahara is designed to run on variants of the popular LAMP stack. Apart from the PHP requirement, all other parts can be swapped for alternatives if necessary. However, the platform used by the core developers (and so most thoroughly tested) is:<br />
<br />
* Server OS: '''Ubuntu Linux''' latest LTS<br />
* Web Server: '''Apache2''' latest 2.4.x version<br />
* Database Server: '''PostgreSQL''' latest 12.x version<br />
* Language: '''PHP''' - PHP 7.4+, 8.1+<br />
* Web Browser: latest version of<br />
** '''Firefox'''<br />
** '''Chrome'''<br />
** '''Safari'''<br />
** '''MS Edge'''<br />
<br />
===All Possible Software Options===<br />
<br />
While we have a recommended platform, Mahara will run successfully using replacements for parts of the stack. All possible options, supported and unsupported, are listed here.<br />
<br />
====Server OS====<br />
<br />
Mahara is '''officially supported''' on the following operating systems:<br />
<br />
* '''[http://www.debian.org/ Debian GNU/Linux]''', all versions from 11/"Bullseye"<br />
* '''[http://www.ubuntu.com/ Ubuntu GNU/Linux]''', all versions from 20.04/"Focal Fossa"<br />
<br />
Mahara is not officially supported, but '''known to work or mostly work''', on the following operating systems:<br />
<br />
* '''Most other variants of Linux''', including Red Hat Enterprise Linux, CentOS, Slackware, Fedora and SUSE.<br />
* '''Microsoft Windows''' - all desktop versions from XP, all server versions from Windows Server 2003.<br />
* '''Mac OS X Server''', from Tiger upwards (note that people seem to be having more luck with Leopard and above).<br />
<br />
Currently, we're not certain of the status of Mahara on other operating systems (Solaris springs to mind). If you know more, feel free to add them to the above list!<br />
<br />
====Web Server====<br />
<br />
Mahara is '''officially supported''' on the following web servers:<br />
<br />
* '''[http://httpd.apache.org/ Apache]''', all versions from 2.4<br />
<br />
Mahara is not officially supported, but '''known to work or mostly work''', on the following web servers:<br />
<br />
* '''[http://nginx.net/ nginx]''' (using fastcgi)<br />
<br />
====Database Server====<br />
<br />
Mahara is officially supported on the following database servers:<br />
<br />
* '''[http://www.postgresql.org/ PostgreSQL]''', all versions from 9.5<br />
* '''[http://www.mysql.com/ MySQL]''', all versions from 5.6. Note that you will need InnoDB table support<br />
** (And equivalent '''[https://mariadb.org MariaDB]''' versions)<br />
<br />
Mahara's database must be in UTF8 encoding. In MySQL, you can use any UTF8 collation you like - generally, you'll pick the one that suits your locale.<br />
<br />
If you are using MySQL 5.1.5 or older, you need to add the SUPER privilege to Mahara's database user in order to enable the Elasticsearch search plugin. (IF you will not be using Elasticsearch, you don't need this.)<br />
<br />
Mahara is not supported or known to work on any other database server.<br />
<br />
====PHP====<br />
<br />
PHP version 7.2.x or later is required. In addition, you'll need the following extensions:<br />
<br />
* gd (include Freetype support)<br />
* curl<br />
* pgsql OR mysqli<br />
* For networking support: openssl and xmlrpc<br />
* mcrypt<br />
* intl - For language internationalisation<br />
* zip and unzip utilities (necessary for portfolio exports)<br />
* Optionally: imagick<br />
* Optionally: adodb (improves performance)<br />
** The ADOdb PHP extension, written in C, which Mahara will automatically detect and use to improve the performance of its database layer.<br />
* Recommended: zlib, zip, bz2<br />
<br />
You should make sure that <code>magic_quotes_gpc</code> is off, and that <code>register_globals</code> is off. Mahara will work around these settings if they're on, but it's better if you turn them off.<br />
<br />
====Web Browser====<br />
<br />
Mahara should work in any modern web browser with JavaScript. However current stable is only actively tested in the following browsers:<br />
<br />
* Firefox - latest version<br />
* Chrome - latest version<br />
* Safari - latest version<br />
* Opera - latest version<br />
* Internet explorer<br />
** IE 9-11 (for Mahara up to 15.04)<br />
** IE 11, or Edge (for Mahara 15.10 and above)<br />
* Mobile (phone or tablet)<br />
** Safara for iOS<br />
** Chrome for Android<br />
<br />
Some Mahara plugins may require browser plugins for full functionality. For instance, the copy button on the secret URL screen requires the Adobe Flash browser plugin.<br />
<br />
==Hardware==<br />
<br />
Mahara has hardware requirements that are extremely similar to other PHP-based web applications. A detailed analysis of this is provided in the [[System Administrator's Guide/Scalability|scalability]] article, but here are some guiding principles:<br />
<br />
* Mahara comprises a PHP application, which is CPU bound, and a database, which is IO bound. If you can put the database on a separate host to the web server(s), you'll be able to tune the machines more appropriately, but this isn't necessary for "small" installations (anything up to a few thousand users).<br />
* Mahara requires somewhere between 8 and 32M of RAM for most script invocations. This means that you'll need a decent amount of RAM for your web server(s) in order to support the most number of '''concurrent''' connections. So don't be too stingy with the amount of RAM you allocate if you're going to use virtualisation, else the system will crash and burn when you get more than one user using it at once :). Consider at least 1G if you can.<br />
* If possible, putting a reverse proxy in front of Apache is a great idea - it'll allow your site to handle more concurrent users, as Apache processes won't have to stick around while serving data to clients.<br />
* Installing Mahara alongside other webapps like Moodle makes sense - they have similar performance profiles. But remember, this will increase the amount of load you're putting on the system. So again, if installing Mahara in a limited resource environment, you might have to increase some limits.<br />
<br />
The minimum requirements are:<br />
<br />
* CPU: any modern CPU produced in the last few years is fine, the faster the better naturally. PHP pages are CPU limited, so faster CPUs mean quicker response times.<br />
* Memory: 256MB at an absolute minimum. 1G or more is recommended.<br />
* Disk: This will depend largely on how much disk quota you want each user to have. For a site of 1000 users, each with a 250M quota, you might need 50G to start with.<br />
<br />
For more detailed information about choosing the right hardware, check out the [[System Administrator's Guide/Scalability|scalability]] article.<br />
<br />
==Requirements FAQ==<br />
<br />
Here are some commonly asked questions about the requirements:<br />
<br />
===Can I use Mahara on Windows?===<br />
<br />
Yes, absolutely!<br />
<br />
Mahara can be used on Windows, by accessing a Mahara site (such as https://mahara.org) on a web browser running on a Windows machine. We regularly test Mahara against recent versions of Internet Explorer and Edge, and actively fix any bugs found for users accessing Mahara from a Windows computer.<br />
<br />
===Can I host Mahara on Windows?===<br />
<br />
Hosting Mahara on Windows (in other words, running Mahara in IIS or Apache via XAMPP, running on a Windows server), is more complicated. For hosting solutions, Mahara has been designed for Linux, Apache, PHP and an SQL database, and currently there has been very little testing for Windows hosted environments. Some people have done it successfully. You might want to search this wiki and the mahara.org forum for the instructions they've used. Because Mahara was designed to run on Apache, you will probably find it easier to use Apache in XAMPP than to use IIS or another webserver software.<br />
<br />
Because [[Developer_Area/Mahara_project_overview#Who_makes_Mahara.3F|Catalyst IT]] is an all-open-source software company, it is very unlikely the Mahara core team will have the resources to support hosting on Windows any time soon. So while you may be able to install Mahara on a Windows server without too much bother, be aware that we do not officially support this and may not be able to assist you if you have any issues.<br />
<br />
===What about hosting Mahara on Solaris/Mac/BSD/Other *nix OS?===<br />
<br />
The developers do not explicitly test for these OSes. While they may well work, there may be issues that the developers cannot help you with. If you come across an issue and work out why it doesn't work, please consider posting in the forums or opening a bug report, so that others may benefit too!<br />
<br />
===Will Mahara ever support Windows/Solaris/Other webservers/Other databases===<br />
<br />
Unfortunately, the answer is probably not, unless someone wants to fund this, or offers their own time and services to implement and maintain this functionality.<br />
<br />
Mahara is [[Developer_Area/Mahara_project_overview#Who_makes_Mahara.3F|primarily maintained and developed]] by the Mahara team at [https://www.catalyst.net.nz Catalyst IT] in New Zealand. The Catalyst IT Mahara team (often referred to as "Mahara HQ") is funded primarily by paid client support, hosting, and customization requests. So our highest priority goes to implementing features or bug fixes that are specifically funded by our clients. If you would like to help support the Mahara project by sponsoring a feature or bug fix, you can buy a [https://www.catalyst.net.nz/what-we-offer/learning-and-development/mahara-support-packages Mahara support package], or contract with Catalyst for larger requests.<br />
<br />
Beyond that, we have a limited number of resources for unfunded maintenance and expansion of the Mahara project. (Catalyst IT is committed to open source software, but is not a charity.) We try to use these resources in areas where they will produce the greatest benefit for the greatest number of Mahara users, and testing Mahara on other hosting platforms is probably not one of those areas.<br />
<br />
However, we are very willing to accept patches or implement small code adaptations to make Mahara run more smoothly on other systems. If you can help with this, see [[Developer Area/Contributing Code]].<br />
<br />
===Can I use shared hosting?===<br />
<br />
Maybe. It depends on your host. Some hosts disable certain functions (e.g. <code>exec</code>) or use safe mode, and these things can badly impact on Mahara functionality. '''Mahara is not explicitly designed to run on shared hosting''' - while it is a goal we keep in mind, and will accept patches for, '''shared hosting by its nature limits what you can do''', and you should endeavour to obtain a VPS or dedicated host if at all possible.<br />
<br />
If you would still like to install Mahara on shared hosting, you can [http://linx.ml/view/view.php?t=4LvhtJH8NgEMfy1Ii3R5 follow the instructions]. This guide will show you how to install Mahara via cPanel and is designed for users who don't have any previous experience with creating websites or setting up databases.<br />
<br />
===npm and nodejs are not available in the Debian repo. How do I install them on my Debian server?===<br />
<br />
You will only need npm or nodejs if you are attempting to compile Mahara's theme CSS for Mahara 15.10 or later, after cloning the Mahara git repository. If you're using an earlier version of Mahara, or you downloaded Mahara from the zip file on Launchpad, the CSS files will already be included and this question probably does not apply to you.<br />
<br />
To install npm and nodejs on Debian, you'll need sudo access:<br />
<pre><br />
echo "deb https://deb.nodesource.com/node_0.12 wheezy main" > /etc/apt/sources.list.d/nodesource.list<br />
curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add -<br />
apt-get install apt-transport-https<br />
apt-get update; apt-get install nodejs; npm install -g gulp<br />
</pre><br />
<br />
===I am confused by all of this, where do I go to get help now?===<br />
<br />
To the [http://mahara.org/interaction/forum/view.php?id=2 Mahara Support forums], or #mahara on freenode.</div>Robertlhttps://wiki.mahara.org/index.php?title=System_Administrator%27s_Guide/Requirements&diff=13632System Administrator's Guide/Requirements2023-03-24T01:32:31Z<p>Robertl: /* Web Server */</p>
<hr />
<div>The following article lists the software and hardware requirements for Mahara. There is a sister article on [[System Administrator's Guide/Scalability|scalability]] that provides more details in particular about the hardware.<br />
<br />
== Mahara version ==<br />
<br />
We attempt to keep this article up to date to reflect the [[SupportedVersions|latest stable release]] of Mahara. For the system requirements for older Mahara versions, check the README file in the release's zip file, or look in the git repository for your branch or release, for example:<br />
<br />
; 22.10 : https://git.mahara.org/mahara/mahara/blob/22.10_STABLE/README.md<br />
; development : https://git.mahara.org/mahara/mahara/blob/main/README.md<br />
<br />
==Software==<br />
<br />
===Recommended Platform===<br />
<br />
Please see the README file in the code that you downloaded for up-to-date information on the system requirements that Mahara supports for the particular version that you are installing.<br />
<br />
Mahara is designed to run on variants of the popular LAMP stack. Apart from the PHP requirement, all other parts can be swapped for alternatives if necessary. However, the platform used by the core developers (and so most thoroughly tested) is:<br />
<br />
* Server OS: '''Ubuntu Linux''' latest LTS<br />
* Web Server: '''Apache2''' latest 2.4.x version<br />
* Database Server: '''PostgreSQL''' latest 12.x version<br />
* Language: '''PHP''' - PHP 7.4+, 8.1+<br />
* Web Browser: latest version of<br />
** '''Firefox'''<br />
** '''Chrome'''<br />
** '''Safari'''<br />
** '''MS Edge'''<br />
<br />
===All Possible Software Options===<br />
<br />
While we have a recommended platform, Mahara will run successfully using replacements for parts of the stack. All possible options, supported and unsupported, are listed here.<br />
<br />
====Server OS====<br />
<br />
Mahara is '''officially supported''' on the following operating systems:<br />
<br />
* '''[http://www.debian.org/ Debian GNU/Linux]''', all versions from 11/"Bullseye"<br />
* '''[http://www.ubuntu.com/ Ubuntu GNU/Linux]''', all versions from 20.04/"Focal Fossa"<br />
<br />
Mahara is not officially supported, but '''known to work or mostly work''', on the following operating systems:<br />
<br />
* '''Most other variants of Linux''', including Red Hat Enterprise Linux, CentOS, Slackware, Fedora and SUSE.<br />
* '''Microsoft Windows''' - all desktop versions from XP, all server versions from Windows Server 2003.<br />
* '''Mac OS X Server''', from Tiger upwards (note that people seem to be having more luck with Leopard and above).<br />
<br />
Currently, we're not certain of the status of Mahara on other operating systems (Solaris springs to mind). If you know more, feel free to add them to the above list!<br />
<br />
====Web Server====<br />
<br />
Mahara is '''officially supported''' on the following web servers:<br />
<br />
* '''[http://httpd.apache.org/ Apache]''', all versions from 2.4<br />
<br />
Mahara is not officially supported, but '''known to work or mostly work''', on the following web servers:<br />
<br />
* '''[http://nginx.net/ nginx]''' (using fastcgi)<br />
<br />
====Database Server====<br />
<br />
Mahara is officially supported on the following database servers:<br />
<br />
* '''[http://www.postgresql.org/ PostgreSQL]''', all versions from 9.1<br />
* '''[http://www.mysql.com/ MySQL]''', all versions from 5.1. Note that you will need InnoDB table support<br />
** (And equivalent '''[https://mariadb.org MariaDB]''' versions)<br />
<br />
Mahara's database must be in UTF8 encoding. In MySQL, you can use any UTF8 collation you like - generally, you'll pick the one that suits your locale.<br />
<br />
If you are using MySQL 5.1.5 or older, you need to add the SUPER privilege to Mahara's database user in order to enable the Elasticsearch search plugin. (IF you will not be using Elasticsearch, you don't need this.)<br />
<br />
Mahara is not supported or known to work on any other database server.<br />
<br />
====PHP====<br />
<br />
PHP version 7.2.x or later is required. In addition, you'll need the following extensions:<br />
<br />
* gd (include Freetype support)<br />
* curl<br />
* pgsql OR mysqli<br />
* For networking support: openssl and xmlrpc<br />
* mcrypt<br />
* intl - For language internationalisation<br />
* zip and unzip utilities (necessary for portfolio exports)<br />
* Optionally: imagick<br />
* Optionally: adodb (improves performance)<br />
** The ADOdb PHP extension, written in C, which Mahara will automatically detect and use to improve the performance of its database layer.<br />
* Recommended: zlib, zip, bz2<br />
<br />
You should make sure that <code>magic_quotes_gpc</code> is off, and that <code>register_globals</code> is off. Mahara will work around these settings if they're on, but it's better if you turn them off.<br />
<br />
====Web Browser====<br />
<br />
Mahara should work in any modern web browser with JavaScript. However current stable is only actively tested in the following browsers:<br />
<br />
* Firefox - latest version<br />
* Chrome - latest version<br />
* Safari - latest version<br />
* Opera - latest version<br />
* Internet explorer<br />
** IE 9-11 (for Mahara up to 15.04)<br />
** IE 11, or Edge (for Mahara 15.10 and above)<br />
* Mobile (phone or tablet)<br />
** Safara for iOS<br />
** Chrome for Android<br />
<br />
Some Mahara plugins may require browser plugins for full functionality. For instance, the copy button on the secret URL screen requires the Adobe Flash browser plugin.<br />
<br />
==Hardware==<br />
<br />
Mahara has hardware requirements that are extremely similar to other PHP-based web applications. A detailed analysis of this is provided in the [[System Administrator's Guide/Scalability|scalability]] article, but here are some guiding principles:<br />
<br />
* Mahara comprises a PHP application, which is CPU bound, and a database, which is IO bound. If you can put the database on a separate host to the web server(s), you'll be able to tune the machines more appropriately, but this isn't necessary for "small" installations (anything up to a few thousand users).<br />
* Mahara requires somewhere between 8 and 32M of RAM for most script invocations. This means that you'll need a decent amount of RAM for your web server(s) in order to support the most number of '''concurrent''' connections. So don't be too stingy with the amount of RAM you allocate if you're going to use virtualisation, else the system will crash and burn when you get more than one user using it at once :). Consider at least 1G if you can.<br />
* If possible, putting a reverse proxy in front of Apache is a great idea - it'll allow your site to handle more concurrent users, as Apache processes won't have to stick around while serving data to clients.<br />
* Installing Mahara alongside other webapps like Moodle makes sense - they have similar performance profiles. But remember, this will increase the amount of load you're putting on the system. So again, if installing Mahara in a limited resource environment, you might have to increase some limits.<br />
<br />
The minimum requirements are:<br />
<br />
* CPU: any modern CPU produced in the last few years is fine, the faster the better naturally. PHP pages are CPU limited, so faster CPUs mean quicker response times.<br />
* Memory: 256MB at an absolute minimum. 1G or more is recommended.<br />
* Disk: This will depend largely on how much disk quota you want each user to have. For a site of 1000 users, each with a 250M quota, you might need 50G to start with.<br />
<br />
For more detailed information about choosing the right hardware, check out the [[System Administrator's Guide/Scalability|scalability]] article.<br />
<br />
==Requirements FAQ==<br />
<br />
Here are some commonly asked questions about the requirements:<br />
<br />
===Can I use Mahara on Windows?===<br />
<br />
Yes, absolutely!<br />
<br />
Mahara can be used on Windows, by accessing a Mahara site (such as https://mahara.org) on a web browser running on a Windows machine. We regularly test Mahara against recent versions of Internet Explorer and Edge, and actively fix any bugs found for users accessing Mahara from a Windows computer.<br />
<br />
===Can I host Mahara on Windows?===<br />
<br />
Hosting Mahara on Windows (in other words, running Mahara in IIS or Apache via XAMPP, running on a Windows server), is more complicated. For hosting solutions, Mahara has been designed for Linux, Apache, PHP and an SQL database, and currently there has been very little testing for Windows hosted environments. Some people have done it successfully. You might want to search this wiki and the mahara.org forum for the instructions they've used. Because Mahara was designed to run on Apache, you will probably find it easier to use Apache in XAMPP than to use IIS or another webserver software.<br />
<br />
Because [[Developer_Area/Mahara_project_overview#Who_makes_Mahara.3F|Catalyst IT]] is an all-open-source software company, it is very unlikely the Mahara core team will have the resources to support hosting on Windows any time soon. So while you may be able to install Mahara on a Windows server without too much bother, be aware that we do not officially support this and may not be able to assist you if you have any issues.<br />
<br />
===What about hosting Mahara on Solaris/Mac/BSD/Other *nix OS?===<br />
<br />
The developers do not explicitly test for these OSes. While they may well work, there may be issues that the developers cannot help you with. If you come across an issue and work out why it doesn't work, please consider posting in the forums or opening a bug report, so that others may benefit too!<br />
<br />
===Will Mahara ever support Windows/Solaris/Other webservers/Other databases===<br />
<br />
Unfortunately, the answer is probably not, unless someone wants to fund this, or offers their own time and services to implement and maintain this functionality.<br />
<br />
Mahara is [[Developer_Area/Mahara_project_overview#Who_makes_Mahara.3F|primarily maintained and developed]] by the Mahara team at [https://www.catalyst.net.nz Catalyst IT] in New Zealand. The Catalyst IT Mahara team (often referred to as "Mahara HQ") is funded primarily by paid client support, hosting, and customization requests. So our highest priority goes to implementing features or bug fixes that are specifically funded by our clients. If you would like to help support the Mahara project by sponsoring a feature or bug fix, you can buy a [https://www.catalyst.net.nz/what-we-offer/learning-and-development/mahara-support-packages Mahara support package], or contract with Catalyst for larger requests.<br />
<br />
Beyond that, we have a limited number of resources for unfunded maintenance and expansion of the Mahara project. (Catalyst IT is committed to open source software, but is not a charity.) We try to use these resources in areas where they will produce the greatest benefit for the greatest number of Mahara users, and testing Mahara on other hosting platforms is probably not one of those areas.<br />
<br />
However, we are very willing to accept patches or implement small code adaptations to make Mahara run more smoothly on other systems. If you can help with this, see [[Developer Area/Contributing Code]].<br />
<br />
===Can I use shared hosting?===<br />
<br />
Maybe. It depends on your host. Some hosts disable certain functions (e.g. <code>exec</code>) or use safe mode, and these things can badly impact on Mahara functionality. '''Mahara is not explicitly designed to run on shared hosting''' - while it is a goal we keep in mind, and will accept patches for, '''shared hosting by its nature limits what you can do''', and you should endeavour to obtain a VPS or dedicated host if at all possible.<br />
<br />
If you would still like to install Mahara on shared hosting, you can [http://linx.ml/view/view.php?t=4LvhtJH8NgEMfy1Ii3R5 follow the instructions]. This guide will show you how to install Mahara via cPanel and is designed for users who don't have any previous experience with creating websites or setting up databases.<br />
<br />
===npm and nodejs are not available in the Debian repo. How do I install them on my Debian server?===<br />
<br />
You will only need npm or nodejs if you are attempting to compile Mahara's theme CSS for Mahara 15.10 or later, after cloning the Mahara git repository. If you're using an earlier version of Mahara, or you downloaded Mahara from the zip file on Launchpad, the CSS files will already be included and this question probably does not apply to you.<br />
<br />
To install npm and nodejs on Debian, you'll need sudo access:<br />
<pre><br />
echo "deb https://deb.nodesource.com/node_0.12 wheezy main" > /etc/apt/sources.list.d/nodesource.list<br />
curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add -<br />
apt-get install apt-transport-https<br />
apt-get update; apt-get install nodejs; npm install -g gulp<br />
</pre><br />
<br />
===I am confused by all of this, where do I go to get help now?===<br />
<br />
To the [http://mahara.org/interaction/forum/view.php?id=2 Mahara Support forums], or #mahara on freenode.</div>Robertlhttps://wiki.mahara.org/index.php?title=System_Administrator%27s_Guide/Requirements&diff=13631System Administrator's Guide/Requirements2023-03-24T01:32:12Z<p>Robertl: /* Server OS */</p>
<hr />
<div>The following article lists the software and hardware requirements for Mahara. There is a sister article on [[System Administrator's Guide/Scalability|scalability]] that provides more details in particular about the hardware.<br />
<br />
== Mahara version ==<br />
<br />
We attempt to keep this article up to date to reflect the [[SupportedVersions|latest stable release]] of Mahara. For the system requirements for older Mahara versions, check the README file in the release's zip file, or look in the git repository for your branch or release, for example:<br />
<br />
; 22.10 : https://git.mahara.org/mahara/mahara/blob/22.10_STABLE/README.md<br />
; development : https://git.mahara.org/mahara/mahara/blob/main/README.md<br />
<br />
==Software==<br />
<br />
===Recommended Platform===<br />
<br />
Please see the README file in the code that you downloaded for up-to-date information on the system requirements that Mahara supports for the particular version that you are installing.<br />
<br />
Mahara is designed to run on variants of the popular LAMP stack. Apart from the PHP requirement, all other parts can be swapped for alternatives if necessary. However, the platform used by the core developers (and so most thoroughly tested) is:<br />
<br />
* Server OS: '''Ubuntu Linux''' latest LTS<br />
* Web Server: '''Apache2''' latest 2.4.x version<br />
* Database Server: '''PostgreSQL''' latest 12.x version<br />
* Language: '''PHP''' - PHP 7.4+, 8.1+<br />
* Web Browser: latest version of<br />
** '''Firefox'''<br />
** '''Chrome'''<br />
** '''Safari'''<br />
** '''MS Edge'''<br />
<br />
===All Possible Software Options===<br />
<br />
While we have a recommended platform, Mahara will run successfully using replacements for parts of the stack. All possible options, supported and unsupported, are listed here.<br />
<br />
====Server OS====<br />
<br />
Mahara is '''officially supported''' on the following operating systems:<br />
<br />
* '''[http://www.debian.org/ Debian GNU/Linux]''', all versions from 11/"Bullseye"<br />
* '''[http://www.ubuntu.com/ Ubuntu GNU/Linux]''', all versions from 20.04/"Focal Fossa"<br />
<br />
Mahara is not officially supported, but '''known to work or mostly work''', on the following operating systems:<br />
<br />
* '''Most other variants of Linux''', including Red Hat Enterprise Linux, CentOS, Slackware, Fedora and SUSE.<br />
* '''Microsoft Windows''' - all desktop versions from XP, all server versions from Windows Server 2003.<br />
* '''Mac OS X Server''', from Tiger upwards (note that people seem to be having more luck with Leopard and above).<br />
<br />
Currently, we're not certain of the status of Mahara on other operating systems (Solaris springs to mind). If you know more, feel free to add them to the above list!<br />
<br />
====Web Server====<br />
<br />
Mahara is '''officially supported''' on the following web servers:<br />
<br />
* '''[http://httpd.apache.org/ Apache]''', all versions from 2<br />
<br />
Mahara is not officially supported, but '''known to work or mostly work''', on the following web servers:<br />
<br />
* '''[http://nginx.net/ nginx]''' (using fastcgi)<br />
<br />
====Database Server====<br />
<br />
Mahara is officially supported on the following database servers:<br />
<br />
* '''[http://www.postgresql.org/ PostgreSQL]''', all versions from 9.1<br />
* '''[http://www.mysql.com/ MySQL]''', all versions from 5.1. Note that you will need InnoDB table support<br />
** (And equivalent '''[https://mariadb.org MariaDB]''' versions)<br />
<br />
Mahara's database must be in UTF8 encoding. In MySQL, you can use any UTF8 collation you like - generally, you'll pick the one that suits your locale.<br />
<br />
If you are using MySQL 5.1.5 or older, you need to add the SUPER privilege to Mahara's database user in order to enable the Elasticsearch search plugin. (IF you will not be using Elasticsearch, you don't need this.)<br />
<br />
Mahara is not supported or known to work on any other database server.<br />
<br />
====PHP====<br />
<br />
PHP version 7.2.x or later is required. In addition, you'll need the following extensions:<br />
<br />
* gd (include Freetype support)<br />
* curl<br />
* pgsql OR mysqli<br />
* For networking support: openssl and xmlrpc<br />
* mcrypt<br />
* intl - For language internationalisation<br />
* zip and unzip utilities (necessary for portfolio exports)<br />
* Optionally: imagick<br />
* Optionally: adodb (improves performance)<br />
** The ADOdb PHP extension, written in C, which Mahara will automatically detect and use to improve the performance of its database layer.<br />
* Recommended: zlib, zip, bz2<br />
<br />
You should make sure that <code>magic_quotes_gpc</code> is off, and that <code>register_globals</code> is off. Mahara will work around these settings if they're on, but it's better if you turn them off.<br />
<br />
====Web Browser====<br />
<br />
Mahara should work in any modern web browser with JavaScript. However current stable is only actively tested in the following browsers:<br />
<br />
* Firefox - latest version<br />
* Chrome - latest version<br />
* Safari - latest version<br />
* Opera - latest version<br />
* Internet explorer<br />
** IE 9-11 (for Mahara up to 15.04)<br />
** IE 11, or Edge (for Mahara 15.10 and above)<br />
* Mobile (phone or tablet)<br />
** Safara for iOS<br />
** Chrome for Android<br />
<br />
Some Mahara plugins may require browser plugins for full functionality. For instance, the copy button on the secret URL screen requires the Adobe Flash browser plugin.<br />
<br />
==Hardware==<br />
<br />
Mahara has hardware requirements that are extremely similar to other PHP-based web applications. A detailed analysis of this is provided in the [[System Administrator's Guide/Scalability|scalability]] article, but here are some guiding principles:<br />
<br />
* Mahara comprises a PHP application, which is CPU bound, and a database, which is IO bound. If you can put the database on a separate host to the web server(s), you'll be able to tune the machines more appropriately, but this isn't necessary for "small" installations (anything up to a few thousand users).<br />
* Mahara requires somewhere between 8 and 32M of RAM for most script invocations. This means that you'll need a decent amount of RAM for your web server(s) in order to support the most number of '''concurrent''' connections. So don't be too stingy with the amount of RAM you allocate if you're going to use virtualisation, else the system will crash and burn when you get more than one user using it at once :). Consider at least 1G if you can.<br />
* If possible, putting a reverse proxy in front of Apache is a great idea - it'll allow your site to handle more concurrent users, as Apache processes won't have to stick around while serving data to clients.<br />
* Installing Mahara alongside other webapps like Moodle makes sense - they have similar performance profiles. But remember, this will increase the amount of load you're putting on the system. So again, if installing Mahara in a limited resource environment, you might have to increase some limits.<br />
<br />
The minimum requirements are:<br />
<br />
* CPU: any modern CPU produced in the last few years is fine, the faster the better naturally. PHP pages are CPU limited, so faster CPUs mean quicker response times.<br />
* Memory: 256MB at an absolute minimum. 1G or more is recommended.<br />
* Disk: This will depend largely on how much disk quota you want each user to have. For a site of 1000 users, each with a 250M quota, you might need 50G to start with.<br />
<br />
For more detailed information about choosing the right hardware, check out the [[System Administrator's Guide/Scalability|scalability]] article.<br />
<br />
==Requirements FAQ==<br />
<br />
Here are some commonly asked questions about the requirements:<br />
<br />
===Can I use Mahara on Windows?===<br />
<br />
Yes, absolutely!<br />
<br />
Mahara can be used on Windows, by accessing a Mahara site (such as https://mahara.org) on a web browser running on a Windows machine. We regularly test Mahara against recent versions of Internet Explorer and Edge, and actively fix any bugs found for users accessing Mahara from a Windows computer.<br />
<br />
===Can I host Mahara on Windows?===<br />
<br />
Hosting Mahara on Windows (in other words, running Mahara in IIS or Apache via XAMPP, running on a Windows server), is more complicated. For hosting solutions, Mahara has been designed for Linux, Apache, PHP and an SQL database, and currently there has been very little testing for Windows hosted environments. Some people have done it successfully. You might want to search this wiki and the mahara.org forum for the instructions they've used. Because Mahara was designed to run on Apache, you will probably find it easier to use Apache in XAMPP than to use IIS or another webserver software.<br />
<br />
Because [[Developer_Area/Mahara_project_overview#Who_makes_Mahara.3F|Catalyst IT]] is an all-open-source software company, it is very unlikely the Mahara core team will have the resources to support hosting on Windows any time soon. So while you may be able to install Mahara on a Windows server without too much bother, be aware that we do not officially support this and may not be able to assist you if you have any issues.<br />
<br />
===What about hosting Mahara on Solaris/Mac/BSD/Other *nix OS?===<br />
<br />
The developers do not explicitly test for these OSes. While they may well work, there may be issues that the developers cannot help you with. If you come across an issue and work out why it doesn't work, please consider posting in the forums or opening a bug report, so that others may benefit too!<br />
<br />
===Will Mahara ever support Windows/Solaris/Other webservers/Other databases===<br />
<br />
Unfortunately, the answer is probably not, unless someone wants to fund this, or offers their own time and services to implement and maintain this functionality.<br />
<br />
Mahara is [[Developer_Area/Mahara_project_overview#Who_makes_Mahara.3F|primarily maintained and developed]] by the Mahara team at [https://www.catalyst.net.nz Catalyst IT] in New Zealand. The Catalyst IT Mahara team (often referred to as "Mahara HQ") is funded primarily by paid client support, hosting, and customization requests. So our highest priority goes to implementing features or bug fixes that are specifically funded by our clients. If you would like to help support the Mahara project by sponsoring a feature or bug fix, you can buy a [https://www.catalyst.net.nz/what-we-offer/learning-and-development/mahara-support-packages Mahara support package], or contract with Catalyst for larger requests.<br />
<br />
Beyond that, we have a limited number of resources for unfunded maintenance and expansion of the Mahara project. (Catalyst IT is committed to open source software, but is not a charity.) We try to use these resources in areas where they will produce the greatest benefit for the greatest number of Mahara users, and testing Mahara on other hosting platforms is probably not one of those areas.<br />
<br />
However, we are very willing to accept patches or implement small code adaptations to make Mahara run more smoothly on other systems. If you can help with this, see [[Developer Area/Contributing Code]].<br />
<br />
===Can I use shared hosting?===<br />
<br />
Maybe. It depends on your host. Some hosts disable certain functions (e.g. <code>exec</code>) or use safe mode, and these things can badly impact on Mahara functionality. '''Mahara is not explicitly designed to run on shared hosting''' - while it is a goal we keep in mind, and will accept patches for, '''shared hosting by its nature limits what you can do''', and you should endeavour to obtain a VPS or dedicated host if at all possible.<br />
<br />
If you would still like to install Mahara on shared hosting, you can [http://linx.ml/view/view.php?t=4LvhtJH8NgEMfy1Ii3R5 follow the instructions]. This guide will show you how to install Mahara via cPanel and is designed for users who don't have any previous experience with creating websites or setting up databases.<br />
<br />
===npm and nodejs are not available in the Debian repo. How do I install them on my Debian server?===<br />
<br />
You will only need npm or nodejs if you are attempting to compile Mahara's theme CSS for Mahara 15.10 or later, after cloning the Mahara git repository. If you're using an earlier version of Mahara, or you downloaded Mahara from the zip file on Launchpad, the CSS files will already be included and this question probably does not apply to you.<br />
<br />
To install npm and nodejs on Debian, you'll need sudo access:<br />
<pre><br />
echo "deb https://deb.nodesource.com/node_0.12 wheezy main" > /etc/apt/sources.list.d/nodesource.list<br />
curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add -<br />
apt-get install apt-transport-https<br />
apt-get update; apt-get install nodejs; npm install -g gulp<br />
</pre><br />
<br />
===I am confused by all of this, where do I go to get help now?===<br />
<br />
To the [http://mahara.org/interaction/forum/view.php?id=2 Mahara Support forums], or #mahara on freenode.</div>Robertlhttps://wiki.mahara.org/index.php?title=System_Administrator%27s_Guide/Requirements&diff=13630System Administrator's Guide/Requirements2023-03-24T01:28:16Z<p>Robertl: /* Recommended Platform */</p>
<hr />
<div>The following article lists the software and hardware requirements for Mahara. There is a sister article on [[System Administrator's Guide/Scalability|scalability]] that provides more details in particular about the hardware.<br />
<br />
== Mahara version ==<br />
<br />
We attempt to keep this article up to date to reflect the [[SupportedVersions|latest stable release]] of Mahara. For the system requirements for older Mahara versions, check the README file in the release's zip file, or look in the git repository for your branch or release, for example:<br />
<br />
; 22.10 : https://git.mahara.org/mahara/mahara/blob/22.10_STABLE/README.md<br />
; development : https://git.mahara.org/mahara/mahara/blob/main/README.md<br />
<br />
==Software==<br />
<br />
===Recommended Platform===<br />
<br />
Please see the README file in the code that you downloaded for up-to-date information on the system requirements that Mahara supports for the particular version that you are installing.<br />
<br />
Mahara is designed to run on variants of the popular LAMP stack. Apart from the PHP requirement, all other parts can be swapped for alternatives if necessary. However, the platform used by the core developers (and so most thoroughly tested) is:<br />
<br />
* Server OS: '''Ubuntu Linux''' latest LTS<br />
* Web Server: '''Apache2''' latest 2.4.x version<br />
* Database Server: '''PostgreSQL''' latest 12.x version<br />
* Language: '''PHP''' - PHP 7.4+, 8.1+<br />
* Web Browser: latest version of<br />
** '''Firefox'''<br />
** '''Chrome'''<br />
** '''Safari'''<br />
** '''MS Edge'''<br />
<br />
===All Possible Software Options===<br />
<br />
While we have a recommended platform, Mahara will run successfully using replacements for parts of the stack. All possible options, supported and unsupported, are listed here.<br />
<br />
====Server OS====<br />
<br />
Mahara is '''officially supported''' on the following operating systems:<br />
<br />
* '''[http://www.debian.org/ Debian GNU/Linux]''', all versions from 6/"Squeeze"<br />
* '''[http://www.ubuntu.com/ Ubuntu GNU/Linux]''', all versions from 12.04/"Lucid Lynx"<br />
<br />
Mahara is not officially supported, but '''known to work or mostly work''', on the following operating systems:<br />
<br />
* '''Most other variants of Linux''', including Red Hat Enterprise Linux, CentOS, Slackware, Fedora and SUSE.<br />
* '''Microsoft Windows''' - all desktop versions from XP, all server versions from Windows Server 2003.<br />
* '''Mac OS X Server''', from Tiger upwards (note that people seem to be having more luck with Leopard and above).<br />
<br />
Currently, we're not certain of the status of Mahara on other operating systems (Solaris springs to mind). If you know more, feel free to add them to the above list!<br />
<br />
====Web Server====<br />
<br />
Mahara is '''officially supported''' on the following web servers:<br />
<br />
* '''[http://httpd.apache.org/ Apache]''', all versions from 2<br />
<br />
Mahara is not officially supported, but '''known to work or mostly work''', on the following web servers:<br />
<br />
* '''[http://nginx.net/ nginx]''' (using fastcgi)<br />
<br />
====Database Server====<br />
<br />
Mahara is officially supported on the following database servers:<br />
<br />
* '''[http://www.postgresql.org/ PostgreSQL]''', all versions from 9.1<br />
* '''[http://www.mysql.com/ MySQL]''', all versions from 5.1. Note that you will need InnoDB table support<br />
** (And equivalent '''[https://mariadb.org MariaDB]''' versions)<br />
<br />
Mahara's database must be in UTF8 encoding. In MySQL, you can use any UTF8 collation you like - generally, you'll pick the one that suits your locale.<br />
<br />
If you are using MySQL 5.1.5 or older, you need to add the SUPER privilege to Mahara's database user in order to enable the Elasticsearch search plugin. (IF you will not be using Elasticsearch, you don't need this.)<br />
<br />
Mahara is not supported or known to work on any other database server.<br />
<br />
====PHP====<br />
<br />
PHP version 7.2.x or later is required. In addition, you'll need the following extensions:<br />
<br />
* gd (include Freetype support)<br />
* curl<br />
* pgsql OR mysqli<br />
* For networking support: openssl and xmlrpc<br />
* mcrypt<br />
* intl - For language internationalisation<br />
* zip and unzip utilities (necessary for portfolio exports)<br />
* Optionally: imagick<br />
* Optionally: adodb (improves performance)<br />
** The ADOdb PHP extension, written in C, which Mahara will automatically detect and use to improve the performance of its database layer.<br />
* Recommended: zlib, zip, bz2<br />
<br />
You should make sure that <code>magic_quotes_gpc</code> is off, and that <code>register_globals</code> is off. Mahara will work around these settings if they're on, but it's better if you turn them off.<br />
<br />
====Web Browser====<br />
<br />
Mahara should work in any modern web browser with JavaScript. However current stable is only actively tested in the following browsers:<br />
<br />
* Firefox - latest version<br />
* Chrome - latest version<br />
* Safari - latest version<br />
* Opera - latest version<br />
* Internet explorer<br />
** IE 9-11 (for Mahara up to 15.04)<br />
** IE 11, or Edge (for Mahara 15.10 and above)<br />
* Mobile (phone or tablet)<br />
** Safara for iOS<br />
** Chrome for Android<br />
<br />
Some Mahara plugins may require browser plugins for full functionality. For instance, the copy button on the secret URL screen requires the Adobe Flash browser plugin.<br />
<br />
==Hardware==<br />
<br />
Mahara has hardware requirements that are extremely similar to other PHP-based web applications. A detailed analysis of this is provided in the [[System Administrator's Guide/Scalability|scalability]] article, but here are some guiding principles:<br />
<br />
* Mahara comprises a PHP application, which is CPU bound, and a database, which is IO bound. If you can put the database on a separate host to the web server(s), you'll be able to tune the machines more appropriately, but this isn't necessary for "small" installations (anything up to a few thousand users).<br />
* Mahara requires somewhere between 8 and 32M of RAM for most script invocations. This means that you'll need a decent amount of RAM for your web server(s) in order to support the most number of '''concurrent''' connections. So don't be too stingy with the amount of RAM you allocate if you're going to use virtualisation, else the system will crash and burn when you get more than one user using it at once :). Consider at least 1G if you can.<br />
* If possible, putting a reverse proxy in front of Apache is a great idea - it'll allow your site to handle more concurrent users, as Apache processes won't have to stick around while serving data to clients.<br />
* Installing Mahara alongside other webapps like Moodle makes sense - they have similar performance profiles. But remember, this will increase the amount of load you're putting on the system. So again, if installing Mahara in a limited resource environment, you might have to increase some limits.<br />
<br />
The minimum requirements are:<br />
<br />
* CPU: any modern CPU produced in the last few years is fine, the faster the better naturally. PHP pages are CPU limited, so faster CPUs mean quicker response times.<br />
* Memory: 256MB at an absolute minimum. 1G or more is recommended.<br />
* Disk: This will depend largely on how much disk quota you want each user to have. For a site of 1000 users, each with a 250M quota, you might need 50G to start with.<br />
<br />
For more detailed information about choosing the right hardware, check out the [[System Administrator's Guide/Scalability|scalability]] article.<br />
<br />
==Requirements FAQ==<br />
<br />
Here are some commonly asked questions about the requirements:<br />
<br />
===Can I use Mahara on Windows?===<br />
<br />
Yes, absolutely!<br />
<br />
Mahara can be used on Windows, by accessing a Mahara site (such as https://mahara.org) on a web browser running on a Windows machine. We regularly test Mahara against recent versions of Internet Explorer and Edge, and actively fix any bugs found for users accessing Mahara from a Windows computer.<br />
<br />
===Can I host Mahara on Windows?===<br />
<br />
Hosting Mahara on Windows (in other words, running Mahara in IIS or Apache via XAMPP, running on a Windows server), is more complicated. For hosting solutions, Mahara has been designed for Linux, Apache, PHP and an SQL database, and currently there has been very little testing for Windows hosted environments. Some people have done it successfully. You might want to search this wiki and the mahara.org forum for the instructions they've used. Because Mahara was designed to run on Apache, you will probably find it easier to use Apache in XAMPP than to use IIS or another webserver software.<br />
<br />
Because [[Developer_Area/Mahara_project_overview#Who_makes_Mahara.3F|Catalyst IT]] is an all-open-source software company, it is very unlikely the Mahara core team will have the resources to support hosting on Windows any time soon. So while you may be able to install Mahara on a Windows server without too much bother, be aware that we do not officially support this and may not be able to assist you if you have any issues.<br />
<br />
===What about hosting Mahara on Solaris/Mac/BSD/Other *nix OS?===<br />
<br />
The developers do not explicitly test for these OSes. While they may well work, there may be issues that the developers cannot help you with. If you come across an issue and work out why it doesn't work, please consider posting in the forums or opening a bug report, so that others may benefit too!<br />
<br />
===Will Mahara ever support Windows/Solaris/Other webservers/Other databases===<br />
<br />
Unfortunately, the answer is probably not, unless someone wants to fund this, or offers their own time and services to implement and maintain this functionality.<br />
<br />
Mahara is [[Developer_Area/Mahara_project_overview#Who_makes_Mahara.3F|primarily maintained and developed]] by the Mahara team at [https://www.catalyst.net.nz Catalyst IT] in New Zealand. The Catalyst IT Mahara team (often referred to as "Mahara HQ") is funded primarily by paid client support, hosting, and customization requests. So our highest priority goes to implementing features or bug fixes that are specifically funded by our clients. If you would like to help support the Mahara project by sponsoring a feature or bug fix, you can buy a [https://www.catalyst.net.nz/what-we-offer/learning-and-development/mahara-support-packages Mahara support package], or contract with Catalyst for larger requests.<br />
<br />
Beyond that, we have a limited number of resources for unfunded maintenance and expansion of the Mahara project. (Catalyst IT is committed to open source software, but is not a charity.) We try to use these resources in areas where they will produce the greatest benefit for the greatest number of Mahara users, and testing Mahara on other hosting platforms is probably not one of those areas.<br />
<br />
However, we are very willing to accept patches or implement small code adaptations to make Mahara run more smoothly on other systems. If you can help with this, see [[Developer Area/Contributing Code]].<br />
<br />
===Can I use shared hosting?===<br />
<br />
Maybe. It depends on your host. Some hosts disable certain functions (e.g. <code>exec</code>) or use safe mode, and these things can badly impact on Mahara functionality. '''Mahara is not explicitly designed to run on shared hosting''' - while it is a goal we keep in mind, and will accept patches for, '''shared hosting by its nature limits what you can do''', and you should endeavour to obtain a VPS or dedicated host if at all possible.<br />
<br />
If you would still like to install Mahara on shared hosting, you can [http://linx.ml/view/view.php?t=4LvhtJH8NgEMfy1Ii3R5 follow the instructions]. This guide will show you how to install Mahara via cPanel and is designed for users who don't have any previous experience with creating websites or setting up databases.<br />
<br />
===npm and nodejs are not available in the Debian repo. How do I install them on my Debian server?===<br />
<br />
You will only need npm or nodejs if you are attempting to compile Mahara's theme CSS for Mahara 15.10 or later, after cloning the Mahara git repository. If you're using an earlier version of Mahara, or you downloaded Mahara from the zip file on Launchpad, the CSS files will already be included and this question probably does not apply to you.<br />
<br />
To install npm and nodejs on Debian, you'll need sudo access:<br />
<pre><br />
echo "deb https://deb.nodesource.com/node_0.12 wheezy main" > /etc/apt/sources.list.d/nodesource.list<br />
curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add -<br />
apt-get install apt-transport-https<br />
apt-get update; apt-get install nodejs; npm install -g gulp<br />
</pre><br />
<br />
===I am confused by all of this, where do I go to get help now?===<br />
<br />
To the [http://mahara.org/interaction/forum/view.php?id=2 Mahara Support forums], or #mahara on freenode.</div>Robertlhttps://wiki.mahara.org/index.php?title=System_Administrator%27s_Guide/Requirements&diff=13629System Administrator's Guide/Requirements2023-03-24T01:25:49Z<p>Robertl: /* Mahara version */</p>
<hr />
<div>The following article lists the software and hardware requirements for Mahara. There is a sister article on [[System Administrator's Guide/Scalability|scalability]] that provides more details in particular about the hardware.<br />
<br />
== Mahara version ==<br />
<br />
We attempt to keep this article up to date to reflect the [[SupportedVersions|latest stable release]] of Mahara. For the system requirements for older Mahara versions, check the README file in the release's zip file, or look in the git repository for your branch or release, for example:<br />
<br />
; 22.10 : https://git.mahara.org/mahara/mahara/blob/22.10_STABLE/README.md<br />
; development : https://git.mahara.org/mahara/mahara/blob/main/README.md<br />
<br />
==Software==<br />
<br />
===Recommended Platform===<br />
<br />
Please see the README file in the code that you downloaded for up-to-date information on the system requirements that Mahara supports for the particular version that you are installing.<br />
<br />
Mahara is designed to run on variants of the popular LAMP stack. Apart from the PHP requirement, all other parts can be swapped for alternatives if necessary. However, the platform used by the core developers (and so most thoroughly tested) is:<br />
<br />
* Server OS: '''Ubuntu Linux''' latest LTS<br />
* Web Server: '''Apache2''' latest 2.4.x version<br />
* Database Server: '''PostgreSQL''' latest 9.x version<br />
* Language: '''PHP''' - PHP 7.2+<br />
* Web Browser: latest version of<br />
** '''Firefox'''<br />
** '''Chrome'''<br />
** '''Safari'''<br />
** '''Internet Explorer'''<br />
<br />
===All Possible Software Options===<br />
<br />
While we have a recommended platform, Mahara will run successfully using replacements for parts of the stack. All possible options, supported and unsupported, are listed here.<br />
<br />
====Server OS====<br />
<br />
Mahara is '''officially supported''' on the following operating systems:<br />
<br />
* '''[http://www.debian.org/ Debian GNU/Linux]''', all versions from 6/"Squeeze"<br />
* '''[http://www.ubuntu.com/ Ubuntu GNU/Linux]''', all versions from 12.04/"Lucid Lynx"<br />
<br />
Mahara is not officially supported, but '''known to work or mostly work''', on the following operating systems:<br />
<br />
* '''Most other variants of Linux''', including Red Hat Enterprise Linux, CentOS, Slackware, Fedora and SUSE.<br />
* '''Microsoft Windows''' - all desktop versions from XP, all server versions from Windows Server 2003.<br />
* '''Mac OS X Server''', from Tiger upwards (note that people seem to be having more luck with Leopard and above).<br />
<br />
Currently, we're not certain of the status of Mahara on other operating systems (Solaris springs to mind). If you know more, feel free to add them to the above list!<br />
<br />
====Web Server====<br />
<br />
Mahara is '''officially supported''' on the following web servers:<br />
<br />
* '''[http://httpd.apache.org/ Apache]''', all versions from 2<br />
<br />
Mahara is not officially supported, but '''known to work or mostly work''', on the following web servers:<br />
<br />
* '''[http://nginx.net/ nginx]''' (using fastcgi)<br />
<br />
====Database Server====<br />
<br />
Mahara is officially supported on the following database servers:<br />
<br />
* '''[http://www.postgresql.org/ PostgreSQL]''', all versions from 9.1<br />
* '''[http://www.mysql.com/ MySQL]''', all versions from 5.1. Note that you will need InnoDB table support<br />
** (And equivalent '''[https://mariadb.org MariaDB]''' versions)<br />
<br />
Mahara's database must be in UTF8 encoding. In MySQL, you can use any UTF8 collation you like - generally, you'll pick the one that suits your locale.<br />
<br />
If you are using MySQL 5.1.5 or older, you need to add the SUPER privilege to Mahara's database user in order to enable the Elasticsearch search plugin. (IF you will not be using Elasticsearch, you don't need this.)<br />
<br />
Mahara is not supported or known to work on any other database server.<br />
<br />
====PHP====<br />
<br />
PHP version 7.2.x or later is required. In addition, you'll need the following extensions:<br />
<br />
* gd (include Freetype support)<br />
* curl<br />
* pgsql OR mysqli<br />
* For networking support: openssl and xmlrpc<br />
* mcrypt<br />
* intl - For language internationalisation<br />
* zip and unzip utilities (necessary for portfolio exports)<br />
* Optionally: imagick<br />
* Optionally: adodb (improves performance)<br />
** The ADOdb PHP extension, written in C, which Mahara will automatically detect and use to improve the performance of its database layer.<br />
* Recommended: zlib, zip, bz2<br />
<br />
You should make sure that <code>magic_quotes_gpc</code> is off, and that <code>register_globals</code> is off. Mahara will work around these settings if they're on, but it's better if you turn them off.<br />
<br />
====Web Browser====<br />
<br />
Mahara should work in any modern web browser with JavaScript. However current stable is only actively tested in the following browsers:<br />
<br />
* Firefox - latest version<br />
* Chrome - latest version<br />
* Safari - latest version<br />
* Opera - latest version<br />
* Internet explorer<br />
** IE 9-11 (for Mahara up to 15.04)<br />
** IE 11, or Edge (for Mahara 15.10 and above)<br />
* Mobile (phone or tablet)<br />
** Safara for iOS<br />
** Chrome for Android<br />
<br />
Some Mahara plugins may require browser plugins for full functionality. For instance, the copy button on the secret URL screen requires the Adobe Flash browser plugin.<br />
<br />
==Hardware==<br />
<br />
Mahara has hardware requirements that are extremely similar to other PHP-based web applications. A detailed analysis of this is provided in the [[System Administrator's Guide/Scalability|scalability]] article, but here are some guiding principles:<br />
<br />
* Mahara comprises a PHP application, which is CPU bound, and a database, which is IO bound. If you can put the database on a separate host to the web server(s), you'll be able to tune the machines more appropriately, but this isn't necessary for "small" installations (anything up to a few thousand users).<br />
* Mahara requires somewhere between 8 and 32M of RAM for most script invocations. This means that you'll need a decent amount of RAM for your web server(s) in order to support the most number of '''concurrent''' connections. So don't be too stingy with the amount of RAM you allocate if you're going to use virtualisation, else the system will crash and burn when you get more than one user using it at once :). Consider at least 1G if you can.<br />
* If possible, putting a reverse proxy in front of Apache is a great idea - it'll allow your site to handle more concurrent users, as Apache processes won't have to stick around while serving data to clients.<br />
* Installing Mahara alongside other webapps like Moodle makes sense - they have similar performance profiles. But remember, this will increase the amount of load you're putting on the system. So again, if installing Mahara in a limited resource environment, you might have to increase some limits.<br />
<br />
The minimum requirements are:<br />
<br />
* CPU: any modern CPU produced in the last few years is fine, the faster the better naturally. PHP pages are CPU limited, so faster CPUs mean quicker response times.<br />
* Memory: 256MB at an absolute minimum. 1G or more is recommended.<br />
* Disk: This will depend largely on how much disk quota you want each user to have. For a site of 1000 users, each with a 250M quota, you might need 50G to start with.<br />
<br />
For more detailed information about choosing the right hardware, check out the [[System Administrator's Guide/Scalability|scalability]] article.<br />
<br />
==Requirements FAQ==<br />
<br />
Here are some commonly asked questions about the requirements:<br />
<br />
===Can I use Mahara on Windows?===<br />
<br />
Yes, absolutely!<br />
<br />
Mahara can be used on Windows, by accessing a Mahara site (such as https://mahara.org) on a web browser running on a Windows machine. We regularly test Mahara against recent versions of Internet Explorer and Edge, and actively fix any bugs found for users accessing Mahara from a Windows computer.<br />
<br />
===Can I host Mahara on Windows?===<br />
<br />
Hosting Mahara on Windows (in other words, running Mahara in IIS or Apache via XAMPP, running on a Windows server), is more complicated. For hosting solutions, Mahara has been designed for Linux, Apache, PHP and an SQL database, and currently there has been very little testing for Windows hosted environments. Some people have done it successfully. You might want to search this wiki and the mahara.org forum for the instructions they've used. Because Mahara was designed to run on Apache, you will probably find it easier to use Apache in XAMPP than to use IIS or another webserver software.<br />
<br />
Because [[Developer_Area/Mahara_project_overview#Who_makes_Mahara.3F|Catalyst IT]] is an all-open-source software company, it is very unlikely the Mahara core team will have the resources to support hosting on Windows any time soon. So while you may be able to install Mahara on a Windows server without too much bother, be aware that we do not officially support this and may not be able to assist you if you have any issues.<br />
<br />
===What about hosting Mahara on Solaris/Mac/BSD/Other *nix OS?===<br />
<br />
The developers do not explicitly test for these OSes. While they may well work, there may be issues that the developers cannot help you with. If you come across an issue and work out why it doesn't work, please consider posting in the forums or opening a bug report, so that others may benefit too!<br />
<br />
===Will Mahara ever support Windows/Solaris/Other webservers/Other databases===<br />
<br />
Unfortunately, the answer is probably not, unless someone wants to fund this, or offers their own time and services to implement and maintain this functionality.<br />
<br />
Mahara is [[Developer_Area/Mahara_project_overview#Who_makes_Mahara.3F|primarily maintained and developed]] by the Mahara team at [https://www.catalyst.net.nz Catalyst IT] in New Zealand. The Catalyst IT Mahara team (often referred to as "Mahara HQ") is funded primarily by paid client support, hosting, and customization requests. So our highest priority goes to implementing features or bug fixes that are specifically funded by our clients. If you would like to help support the Mahara project by sponsoring a feature or bug fix, you can buy a [https://www.catalyst.net.nz/what-we-offer/learning-and-development/mahara-support-packages Mahara support package], or contract with Catalyst for larger requests.<br />
<br />
Beyond that, we have a limited number of resources for unfunded maintenance and expansion of the Mahara project. (Catalyst IT is committed to open source software, but is not a charity.) We try to use these resources in areas where they will produce the greatest benefit for the greatest number of Mahara users, and testing Mahara on other hosting platforms is probably not one of those areas.<br />
<br />
However, we are very willing to accept patches or implement small code adaptations to make Mahara run more smoothly on other systems. If you can help with this, see [[Developer Area/Contributing Code]].<br />
<br />
===Can I use shared hosting?===<br />
<br />
Maybe. It depends on your host. Some hosts disable certain functions (e.g. <code>exec</code>) or use safe mode, and these things can badly impact on Mahara functionality. '''Mahara is not explicitly designed to run on shared hosting''' - while it is a goal we keep in mind, and will accept patches for, '''shared hosting by its nature limits what you can do''', and you should endeavour to obtain a VPS or dedicated host if at all possible.<br />
<br />
If you would still like to install Mahara on shared hosting, you can [http://linx.ml/view/view.php?t=4LvhtJH8NgEMfy1Ii3R5 follow the instructions]. This guide will show you how to install Mahara via cPanel and is designed for users who don't have any previous experience with creating websites or setting up databases.<br />
<br />
===npm and nodejs are not available in the Debian repo. How do I install them on my Debian server?===<br />
<br />
You will only need npm or nodejs if you are attempting to compile Mahara's theme CSS for Mahara 15.10 or later, after cloning the Mahara git repository. If you're using an earlier version of Mahara, or you downloaded Mahara from the zip file on Launchpad, the CSS files will already be included and this question probably does not apply to you.<br />
<br />
To install npm and nodejs on Debian, you'll need sudo access:<br />
<pre><br />
echo "deb https://deb.nodesource.com/node_0.12 wheezy main" > /etc/apt/sources.list.d/nodesource.list<br />
curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add -<br />
apt-get install apt-transport-https<br />
apt-get update; apt-get install nodejs; npm install -g gulp<br />
</pre><br />
<br />
===I am confused by all of this, where do I go to get help now?===<br />
<br />
To the [http://mahara.org/interaction/forum/view.php?id=2 Mahara Support forums], or #mahara on freenode.</div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Contributing_Code&diff=13598Developer Area/Contributing Code2023-03-03T00:46:28Z<p>Robertl: /* Setting up Gerrit in your local Mahara repository */</p>
<hr />
<div>==If all else fails...==<br />
<br />
Admittedly, it can be a little intimidating for a new developer to go through the process described on this page to submit patches to Mahara. If you can't get this working, or don't want to, feel free to simply attach your patch file directly to a [https://bugs.launchpad.net/mahara/+filebug bug report in Launchpad]. (It's helpful if you can specify the exact version of Mahara your patch applies against.) Or link to a commit on github. Or even paste code directly into the bug report. We welcome all contributions. :)<br />
<br />
From there, another member of the Mahara community can push your contribution into Gerrit, using <tt>git commit --author="Your Name <youremail@example.com>"</tt> to credit you as the author of the change.<br />
<br />
But if you plan on being a regular contributor to Mahara, it's preferable if you can follow the process described below. If you have difficulties, feel free to ask for help on #mahara-dev on irc.freenode.net, or in the [https://mahara.org/interaction/forum/view.php?id=48 Mahara developer forums].<br />
<br />
==Getting ready for using Gerrit==<br />
<br />
The [https://reviews.mahara.org/ Mahara code review system] uses [http://code.google.com/p/gerrit Gerrit], a web-based collaborative tool for code revision. This allows anyone who wish to contribute to submit code and get it added to Mahara core. You do not need commit permission on the main Mahara repository, or to be part of the "Mahara Reviewers" group to send your patchsets through the Gerrit system. Essentially, Gerrit is an intermediate step on the way of the patch between your local workspace and the main Mahara repository. For your local git clone of Mahara, Gerrit is just another remote branch which one can push changes to that will be shown on the Gerrit web interface.<br />
<br />
====Initial setup====<br />
<br />
First you'll need to create accounts on Launchpad and reviews.mahara.org, and install some local software. You'll find instructions for that here:<br />
<br />
*[[Developer Area/Developer Tools]].<br />
<br />
====Get a copy of the Mahara source code from git====<br />
<br />
Grab a read-only copy of the [https://github.com/MaharaProject/mahara Mahara repo] from Github:<br />
<br />
cd /path/to/your/web/directory<br />
git clone git@github.com:MaharaProject/mahara.git<br />
<br />
This will create a copy of the Mahara source code at '''/path/to/your/web/directory/mahara'''. For testing purposes, you'll probably want to configure this code so that it actually runs as a copy of Mahara on your local machine. If you need instructions on how to do that, check out [[Developer_Area/Developer_Environment | Setting up your developer environment]].<br />
<br />
====Setting up Gerrit in your local Mahara repository====<br />
<br />
Add the gerrit site as a new remote in your local git repository. (Replace '''username''' with your username on reviews.mahara.org). '''The username is case-sensitive''', which is why we recommend using a lowercase one.<br />
<br />
cd /path/to/your/web/directory/mahara<br />
git remote add gerrit ssh://'''username'''@reviews.mahara.org:29418/mahara<br />
<br />
If you cannot use SSH, do:<br />
<br />
git remote add gerrit https://reviews.mahara.org/mahara<br />
<br />
To test whether this has worked correctly, try this command:<br />
<br />
git fetch gerrit<br />
<br />
You should see git fetch a list of branches. If you don't see that, or you see an error message, check out the [[Developer Area/Contributing Code/Troubleshooting your Gerrit connection|troubleshooting your Gerrit connection]] page.<br />
<br />
If that doesn't work and you get a message mentioning diffie-hellman, add the following lines to your ssh config file in your home directory. We need those due to an older version of SSH still being used for the moment:<br />
<br />
<pre><br />
Host reviews.mahara.org<br />
Hostname 202.78.242.17<br />
Port 29418<br />
KexAlgorithms +diffie-hellman-group1-sha1<br />
</pre><br />
<br />
Next, you will need to add a commit hook to your local git repo, to generate a <tt>Change-Id:</tt> line in your commit messages as required for proper gerrit functioning:<br />
<br />
scp -p -P 29418 '''username'''@reviews.mahara.org:hooks/commit-msg .git/hooks/<br />
<br />
Make this file executable:<br />
<br />
chmod u+x /path/to/your/web/directory/mahara/.git/hooks/commit-msg<br />
<br />
If you wish to have your instance of Mahara to be able to compile the css (version 15.10+) on the checkout of a patchset from Gerrit then you can, from your Mahara base directory, do the following:<br />
<br />
touch .git/hooks/post-checkout && chmod 764 .git/hooks/post-checkout<br />
<br />
Edit the file and add the following, making sure the #!/bin/bash is the first line of the file:<br />
<code><pre><br />
#!/bin/bash<br />
<br />
set -e<br />
<br />
# The three values we get from post-checkout hook<br />
prevHEAD=$1<br />
newHEAD=$2<br />
checkoutType=$3<br />
<br />
[[ $checkoutType == 1 ]] && checkoutType='branch' || checkoutType='file' ;<br />
<br />
newHEADcheck=$(git name-rev --name-only $newHEAD)<br />
branch=$newHEADcheck<br />
if [ $newHEADcheck = 'undefined' ]; then<br />
# see if we can find out what the branch we will be merging the patch to <br />
maharaBranch=$(curl -s https://reviews.mahara.org/changes/?q=$newHEAD | grep branch)<br />
<br />
regex='"branch":"([^"]+)"'<br />
if [[ $maharaBranch =~ $regex ]]; then<br />
branch=${BASH_REMATCH[1]}<br />
fi<br />
<br />
if [ "$branch" = "main" ]; then<br />
# get git root directory<br />
gitRoot=$(git rev-parse --show-toplevel)<br />
cd $gitRoot<br />
printf '\npost-checkout hook\n'<br />
make cleancomposer<br />
make initcomposerdev<br />
fi<br />
make clean-css<br />
make css<br />
fi<br />
</pre></code><br />
So now when you checkout a gerrit patch that is on main branch it should compile the css.<br />
<br />
==Preparing / organising your changes==<br />
<br />
Some basic guidelines:<br />
<br />
*'''One patchset per logical change'''<br />
**If you've fixed three or four bugs in entirely different parts of the system, sending them together as one patchset makes it harder to review, manage, and merge them. For instance, if it turns out that one of the three fixes is incorrect, while the other two are ready to merge, or if only one fix needs to be back-ported to previous versions of Mahara.<br />
*'''Include technical details with each change'''<br />
**You should briefly describe what the change intends to do. The ''worst'' possible description you could use is "fixed bug", or possibly "rawr". What we want to see is enough detail about what was wrong, and if not obvious from the patch, why you fixed the problem the way you did. If your description starts getting too long (more than a paragraph), it's probably a sign that you should split up your patches.<br />
*'''Group related patches together into topics'''<br />
**If you are developing a larger feature as a series of related patches, group them together into a topic (see the section below on how to do this in gerrit). A topic is especially important if the first few patches in the series don't really achieve anything on their own. A reviewer will be able to make sense of an earlier patch by looking forward to later ones within the same topic. The commit message of the earlier patch should explain the plan, and the whole series of patches should be submitted at the same time.<br />
*'''Apply new patch on top of clean checked-out branch'''<br />
**Every new patch should be applied on top of the clean checked-out branch to avoid adding dependencies in error.<br />
*'''Consider the reviewer'''<br />
**Following the guidelines above should help to make your patches easier for the reviewer to read and understand. But also try to remember that the person reviewing your code would probably rather be doing something else, like writing their own code. They don't want to have to review your patch twice, so don't submit patches until they're well-tested, and until you're absolutely sure the code is correct.<br />
*'''Make sure your changes "blend in" with the surrounding code'''<br />
**By that, we mean make sure you're using four spaces for indentation, the same bracing style the surrounding code uses for if {} etc. Make sure your changes are internationalised using our translation system, and that you throw exceptions the same way the existing code does when errors occur. If your code isn't too much different, we'll probably help you out by fixing it up. But if you're using tabs, weird bracing styles and your own functions for database access, your code is sure to be rejected.<br />
*'''Make sure that the new code follows our [[Developer Area/Coding guidelines|coding guidelines]]'''<br />
<br />
Here are some additional articles you might be interested in reading:<br />
<br />
*[http://feeding.cloud.geek.nz/2009/06/writing-perfect-patch.html Writing good patches]<br />
*[http://feeding.cloud.geek.nz/2009/07/3-ways-to-improve-your-source-control.html Keeping source code history clean]<br />
*[http://wiki.postgresql.org/wiki/Creating_Clean_Patches Creating Clean Patches]<br />
<br />
==Submitting commits for review==<br />
<br />
===Preferred method===<br />
<br />
This is the '''preferred method''' of pushing things to Gerrit, but you should understand what it does by reading the [[Developer_Area/Contributing_Code#Manual_method|manual method]] as well. <br />
<br />
Note: To use this, you will need to install '''xmllint'''. On debian/ubuntu based systems, this is in '''libxml2-utils'''. <br />
<br />
To push your change, simply type this in the root directory of your feature/bugfix branch, eg the parent directory of the htdocs/ directory:<br />
<br />
make push<br />
<br />
or if you want to add a Gerrit tag:<br />
<br />
make push TAG=topic_for_this_change<br />
<br />
Note: You only need to do the topic tag once.<br />
<br />
If what you are working on is not finished but you want to save / show your workings to others you can push the patch as 'Work in progress' via:<br />
<br />
make wip<br />
<br />
or<br />
<br />
make wip TAG=topic_for_this_change<br />
<br />
This will run a few initial sanity checks and either push your changes to Gerrit or will return warnings about coding problems that you will need to fix ([https://wiki.mahara.org/index.php/Developer_Area/Contributing_Code#Making_changes_in_existing_commits see below]).<br />
<br />
'''Note:''' Setting the topic is encouraged for patches that contain new functionality so that they can be spotted more easily as someone from the core team needs to do the front-end verification. A tester's OK would not be enough as they may only test that it works, but not review the implementation itself. The topic tag should include "(feature)".<br />
<br />
'''Note:''' To set a topic with a spaces in it you will need to do place it in double quotes and put a backslash before the space, eg: TAG="My\ new\ patch"<br />
<br />
Once a patch is pushed to Gerrit it is run through a host of automated tests and (after a short while) will update the Gerrit review with a pass or fail in the automated Tests (AT) column.<br />
<br />
If your patch fails the automated tests you can follow the link provided in the comments section to find out why your patch failed to help debug and fix the issues ([https://wiki.mahara.org/index.php/Developer_Area/Contributing_Code#Making_changes_in_existing_commits see below]).<br />
<br />
====Apple Mac Computers====<br />
Apple Mac Devices may have an extra requirement to update the libraries in use. This is especially important if encountering these error messages when running "make push":<br />
<br />
xargs: illegal option -- -<br />
<br />
sed: illegal option -- r <br />
<br />
On an Apple Mac device, the version of "xargs" and "sed" is different and you may see the above errors even if these libraries are already installed.<br />
To resolve these issues, install gnu-sed and findutils using the "--with-default-names" option to line them up to the expected Linux counterparts.<br />
<br />
Install Homebrew<br />
<br />
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"<br />
<br />
Install required libraries of xmllint, sed, and xargs<br />
<br />
brew install xmlstarlet --with-default-names<br />
<br />
brew install gnu-sed --with-default-names<br />
<br />
brew install findutils --with-default-names<br />
<br />
Tips:<br />
<br />
Update Git to use the correct email address associated with Gerrit Before making any changes by using the command below with the Gerrit email in use:<br />
<br />
git config user.email "email@example.com"<br />
<br />
Be careful if using "sudo" (superuser do) for commands when pushing to Gerrit on an Apple Mac device. The SSH keys are user based, and the sudo command may end up using a different set of SSH keys, resulting in the push being rejected.<br />
<br />
===Manual method===<br />
<br />
In order to push your changes for review, just push into the project's magical <tt>refs/publish/'''remote_branchname'''</tt> ref. If you are pushing to the remote main branch and your current local branch is ''bug123456'', your command will be:<br />
<br />
git push gerrit HEAD:refs/for/'''main'''<br />
<br />
Once you pushed, your change will be available for review on the [https://reviews.mahara.org/ Mahara code review system]. The single change will be created on review system for each commit you pushed. If you push several commits, gerrit will add dependencies between changes based on the git parent ref.<br />
<br />
You may also push a single commit, simply use its hash:<br />
<br />
git push gerrit '''38f4f96df''':refs/for/main<br />
<br />
If you like, you may specify the topic tag that will be shown in your change details on review system. This tag may be associated with a group of changes if you use it for several commits. To do that, simply append it to the destination ref, e.g.<br />
<br />
git push gerrit HEAD:refs/for/main/'''topic_for_this_change'''<br />
<br />
'''Note:''' Setting the topic is encouraged for patches that contain new functionality so that they can be spotted more easily as someone from the core team needs to do the front-end verification. A tester's OK would not be enough as they may only test that it works, but not review the implementation itself. The topic tag should include "(feature)".<br />
<br />
==Security patches==<br />
<br />
For patches for security issues, use:<br />
<br />
make security<br />
<br />
or<br />
<br />
make security TAG=topic_for_this_change<br />
<br />
This will submit your patch into gerrit as a "Private" submission, which will be only visible to you and to people in gerrit's "Security" group. The downside to this is that the code review system doesn't work automatically for Draft submissions, so verifications and review have to be made as freetext comments, rather than +/-.<br />
<br />
==Git for Newbs==<br />
<br />
If you're new to git, here is a cheat sheet of some of the operations you'll likely need to do.<br />
<br />
===Creating a new branch for your change===<br />
<br />
We strongly recommend you create one git branch per change you want to submit. First, make sure you have checked out the "main" branch, and that it is up to date and clean of any changes:<br />
<br />
git checkout main -f<br />
git reset --hard origin/main<br />
git pull<br />
<br />
Then create the new branch. It is useful to give it a meaningful name like a Launchpad bug number.<br />
<br />
git checkout -b bug123456<br />
<br />
Make the changes you want. When you're done, you'll need to group them into a git commit and push that commit to gerrit. First, check what changes you have in your local workspace:<br />
<br />
git status<br />
<br />
Next, add any new files that you have added which are not yet tracked by git. You will need to add them by name, for example:<br />
<br />
git add htdocs/view/my_new_view_file.php<br />
<br />
Then, you can commit the modified/deleted files with:<br />
<br />
git commit -a<br />
<br />
Or if you want to choose interactively which bits of code to add:<br />
<br />
git add -p<br />
git commit<br />
<br />
And finally, use this branch when you push to the code review system ([https://wiki.mahara.org/index.php/Developer_Area/Contributing_Code#Submitting_commits_for_review see below]).<br />
<br />
===Making changes in existing commits===<br />
<br />
It's best to check out the commit from Gerrit itself. There will be a link under the download section with "checkout" highlighted - to copy/paste, eg:<br />
<br />
git fetch https://reviews.mahara.org/mahara refs/changes/57/1234/1 && git checkout FETCH_HEAD<br />
<br />
Make the changes that you need and add them ready for committing<br />
<br />
git add -p<br />
<br />
Then commit these new changes to the same commit message as before:<br />
<br />
git commit --amend<br />
<br />
Another option is commit squashing, below.<br />
<br />
When your commit has been reviewed, you may require to make some changes before it will be accepted. The changes you will be doing should be [http://book.git-scm.com/4_interactive_rebasing.html squashed] into the same commit you originally pushed for review. You must ensure that the <tt>Change-Id:</tt> line is preserved the same as in the original commit. This will make Gerrit matching this commit to the original one and appending your changes as a new patchset. The simplest workflow would be:<br />
<br />
#Checkout the branch where your original changes are (see above)<br />
#Make the required changes<br />
#Commit the changes<br />
#*The commit message does not matter as it will be removed when the commit is squashed, so random text here is fine.<br />
#Use [http://book.git-scm.com/4_interactive_rebasing.html interactive rebasing] to squash the latest commit into the previous commit.<br />
#*An example command for this would be: <tt>git rebase -i HEAD~2</tt><br />
#*Find the latest commit in the list (it should be the bottom-most commit) and replace the word 'pick' with 'f'. This is short for 'fixup', which will squash the commit into the one before it, and discard the commit message. (This is what we want.) You may also use 's' in which case you will be offered to amend the commit message before squashing (ensure that you leave <tt>Change-Id:</tt> of the commit you are squashing onto).<br />
<br />
Now you may push the amended commit to review system the most convenient way:<br />
<br />
git push gerrit HEAD:refs/publish/main<br />
<br />
or<br />
<br />
make push<br />
<br />
In the Gerrit interface it will appear under the same change as a separate patchset ready for another review.<br />
<br />
===Ordering commits===<br />
<br />
If you have pushed some commits to Gerrit but then discover that one of your commits is dependent on another you can adjust the hierarchy of your commits like this.<br />
<br />
Checkout the commit that you want to come first/be the parent by getting the checkout code from the review, eg: <br />
<br />
git fetch https://reviews.mahara.org/mahara refs/changes/49/1234/1 && git checkout FETCH_HEAD<br />
<br />
Then cherry-pick the second/child commit by selecting 'cherry-pick' before copying the link, eg:<br />
<br />
git fetch https://reviews.mahara.org/mahara refs/changes/50/2345/1 && git cherry-pick FETCH_HEAD<br />
<br />
If the child commit merge throws an error, ie you should see lines like: <br />
hint: after resolving the conflicts, mark the corrected paths<br />
hint: with 'git add <paths>' or 'git rm <paths>'<br />
hint: and commit the result with 'git commit'<br />
<br />
you will need to fix up the merge conflicts - first go:<br />
<br />
git status<br />
<br />
to see which files are causing the merge problems. you should see something like 'Changes to be committed:' listing the files that will merge fine, and 'Unmerged paths:' listing files that will need to be fixed.<br />
<br />
Edit the files that need to be fixed and you should see in them some new lines added beginning with <<<<<<< HEAD then some code (part 1), then ======= then some other code (part 2), then >>>>>>> followed by commit id and commit title<br />
<br />
What you need to do is to work out which bits of code to keep from part 1 and edit part 2 to suit (or visa versa) delete the <<<<<<<, =======, >>>>>>> lines and any code not needd once you are done.<br />
<br />
Save the file and then add the resolved file to the commit by adding the full file directly, eg:<br />
<br />
git add /name/of/file.php<br />
<br />
once all the Unmerged paths files are fixed and added then go:<br />
<br />
git commit<br />
make push<br />
<br />
If the child commit has merged cleanly onto the parent one you can then push it back to Gerrit<br />
<br />
make push<br />
<br />
And now in Gerrit you will see under the dependencies section that the child patch has a new patchset and that patchset depends on the parent patch/commit.<br />
<br />
===Committing in some easy condensed steps===<br />
<br />
====First commit====<br />
<br />
1. Make sure you are on the latest main.<br />
<br />
git checkout main<br />
git pull<br />
<br />
2. Make changes to the file(s) that you want to fix in your favorite editor.<br />
<br />
3. Check which files you have changed.<br />
<br />
git status<br />
<br />
4. Review your changes by comparing them to the original content of the file.<br />
<br />
git diff<br />
<br />
5. Double-check on which branch you are. You should be on "main".<br />
<br />
git branch<br />
<br />
6. Create a new branch which contains the changed files. You can give the branch any name you like as long as you remember what you changed on it. Using the bug number in the branch name is easy to identify it.<br />
<br />
git checkout -b bug[bug number]<br />
<br />
7. Double-check that you are now on that new branch and that you still see the changed files.<br />
<br />
git branch<br />
git status<br />
<br />
8. Commit your changes to git. Please read [http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html how to write good commit messages]. Ideally, the Launchpad bug number appears in the first line of the commit so that it appears in the changelog. If the first line would get too long, put the bug number in the second or last line. It will then be linked back to Launchpad and your patch will be associated to the bug correctly. The "-a" means that all files that have changed will be taken into consideration.<br />
<br />
git commit -a<br />
<br />
9. Check your local git log that you committed your change and that the commit message doesn't contain any errors. You can make changes to your commit message if necessary with "git --amend".<br />
git log<br />
<br />
10. Push your changes to the review system. Make a note of the URL under which your patch is available for review. You will also see it appear on your Gerrit dashboard.<br />
<br />
make push<br />
<br />
====Re-submit a patch====<br />
<br />
You may have to make changes to a patch that you submitted based on feedback you receive from the reviewers.<br />
<br />
1. Make sure that you are on the branch in which you fixed the bug. If necessary, switch to it with git checkout.<br />
<br />
git branch<br />
git checkout bug[bugnumber]<br />
<br />
2. Make the necessary changes.<br />
<br />
3. Check which files you have changed.<br />
<br />
git status<br />
<br />
4. Review your changes by comparing them to the original content of the file.<br />
<br />
git diff<br />
<br />
5. Add the file(s) to the commit.<br />
<br />
git add [filename] OR<br />
git add . (adds all files that have changed)<br />
<br />
6. Open the commit message and make changes if necessary. Then save the file. The command given here is for vim.<br />
<br />
git commit --amend<br />
[in vim] :wq<br />
<br />
7. Review that your changes to the commit message made it into the log.<br />
<br />
git log<br />
<br />
8. Push your changes to the review system<br />
<br />
make push<br />
<br />
==Useful links==<br />
<br />
*[https://reviews.mahara.org/Documentation/index.html Gerrit official documentation]<br />
*[http://www.itk.org/Wiki/ITK/Gerrit/ReviewPrimer Gerrit Review Primer] - useful for getting familiar with review interface.<br />
<br />
==FAQ==<br />
<br />
Or rather: Questions a couple of people asked that many others might have. :-)<br />
<br />
1.<br />
<br />
'''Q:''' If I was creating a feature request (not a bug), should I still create a launchpad bug?<br />
<br />
'''A:''' Yes. Launchpad does not distinguish between bugs and feature requests. We identify features by the status "Wishlist".<br />
<br />
<br />
2. <br />
<br />
'''Q:''' How do I link my launchpad bug with the Gerrit change?<br />
<br />
'''A:''' When you put the bug number in your commit message with "Bug 1234567" or "Bug #1234567" then that will be translated into a link to that bug on Launchpad and also automatically update Launchpad to include a link to the review.<br />
<br />
It is recommended to start your commit message with the bug number like so: <br />
<br />
Bug 1234567: Your short commit message here<br />
<br />
Second line of the commit message with more detail<br />
If you have a lot to say, break your commit message<br />
at about 50 characters so nobody needs to scroll<br />
horizontally in order to read your commit message. ;-)<br />
<br />
<br />
3. <br />
<br />
'''Q:''' Do I need to add some tags to launchpad so people will notice it?<br />
<br />
'''A:''' No. That is not necessary. Tags will be added during the triage process. It is enough for you to report the issue. The core team will assign the appropriate status and priority amongst other things.<br />
<br />
<br />
4. <br />
<br />
'''Q:''' How can I request that a "bug" be backported to an older release?<br />
<br />
'''A:''' We decide that for Mahara core. Generally, we only backport high importance bugs. Once a bug fix has passed review (and is merged), you can backport it for your older version of Mahara yourself.<br />
<br />
If you disagree with not backporting a bug fix, you can provide a reason for actually doing so on the Launchpad item.<br />
<br />
<br />
5. <br />
<br />
'''Q:''' What is the typical process for creating a patch?<br />
<br />
'''A:''' <br />
<br />
#. Create the Launchpad bug.<br />
#. Add the patch to Gerrit so you can link it to the bug number.<br />
#. Wait for reply and comment.<br />
#. Fix things up if needed in the code review system.<br />
#. It gets merged.<br />
<br />
6.<br />
<br />
'''Q:''' I'm having trouble with make css. How do I avoid SyntaxError: Use of const in strict mode?<br />
<br />
'''A:''' You need to update your nodejs version.<br />
This can be achieved via<br />
a) Clear NPM's cache:<br />
<br />
sudo npm cache clean -f<br />
<br />
b) Install a little helper called 'n'<br />
<br />
sudo npm install -g n<br />
<br />
c) Install latest stable NodeJS version<br />
<br />
sudo n stable<br />
<br />
[[Category:Developer Area]]</div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Developer_Meetings/92&diff=13451Developer Area/Developer Meetings/922022-11-08T22:48:02Z<p>Robertl: </p>
<hr />
<div>Agenda for the 92nd Mahara developer meeting on '''[https://www.timeanddate.com/worldclock/fixedtime.html?msg=Mahara+dev+meeting&iso=20221109T12&p1=264 Tuesday, 8 November 2022 at 23:00:00 UTC]'''<br />
<br />
We will meet online using [https://bigbb.catalyst.net.nz/gl/kri-qrp-eqx Big Blue Button] (A Catalyst staff member will initiate the call).<br />
<br />
Our #Mahara channel on Matrix will be our backup in case there are problems with the web conferencing tool and we'll need to chat to resolve it. You can connect to our Matrix channel also using the #mahara channel on Freenode IRC.<br />
<br />
*Chair: Robert Lyon<br />
*Minute taker: Doris Tam<br />
<br />
[[Developer_Area/Developer_Meetings/Chair_Duties|Chair and minute taker duties explained]]<br />
<br />
==Agenda==<br />
Items from previous meetings<br />
<br />
*Robert: Change to makefile to add some basic security checks<br />
* Update coding and code review guidelines to add words around security<br />
* Mahara 22.10<br />
* Roadmap for 23.04, in particular the [[Proposals/Outcomes portfolio|outcomes portfolio]]<br />
<br />
New items</div>Robertlhttps://wiki.mahara.org/index.php?title=Releases&diff=13443Releases2022-11-01T01:00:16Z<p>Robertl: /* Current and upcoming releases */</p>
<hr />
<div>=Release cycle and version support=<br />
<p>A new major version of Mahara is released every 6 months, in April and October. The version numbers reflect the year and the month in which a version was released. See [[Developer_Area/Version_Numbering_Policy|Version Numbering Policy]] for more details.<br><br />
<br />
{| class="wikitable" style="padding:0em; text-align:left" summary="Mahara's six monthly cycle for April and October releases."<br />
! scope="col" style="text-align:left; background-color:#566d31; color:#fff;" |Release cycle<br />
! scope="col" style="text-align:left;" |Nov - Apr<br />
! scope="col" style="text-align:left;" |May - Oct<br />
|-<br />
! scope="row" style="text-align:left;" |Feature freeze<br />
| style="background-color:#fff;" |Early February<br />
| style="background-color:#fff;" |Early August<br />
|-<br />
! scope="row" style="text-align:left;" |UI freeze<br />
| style="background-color:#fff;" |Early March<br />
| style="background-color:#fff;" |Early September<br />
|-<br />
! scope="row" style="text-align:left;" |Release candidate<br />
| style="background-color:#fff;" |Mid March<br />
| style="background-color:#fff;" |Mid September<br />
|-<br />
! scope="row" style="text-align:left;" |Official release<br />
| style="background-color:#fff;" |Late April<br />
| style="background-color:#fff;" |Late October<br />
|-<br />
|}<br />
<ul><br />
<li> Each release has 16 weeks before feature freeze.</li><br />
<li>For each release, We've put feature freeze at a month before the release candidate. Only non-feature bug fixes will be committed after this </li><br />
<li>The week before the release candidates is a UI freeze. This is a freeze to string changes and theme changes. String or UI fixes will need to be at least high importance.</li><br />
</ul></p><br />
<p></p><br />
<p><strong>The standard support lifetime of a major version is 18 months (3 release cycles):</strong><br><br />
<ul><br />
<li>Receives bug fixes and security fixes for the first 6 months</li><br />
<li>Receives security fixes only, for an additional 12 months</li><br />
</ul><br />
In the event that a major release substantially breaks backwards compatibility, we may declare the previous release to be an extended support release which will receive security fixes for 30 months (5 release cycles), to give sites more time to upgrade.</p><br />
<br />
=Older releases (pre Mahara 1.6)=<br />
<br />
Prior to Mahara 1.6, Mahara major versions were released as needed, according to no particular schedule. During the transition period to the 6 month release cycle, support for the older releases was provided for 2 release cycles.<br />
<br />
=Current and upcoming releases=<br />
<p>The latest <strong>stable</strong> version of Mahara is 22.04, released on 27 April 2022.</p><br />
<br />
<p>'''Note:''' This page is updated manually, and sometimes falls behind. For 100% up-to-date information, look for the release labelled "Current Stable Release" on our [https://launchpad.net/mahara/+series Launchpad release page], or use the "Download" link on the front page of https://mahara.org</p><br />
<br />
{| class="wikitable"<br />
| style="background:#ba2025; color:#fff" |Unsupported<br />
| style="background:#566d31; color:#fff" |Currently in support<br />
|Not yet released<br />
|}<br />
<br />
<!-- This is the template for the table sections below<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff"|'''[https://mahara.org/interaction/forum/topic.php?id= Major point release number]'''<br />
|<br />
* [https://launchpad.net/mahara/ Minor point release number]<br />
| '''Major point release date''' <br><br />
* Minor point release dates<br />
| style="background:#566d31; color:#fff" | End of support date<br />
|-<br />
--><br />
<br />
{| class="wikitable" summary="Release notes for major and minor versions of Mahara, official release dates and version support end date. Versions are listed in reverse chronological order. Table is four columns wide and 22 rows deep."<br />
|+ style="text-align:left;" |Mahara release notes and end of support<br />
|-<br />
! style="text-align:left;" |Major release<br />
! style="text-align:left;" |Minor release<br />
! style="text-align:left;" |Release date<br />
! style="text-align:left;" |End of support<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=9097 22.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/22.10.0#release-notes 22.10.0]<br />
|'''31 October 2022''' <br><br />
<br />
*31 October 2022<br />
| style="background:#566d31; color:#fff" |April 2024<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=9097 22.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/22.04.2#release-notes 22.04.2]<br />
*[https://launchpad.net/mahara/+milestone/22.04.1#release-notes 22.04.1]<br />
*[https://launchpad.net/mahara/+milestone/22.04.0#release-notes 22.04.0]<br />
|'''27 April 2022''' <br><br />
<br />
*16 June 2022<br />
*2 May 2022<br />
*27 April 2022<br />
| style="background:#566d31; color:#fff" |October 2023<br />
|-<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8955 21.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/21.10.5#release-notes 21.10.5]<br />
*[https://launchpad.net/mahara/+milestone/21.10.4#release-notes 21.10.4]<br />
*[https://launchpad.net/mahara/+milestone/21.10.3#release-notes 21.10.3]<br />
*[https://launchpad.net/mahara/+milestone/21.10.2#release-notes 21.10.2]<br />
*[https://launchpad.net/mahara/+milestone/21.10.1#release-notes 21.10.1]<br />
*[https://launchpad.net/mahara/+milestone/21.10.0#release-notes 21.10.0]<br />
|'''29 October 2021''' <br><br />
<br />
*31 October 2022<br />
*16 June 2022<br />
*2 May 2022<br />
*27 April 2022<br />
*9 February 2022<br />
*29 October 2021<br />
| style="background:#566d31; color:#fff" |April 2023<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8817 21.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/21.04.6#release-notes 21.04.6]<br />
*[https://launchpad.net/mahara/+milestone/21.04.5#release-notes 21.04.5]<br />
*[https://launchpad.net/mahara/+milestone/21.04.4#release-notes 21.04.4]<br />
*[https://launchpad.net/mahara/+milestone/21.04.3#release-notes 21.04.3]<br />
*[https://launchpad.net/mahara/+milestone/21.04.2#release-notes 21.04.2]<br />
*[https://launchpad.net/mahara/+milestone/21.04.1#release-notes 21.04.1]<br />
*[https://launchpad.net/mahara/+milestone/21.04.0#release-notes 21.04.0]<br />
|'''30 April 2021''' <br><br />
<br />
*16 June 2022<br />
*2 May 2022<br />
*27 April 2022<br />
*9 February 2022<br />
*29 October 2021<br />
*21 May 2021<br />
*30 April 2021<br />
| style="background:#566d31; color:#fff" |October 2022<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8728 20.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/20.10.6#release-notes 20.10.6]<br />
*[https://launchpad.net/mahara/+milestone/20.10.5#release-notes 20.10.5]<br />
*[https://launchpad.net/mahara/+milestone/20.10.4#release-notes 20.10.4]<br />
*[https://launchpad.net/mahara/+milestone/20.10.3#release-notes 20.10.3]<br />
*[https://launchpad.net/mahara/+milestone/20.10.2#release-notes 20.10.2]<br />
*[https://launchpad.net/mahara/+milestone/20.10.1#release-notes 20.10.1]<br />
*[https://launchpad.net/mahara/+milestone/20.10.0#release-notes 20.10.0]<br />
|'''22 October 2020'''<br><br />
<br />
*2 May 2022<br />
*27 April 2022<br />
*9 February 2022<br />
*29 October 2021<br />
*21 May 2021<br />
*4 May 2021<br />
*22 October 2020<br />
| style="background:#ba2025; color:#fff" |April 2022 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8611 20.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/20.04.5#release-notes 20.04.5]<br />
*[https://launchpad.net/mahara/+milestone/20.04.4#release-notes 20.04.4]<br />
*[https://launchpad.net/mahara/+milestone/20.04.3#release-notes 20.04.3]<br />
*[https://launchpad.net/mahara/+milestone/20.04.2#release-notes 20.04.2]<br />
*[https://launchpad.net/mahara/+milestone/20.04.1#release-notes 20.04.1]<br />
*[https://launchpad.net/mahara/20.04/20.04.0#release-notes 20.04.0]<br />
|'''29 April 2020'''<br><br />
<br />
*29 October 2021<br />
*22 May 2021<br />
*4 May 2021<br />
*22 October 2020<br />
*4 August 2020<br />
*29 April 2020<br />
| style="background:#ba2025; color:#fff" |October 2021 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8533 19.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/19.10.6#releasenotes 19.10.6]<br />
*[https://launchpad.net/mahara/+milestone/19.10.5#releasenotes 19.10.5]<br />
*[https://launchpad.net/mahara/+milestone/19.10.4#release-notes 19.10.4]<br />
*[https://launchpad.net/mahara/+milestone/19.10.3#release-notes 19.10.3]<br />
*[https://launchpad.net/mahara/+milestone/19.10.2#release-notes 19.10.2]<br />
*[https://launchpad.net/mahara/19.10/19.10.1#release-notes 19.10.1]<br />
*[https://launchpad.net/mahara/19.10/19.10.0#release-notes 19.10.0]<br />
|'''31 October 2019''' <br><br />
<br />
*4 May 2021<br />
*22 October 2020<br />
*4 August 2020<br />
*30 April 2020<br />
*4 April 2020<br />
*12 November 2019<br />
*31 October 2019<br />
| style="background:#ba2025; color:#fff" |April 2021 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8444 19.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/19.04/19.04.5#release-notes 19.04.5]<br />
*[https://launchpad.net/mahara/19.04/19.04.4#release-notes 19.04.4]<br />
*[https://launchpad.net/mahara/19.04/19.04.3#release-notes 19.04.3]<br />
*[https://launchpad.net/mahara/19.04/19.04.2#release-notes 19.04.2]<br />
*[https://launchpad.net/mahara/19.04/19.04.1#release-notes 19.04.1]<br />
*[https://launchpad.net/mahara/19.04/19.04.0#release-notes 19.04.0]<br />
|'''30 April 2019''' <br><br />
<br />
*30 April 2020<br />
*4 March 2020<br />
*12 November 2019<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
| style="background:#ba2025; color:#fff" |October 2020 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8365 18.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/18.10/18.10.6#release-notes 18.10.6]<br />
*[https://launchpad.net/mahara/18.10/18.10.5#release-notes 18.10.5]<br />
*[https://launchpad.net/mahara/18.10/18.10.4#release-notes 18.10.4]<br />
*[https://launchpad.net/mahara/18.10/18.10.3#release-notes 18.10.3]<br />
*[https://launchpad.net/mahara/18.10/18.10.2#release-notes 18.10.2]<br />
*[https://launchpad.net/mahara/18.10/18.10.1#release-notes 18.10.1]<br />
*[https://launchpad.net/mahara/18.10/18.10.0#release-notes 18.10.0]<br />
|'''25 October 2018''' <br><br />
<br />
*30 April 2020<br />
*4 March 2020<br />
*12 November 2019<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
*25 October 2018<br />
| style="background:#ba2025; color:#fff" |April 2020 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8216 18.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/18.04/18.04.6#release-notes 18.04.6]<br />
*[https://launchpad.net/mahara/18.04/18.04.5#release-notes 18.04.5]<br />
*[https://launchpad.net/mahara/18.04/18.04.4#release-notes 18.04.4]<br />
*[https://launchpad.net/mahara/18.04/18.04.3#release-notes 18.04.3]<br />
*[https://launchpad.net/mahara/18.04/18.04.2#release-notes 18.04.2]<br />
*[https://launchpad.net/mahara/18.04/18.04.1#release-notes 18.04.1]<br />
*[https://launchpad.net/mahara/18.04/18.04.0#release-notes 18.04.0]<br />
|'''6 April 2018''' <br><br />
<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
| style="background:#ba2025; color:#fff" |October 2019 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8084 17.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/17.10/17.10.9#release-notes 17.10.9]<br />
*[https://launchpad.net/mahara/17.10/17.10.8#release-notes 17.10.8]<br />
*[https://launchpad.net/mahara/17.10/17.10.7#release-notes 17.10.7]<br />
*[https://launchpad.net/mahara/17.10/17.10.6#release-notes 17.10.6]<br />
*[https://launchpad.net/mahara/17.10/17.10.5#release-notes 17.10.5]<br />
*[https://launchpad.net/mahara/17.10/17.10.4#release-notes 17.10.4]<br />
*[https://launchpad.net/mahara/17.10/17.10.3#release-notes 17.10.3]<br />
*[https://launchpad.net/mahara/17.10/17.10.2#release-notes 17.10.2]<br />
*[https://launchpad.net/mahara/17.10/17.10.1#release-notes 17.10.1]<br />
*[https://launchpad.net/mahara/17.10/17.10.0#release-notes 17.10.0]<br />
|'''30 October 2017''' <br><br />
<br />
*30 April 2019<br />
*30 April 2019<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*14 December 2017<br />
*30 October 2017<br />
| style="background:#ba2025; color:#fff;" |30 April 2019 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7926 17.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/17.04/17.04.10#release-notes 17.04.10]<br />
*[https://launchpad.net/mahara/17.04/17.04.9#release-notes 17.04.9]<br />
*[https://launchpad.net/mahara/17.04/17.04.8#release-notes 17.04.8]<br />
*[https://launchpad.net/mahara/17.04/17.04.7#release-notes 17.04.7]<br />
*[https://launchpad.net/mahara/17.04/17.04.6#release-notes 17.04.6]<br />
*[https://launchpad.net/mahara/17.04/17.04.5#release-notes 17.04.5]<br />
*[https://launchpad.net/mahara/17.04/17.04.4#release-notes 17.04.4]<br />
*[https://launchpad.net/mahara/17.04/17.04.3#release-notes 17.04.3]<br />
*[https://launchpad.net/mahara/17.04/17.04.2#release-notes 17.04.2]<br />
*[https://launchpad.net/mahara/17.04/17.04.1#release-notes 17.04.1]<br />
*[https://launchpad.net/mahara/17.04/17.04.0#release-notes 17.04.0]<br />
|'''27 April 2017''' <br><br />
<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*12 May 2017<br />
*27 April 2017<br />
| style="background:#ba2025; color:#fff" |25 October 2018 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7750 16.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/16.10/16.10.9#release-notes 16.10.9]<br />
*[https://launchpad.net/mahara/16.10/16.10.8#release-notes 16.10.8]<br />
*[https://launchpad.net/mahara/16.10/16.10.7#release-notes 16.10.7]<br />
*[https://launchpad.net/mahara/16.10/16.10.6#release-notes 16.10.6]<br />
*[https://launchpad.net/mahara/16.10/16.10.5#release-notes 16.10.5]<br />
*[https://launchpad.net/mahara/16.10/16.10.4#release-notes 16.10.4]<br />
*[https://launchpad.net/mahara/16.10/16.10.3#release-notes 16.10.3]<br />
*[https://launchpad.net/mahara/16.10/16.10.2#release-notes 16.10.2]<br />
*[https://launchpad.net/mahara/16.10/16.10.1#release-notes 16.10.1]<br />
*[https://launchpad.net/mahara/16.10/16.10.0#release-notes 16.10.0]<br />
|'''21 October 2016''' <br><br />
<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*13 December 2016<br />
*21 October 2016<br />
| style="background:#ba2025; color:#fff" |06 April 2018 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7585 16.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/16.04/16.04.9#release-notes 16.04.9]<br />
*[https://launchpad.net/mahara/16.04/16.04.8#release-notes 16.04.8]<br />
*[https://launchpad.net/mahara/16.04/16.04.7#release-notes 16.04.7]<br />
*[https://launchpad.net/mahara/16.04/16.04.6#release-notes 16.04.6]<br />
*[https://launchpad.net/mahara/16.04/16.04.5#release-notes 16.04.5]<br />
*[https://launchpad.net/mahara/16.04/16.04.4#release-notes 16.04.4]<br />
*[https://launchpad.net/mahara/16.04/16.04.3#release-notes 16.04.3]<br />
*[https://launchpad.net/mahara/16.04/16.04.2#release-notes 16.04.2]<br />
*[https://launchpad.net/mahara/16.04/16.04.1#release-notes 16.04.1]<br />
*[https://launchpad.net/mahara/16.04/16.04.0#release-notes 16.04.0]<br />
|'''28 April 2016''' <br><br />
<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*11 July 2016<br />
*9 June 2016<br />
*28 April 2016<br />
| style="background:#ba2025; color:#fff" |30 October 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7420 15.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/15.10/15.10.8#release-notes 15.10.8]<br />
*[https://launchpad.net/mahara/15.10/15.10.7#release-notes 15.10.7]<br />
*[https://launchpad.net/mahara/15.10/15.10.6#release-notes 15.10.6]<br />
*[https://launchpad.net/mahara/15.10/15.10.5#release-notes 15.10.5]<br />
*[https://launchpad.net/mahara/15.10/15.10.4#release-notes 15.10.4]<br />
*[https://launchpad.net/mahara/15.10/15.10.3#release-notes 15.10.3]<br />
*[https://launchpad.net/mahara/15.10/15.10.2#release-notes 15.10.2]<br />
*[https://launchpad.net/mahara/15.10/15.10.1#release-notes 15.10.1]<br />
*[https://launchpad.net/mahara/15.10/15.10.0#release-notes 15.10.0]<br />
|'''23 October 2015''' <br><br />
<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*11 July 2016<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*23 October 2015<br />
| style="background:#ba2025; color:#fff" |26 April 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7171 15.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/15.04/15.04.15#release-notes 15.04.15]<br />
*[https://launchpad.net/mahara/15.04/15.04.14#release-notes 15.04.14]<br />
*[https://launchpad.net/mahara/15.04/15.04.13#release-notes 15.04.13]<br />
*[https://launchpad.net/mahara/15.04/15.04.12#release-notes 15.04.12]<br />
*[https://launchpad.net/mahara/15.04/15.04.11#release-notes 15.04.11]<br />
*[https://launchpad.net/mahara/15.04/15.04.10#release-notes 15.04.10]<br />
*[https://launchpad.net/mahara/15.04/15.04.9#release-notes 15.04.9]<br />
*[https://launchpad.net/mahara/15.04/15.04.8#release-notes 15.04.8]<br />
*[https://launchpad.net/mahara/15.04/15.04.7#release-notes 15.04.7]<br />
*[https://launchpad.net/mahara/15.04/15.04.6#release-notes 15.04.6]<br />
*[https://launchpad.net/mahara/15.04/15.04.5#release-notes 15.04.5]<br />
*[https://launchpad.net/mahara/15.04/15.04.4#release-notes 15.04.4]<br />
*[https://launchpad.net/mahara/15.04/15.04.3#release-notes 15.04.3]<br />
*[https://launchpad.net/mahara/15.04/15.04.2#release-notes 15.04.2]<br />
*[https://launchpad.net/mahara/15.04/15.04.1#release-notes 15.04.1]<br />
*[https://launchpad.net/mahara/15.04/15.04.0#release-notes 15.04.0]<br />
|'''23 October 2015''' <br><br />
<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*12 July 2016<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*29 May 2015<br />
*17 April 2015<br />
| style="background:#ba2025; color:#fff" |30 October 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=6509 1.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.10/1.10.10#release-notes 1.10.10]<br />
*[https://launchpad.net/mahara/1.10/1.10.9#release-notes 1.10.9]<br />
*[https://launchpad.net/mahara/1.10/1.10.8#release-notes 1.10.8]<br />
*[https://launchpad.net/mahara/1.10/1.10.7#release-notes 1.10.7]<br />
*[https://launchpad.net/mahara/1.10/1.10.6#release-notes 1.10.6]<br />
*[https://launchpad.net/mahara/1.10/1.10.5#release-notes 1.10.5]<br />
*[https://launchpad.net/mahara/1.10/1.10.4#release-notes 1.10.4]<br />
*[https://launchpad.net/mahara/1.10/1.10.3#release-notes 1.10.3]<br />
*[https://launchpad.net/mahara/1.10/1.10.2#release-notes 1.10.2]<br />
*[https://launchpad.net/mahara/1.10/1.10.1#release-notes 1.10.1]<br />
*[https://launchpad.net/mahara/1.10/1.10.0#release-notes 1.10.0]<br />
|'''21 October 2014''' <br><br />
<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*29 May 2015<br />
*20 April 2015<br />
*13 January 2015<br />
*26 November 2014<br />
*21 October 2014<br />
| style="background:#ba2025; color:#fff" |2 May 2016 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=6254 1.9]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.9/1.9.9#release-notes 1.9.9]<br />
*[https://launchpad.net/mahara/1.9/1.9.8#release-notes 1.9.8]<br />
*[https://launchpad.net/mahara/1.9/1.9.7#release-notes 1.9.7]<br />
*[https://launchpad.net/mahara/1.9/1.9.6#release-notes 1.9.6]<br />
*[https://launchpad.net/mahara/1.9/1.9.5#release-notes 1.9.5]<br />
*[https://launchpad.net/mahara/1.9/1.9.4#release-notes 1.9.4]<br />
*[https://launchpad.net/mahara/1.9/1.9.3#release-notes 1.9.3]<br />
*[https://launchpad.net/mahara/1.9/1.9.2#release-notes 1.9.2]<br />
*[https://launchpad.net/mahara/1.9/1.9.1#release-notes 1.9.1]<br />
*[https://launchpad.net/mahara/1.9/1.9.0#release-notes 1.9.0]<br />
|'''15 April 2014''' <br><br />
<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*26 November 2014<br />
*22 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*15 April 2014<br />
| style="background:#ba2025; color:#fff" |27 October 2015 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=5833 1.8]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.8/1.8.7#release-notes 1.8.7]<br />
*[https://launchpad.net/mahara/1.8/1.8.6#release-notes 1.8.6]<br />
*[https://launchpad.net/mahara/1.8/1.8.5#release-notes 1.8.5]<br />
*[https://launchpad.net/mahara/1.8/1.8.4#release-notes 1.8.4]<br />
*[https://launchpad.net/mahara/1.8/1.8.3#release-notes 1.8.3]<br />
*[https://launchpad.net/mahara/1.8/1.8.2#release-notes 1.8.2]<br />
*[https://launchpad.net/mahara/1.8/1.8.1#release-notes 1.8.1]<br />
*[https://launchpad.net/mahara/1.8/1.8.0#release-notes 1.8.0]<br />
|'''24 October 2013''' <br><br />
<br />
*20 April 2015<br />
*26 November 2014<br />
*22 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*3 April 2014<br />
*18 December 2013<br />
*24 October 2013<br />
| style="background:#ba2025; color:#fff" |20 April 2015 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=5371 1.7]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.7/1.7.8#release-notes 1.7.8]<br />
*[https://launchpad.net/mahara/1.7/1.7.7#release-notes 1.7.7]<br />
*[https://launchpad.net/mahara/1.7/1.7.6#release-notes 1.7.6]<br />
*[https://launchpad.net/mahara/1.7/1.7.5#release-notes 1.7.5]<br />
*[https://launchpad.net/mahara/1.7/1.7.4#release-notes 1.7.4]<br />
*[https://launchpad.net/mahara/1.7/1.7.3#release-notes 1.7.3]<br />
*[https://launchpad.net/mahara/1.7/1.7.2#release-notes 1.7.2]<br />
*[https://launchpad.net/mahara/1.7/1.7.1#release-notes 1.7.1]<br />
*[https://launchpad.net/mahara/1.7/1.7.0#release-notes 1.7.0]<br />
|'''19 April 2013''' <br><br />
<br />
*21 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*29 October 2013<br />
*3 October 2013<br />
*3 April 2014<br />
*18 December 2013<br />
*24 October 2013<br />
*19 April 2013<br />
| style="background:#ba2025; color:#fff" |21 October 2014 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=4967 1.6]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.6/1.6.10#release-notes 1.6.10]<br />
*[https://launchpad.net/mahara/1.6/1.6.9#release-notes 1.6.9]<br />
*[https://launchpad.net/mahara/1.6/1.6.8#release-notes 1.6.8]<br />
*[https://launchpad.net/mahara/1.6/1.6.7#release-notes 1.6.7]<br />
*[https://launchpad.net/mahara/1.6/1.6.6#release-notes 1.6.6]<br />
*[https://launchpad.net/mahara/1.6/1.6.5#release-notes 1.6.5]<br />
*[https://launchpad.net/mahara/1.6/1.6.4#release-notes 1.6.4]<br />
*[https://launchpad.net/mahara/1.6/1.6.3#release-notes 1.6.3]<br />
*[https://launchpad.net/mahara/1.6/1.6.2#release-notes 1.6.2]<br />
*[https://launchpad.net/mahara/1.6/1.6.1#release-notes 1.6.1]<br />
*[https://launchpad.net/mahara/1.6/1.6.0#release-notes 1.6.0]<br />
|'''19 October 2019''' <br><br />
<br />
*13 May 2014<br />
*3 April 2014<br />
*29 October 2013<br />
*3 October 2013<br />
*25 July 2013<br />
*2 May 2013<br />
*15 April 2013<br />
*15 February 2013<br />
*23 November 2012<br />
*24 October 2012<br />
*19 October 2012<br />
| style="background:#ba2025; color:#fff" |29 April 2014 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=4469 1.5]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.5/1.5.13#release-notes 1.5.13]<br />
*[https://launchpad.net/mahara/1.5/1.5.12#release-notes 1.5.12]<br />
*[https://launchpad.net/mahara/1.5/1.5.11#release-notes 1.5.11]<br />
*[https://launchpad.net/mahara/1.5/1.5.10#release-notes 1.5.10]<br />
*[https://launchpad.net/mahara/1.5/1.5.9#release-notes 1.5.9]<br />
*[https://launchpad.net/mahara/1.5/1.5.8#release-notes 1.5.8]<br />
*[https://launchpad.net/mahara/1.5/1.5.7#release-notes 1.5.7]<br />
*[https://launchpad.net/mahara/1.5/1.5.6#release-notes 1.5.6]<br />
*[https://launchpad.net/mahara/1.5/1.5.4#release-notes 1.5.4]<br />
*[https://launchpad.net/mahara/1.5/1.5.3#release-notes 1.5.3]<br />
*[https://launchpad.net/mahara/1.5/1.5.2#release-notes 1.5.2]<br />
*[https://launchpad.net/mahara/1.5/1.5.1#release-notes 1.5.1]<br />
*[https://launchpad.net/mahara/1.5/1.5.0#release-notes 1.5.0]<br />
|'''17 April 2012''' <br><br />
<br />
*25 October 2013<br />
*3 October 2013<br />
*24 July 2013<br />
*2 May 2013<br />
*15 April 2013<br />
*15 February 2013<br />
*23 November 2012<br />
*17 October 2012<br />
*10 October 2012<br />
*14 September 2012<br />
*31 July 2012<br />
*3 May 2012<br />
*17 April 2012<br />
| style="background:#ba2025; color:#fff" |29 October 2013 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=3744 1.4]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.6 1.4.6]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.5 1.4.5]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.4 1.4.4]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.3 1.4.3]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.2 1.4.2]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.1 1.4.1]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.0 1.4.0]<br />
|'''13 June 2011''' <br><br />
<br />
*17 October 2012<br />
*10 October 2012<br />
*14 September 2012<br />
*31 July 2011<br />
*6 March 2011<br />
*3 November 2011<br />
*13 June 2011<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=2252 1.3]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.3.8 1.3.8]<br />
*[https://launchpad.net/mahara/+milestone/1.3.7 1.3.7]<br />
*[https://launchpad.net/mahara/+milestone/1.3.6 1.3.6]<br />
*[https://launchpad.net/mahara/+milestone/1.3.5 1.3.5]<br />
*[https://launchpad.net/mahara/+milestone/1.3.4 1.3.4]<br />
*[https://launchpad.net/mahara/+milestone/1.3.3 1.3.3]<br />
*[https://launchpad.net/mahara/+milestone/1.3.2 1.3.2]<br />
*[https://launchpad.net/mahara/+milestone/1.3.1 1.3.1]<br />
*[https://launchpad.net/mahara/+milestone/1.3.0 1.3.0]<br />
|'''10 September 2010''' <br><br />
<br />
*5 March 2012<br />
*3 Novemver 2011<br />
*10 May 2011<br />
*28 March 2011<br />
*24 March 2011<br />
*7 November 2010<br />
*8 October 2010<br />
*17 September 2010<br />
*10 September 2010<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=1226 1.2]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.2.9 1.2.9]<br />
*[https://launchpad.net/mahara/+milestone/1.2..8 1.2.8]<br />
*[https://launchpad.net/mahara/+milestone/1.2.7 1.2.7]<br />
*[https://launchpad.net/mahara/+milestone/1.2.6 1.2.6]<br />
*[https://launchpad.net/mahara/+milestone/1.2.5 1.2.5]<br />
*[https://launchpad.net/mahara/+milestone/1.2.4 1.2.4]<br />
*[https://launchpad.net/mahara/+milestone/1.2.3 1.2.3]<br />
*[https://launchpad.net/mahara/+milestone/1.2.2 1.2.2]<br />
*[https://launchpad.net/mahara/+milestone/1.2.1 1.2.1]<br />
*[https://launchpad.net/mahara/+milestone/1.2.0 1.2.0]<br />
|'''16 November 2009''' <br><br />
<br />
*10 May 2011<br />
*24 March 2011<br />
*1 September 2011<br />
*2 July 2010<br />
*6 April 2010<br />
*8 February 2010<br />
*8 December 2009<br />
*8 December 2009<br />
*16 November 2009<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://launchpad.net/mahara/+milestone/1.0.10 1.1]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.1.9 1.1.9]<br />
*[https://launchpad.net/mahara/+milestone/1.1.8 1.1.8]<br />
*[https://launchpad.net/mahara/+milestone/1.1.7 1.1.7]<br />
*[https://launchpad.net/mahara/+milestone/1.1.6 1.1.6]<br />
*[https://launchpad.net/mahara/+milestone/1.1.5 1.1.5]<br />
*[https://launchpad.net/mahara/+milestone/1.1.4 1.1.4]<br />
*[https://launchpad.net/mahara/+milestone/1.1.3 1.1.3]<br />
*[https://launchpad.net/mahara/+milestone/1.1.2 1.1.2]<br />
*[https://launchpad.net/mahara/+milestone/1.1.1 1.1.1]<br />
*[https://launchpad.net/mahara/+milestone/1.1.0 1.1.0]<br />
|'''25 February 2009''' <br><br />
<br />
*2 July 2010<br />
*6 April 2010<br />
*28 October 2009<br />
*21 June 2009<br />
*10 June 2009<br />
*21 April 2009<br />
*9 March 2009<br />
*26 February 2009<br />
*25 February 2009<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=292 1.0]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.0.15 1.0.15]<br />
*[https://launchpad.net/mahara/+milestone/1.0.14 1.0.14]<br />
*[https://launchpad.net/mahara/+milestone/1.0.13 1.0.13]<br />
*[https://launchpad.net/mahara/+milestone/1.0.12 1.0.12]<br />
*[https://launchpad.net/mahara/+milestone/1.0.11 1.0.11]<br />
*[https://launchpad.net/mahara/+milestone/1.0.10 1.0.10]<br />
*[[Releases/1.0.9|1.0.9]]<br />
*[[Releases/1.0.8|1.0.8]]<br />
*[[Releases/1.0.7|1.0.7]]<br />
|'''9 March 2009''' <br><br />
<br />
*2 July 2010<br />
*6 April 2010<br />
*28 October 2009<br />
*21 June 2009<br />
*21 April 2009<br />
*9 March 2009<br />
*Unavailable<br />
*Unavailable<br />
*Unavailable<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
|}<br />
<br />
=Definition of support=<br />
<br />
Being "supported" means:<br />
<br />
*The release team is committed to making available updates to Mahara that are security related. See [[Security]] to find out how to report security bugs to us.<br />
*Occasionally, some other serious bug fixes will be included, but these are not guaranteed. If you find another type of bug, please let us know by reporting it on the mahara.org forums or directly on Launchpad: https://bugs.launchpad.net/mahara/+filebug<br />
<br />
=Specific backporting rules=<br />
<br />
When deciding which bugs to backport to supported branches, these are the general principles:<br />
<br />
*'''[[Security]] bugs'''<br />
**'''All''' Critical and High priority security bugs should be backported.<br />
**'''Nearly all''' Medium and Low priority security bugs should be backported. At the maintenance team's discretion, these might not be backported if:<br />
***Backporting would be technically difficult due to differences between Mahara versions.<br />
***The bug fix requires database upgrades or dataroot manipulations.<br />
***The bug fix otherwise introduces a high risk of [https://en.wikipedia.org/wiki/Software_regression regressions].<br />
<br />
*'''Non-security bugs'''<br />
**'''All''' Critical bugs should be backported.<br />
**'''Most''' High priority bugs should be backported. At the maintenance team's discretion, these might not be backported if:<br />
***Backporting would be technically difficult due to differences between Mahara versions.<br />
***The bug fix requires database upgrades or dataroot manipulations.<br />
***The bug fix otherwise introduces a high risk of [https://en.wikipedia.org/wiki/Software_regression regressions].<br />
**'''No''' Medium or Low priority non-security bugs are backported.<br />
**'''No''' Wishlist bugs are backported. Wishlist items are only added to the current development branch.<br />
<br />
If you want to backport certain bug fixes or new features to your own instance of Mahara, you can do so on your own as the code is available.<br />
<br />
See [[Developer_Area/Bug_Status#Importance|Bug Status:Importance]] for the guidelines on how we decide whether a bug is Critical, High, Medium, or Low.<br />
<br />
[[Category:Release Notes]]</div>Robertlhttps://wiki.mahara.org/index.php?title=Releases&diff=13442Releases2022-11-01T00:59:21Z<p>Robertl: /* Current and upcoming releases */</p>
<hr />
<div>=Release cycle and version support=<br />
<p>A new major version of Mahara is released every 6 months, in April and October. The version numbers reflect the year and the month in which a version was released. See [[Developer_Area/Version_Numbering_Policy|Version Numbering Policy]] for more details.<br><br />
<br />
{| class="wikitable" style="padding:0em; text-align:left" summary="Mahara's six monthly cycle for April and October releases."<br />
! scope="col" style="text-align:left; background-color:#566d31; color:#fff;" |Release cycle<br />
! scope="col" style="text-align:left;" |Nov - Apr<br />
! scope="col" style="text-align:left;" |May - Oct<br />
|-<br />
! scope="row" style="text-align:left;" |Feature freeze<br />
| style="background-color:#fff;" |Early February<br />
| style="background-color:#fff;" |Early August<br />
|-<br />
! scope="row" style="text-align:left;" |UI freeze<br />
| style="background-color:#fff;" |Early March<br />
| style="background-color:#fff;" |Early September<br />
|-<br />
! scope="row" style="text-align:left;" |Release candidate<br />
| style="background-color:#fff;" |Mid March<br />
| style="background-color:#fff;" |Mid September<br />
|-<br />
! scope="row" style="text-align:left;" |Official release<br />
| style="background-color:#fff;" |Late April<br />
| style="background-color:#fff;" |Late October<br />
|-<br />
|}<br />
<ul><br />
<li> Each release has 16 weeks before feature freeze.</li><br />
<li>For each release, We've put feature freeze at a month before the release candidate. Only non-feature bug fixes will be committed after this </li><br />
<li>The week before the release candidates is a UI freeze. This is a freeze to string changes and theme changes. String or UI fixes will need to be at least high importance.</li><br />
</ul></p><br />
<p></p><br />
<p><strong>The standard support lifetime of a major version is 18 months (3 release cycles):</strong><br><br />
<ul><br />
<li>Receives bug fixes and security fixes for the first 6 months</li><br />
<li>Receives security fixes only, for an additional 12 months</li><br />
</ul><br />
In the event that a major release substantially breaks backwards compatibility, we may declare the previous release to be an extended support release which will receive security fixes for 30 months (5 release cycles), to give sites more time to upgrade.</p><br />
<br />
=Older releases (pre Mahara 1.6)=<br />
<br />
Prior to Mahara 1.6, Mahara major versions were released as needed, according to no particular schedule. During the transition period to the 6 month release cycle, support for the older releases was provided for 2 release cycles.<br />
<br />
=Current and upcoming releases=<br />
<p>The latest <strong>stable</strong> version of Mahara is 22.04, released on 27 April 2022.</p><br />
<br />
<p>'''Note:''' This page is updated manually, and sometimes falls behind. For 100% up-to-date information, look for the release labelled "Current Stable Release" on our [https://launchpad.net/mahara/+series Launchpad release page], or use the "Download" link on the front page of https://mahara.org</p><br />
<br />
{| class="wikitable"<br />
| style="background:#ba2025; color:#fff" |Unsupported<br />
| style="background:#566d31; color:#fff" |Currently in support<br />
|Not yet released<br />
|}<br />
<br />
<!-- This is the template for the table sections below<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff"|'''[https://mahara.org/interaction/forum/topic.php?id= Major point release number]'''<br />
|<br />
* [https://launchpad.net/mahara/ Minor point release number]<br />
| '''Major point release date''' <br><br />
* Minor point release dates<br />
| style="background:#566d31; color:#fff" | End of support date<br />
|-<br />
--><br />
<br />
{| class="wikitable" summary="Release notes for major and minor versions of Mahara, official release dates and version support end date. Versions are listed in reverse chronological order. Table is four columns wide and 22 rows deep."<br />
|+ style="text-align:left;" |Mahara release notes and end of support<br />
|-<br />
! style="text-align:left;" |Major release<br />
! style="text-align:left;" |Minor release<br />
! style="text-align:left;" |Release date<br />
! style="text-align:left;" |End of support<br />
|-<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=9097 22.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/22.10.0#release-notes 22.10.0]<br />
|'''31 October 2022''' <br><br />
<br />
*31 October 2022<br />
| style="background:#566d31; color:#fff" |April 2024<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=9097 22.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/22.04.2#release-notes 22.04.2]<br />
*[https://launchpad.net/mahara/+milestone/22.04.1#release-notes 22.04.1]<br />
*[https://launchpad.net/mahara/+milestone/22.04.0#release-notes 22.04.0]<br />
|'''27 April 2022''' <br><br />
<br />
*16 June 2022<br />
*2 May 2022<br />
*27 April 2022<br />
| style="background:#566d31; color:#fff" |October 2023<br />
|-<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8955 21.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/21.10.5#release-notes 21.10.5]<br />
*[https://launchpad.net/mahara/+milestone/21.10.4#release-notes 21.10.4]<br />
*[https://launchpad.net/mahara/+milestone/21.10.3#release-notes 21.10.3]<br />
*[https://launchpad.net/mahara/+milestone/21.10.2#release-notes 21.10.2]<br />
*[https://launchpad.net/mahara/+milestone/21.10.1#release-notes 21.10.1]<br />
*[https://launchpad.net/mahara/+milestone/21.10.0#release-notes 21.10.0]<br />
|'''29 October 2021''' <br><br />
<br />
*31 October 2022<br />
*16 June 2022<br />
*2 May 2022<br />
*27 April 2022<br />
*9 February 2022<br />
*29 October 2021<br />
| style="background:#566d31; color:#fff" |April 2023<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8817 21.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/21.04.6#release-notes 21.04.6]<br />
*[https://launchpad.net/mahara/+milestone/21.04.5#release-notes 21.04.5]<br />
*[https://launchpad.net/mahara/+milestone/21.04.4#release-notes 21.04.4]<br />
*[https://launchpad.net/mahara/+milestone/21.04.3#release-notes 21.04.3]<br />
*[https://launchpad.net/mahara/+milestone/21.04.2#release-notes 21.04.2]<br />
*[https://launchpad.net/mahara/+milestone/21.04.1#release-notes 21.04.1]<br />
*[https://launchpad.net/mahara/+milestone/21.04.0#release-notes 21.04.0]<br />
|'''30 April 2021''' <br><br />
<br />
*16 June 2022<br />
*2 May 2022<br />
*27 April 2022<br />
*9 February 2022<br />
*29 October 2021<br />
*21 May 2021<br />
*30 April 2021<br />
| style="background:#566d31; color:#fff" |October 2022<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8728 20.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/20.10.6#release-notes 20.10.6]<br />
*[https://launchpad.net/mahara/+milestone/20.10.5#release-notes 20.10.5]<br />
*[https://launchpad.net/mahara/+milestone/20.10.4#release-notes 20.10.4]<br />
*[https://launchpad.net/mahara/+milestone/20.10.3#release-notes 20.10.3]<br />
*[https://launchpad.net/mahara/+milestone/20.10.2#release-notes 20.10.2]<br />
*[https://launchpad.net/mahara/+milestone/20.10.1#release-notes 20.10.1]<br />
*[https://launchpad.net/mahara/+milestone/20.10.0#release-notes 20.10.0]<br />
|'''22 October 2020'''<br><br />
<br />
*2 May 2022<br />
*27 April 2022<br />
*9 February 2022<br />
*29 October 2021<br />
*21 May 2021<br />
*4 May 2021<br />
*22 October 2020<br />
| style="background:#ba2025; color:#fff" |April 2022 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8611 20.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/20.04.5#release-notes 20.04.5]<br />
*[https://launchpad.net/mahara/+milestone/20.04.4#release-notes 20.04.4]<br />
*[https://launchpad.net/mahara/+milestone/20.04.3#release-notes 20.04.3]<br />
*[https://launchpad.net/mahara/+milestone/20.04.2#release-notes 20.04.2]<br />
*[https://launchpad.net/mahara/+milestone/20.04.1#release-notes 20.04.1]<br />
*[https://launchpad.net/mahara/20.04/20.04.0#release-notes 20.04.0]<br />
|'''29 April 2020'''<br><br />
<br />
*29 October 2021<br />
*22 May 2021<br />
*4 May 2021<br />
*22 October 2020<br />
*4 August 2020<br />
*29 April 2020<br />
| style="background:#ba2025; color:#fff" |October 2021 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8533 19.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/19.10.6#releasenotes 19.10.6]<br />
*[https://launchpad.net/mahara/+milestone/19.10.5#releasenotes 19.10.5]<br />
*[https://launchpad.net/mahara/+milestone/19.10.4#release-notes 19.10.4]<br />
*[https://launchpad.net/mahara/+milestone/19.10.3#release-notes 19.10.3]<br />
*[https://launchpad.net/mahara/+milestone/19.10.2#release-notes 19.10.2]<br />
*[https://launchpad.net/mahara/19.10/19.10.1#release-notes 19.10.1]<br />
*[https://launchpad.net/mahara/19.10/19.10.0#release-notes 19.10.0]<br />
|'''31 October 2019''' <br><br />
<br />
*4 May 2021<br />
*22 October 2020<br />
*4 August 2020<br />
*30 April 2020<br />
*4 April 2020<br />
*12 November 2019<br />
*31 October 2019<br />
| style="background:#ba2025; color:#fff" |April 2021 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8444 19.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/19.04/19.04.5#release-notes 19.04.5]<br />
*[https://launchpad.net/mahara/19.04/19.04.4#release-notes 19.04.4]<br />
*[https://launchpad.net/mahara/19.04/19.04.3#release-notes 19.04.3]<br />
*[https://launchpad.net/mahara/19.04/19.04.2#release-notes 19.04.2]<br />
*[https://launchpad.net/mahara/19.04/19.04.1#release-notes 19.04.1]<br />
*[https://launchpad.net/mahara/19.04/19.04.0#release-notes 19.04.0]<br />
|'''30 April 2019''' <br><br />
<br />
*30 April 2020<br />
*4 March 2020<br />
*12 November 2019<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
| style="background:#ba2025; color:#fff" |October 2020 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8365 18.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/18.10/18.10.6#release-notes 18.10.6]<br />
*[https://launchpad.net/mahara/18.10/18.10.5#release-notes 18.10.5]<br />
*[https://launchpad.net/mahara/18.10/18.10.4#release-notes 18.10.4]<br />
*[https://launchpad.net/mahara/18.10/18.10.3#release-notes 18.10.3]<br />
*[https://launchpad.net/mahara/18.10/18.10.2#release-notes 18.10.2]<br />
*[https://launchpad.net/mahara/18.10/18.10.1#release-notes 18.10.1]<br />
*[https://launchpad.net/mahara/18.10/18.10.0#release-notes 18.10.0]<br />
|'''25 October 2018''' <br><br />
<br />
*30 April 2020<br />
*4 March 2020<br />
*12 November 2019<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
*25 October 2018<br />
| style="background:#ba2025; color:#fff" |April 2020 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8216 18.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/18.04/18.04.6#release-notes 18.04.6]<br />
*[https://launchpad.net/mahara/18.04/18.04.5#release-notes 18.04.5]<br />
*[https://launchpad.net/mahara/18.04/18.04.4#release-notes 18.04.4]<br />
*[https://launchpad.net/mahara/18.04/18.04.3#release-notes 18.04.3]<br />
*[https://launchpad.net/mahara/18.04/18.04.2#release-notes 18.04.2]<br />
*[https://launchpad.net/mahara/18.04/18.04.1#release-notes 18.04.1]<br />
*[https://launchpad.net/mahara/18.04/18.04.0#release-notes 18.04.0]<br />
|'''6 April 2018''' <br><br />
<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
| style="background:#ba2025; color:#fff" |October 2019 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8084 17.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/17.10/17.10.9#release-notes 17.10.9]<br />
*[https://launchpad.net/mahara/17.10/17.10.8#release-notes 17.10.8]<br />
*[https://launchpad.net/mahara/17.10/17.10.7#release-notes 17.10.7]<br />
*[https://launchpad.net/mahara/17.10/17.10.6#release-notes 17.10.6]<br />
*[https://launchpad.net/mahara/17.10/17.10.5#release-notes 17.10.5]<br />
*[https://launchpad.net/mahara/17.10/17.10.4#release-notes 17.10.4]<br />
*[https://launchpad.net/mahara/17.10/17.10.3#release-notes 17.10.3]<br />
*[https://launchpad.net/mahara/17.10/17.10.2#release-notes 17.10.2]<br />
*[https://launchpad.net/mahara/17.10/17.10.1#release-notes 17.10.1]<br />
*[https://launchpad.net/mahara/17.10/17.10.0#release-notes 17.10.0]<br />
|'''30 October 2017''' <br><br />
<br />
*30 April 2019<br />
*30 April 2019<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*14 December 2017<br />
*30 October 2017<br />
| style="background:#ba2025; color:#fff;" |30 April 2019 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7926 17.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/17.04/17.04.10#release-notes 17.04.10]<br />
*[https://launchpad.net/mahara/17.04/17.04.9#release-notes 17.04.9]<br />
*[https://launchpad.net/mahara/17.04/17.04.8#release-notes 17.04.8]<br />
*[https://launchpad.net/mahara/17.04/17.04.7#release-notes 17.04.7]<br />
*[https://launchpad.net/mahara/17.04/17.04.6#release-notes 17.04.6]<br />
*[https://launchpad.net/mahara/17.04/17.04.5#release-notes 17.04.5]<br />
*[https://launchpad.net/mahara/17.04/17.04.4#release-notes 17.04.4]<br />
*[https://launchpad.net/mahara/17.04/17.04.3#release-notes 17.04.3]<br />
*[https://launchpad.net/mahara/17.04/17.04.2#release-notes 17.04.2]<br />
*[https://launchpad.net/mahara/17.04/17.04.1#release-notes 17.04.1]<br />
*[https://launchpad.net/mahara/17.04/17.04.0#release-notes 17.04.0]<br />
|'''27 April 2017''' <br><br />
<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*12 May 2017<br />
*27 April 2017<br />
| style="background:#ba2025; color:#fff" |25 October 2018 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7750 16.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/16.10/16.10.9#release-notes 16.10.9]<br />
*[https://launchpad.net/mahara/16.10/16.10.8#release-notes 16.10.8]<br />
*[https://launchpad.net/mahara/16.10/16.10.7#release-notes 16.10.7]<br />
*[https://launchpad.net/mahara/16.10/16.10.6#release-notes 16.10.6]<br />
*[https://launchpad.net/mahara/16.10/16.10.5#release-notes 16.10.5]<br />
*[https://launchpad.net/mahara/16.10/16.10.4#release-notes 16.10.4]<br />
*[https://launchpad.net/mahara/16.10/16.10.3#release-notes 16.10.3]<br />
*[https://launchpad.net/mahara/16.10/16.10.2#release-notes 16.10.2]<br />
*[https://launchpad.net/mahara/16.10/16.10.1#release-notes 16.10.1]<br />
*[https://launchpad.net/mahara/16.10/16.10.0#release-notes 16.10.0]<br />
|'''21 October 2016''' <br><br />
<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*13 December 2016<br />
*21 October 2016<br />
| style="background:#ba2025; color:#fff" |06 April 2018 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7585 16.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/16.04/16.04.9#release-notes 16.04.9]<br />
*[https://launchpad.net/mahara/16.04/16.04.8#release-notes 16.04.8]<br />
*[https://launchpad.net/mahara/16.04/16.04.7#release-notes 16.04.7]<br />
*[https://launchpad.net/mahara/16.04/16.04.6#release-notes 16.04.6]<br />
*[https://launchpad.net/mahara/16.04/16.04.5#release-notes 16.04.5]<br />
*[https://launchpad.net/mahara/16.04/16.04.4#release-notes 16.04.4]<br />
*[https://launchpad.net/mahara/16.04/16.04.3#release-notes 16.04.3]<br />
*[https://launchpad.net/mahara/16.04/16.04.2#release-notes 16.04.2]<br />
*[https://launchpad.net/mahara/16.04/16.04.1#release-notes 16.04.1]<br />
*[https://launchpad.net/mahara/16.04/16.04.0#release-notes 16.04.0]<br />
|'''28 April 2016''' <br><br />
<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*11 July 2016<br />
*9 June 2016<br />
*28 April 2016<br />
| style="background:#ba2025; color:#fff" |30 October 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7420 15.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/15.10/15.10.8#release-notes 15.10.8]<br />
*[https://launchpad.net/mahara/15.10/15.10.7#release-notes 15.10.7]<br />
*[https://launchpad.net/mahara/15.10/15.10.6#release-notes 15.10.6]<br />
*[https://launchpad.net/mahara/15.10/15.10.5#release-notes 15.10.5]<br />
*[https://launchpad.net/mahara/15.10/15.10.4#release-notes 15.10.4]<br />
*[https://launchpad.net/mahara/15.10/15.10.3#release-notes 15.10.3]<br />
*[https://launchpad.net/mahara/15.10/15.10.2#release-notes 15.10.2]<br />
*[https://launchpad.net/mahara/15.10/15.10.1#release-notes 15.10.1]<br />
*[https://launchpad.net/mahara/15.10/15.10.0#release-notes 15.10.0]<br />
|'''23 October 2015''' <br><br />
<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*11 July 2016<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*23 October 2015<br />
| style="background:#ba2025; color:#fff" |26 April 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7171 15.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/15.04/15.04.15#release-notes 15.04.15]<br />
*[https://launchpad.net/mahara/15.04/15.04.14#release-notes 15.04.14]<br />
*[https://launchpad.net/mahara/15.04/15.04.13#release-notes 15.04.13]<br />
*[https://launchpad.net/mahara/15.04/15.04.12#release-notes 15.04.12]<br />
*[https://launchpad.net/mahara/15.04/15.04.11#release-notes 15.04.11]<br />
*[https://launchpad.net/mahara/15.04/15.04.10#release-notes 15.04.10]<br />
*[https://launchpad.net/mahara/15.04/15.04.9#release-notes 15.04.9]<br />
*[https://launchpad.net/mahara/15.04/15.04.8#release-notes 15.04.8]<br />
*[https://launchpad.net/mahara/15.04/15.04.7#release-notes 15.04.7]<br />
*[https://launchpad.net/mahara/15.04/15.04.6#release-notes 15.04.6]<br />
*[https://launchpad.net/mahara/15.04/15.04.5#release-notes 15.04.5]<br />
*[https://launchpad.net/mahara/15.04/15.04.4#release-notes 15.04.4]<br />
*[https://launchpad.net/mahara/15.04/15.04.3#release-notes 15.04.3]<br />
*[https://launchpad.net/mahara/15.04/15.04.2#release-notes 15.04.2]<br />
*[https://launchpad.net/mahara/15.04/15.04.1#release-notes 15.04.1]<br />
*[https://launchpad.net/mahara/15.04/15.04.0#release-notes 15.04.0]<br />
|'''23 October 2015''' <br><br />
<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*12 July 2016<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*29 May 2015<br />
*17 April 2015<br />
| style="background:#ba2025; color:#fff" |30 October 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=6509 1.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.10/1.10.10#release-notes 1.10.10]<br />
*[https://launchpad.net/mahara/1.10/1.10.9#release-notes 1.10.9]<br />
*[https://launchpad.net/mahara/1.10/1.10.8#release-notes 1.10.8]<br />
*[https://launchpad.net/mahara/1.10/1.10.7#release-notes 1.10.7]<br />
*[https://launchpad.net/mahara/1.10/1.10.6#release-notes 1.10.6]<br />
*[https://launchpad.net/mahara/1.10/1.10.5#release-notes 1.10.5]<br />
*[https://launchpad.net/mahara/1.10/1.10.4#release-notes 1.10.4]<br />
*[https://launchpad.net/mahara/1.10/1.10.3#release-notes 1.10.3]<br />
*[https://launchpad.net/mahara/1.10/1.10.2#release-notes 1.10.2]<br />
*[https://launchpad.net/mahara/1.10/1.10.1#release-notes 1.10.1]<br />
*[https://launchpad.net/mahara/1.10/1.10.0#release-notes 1.10.0]<br />
|'''21 October 2014''' <br><br />
<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*29 May 2015<br />
*20 April 2015<br />
*13 January 2015<br />
*26 November 2014<br />
*21 October 2014<br />
| style="background:#ba2025; color:#fff" |2 May 2016 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=6254 1.9]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.9/1.9.9#release-notes 1.9.9]<br />
*[https://launchpad.net/mahara/1.9/1.9.8#release-notes 1.9.8]<br />
*[https://launchpad.net/mahara/1.9/1.9.7#release-notes 1.9.7]<br />
*[https://launchpad.net/mahara/1.9/1.9.6#release-notes 1.9.6]<br />
*[https://launchpad.net/mahara/1.9/1.9.5#release-notes 1.9.5]<br />
*[https://launchpad.net/mahara/1.9/1.9.4#release-notes 1.9.4]<br />
*[https://launchpad.net/mahara/1.9/1.9.3#release-notes 1.9.3]<br />
*[https://launchpad.net/mahara/1.9/1.9.2#release-notes 1.9.2]<br />
*[https://launchpad.net/mahara/1.9/1.9.1#release-notes 1.9.1]<br />
*[https://launchpad.net/mahara/1.9/1.9.0#release-notes 1.9.0]<br />
|'''15 April 2014''' <br><br />
<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*26 November 2014<br />
*22 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*15 April 2014<br />
| style="background:#ba2025; color:#fff" |27 October 2015 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=5833 1.8]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.8/1.8.7#release-notes 1.8.7]<br />
*[https://launchpad.net/mahara/1.8/1.8.6#release-notes 1.8.6]<br />
*[https://launchpad.net/mahara/1.8/1.8.5#release-notes 1.8.5]<br />
*[https://launchpad.net/mahara/1.8/1.8.4#release-notes 1.8.4]<br />
*[https://launchpad.net/mahara/1.8/1.8.3#release-notes 1.8.3]<br />
*[https://launchpad.net/mahara/1.8/1.8.2#release-notes 1.8.2]<br />
*[https://launchpad.net/mahara/1.8/1.8.1#release-notes 1.8.1]<br />
*[https://launchpad.net/mahara/1.8/1.8.0#release-notes 1.8.0]<br />
|'''24 October 2013''' <br><br />
<br />
*20 April 2015<br />
*26 November 2014<br />
*22 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*3 April 2014<br />
*18 December 2013<br />
*24 October 2013<br />
| style="background:#ba2025; color:#fff" |20 April 2015 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=5371 1.7]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.7/1.7.8#release-notes 1.7.8]<br />
*[https://launchpad.net/mahara/1.7/1.7.7#release-notes 1.7.7]<br />
*[https://launchpad.net/mahara/1.7/1.7.6#release-notes 1.7.6]<br />
*[https://launchpad.net/mahara/1.7/1.7.5#release-notes 1.7.5]<br />
*[https://launchpad.net/mahara/1.7/1.7.4#release-notes 1.7.4]<br />
*[https://launchpad.net/mahara/1.7/1.7.3#release-notes 1.7.3]<br />
*[https://launchpad.net/mahara/1.7/1.7.2#release-notes 1.7.2]<br />
*[https://launchpad.net/mahara/1.7/1.7.1#release-notes 1.7.1]<br />
*[https://launchpad.net/mahara/1.7/1.7.0#release-notes 1.7.0]<br />
|'''19 April 2013''' <br><br />
<br />
*21 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*29 October 2013<br />
*3 October 2013<br />
*3 April 2014<br />
*18 December 2013<br />
*24 October 2013<br />
*19 April 2013<br />
| style="background:#ba2025; color:#fff" |21 October 2014 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=4967 1.6]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.6/1.6.10#release-notes 1.6.10]<br />
*[https://launchpad.net/mahara/1.6/1.6.9#release-notes 1.6.9]<br />
*[https://launchpad.net/mahara/1.6/1.6.8#release-notes 1.6.8]<br />
*[https://launchpad.net/mahara/1.6/1.6.7#release-notes 1.6.7]<br />
*[https://launchpad.net/mahara/1.6/1.6.6#release-notes 1.6.6]<br />
*[https://launchpad.net/mahara/1.6/1.6.5#release-notes 1.6.5]<br />
*[https://launchpad.net/mahara/1.6/1.6.4#release-notes 1.6.4]<br />
*[https://launchpad.net/mahara/1.6/1.6.3#release-notes 1.6.3]<br />
*[https://launchpad.net/mahara/1.6/1.6.2#release-notes 1.6.2]<br />
*[https://launchpad.net/mahara/1.6/1.6.1#release-notes 1.6.1]<br />
*[https://launchpad.net/mahara/1.6/1.6.0#release-notes 1.6.0]<br />
|'''19 October 2019''' <br><br />
<br />
*13 May 2014<br />
*3 April 2014<br />
*29 October 2013<br />
*3 October 2013<br />
*25 July 2013<br />
*2 May 2013<br />
*15 April 2013<br />
*15 February 2013<br />
*23 November 2012<br />
*24 October 2012<br />
*19 October 2012<br />
| style="background:#ba2025; color:#fff" |29 April 2014 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=4469 1.5]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.5/1.5.13#release-notes 1.5.13]<br />
*[https://launchpad.net/mahara/1.5/1.5.12#release-notes 1.5.12]<br />
*[https://launchpad.net/mahara/1.5/1.5.11#release-notes 1.5.11]<br />
*[https://launchpad.net/mahara/1.5/1.5.10#release-notes 1.5.10]<br />
*[https://launchpad.net/mahara/1.5/1.5.9#release-notes 1.5.9]<br />
*[https://launchpad.net/mahara/1.5/1.5.8#release-notes 1.5.8]<br />
*[https://launchpad.net/mahara/1.5/1.5.7#release-notes 1.5.7]<br />
*[https://launchpad.net/mahara/1.5/1.5.6#release-notes 1.5.6]<br />
*[https://launchpad.net/mahara/1.5/1.5.4#release-notes 1.5.4]<br />
*[https://launchpad.net/mahara/1.5/1.5.3#release-notes 1.5.3]<br />
*[https://launchpad.net/mahara/1.5/1.5.2#release-notes 1.5.2]<br />
*[https://launchpad.net/mahara/1.5/1.5.1#release-notes 1.5.1]<br />
*[https://launchpad.net/mahara/1.5/1.5.0#release-notes 1.5.0]<br />
|'''17 April 2012''' <br><br />
<br />
*25 October 2013<br />
*3 October 2013<br />
*24 July 2013<br />
*2 May 2013<br />
*15 April 2013<br />
*15 February 2013<br />
*23 November 2012<br />
*17 October 2012<br />
*10 October 2012<br />
*14 September 2012<br />
*31 July 2012<br />
*3 May 2012<br />
*17 April 2012<br />
| style="background:#ba2025; color:#fff" |29 October 2013 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=3744 1.4]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.6 1.4.6]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.5 1.4.5]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.4 1.4.4]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.3 1.4.3]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.2 1.4.2]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.1 1.4.1]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.0 1.4.0]<br />
|'''13 June 2011''' <br><br />
<br />
*17 October 2012<br />
*10 October 2012<br />
*14 September 2012<br />
*31 July 2011<br />
*6 March 2011<br />
*3 November 2011<br />
*13 June 2011<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=2252 1.3]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.3.8 1.3.8]<br />
*[https://launchpad.net/mahara/+milestone/1.3.7 1.3.7]<br />
*[https://launchpad.net/mahara/+milestone/1.3.6 1.3.6]<br />
*[https://launchpad.net/mahara/+milestone/1.3.5 1.3.5]<br />
*[https://launchpad.net/mahara/+milestone/1.3.4 1.3.4]<br />
*[https://launchpad.net/mahara/+milestone/1.3.3 1.3.3]<br />
*[https://launchpad.net/mahara/+milestone/1.3.2 1.3.2]<br />
*[https://launchpad.net/mahara/+milestone/1.3.1 1.3.1]<br />
*[https://launchpad.net/mahara/+milestone/1.3.0 1.3.0]<br />
|'''10 September 2010''' <br><br />
<br />
*5 March 2012<br />
*3 Novemver 2011<br />
*10 May 2011<br />
*28 March 2011<br />
*24 March 2011<br />
*7 November 2010<br />
*8 October 2010<br />
*17 September 2010<br />
*10 September 2010<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=1226 1.2]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.2.9 1.2.9]<br />
*[https://launchpad.net/mahara/+milestone/1.2..8 1.2.8]<br />
*[https://launchpad.net/mahara/+milestone/1.2.7 1.2.7]<br />
*[https://launchpad.net/mahara/+milestone/1.2.6 1.2.6]<br />
*[https://launchpad.net/mahara/+milestone/1.2.5 1.2.5]<br />
*[https://launchpad.net/mahara/+milestone/1.2.4 1.2.4]<br />
*[https://launchpad.net/mahara/+milestone/1.2.3 1.2.3]<br />
*[https://launchpad.net/mahara/+milestone/1.2.2 1.2.2]<br />
*[https://launchpad.net/mahara/+milestone/1.2.1 1.2.1]<br />
*[https://launchpad.net/mahara/+milestone/1.2.0 1.2.0]<br />
|'''16 November 2009''' <br><br />
<br />
*10 May 2011<br />
*24 March 2011<br />
*1 September 2011<br />
*2 July 2010<br />
*6 April 2010<br />
*8 February 2010<br />
*8 December 2009<br />
*8 December 2009<br />
*16 November 2009<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://launchpad.net/mahara/+milestone/1.0.10 1.1]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.1.9 1.1.9]<br />
*[https://launchpad.net/mahara/+milestone/1.1.8 1.1.8]<br />
*[https://launchpad.net/mahara/+milestone/1.1.7 1.1.7]<br />
*[https://launchpad.net/mahara/+milestone/1.1.6 1.1.6]<br />
*[https://launchpad.net/mahara/+milestone/1.1.5 1.1.5]<br />
*[https://launchpad.net/mahara/+milestone/1.1.4 1.1.4]<br />
*[https://launchpad.net/mahara/+milestone/1.1.3 1.1.3]<br />
*[https://launchpad.net/mahara/+milestone/1.1.2 1.1.2]<br />
*[https://launchpad.net/mahara/+milestone/1.1.1 1.1.1]<br />
*[https://launchpad.net/mahara/+milestone/1.1.0 1.1.0]<br />
|'''25 February 2009''' <br><br />
<br />
*2 July 2010<br />
*6 April 2010<br />
*28 October 2009<br />
*21 June 2009<br />
*10 June 2009<br />
*21 April 2009<br />
*9 March 2009<br />
*26 February 2009<br />
*25 February 2009<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=292 1.0]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.0.15 1.0.15]<br />
*[https://launchpad.net/mahara/+milestone/1.0.14 1.0.14]<br />
*[https://launchpad.net/mahara/+milestone/1.0.13 1.0.13]<br />
*[https://launchpad.net/mahara/+milestone/1.0.12 1.0.12]<br />
*[https://launchpad.net/mahara/+milestone/1.0.11 1.0.11]<br />
*[https://launchpad.net/mahara/+milestone/1.0.10 1.0.10]<br />
*[[Releases/1.0.9|1.0.9]]<br />
*[[Releases/1.0.8|1.0.8]]<br />
*[[Releases/1.0.7|1.0.7]]<br />
|'''9 March 2009''' <br><br />
<br />
*2 July 2010<br />
*6 April 2010<br />
*28 October 2009<br />
*21 June 2009<br />
*21 April 2009<br />
*9 March 2009<br />
*Unavailable<br />
*Unavailable<br />
*Unavailable<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
|}<br />
<br />
=Definition of support=<br />
<br />
Being "supported" means:<br />
<br />
*The release team is committed to making available updates to Mahara that are security related. See [[Security]] to find out how to report security bugs to us.<br />
*Occasionally, some other serious bug fixes will be included, but these are not guaranteed. If you find another type of bug, please let us know by reporting it on the mahara.org forums or directly on Launchpad: https://bugs.launchpad.net/mahara/+filebug<br />
<br />
=Specific backporting rules=<br />
<br />
When deciding which bugs to backport to supported branches, these are the general principles:<br />
<br />
*'''[[Security]] bugs'''<br />
**'''All''' Critical and High priority security bugs should be backported.<br />
**'''Nearly all''' Medium and Low priority security bugs should be backported. At the maintenance team's discretion, these might not be backported if:<br />
***Backporting would be technically difficult due to differences between Mahara versions.<br />
***The bug fix requires database upgrades or dataroot manipulations.<br />
***The bug fix otherwise introduces a high risk of [https://en.wikipedia.org/wiki/Software_regression regressions].<br />
<br />
*'''Non-security bugs'''<br />
**'''All''' Critical bugs should be backported.<br />
**'''Most''' High priority bugs should be backported. At the maintenance team's discretion, these might not be backported if:<br />
***Backporting would be technically difficult due to differences between Mahara versions.<br />
***The bug fix requires database upgrades or dataroot manipulations.<br />
***The bug fix otherwise introduces a high risk of [https://en.wikipedia.org/wiki/Software_regression regressions].<br />
**'''No''' Medium or Low priority non-security bugs are backported.<br />
**'''No''' Wishlist bugs are backported. Wishlist items are only added to the current development branch.<br />
<br />
If you want to backport certain bug fixes or new features to your own instance of Mahara, you can do so on your own as the code is available.<br />
<br />
See [[Developer_Area/Bug_Status#Importance|Bug Status:Importance]] for the guidelines on how we decide whether a bug is Critical, High, Medium, or Low.<br />
<br />
[[Category:Release Notes]]</div>Robertlhttps://wiki.mahara.org/index.php?title=Releases&diff=13441Releases2022-11-01T00:57:13Z<p>Robertl: /* Current and upcoming releases */</p>
<hr />
<div>=Release cycle and version support=<br />
<p>A new major version of Mahara is released every 6 months, in April and October. The version numbers reflect the year and the month in which a version was released. See [[Developer_Area/Version_Numbering_Policy|Version Numbering Policy]] for more details.<br><br />
<br />
{| class="wikitable" style="padding:0em; text-align:left" summary="Mahara's six monthly cycle for April and October releases."<br />
! scope="col" style="text-align:left; background-color:#566d31; color:#fff;" |Release cycle<br />
! scope="col" style="text-align:left;" |Nov - Apr<br />
! scope="col" style="text-align:left;" |May - Oct<br />
|-<br />
! scope="row" style="text-align:left;" |Feature freeze<br />
| style="background-color:#fff;" |Early February<br />
| style="background-color:#fff;" |Early August<br />
|-<br />
! scope="row" style="text-align:left;" |UI freeze<br />
| style="background-color:#fff;" |Early March<br />
| style="background-color:#fff;" |Early September<br />
|-<br />
! scope="row" style="text-align:left;" |Release candidate<br />
| style="background-color:#fff;" |Mid March<br />
| style="background-color:#fff;" |Mid September<br />
|-<br />
! scope="row" style="text-align:left;" |Official release<br />
| style="background-color:#fff;" |Late April<br />
| style="background-color:#fff;" |Late October<br />
|-<br />
|}<br />
<ul><br />
<li> Each release has 16 weeks before feature freeze.</li><br />
<li>For each release, We've put feature freeze at a month before the release candidate. Only non-feature bug fixes will be committed after this </li><br />
<li>The week before the release candidates is a UI freeze. This is a freeze to string changes and theme changes. String or UI fixes will need to be at least high importance.</li><br />
</ul></p><br />
<p></p><br />
<p><strong>The standard support lifetime of a major version is 18 months (3 release cycles):</strong><br><br />
<ul><br />
<li>Receives bug fixes and security fixes for the first 6 months</li><br />
<li>Receives security fixes only, for an additional 12 months</li><br />
</ul><br />
In the event that a major release substantially breaks backwards compatibility, we may declare the previous release to be an extended support release which will receive security fixes for 30 months (5 release cycles), to give sites more time to upgrade.</p><br />
<br />
=Older releases (pre Mahara 1.6)=<br />
<br />
Prior to Mahara 1.6, Mahara major versions were released as needed, according to no particular schedule. During the transition period to the 6 month release cycle, support for the older releases was provided for 2 release cycles.<br />
<br />
=Current and upcoming releases=<br />
<p>The latest <strong>stable</strong> version of Mahara is 22.04, released on 27 April 2022.</p><br />
<br />
<p>'''Note:''' This page is updated manually, and sometimes falls behind. For 100% up-to-date information, look for the release labelled "Current Stable Release" on our [https://launchpad.net/mahara/+series Launchpad release page], or use the "Download" link on the front page of https://mahara.org</p><br />
<br />
{| class="wikitable"<br />
| style="background:#ba2025; color:#fff" |Unsupported<br />
| style="background:#566d31; color:#fff" |Currently in support<br />
|Not yet released<br />
|}<br />
<br />
<!-- This is the template for the table sections below<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff"|'''[https://mahara.org/interaction/forum/topic.php?id= Major point release number]'''<br />
|<br />
* [https://launchpad.net/mahara/ Minor point release number]<br />
| '''Major point release date''' <br><br />
* Minor point release dates<br />
| style="background:#566d31; color:#fff" | End of support date<br />
|-<br />
--><br />
<br />
{| class="wikitable" summary="Release notes for major and minor versions of Mahara, official release dates and version support end date. Versions are listed in reverse chronological order. Table is four columns wide and 22 rows deep."<br />
|+ style="text-align:left;" |Mahara release notes and end of support<br />
|-<br />
! style="text-align:left;" |Major release<br />
! style="text-align:left;" |Minor release<br />
! style="text-align:left;" |Release date<br />
! style="text-align:left;" |End of support<br />
|-<br />
!'''[https://mahara.org/interaction/forum/topic.php?id=9097 22.10.0]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/22.10.0#release-notes 22.10.0]<br />
|'''31 October 2022''' <br><br />
<br />
*31 October 2022<br />
|April 2024<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=9097 22.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/22.04.2#release-notes 22.04.2]<br />
*[https://launchpad.net/mahara/+milestone/22.04.1#release-notes 22.04.1]<br />
*[https://launchpad.net/mahara/+milestone/22.04.0#release-notes 22.04.0]<br />
|'''27 April 2022''' <br><br />
<br />
*16 June 2022<br />
*2 May 2022<br />
*27 April 2022<br />
| style="background:#566d31; color:#fff" |October 2023<br />
|-<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8955 21.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/21.10.5#release-notes 21.10.5]<br />
*[https://launchpad.net/mahara/+milestone/21.10.4#release-notes 21.10.4]<br />
*[https://launchpad.net/mahara/+milestone/21.10.3#release-notes 21.10.3]<br />
*[https://launchpad.net/mahara/+milestone/21.10.2#release-notes 21.10.2]<br />
*[https://launchpad.net/mahara/+milestone/21.10.1#release-notes 21.10.1]<br />
*[https://launchpad.net/mahara/+milestone/21.10.0#release-notes 21.10.0]<br />
|'''29 October 2021''' <br><br />
<br />
*31 October 2022<br />
*16 June 2022<br />
*2 May 2022<br />
*27 April 2022<br />
*9 February 2022<br />
*29 October 2021<br />
| style="background:#566d31; color:#fff" |April 2023<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8817 21.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/21.04.6#release-notes 21.04.6]<br />
*[https://launchpad.net/mahara/+milestone/21.04.5#release-notes 21.04.5]<br />
*[https://launchpad.net/mahara/+milestone/21.04.4#release-notes 21.04.4]<br />
*[https://launchpad.net/mahara/+milestone/21.04.3#release-notes 21.04.3]<br />
*[https://launchpad.net/mahara/+milestone/21.04.2#release-notes 21.04.2]<br />
*[https://launchpad.net/mahara/+milestone/21.04.1#release-notes 21.04.1]<br />
*[https://launchpad.net/mahara/+milestone/21.04.0#release-notes 21.04.0]<br />
|'''30 April 2021''' <br><br />
<br />
*16 June 2022<br />
*2 May 2022<br />
*27 April 2022<br />
*9 February 2022<br />
*29 October 2021<br />
*21 May 2021<br />
*30 April 2021<br />
| style="background:#566d31; color:#fff" |October 2022<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8728 20.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/20.10.6#release-notes 20.10.6]<br />
*[https://launchpad.net/mahara/+milestone/20.10.5#release-notes 20.10.5]<br />
*[https://launchpad.net/mahara/+milestone/20.10.4#release-notes 20.10.4]<br />
*[https://launchpad.net/mahara/+milestone/20.10.3#release-notes 20.10.3]<br />
*[https://launchpad.net/mahara/+milestone/20.10.2#release-notes 20.10.2]<br />
*[https://launchpad.net/mahara/+milestone/20.10.1#release-notes 20.10.1]<br />
*[https://launchpad.net/mahara/+milestone/20.10.0#release-notes 20.10.0]<br />
|'''22 October 2020'''<br><br />
<br />
*2 May 2022<br />
*27 April 2022<br />
*9 February 2022<br />
*29 October 2021<br />
*21 May 2021<br />
*4 May 2021<br />
*22 October 2020<br />
| style="background:#ba2025; color:#fff" |April 2022 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8611 20.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/20.04.5#release-notes 20.04.5]<br />
*[https://launchpad.net/mahara/+milestone/20.04.4#release-notes 20.04.4]<br />
*[https://launchpad.net/mahara/+milestone/20.04.3#release-notes 20.04.3]<br />
*[https://launchpad.net/mahara/+milestone/20.04.2#release-notes 20.04.2]<br />
*[https://launchpad.net/mahara/+milestone/20.04.1#release-notes 20.04.1]<br />
*[https://launchpad.net/mahara/20.04/20.04.0#release-notes 20.04.0]<br />
|'''29 April 2020'''<br><br />
<br />
*29 October 2021<br />
*22 May 2021<br />
*4 May 2021<br />
*22 October 2020<br />
*4 August 2020<br />
*29 April 2020<br />
| style="background:#ba2025; color:#fff" |October 2021 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8533 19.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/19.10.6#releasenotes 19.10.6]<br />
*[https://launchpad.net/mahara/+milestone/19.10.5#releasenotes 19.10.5]<br />
*[https://launchpad.net/mahara/+milestone/19.10.4#release-notes 19.10.4]<br />
*[https://launchpad.net/mahara/+milestone/19.10.3#release-notes 19.10.3]<br />
*[https://launchpad.net/mahara/+milestone/19.10.2#release-notes 19.10.2]<br />
*[https://launchpad.net/mahara/19.10/19.10.1#release-notes 19.10.1]<br />
*[https://launchpad.net/mahara/19.10/19.10.0#release-notes 19.10.0]<br />
|'''31 October 2019''' <br><br />
<br />
*4 May 2021<br />
*22 October 2020<br />
*4 August 2020<br />
*30 April 2020<br />
*4 April 2020<br />
*12 November 2019<br />
*31 October 2019<br />
| style="background:#ba2025; color:#fff" |April 2021 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8444 19.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/19.04/19.04.5#release-notes 19.04.5]<br />
*[https://launchpad.net/mahara/19.04/19.04.4#release-notes 19.04.4]<br />
*[https://launchpad.net/mahara/19.04/19.04.3#release-notes 19.04.3]<br />
*[https://launchpad.net/mahara/19.04/19.04.2#release-notes 19.04.2]<br />
*[https://launchpad.net/mahara/19.04/19.04.1#release-notes 19.04.1]<br />
*[https://launchpad.net/mahara/19.04/19.04.0#release-notes 19.04.0]<br />
|'''30 April 2019''' <br><br />
<br />
*30 April 2020<br />
*4 March 2020<br />
*12 November 2019<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
| style="background:#ba2025; color:#fff" |October 2020 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8365 18.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/18.10/18.10.6#release-notes 18.10.6]<br />
*[https://launchpad.net/mahara/18.10/18.10.5#release-notes 18.10.5]<br />
*[https://launchpad.net/mahara/18.10/18.10.4#release-notes 18.10.4]<br />
*[https://launchpad.net/mahara/18.10/18.10.3#release-notes 18.10.3]<br />
*[https://launchpad.net/mahara/18.10/18.10.2#release-notes 18.10.2]<br />
*[https://launchpad.net/mahara/18.10/18.10.1#release-notes 18.10.1]<br />
*[https://launchpad.net/mahara/18.10/18.10.0#release-notes 18.10.0]<br />
|'''25 October 2018''' <br><br />
<br />
*30 April 2020<br />
*4 March 2020<br />
*12 November 2019<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
*25 October 2018<br />
| style="background:#ba2025; color:#fff" |April 2020 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8216 18.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/18.04/18.04.6#release-notes 18.04.6]<br />
*[https://launchpad.net/mahara/18.04/18.04.5#release-notes 18.04.5]<br />
*[https://launchpad.net/mahara/18.04/18.04.4#release-notes 18.04.4]<br />
*[https://launchpad.net/mahara/18.04/18.04.3#release-notes 18.04.3]<br />
*[https://launchpad.net/mahara/18.04/18.04.2#release-notes 18.04.2]<br />
*[https://launchpad.net/mahara/18.04/18.04.1#release-notes 18.04.1]<br />
*[https://launchpad.net/mahara/18.04/18.04.0#release-notes 18.04.0]<br />
|'''6 April 2018''' <br><br />
<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
| style="background:#ba2025; color:#fff" |October 2019 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8084 17.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/17.10/17.10.9#release-notes 17.10.9]<br />
*[https://launchpad.net/mahara/17.10/17.10.8#release-notes 17.10.8]<br />
*[https://launchpad.net/mahara/17.10/17.10.7#release-notes 17.10.7]<br />
*[https://launchpad.net/mahara/17.10/17.10.6#release-notes 17.10.6]<br />
*[https://launchpad.net/mahara/17.10/17.10.5#release-notes 17.10.5]<br />
*[https://launchpad.net/mahara/17.10/17.10.4#release-notes 17.10.4]<br />
*[https://launchpad.net/mahara/17.10/17.10.3#release-notes 17.10.3]<br />
*[https://launchpad.net/mahara/17.10/17.10.2#release-notes 17.10.2]<br />
*[https://launchpad.net/mahara/17.10/17.10.1#release-notes 17.10.1]<br />
*[https://launchpad.net/mahara/17.10/17.10.0#release-notes 17.10.0]<br />
|'''30 October 2017''' <br><br />
<br />
*30 April 2019<br />
*30 April 2019<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*14 December 2017<br />
*30 October 2017<br />
| style="background:#ba2025; color:#fff;" |30 April 2019 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7926 17.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/17.04/17.04.10#release-notes 17.04.10]<br />
*[https://launchpad.net/mahara/17.04/17.04.9#release-notes 17.04.9]<br />
*[https://launchpad.net/mahara/17.04/17.04.8#release-notes 17.04.8]<br />
*[https://launchpad.net/mahara/17.04/17.04.7#release-notes 17.04.7]<br />
*[https://launchpad.net/mahara/17.04/17.04.6#release-notes 17.04.6]<br />
*[https://launchpad.net/mahara/17.04/17.04.5#release-notes 17.04.5]<br />
*[https://launchpad.net/mahara/17.04/17.04.4#release-notes 17.04.4]<br />
*[https://launchpad.net/mahara/17.04/17.04.3#release-notes 17.04.3]<br />
*[https://launchpad.net/mahara/17.04/17.04.2#release-notes 17.04.2]<br />
*[https://launchpad.net/mahara/17.04/17.04.1#release-notes 17.04.1]<br />
*[https://launchpad.net/mahara/17.04/17.04.0#release-notes 17.04.0]<br />
|'''27 April 2017''' <br><br />
<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*12 May 2017<br />
*27 April 2017<br />
| style="background:#ba2025; color:#fff" |25 October 2018 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7750 16.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/16.10/16.10.9#release-notes 16.10.9]<br />
*[https://launchpad.net/mahara/16.10/16.10.8#release-notes 16.10.8]<br />
*[https://launchpad.net/mahara/16.10/16.10.7#release-notes 16.10.7]<br />
*[https://launchpad.net/mahara/16.10/16.10.6#release-notes 16.10.6]<br />
*[https://launchpad.net/mahara/16.10/16.10.5#release-notes 16.10.5]<br />
*[https://launchpad.net/mahara/16.10/16.10.4#release-notes 16.10.4]<br />
*[https://launchpad.net/mahara/16.10/16.10.3#release-notes 16.10.3]<br />
*[https://launchpad.net/mahara/16.10/16.10.2#release-notes 16.10.2]<br />
*[https://launchpad.net/mahara/16.10/16.10.1#release-notes 16.10.1]<br />
*[https://launchpad.net/mahara/16.10/16.10.0#release-notes 16.10.0]<br />
|'''21 October 2016''' <br><br />
<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*13 December 2016<br />
*21 October 2016<br />
| style="background:#ba2025; color:#fff" |06 April 2018 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7585 16.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/16.04/16.04.9#release-notes 16.04.9]<br />
*[https://launchpad.net/mahara/16.04/16.04.8#release-notes 16.04.8]<br />
*[https://launchpad.net/mahara/16.04/16.04.7#release-notes 16.04.7]<br />
*[https://launchpad.net/mahara/16.04/16.04.6#release-notes 16.04.6]<br />
*[https://launchpad.net/mahara/16.04/16.04.5#release-notes 16.04.5]<br />
*[https://launchpad.net/mahara/16.04/16.04.4#release-notes 16.04.4]<br />
*[https://launchpad.net/mahara/16.04/16.04.3#release-notes 16.04.3]<br />
*[https://launchpad.net/mahara/16.04/16.04.2#release-notes 16.04.2]<br />
*[https://launchpad.net/mahara/16.04/16.04.1#release-notes 16.04.1]<br />
*[https://launchpad.net/mahara/16.04/16.04.0#release-notes 16.04.0]<br />
|'''28 April 2016''' <br><br />
<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*11 July 2016<br />
*9 June 2016<br />
*28 April 2016<br />
| style="background:#ba2025; color:#fff" |30 October 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7420 15.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/15.10/15.10.8#release-notes 15.10.8]<br />
*[https://launchpad.net/mahara/15.10/15.10.7#release-notes 15.10.7]<br />
*[https://launchpad.net/mahara/15.10/15.10.6#release-notes 15.10.6]<br />
*[https://launchpad.net/mahara/15.10/15.10.5#release-notes 15.10.5]<br />
*[https://launchpad.net/mahara/15.10/15.10.4#release-notes 15.10.4]<br />
*[https://launchpad.net/mahara/15.10/15.10.3#release-notes 15.10.3]<br />
*[https://launchpad.net/mahara/15.10/15.10.2#release-notes 15.10.2]<br />
*[https://launchpad.net/mahara/15.10/15.10.1#release-notes 15.10.1]<br />
*[https://launchpad.net/mahara/15.10/15.10.0#release-notes 15.10.0]<br />
|'''23 October 2015''' <br><br />
<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*11 July 2016<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*23 October 2015<br />
| style="background:#ba2025; color:#fff" |26 April 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7171 15.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/15.04/15.04.15#release-notes 15.04.15]<br />
*[https://launchpad.net/mahara/15.04/15.04.14#release-notes 15.04.14]<br />
*[https://launchpad.net/mahara/15.04/15.04.13#release-notes 15.04.13]<br />
*[https://launchpad.net/mahara/15.04/15.04.12#release-notes 15.04.12]<br />
*[https://launchpad.net/mahara/15.04/15.04.11#release-notes 15.04.11]<br />
*[https://launchpad.net/mahara/15.04/15.04.10#release-notes 15.04.10]<br />
*[https://launchpad.net/mahara/15.04/15.04.9#release-notes 15.04.9]<br />
*[https://launchpad.net/mahara/15.04/15.04.8#release-notes 15.04.8]<br />
*[https://launchpad.net/mahara/15.04/15.04.7#release-notes 15.04.7]<br />
*[https://launchpad.net/mahara/15.04/15.04.6#release-notes 15.04.6]<br />
*[https://launchpad.net/mahara/15.04/15.04.5#release-notes 15.04.5]<br />
*[https://launchpad.net/mahara/15.04/15.04.4#release-notes 15.04.4]<br />
*[https://launchpad.net/mahara/15.04/15.04.3#release-notes 15.04.3]<br />
*[https://launchpad.net/mahara/15.04/15.04.2#release-notes 15.04.2]<br />
*[https://launchpad.net/mahara/15.04/15.04.1#release-notes 15.04.1]<br />
*[https://launchpad.net/mahara/15.04/15.04.0#release-notes 15.04.0]<br />
|'''23 October 2015''' <br><br />
<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*12 July 2016<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*29 May 2015<br />
*17 April 2015<br />
| style="background:#ba2025; color:#fff" |30 October 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=6509 1.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.10/1.10.10#release-notes 1.10.10]<br />
*[https://launchpad.net/mahara/1.10/1.10.9#release-notes 1.10.9]<br />
*[https://launchpad.net/mahara/1.10/1.10.8#release-notes 1.10.8]<br />
*[https://launchpad.net/mahara/1.10/1.10.7#release-notes 1.10.7]<br />
*[https://launchpad.net/mahara/1.10/1.10.6#release-notes 1.10.6]<br />
*[https://launchpad.net/mahara/1.10/1.10.5#release-notes 1.10.5]<br />
*[https://launchpad.net/mahara/1.10/1.10.4#release-notes 1.10.4]<br />
*[https://launchpad.net/mahara/1.10/1.10.3#release-notes 1.10.3]<br />
*[https://launchpad.net/mahara/1.10/1.10.2#release-notes 1.10.2]<br />
*[https://launchpad.net/mahara/1.10/1.10.1#release-notes 1.10.1]<br />
*[https://launchpad.net/mahara/1.10/1.10.0#release-notes 1.10.0]<br />
|'''21 October 2014''' <br><br />
<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*29 May 2015<br />
*20 April 2015<br />
*13 January 2015<br />
*26 November 2014<br />
*21 October 2014<br />
| style="background:#ba2025; color:#fff" |2 May 2016 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=6254 1.9]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.9/1.9.9#release-notes 1.9.9]<br />
*[https://launchpad.net/mahara/1.9/1.9.8#release-notes 1.9.8]<br />
*[https://launchpad.net/mahara/1.9/1.9.7#release-notes 1.9.7]<br />
*[https://launchpad.net/mahara/1.9/1.9.6#release-notes 1.9.6]<br />
*[https://launchpad.net/mahara/1.9/1.9.5#release-notes 1.9.5]<br />
*[https://launchpad.net/mahara/1.9/1.9.4#release-notes 1.9.4]<br />
*[https://launchpad.net/mahara/1.9/1.9.3#release-notes 1.9.3]<br />
*[https://launchpad.net/mahara/1.9/1.9.2#release-notes 1.9.2]<br />
*[https://launchpad.net/mahara/1.9/1.9.1#release-notes 1.9.1]<br />
*[https://launchpad.net/mahara/1.9/1.9.0#release-notes 1.9.0]<br />
|'''15 April 2014''' <br><br />
<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*26 November 2014<br />
*22 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*15 April 2014<br />
| style="background:#ba2025; color:#fff" |27 October 2015 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=5833 1.8]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.8/1.8.7#release-notes 1.8.7]<br />
*[https://launchpad.net/mahara/1.8/1.8.6#release-notes 1.8.6]<br />
*[https://launchpad.net/mahara/1.8/1.8.5#release-notes 1.8.5]<br />
*[https://launchpad.net/mahara/1.8/1.8.4#release-notes 1.8.4]<br />
*[https://launchpad.net/mahara/1.8/1.8.3#release-notes 1.8.3]<br />
*[https://launchpad.net/mahara/1.8/1.8.2#release-notes 1.8.2]<br />
*[https://launchpad.net/mahara/1.8/1.8.1#release-notes 1.8.1]<br />
*[https://launchpad.net/mahara/1.8/1.8.0#release-notes 1.8.0]<br />
|'''24 October 2013''' <br><br />
<br />
*20 April 2015<br />
*26 November 2014<br />
*22 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*3 April 2014<br />
*18 December 2013<br />
*24 October 2013<br />
| style="background:#ba2025; color:#fff" |20 April 2015 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=5371 1.7]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.7/1.7.8#release-notes 1.7.8]<br />
*[https://launchpad.net/mahara/1.7/1.7.7#release-notes 1.7.7]<br />
*[https://launchpad.net/mahara/1.7/1.7.6#release-notes 1.7.6]<br />
*[https://launchpad.net/mahara/1.7/1.7.5#release-notes 1.7.5]<br />
*[https://launchpad.net/mahara/1.7/1.7.4#release-notes 1.7.4]<br />
*[https://launchpad.net/mahara/1.7/1.7.3#release-notes 1.7.3]<br />
*[https://launchpad.net/mahara/1.7/1.7.2#release-notes 1.7.2]<br />
*[https://launchpad.net/mahara/1.7/1.7.1#release-notes 1.7.1]<br />
*[https://launchpad.net/mahara/1.7/1.7.0#release-notes 1.7.0]<br />
|'''19 April 2013''' <br><br />
<br />
*21 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*29 October 2013<br />
*3 October 2013<br />
*3 April 2014<br />
*18 December 2013<br />
*24 October 2013<br />
*19 April 2013<br />
| style="background:#ba2025; color:#fff" |21 October 2014 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=4967 1.6]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.6/1.6.10#release-notes 1.6.10]<br />
*[https://launchpad.net/mahara/1.6/1.6.9#release-notes 1.6.9]<br />
*[https://launchpad.net/mahara/1.6/1.6.8#release-notes 1.6.8]<br />
*[https://launchpad.net/mahara/1.6/1.6.7#release-notes 1.6.7]<br />
*[https://launchpad.net/mahara/1.6/1.6.6#release-notes 1.6.6]<br />
*[https://launchpad.net/mahara/1.6/1.6.5#release-notes 1.6.5]<br />
*[https://launchpad.net/mahara/1.6/1.6.4#release-notes 1.6.4]<br />
*[https://launchpad.net/mahara/1.6/1.6.3#release-notes 1.6.3]<br />
*[https://launchpad.net/mahara/1.6/1.6.2#release-notes 1.6.2]<br />
*[https://launchpad.net/mahara/1.6/1.6.1#release-notes 1.6.1]<br />
*[https://launchpad.net/mahara/1.6/1.6.0#release-notes 1.6.0]<br />
|'''19 October 2019''' <br><br />
<br />
*13 May 2014<br />
*3 April 2014<br />
*29 October 2013<br />
*3 October 2013<br />
*25 July 2013<br />
*2 May 2013<br />
*15 April 2013<br />
*15 February 2013<br />
*23 November 2012<br />
*24 October 2012<br />
*19 October 2012<br />
| style="background:#ba2025; color:#fff" |29 April 2014 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=4469 1.5]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.5/1.5.13#release-notes 1.5.13]<br />
*[https://launchpad.net/mahara/1.5/1.5.12#release-notes 1.5.12]<br />
*[https://launchpad.net/mahara/1.5/1.5.11#release-notes 1.5.11]<br />
*[https://launchpad.net/mahara/1.5/1.5.10#release-notes 1.5.10]<br />
*[https://launchpad.net/mahara/1.5/1.5.9#release-notes 1.5.9]<br />
*[https://launchpad.net/mahara/1.5/1.5.8#release-notes 1.5.8]<br />
*[https://launchpad.net/mahara/1.5/1.5.7#release-notes 1.5.7]<br />
*[https://launchpad.net/mahara/1.5/1.5.6#release-notes 1.5.6]<br />
*[https://launchpad.net/mahara/1.5/1.5.4#release-notes 1.5.4]<br />
*[https://launchpad.net/mahara/1.5/1.5.3#release-notes 1.5.3]<br />
*[https://launchpad.net/mahara/1.5/1.5.2#release-notes 1.5.2]<br />
*[https://launchpad.net/mahara/1.5/1.5.1#release-notes 1.5.1]<br />
*[https://launchpad.net/mahara/1.5/1.5.0#release-notes 1.5.0]<br />
|'''17 April 2012''' <br><br />
<br />
*25 October 2013<br />
*3 October 2013<br />
*24 July 2013<br />
*2 May 2013<br />
*15 April 2013<br />
*15 February 2013<br />
*23 November 2012<br />
*17 October 2012<br />
*10 October 2012<br />
*14 September 2012<br />
*31 July 2012<br />
*3 May 2012<br />
*17 April 2012<br />
| style="background:#ba2025; color:#fff" |29 October 2013 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=3744 1.4]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.6 1.4.6]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.5 1.4.5]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.4 1.4.4]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.3 1.4.3]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.2 1.4.2]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.1 1.4.1]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.0 1.4.0]<br />
|'''13 June 2011''' <br><br />
<br />
*17 October 2012<br />
*10 October 2012<br />
*14 September 2012<br />
*31 July 2011<br />
*6 March 2011<br />
*3 November 2011<br />
*13 June 2011<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=2252 1.3]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.3.8 1.3.8]<br />
*[https://launchpad.net/mahara/+milestone/1.3.7 1.3.7]<br />
*[https://launchpad.net/mahara/+milestone/1.3.6 1.3.6]<br />
*[https://launchpad.net/mahara/+milestone/1.3.5 1.3.5]<br />
*[https://launchpad.net/mahara/+milestone/1.3.4 1.3.4]<br />
*[https://launchpad.net/mahara/+milestone/1.3.3 1.3.3]<br />
*[https://launchpad.net/mahara/+milestone/1.3.2 1.3.2]<br />
*[https://launchpad.net/mahara/+milestone/1.3.1 1.3.1]<br />
*[https://launchpad.net/mahara/+milestone/1.3.0 1.3.0]<br />
|'''10 September 2010''' <br><br />
<br />
*5 March 2012<br />
*3 Novemver 2011<br />
*10 May 2011<br />
*28 March 2011<br />
*24 March 2011<br />
*7 November 2010<br />
*8 October 2010<br />
*17 September 2010<br />
*10 September 2010<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=1226 1.2]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.2.9 1.2.9]<br />
*[https://launchpad.net/mahara/+milestone/1.2..8 1.2.8]<br />
*[https://launchpad.net/mahara/+milestone/1.2.7 1.2.7]<br />
*[https://launchpad.net/mahara/+milestone/1.2.6 1.2.6]<br />
*[https://launchpad.net/mahara/+milestone/1.2.5 1.2.5]<br />
*[https://launchpad.net/mahara/+milestone/1.2.4 1.2.4]<br />
*[https://launchpad.net/mahara/+milestone/1.2.3 1.2.3]<br />
*[https://launchpad.net/mahara/+milestone/1.2.2 1.2.2]<br />
*[https://launchpad.net/mahara/+milestone/1.2.1 1.2.1]<br />
*[https://launchpad.net/mahara/+milestone/1.2.0 1.2.0]<br />
|'''16 November 2009''' <br><br />
<br />
*10 May 2011<br />
*24 March 2011<br />
*1 September 2011<br />
*2 July 2010<br />
*6 April 2010<br />
*8 February 2010<br />
*8 December 2009<br />
*8 December 2009<br />
*16 November 2009<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://launchpad.net/mahara/+milestone/1.0.10 1.1]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.1.9 1.1.9]<br />
*[https://launchpad.net/mahara/+milestone/1.1.8 1.1.8]<br />
*[https://launchpad.net/mahara/+milestone/1.1.7 1.1.7]<br />
*[https://launchpad.net/mahara/+milestone/1.1.6 1.1.6]<br />
*[https://launchpad.net/mahara/+milestone/1.1.5 1.1.5]<br />
*[https://launchpad.net/mahara/+milestone/1.1.4 1.1.4]<br />
*[https://launchpad.net/mahara/+milestone/1.1.3 1.1.3]<br />
*[https://launchpad.net/mahara/+milestone/1.1.2 1.1.2]<br />
*[https://launchpad.net/mahara/+milestone/1.1.1 1.1.1]<br />
*[https://launchpad.net/mahara/+milestone/1.1.0 1.1.0]<br />
|'''25 February 2009''' <br><br />
<br />
*2 July 2010<br />
*6 April 2010<br />
*28 October 2009<br />
*21 June 2009<br />
*10 June 2009<br />
*21 April 2009<br />
*9 March 2009<br />
*26 February 2009<br />
*25 February 2009<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=292 1.0]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.0.15 1.0.15]<br />
*[https://launchpad.net/mahara/+milestone/1.0.14 1.0.14]<br />
*[https://launchpad.net/mahara/+milestone/1.0.13 1.0.13]<br />
*[https://launchpad.net/mahara/+milestone/1.0.12 1.0.12]<br />
*[https://launchpad.net/mahara/+milestone/1.0.11 1.0.11]<br />
*[https://launchpad.net/mahara/+milestone/1.0.10 1.0.10]<br />
*[[Releases/1.0.9|1.0.9]]<br />
*[[Releases/1.0.8|1.0.8]]<br />
*[[Releases/1.0.7|1.0.7]]<br />
|'''9 March 2009''' <br><br />
<br />
*2 July 2010<br />
*6 April 2010<br />
*28 October 2009<br />
*21 June 2009<br />
*21 April 2009<br />
*9 March 2009<br />
*Unavailable<br />
*Unavailable<br />
*Unavailable<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
|}<br />
<br />
=Definition of support=<br />
<br />
Being "supported" means:<br />
<br />
*The release team is committed to making available updates to Mahara that are security related. See [[Security]] to find out how to report security bugs to us.<br />
*Occasionally, some other serious bug fixes will be included, but these are not guaranteed. If you find another type of bug, please let us know by reporting it on the mahara.org forums or directly on Launchpad: https://bugs.launchpad.net/mahara/+filebug<br />
<br />
=Specific backporting rules=<br />
<br />
When deciding which bugs to backport to supported branches, these are the general principles:<br />
<br />
*'''[[Security]] bugs'''<br />
**'''All''' Critical and High priority security bugs should be backported.<br />
**'''Nearly all''' Medium and Low priority security bugs should be backported. At the maintenance team's discretion, these might not be backported if:<br />
***Backporting would be technically difficult due to differences between Mahara versions.<br />
***The bug fix requires database upgrades or dataroot manipulations.<br />
***The bug fix otherwise introduces a high risk of [https://en.wikipedia.org/wiki/Software_regression regressions].<br />
<br />
*'''Non-security bugs'''<br />
**'''All''' Critical bugs should be backported.<br />
**'''Most''' High priority bugs should be backported. At the maintenance team's discretion, these might not be backported if:<br />
***Backporting would be technically difficult due to differences between Mahara versions.<br />
***The bug fix requires database upgrades or dataroot manipulations.<br />
***The bug fix otherwise introduces a high risk of [https://en.wikipedia.org/wiki/Software_regression regressions].<br />
**'''No''' Medium or Low priority non-security bugs are backported.<br />
**'''No''' Wishlist bugs are backported. Wishlist items are only added to the current development branch.<br />
<br />
If you want to backport certain bug fixes or new features to your own instance of Mahara, you can do so on your own as the code is available.<br />
<br />
See [[Developer_Area/Bug_Status#Importance|Bug Status:Importance]] for the guidelines on how we decide whether a bug is Critical, High, Medium, or Low.<br />
<br />
[[Category:Release Notes]]</div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Release_Instructions/Release_Candidate&diff=13431Developer Area/Release Instructions/Release Candidate2022-10-17T02:35:37Z<p>Robertl: /* Create the new dev branch */</p>
<hr />
<div>==Create the new dev branch==<br />
Note: You only need to do this for the '''first''' release candidate. If you need to do another release candidate, put it on the '''same branch.'''<br />
<br />
Create a new <code>_DEV</code> branch based off of main.<br />
<br />
*<code>git checkout main</code><br />
<br />
*<code>git checkout -b 1.10_DEV</code><br />
<br />
*<code>git push gerrit 1.10_DEV</code><br />
<br />
If Gerrit won't let you push your new branch, you can instead create it through Gerrit.<br />
<br />
*Go to [https://reviews.mahara.org/ reviews.mahara.org]<br />
*Click on 'Projects', the 'mahara' project, and then on the 'Branches' subtab.<br />
<br />
Then do the following<br />
<br />
*In the '''<code>Makefile</code>''' of the new '''<code>_DEV</code>''' branch, replace <code>main</code> with the name of the branch. Commit and make push.<br />
*Create an empty 'ChangeLog' file. Commit and <code>make push</code>. Note: the file needs a capital C and L in the name.<br />
*Update the release in <code>htdocs/lib/version.php</code> to be <code>$config->release = 'XX.XXrc1';</code> ??? Do we still need this or is it done by release script<br />
<br />
==Bump the version on main==<br />
<br />
*Go to the main branch and bump the version (e.g. if you just created the <code>22.04_DEV</code> branch, bump it to <code>22.10_DEV</code> )<br />
*In <code>htdocs/lib/version.php</code> update <code>$config->series</code>, <code>$config->release</code> and <code>$config->version</code> (version should be today's date)<br />
*Update the README.md with information about how to upgrade to this version, e.g. which minimum version they should have etc<br />
*Commit and <code>make push</code><br />
<br />
{{Final_Checks}}<br />
<br />
==Skip the changelog and release notes==<br />
Do not populate the changelog. For the release notes put something like ''<nowiki/>'First release candidate for 1.4''<nowiki/>'.<br />
<br />
==About Release Candidate releases==<br />
For a Release Candidate, a selection of bugs have been targeted to a the 'rc1' milestone. After the first release candidate, an rc2 milestone may be created to track which ones will go onto the final release. '''Once an rc1 or rc2 bug has been committed, its status should change back to its original .0 milestone.'''<br />
<br />
{{Release_Script}}<br />
<br />
{{Testing}}<br />
<br />
{{Upload_Tarballs}}<br />
<br />
==Creating the new language packs branch==<br />
<br />
You need to set up launchpad translations for the new branch. See the separate instructions on [[Developer_Area/Language_Packs/Launchpad_Branching|setting up a new translations branch]].<br />
<br />
==Changelog and release notes==<br />
<br />
Do not paste the full changelog on Launchpad (that's for the actual release) and only put something like "First release candidate for 1.4" in the bullet point section of the release notes on Launchpad.<br />
<br />
==Update master.dev.mahara.org==<br />
<br />
Updating master.dev.mahara.org however is useful for users who do not have somewhere to set up a test instance but would like to check out the changes.<br />
<br />
==Do not update the bug tracker==<br />
<br />
The bug tracker does not need to be updated because no bugs should ever have an RC release as its milestone.<br />
<br />
Furthermore, these bugs are not fixed until the release has happened, so they should be left as "Fix committed".<br />
<br />
==Do not update the demo site==<br />
<br />
The demo site should always be the last '''stable''' release. The RC is not a release yet.<br />
<br />
{{Announcements}}<br />
Publish news [[Developer Area/Release Instructions/Release day#.28Release candidate.29 Announcements|forum posts to get people to test the release]].<br />
<br />
The main purpose of an RC is to get people to test the release for any major bugs. Therefore, we do not consider the RC as a release and only announce it through: [https://twitter.com/maharaproject Twitter], IRC, and the mahara.org news forum.<br />
<br />
{{Additional tasks}}<br />
<br />
===Update master.dev.mahara.org===<br />
Updating master.dev.mahara.org however is useful for users who do not have somewhere to set up a test instance but would like to check out the changes.<br />
<br />
===News forum post template for RC1===<br />
🟡 Kristina<br />
<br />
[https://mahara.org/interaction/forum/topic.php?id=8934 Example for 21.10] and [https://mahara.org/interaction/forum/topic.php?id=8934 22.04].<br />
<br />
===News forum template for second and/or final RC===<br />
🟡 Kristina<br />
<br />
''Note: Outdated - needs updating''<br />
<br />
Subject: Second release candidate for Mahara 1.4 available<br />
<br />
Based on the feedback we have received so far, this will most likely be the last release candidate before the final 1.4 release:<br />
<br />
*https://launchpad.net/mahara/1.4/1.4rc2<br />
<br />
New Features for the Release Candidate are listed on Launchpad with the newfeature tag:<br />
<br />
*https://bugs.launchpad.net/mahara/+bugs?field.milestone%3Alist=64606&field.tag=nominatedfeature<br />
<br />
We've also done lots of bug fixing is this release cycle. The full list of changes that have been made for 1.4 can be found by clicking here.<br />
<br />
*https://bugs.launchpad.net/mahara/+bugs?field.status%3Alist=FIXCOMMITTED&field.status%3Alist=FIXRELEASED&field.milestone%3Alist=64606<br />
<br />
If you haven't had a chance to test it out yet, please do so now and report any bugs on the tracker:<br />
<br />
*https://bugs.launchpad.net/mahara/+filebug<br />
<br />
This is your last chance to make sure your upgrade to 1.4 will be smooth. If nothing major is reported in the next few days, we will be cutting the 1.4.0 release in about a week.<br />
<br />
Cheers,<br />
<br />
The 1.4 Release Managers</div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Developer_Environment&diff=13378Developer Area/Developer Environment2022-09-15T19:54:31Z<p>Robertl: </p>
<hr />
<div>{{:Developer_Area/tabs}} <!-- to add further tabs, update the following page https://wiki.mahara.org/wiki/Developer_Area/tabs ... this will automatically cascade the changes to all relevant pages --><br />
<br />
<div style="float:right">__TOC__</div><br />
<br />
This page explains how to set up a copy of Mahara for development purposes.<br />
<br />
==The Docker version==<br />
<br />
Included in the main codebase is a docker version of Mahara with Behat capabilities. Before you try this, you will need to have Docker installed.<br />
See: https://docs.docker.com/engine/install/ubuntu/<br />
<br />
The instructions for running the docker version are here:<br><br />
https://git.mahara.org/mahara/mahara/-/blob/main/docker/README.md<br />
<br />
Please feel free to update if there are missing instructions that would be helpful to others.<br />
<br />
==The short version==<br />
<br />
Mahara is a fairly standard PHP web application. You mainly need to place it in your web server and give it a database, and a file storage directory. If you haven't set up a PHP web application before, skip to "the long version" down below.<br />
<br />
#Set up your Apache web server. For development purposes, it is often handy to have the web root sitting inside your home directory.<br />
#Retrieve a copy of the Mahara codebase. Place it in your Apache web root.<br />
#Create a Mahara "dataroot" directory '''outside''' of your web root. Make it read/writeable by Apache.<br />
#Create a database instance and database user for Mahara to use.<br />
#Edit the Mahara "config.php" file so that Mahara knows the location of its dataroot directory, and its database login credentials.<br />
#Run the Mahara installer by visiting your Mahara site in your web browser. If you are missing any required PHP modules, Mahara should tell you. Depending on what you already have installed, you may need one or more of these:<br />
#*If you're on '''Ubuntu 16.04''' or later<br />
#*#<syntaxhighlight lang="text" inline="">php-pgsql</syntaxhighlight><br />
#*#<syntaxhighlight lang="text" inline="">php-gd</syntaxhighlight><br />
#*#<syntaxhighlight lang="text" inline="">php-curl</syntaxhighlight><br />
#*#<syntaxhighlight lang="text" inline="">php-intl</syntaxhighlight><br />
#*#<syntaxhighlight lang="text" inline="">php-json</syntaxhighlight><br />
#*#<syntaxhighlight lang="text" inline="">php-zip</syntaxhighlight><br />
#*If you are using Mysql instead of Postgres<br />
#*#<syntaxhighlight lang="text" inline="">php7.4-mysql</syntaxhighlight> or<br />
#*#<syntaxhighlight lang="text" inline="">php-mysql</syntaxhighlight><br />
<br />
==The long version (for Windows)==<br />
<br />
If you want to install your developer environment on Windows, please [[Developer_Area/Developer_Environment_(Windows) | check the Windows instructions]].<br />
<br />
==The long version (for Linux)==<br />
<br />
The instructions explain one way to set up an installation of Mahara for development purposes. These instructions are specifically for Ubuntu Linux, although the process will probably be quite similar in other Linux versions.<br />
<br />
Note: Please have an apache2 installed on your server<br />
<syntaxhighlight lang="bash"><br />
sudo apt install apache2<br />
</syntaxhighlight><br />
<br />
'''The following instructions are for Ubuntu 16.04 and above unless otherwise noted.'''<br />
<br />
'''1.''' Install required packages:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo apt install \<br />
make curl wget xvfb git gitk postgresql php7.4-common php-cli libapache2-mod-php7.4 \<br />
php7.4-curl php7.4-gd php-json php-ldap php-pgsql php-xmlrpc php-zip php-xml php-mbstring \<br />
nodejs node-gyp php7.4-pgsql php7.4-xml php7.4-xmlrpc php7.4-mbstring php7.4-intl libssl-dev npm<br />
</syntaxhighlight><br />
<br />
<small>Note on php versions: At the time of writing (Nov 2020), php 7.4 has a year of active development remaining, and we are expecting the release of php 8.0 sometime soon. Php 7.4 is currently the recommended version to install. Sometimes there is a generic package _and_ a version-specific package to be installed. [PHP supported versions](https://www.php.net/supported-versions.php)</small><br />
<br />
If you see any errors with the install, you may want to try installing in chunks. See the Troubleshooting section<br />
<br />
Set 7.4 as apache2's version of php<br />
<syntaxhighlight lang="bash"><br />
sudo a2enmod php7.4<br />
</syntaxhighlight><br />
<br />
Check which version of Node you are running with <syntaxhighlight lang="bash" inline="">node -v</syntaxhighlight><br />
<br />
If you are running one of the long term service (lts) versions, 8.x or 10.x, that should work with Mahara fine. If you are running a higher version, or Node is not installed, you will need to add a version to run with Mahara.<br />
<br />
'''2.''' Get a copy of the Mahara code from git. We'll put it under your home directory, in a new directory called "code":<br />
See also [[Developer_Area/Getting_Code_from_Git|Getting Code from Git]]<br />
<br />
<syntaxhighlight lang="bash"><br />
cd ~<br />
mkdir code<br />
cd code<br />
git clone https://git.mahara.org/mahara/mahara.git<br />
</syntaxhighlight><br />
<br />
'''Or, if that failed, use:'''<br />
<br />
<syntaxhighlight lang="bash"><br />
$ git clone https://github.com/MaharaProject/mahara.git<br />
</syntaxhighlight><br />
<br />
'''Or, if you have an account on the Mahara gitlab then do the following:'''<br />
<br />
<syntaxhighlight lang="bash"><br />
$ git clone git@git.mahara.org:mahara/mahara.git<br />
</syntaxhighlight><br />
<br />
'''3.''' Give the Apache web server access to your Mahara code directory:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo chmod a+rx ~/code/mahara<br />
</syntaxhighlight><br />
<br />
'''3a.''' To avoid a possible 403 error later, confirm that your code directory permissions are also drwxr-xr-x<br />
<syntaxhighlight lang="bash"><br />
ls -la ~/<br />
</syntaxhighlight><br />
To fix, run:<br />
<syntaxhighlight lang="bash"><br />
sudo chmod a+rx ~/code<br />
</syntaxhighlight><br />
<br />
Your home directory permissions should be drwx--x--x<br />
Check with:<br />
<syntaxhighlight lang="bash"><br />
ls -la /home<br />
</syntaxhighlight><br />
Fix with:<br />
<syntaxhighlight lang="bash"><br />
sudo chmod a+x /home/[name of your home directory]<br />
</syntaxhighlight><br />
<br />
'''4.''' Create a PostgreSQL database user:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo -u postgres createuser -P -D -R -S maharauser<br />
</syntaxhighlight><br />
<br />
You'll be prompted for a password. Enter '''maharapassword''' for the password.<br />
<br />
If Postgres is not available, check its status and if it says that it's inactive, start the service:<br />
<br />
<syntaxhighlight lang="bash"><br />
service postgresql status<br />
sudo service postgresql start<br />
</syntaxhighlight><br />
<br />
Now create a database:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo -u postgres createdb -Omaharauser mahara-main<br />
</syntaxhighlight><br />
<br />
'''5.''' Using a text editor, copy these contents into a file and save it to <syntaxhighlight lang="text" inline="">~/code/mahara/htdocs/config.php</syntaxhighlight>:<br />
<br />
<syntaxhighlight lang="php"><br />
<?php<br />
$cfg = new stdClass();<br />
<br />
$branch = 'main';<br />
<br />
// database connection details<br />
// valid values for dbtype are 'postgres8' and 'mysql5'<br />
$cfg->dbtype = 'postgres';<br />
$cfg->dbhost = 'localhost';<br />
$cfg->dbuser = 'maharauser';<br />
$cfg->dbname = "mahara-$branch";<br />
$cfg->dbpass = 'maharapassword'; <br />
<br />
$cfg->dataroot = "/var/lib/maharadata/$branch";<br />
<br />
$cfg->sendemail = true;<br />
$cfg->sendallemailto = '<your email address>';<br />
<br />
$cfg->productionmode = false;<br />
$cfg->perftofoot = true;<br />
</syntaxhighlight><br />
<br />
Make sure to replace <syntaxhighlight lang="text" inline=""><your email address></syntaxhighlight> with your email address.<br />
<br />
If you're mainly testing, and you don't find the stack traces in these screen messages particularly useful, adding <syntaxhighlight lang="text" inline="">$cfg->log_backtrace_levels = LOG_LEVEL_ENVIRON;</syntaxhighlight> to config.php will display important warning messages on a single line, without stack traces.<br />
<br />
'''6.''' Create a dataroot directory (this is where Mahara stores uploaded files):<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo mkdir /var/lib/maharadata<br />
sudo mkdir /var/lib/maharadata/main<br />
sudo chown www-data:www-data /var/lib/maharadata/main<br />
</syntaxhighlight><br />
<br />
'''7.''' Set up a new local domain name "mahara" for your Mahara site, in /etc/hosts:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo sh -c "echo '127.0.0.1 mahara' >> /etc/hosts"<br />
</syntaxhighlight><br />
<br />
'''8.''' Increase your PHP "post_max_size" setting to 32M in php.ini:<br />
<br />
If you are using '''Ubuntu 16.04''' or later, these files will be under the version of php you are using, e.g. /etc/php/7.4:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo sh -c "echo 'post_max_size = 37M' >> /etc/php/7.4/cli/php.ini"<br />
sudo sh -c "echo 'upload_max_filesize = 32M' >> /etc/php/7.4/cli/php.ini"<br />
sudo sh -c "echo 'post_max_size = 37M' >> /etc/php/7.4/apache2/php.ini"<br />
sudo sh -c "echo 'upload_max_filesize = 32M' >> /etc/php/7.4/apache2/php.ini"<br />
</syntaxhighlight><br />
<br />
Note: The 'post_max_size' is slightly bigger as a POST command also contains some wrapper information. That wrapper is just text strings and relates to how much the form submits. So usually, 1MB should be enough, but to be on the safe side, 5MB would be better, which then also works for larger uploads.<br />
<br />
'''9.''' Create an Apache configuration file to point to your copy of Mahara. You can do this by first copying the following contents into a file called "mahara.conf", saved in your home directory.<br />
See also: [[Developer_Area/Changing_Hostnames|Changing Hostnames]]<br />
<br />
<syntaxhighlight lang="apache"><br />
<VirtualHost *:80><br />
ServerName mahara<br />
DocumentRoot /home/<your username>/code/mahara/htdocs<br />
<br />
<Directory /home/<your username>/code><br />
Options Indexes FollowSymLinks MultiViews<br />
Require all granted<br />
</Directory><br />
<br />
ErrorLog /var/log/apache2/error.log<br />
LogLevel info<br />
<br />
CustomLog /var/log/apache2/access.log combined<br />
DirectoryIndex index.php index.html<br />
</VirtualHost><br />
</syntaxhighlight><br />
<br />
Then copy the file into your Apache sites-enable directory. The name to give the file will also vary depending on what version of Ubuntu you are using.<br />
<br />
<syntaxhighlight lang="text" inline="">sudo cp ~/mahara.conf /etc/apache2/sites-available/mahara.conf</syntaxhighlight><br />
<br />
'''10.''' Enable the site in Apache:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo a2ensite mahara<br />
sudo apache2ctl configtest<br />
sudo apache2ctl graceful<br />
</syntaxhighlight><br />
<br />
'''11.''' Set up cron:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo vim /etc/cron.d/mahara<br />
* * * * * www-data /usr/bin/php /home/<your username>/code/mahara/htdocs/lib/cron.php<br />
</syntaxhighlight><br />
<br />
If you do not wish to get cron emails every minute, use the following instead:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo vim /etc/cron.d/mahara<br />
* * * * * www-data /usr/bin/php /home/<your username>/code/mahara/htdocs/lib/cron.php >/dev/null 2>&1<br />
</syntaxhighlight><br />
<br />
<br />
Save your file.<br />
<br />
'''12.''' Set up npm and gulp<br />
<br />
The main Mahara git repository includes SCSS files that compile into CSS files, instead of including CSS files directly. We compile these using a Gulp (NodeJS) script that's included with the code. This can easily be invoked via our Makefile by doing "make css", but it requires setting up a couple of additional items first.<br />
<br />
First you'll need to run "npm install" from within the Mahara code directory, to get npm to properly set up all the proper caches and such.<br />
<br />
<syntaxhighlight lang="bash"><br />
cd /home/<your username>/code/mahara<br />
npm install<br />
</syntaxhighlight><br />
<br />
Once that's finished, you'll need to install the npm "gulp" package using the "-g" (global) flag, so that "gulp" can be run as a CLI command. This requires using sudo.<br />
<br />
<syntaxhighlight lang="bash"><br />
cd /home/<your username>/code/mahara<br />
sudo npm install -g gulp<br />
</syntaxhighlight><br />
<br />
'''Note that Mahara runs with at least version 10.x of node. This section needs updating'''<br />
Note: In Mahara 18.10 we upgraded dependencies to work with latest node 8.x (LTS), you may need to update node via: <br />
<syntaxhighlight lang="bash"><br />
sudo npm cache clean -f<br />
sudo npm install -g n <br />
sudo n 8.11.3 (latest at patch)<br />
</syntaxhighlight><br />
Then update node-sass bindings:<br />
<syntaxhighlight lang="bash"><br />
sudo npm rebuild node-sass<br />
</syntaxhighlight><br />
<br />
'''13.''' Build the CSS<br />
<br />
Now that this is done, you can build the CSS files. The easiest way to do this is by doing "make css" in the Mahara code directory. This will run the necessary series of instructions written out in the Makefile.<br />
<br />
<syntaxhighlight lang="bash"><br />
cd /home/<your username>/code/mahara<br />
make css<br />
</syntaxhighlight><br />
<br />
If you see a lot of errors, such as depreciation warnings for .css files, try deleting /home/<your username>/code/mahara/package-lock.json and then re-running "nvm install" and "make css", which should resolve the issues.<br />
<br />
If you run 'make css' and see the following "ERROR: Can't find the "nvm" executable ..." try the following:<br />
<br />
Steps (for me) to get nvm working<br />
<br />
First Install nvm<br />
<br />
<syntaxhighlight lang="bash"><br />
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash<br />
</syntaxhighlight><br />
<br />
Then make the .nvm.sh executable<br />
<syntaxhighlight lang="bash"><br />
cd ~/.nvm && chmod 755 nvm.sh<br />
</syntaxhighlight><br />
<br />
Then reload your .bashrc file<br />
<syntaxhighlight lang="bash"><br />
source ~/.bashrc<br />
</syntaxhighlight><br />
<br />
The set the first nvm version manually to create a default<br />
<syntaxhighlight lang="bash"><br />
./nvm.sh && nvm install 12<br />
</syntaxhighlight><br />
<br />
'''13a.''' Build the CSS in non-production mode<br />
<br />
Sometimes it gets confusing where the sass info comes from to compile the css files. Too make things easier you can edit the 'Makefile' and change the production mode to false<br />
<br />
production = false<br />
<br />
Then run the "make css" again - this will compile the *.css files in an easier to read format with comments about which sass file contributed to the chuck of css code, eg:<br />
<br />
<syntaxhighlight lang="css"><br />
/* line 27, /home/robertl/code/mahara-devel/mahara/htdocs/theme/raw/sass/layout/_footer.scss */<br />
.admin .footer .footer-inner {<br />
padding: 10px; }<br />
/* line 36, /home/robertl/code/mahara-devel/mahara/htdocs/theme/default/sass/layout/_footer.scss */<br />
.admin .footer .footer-inner {<br />
padding: 20px 10px;<br />
background: none;<br />
border: 0;<br />
border-radius: 0; }<br />
</syntaxhighlight><br />
<br />
'''14.''' Go to the site in your browser.<br />
<br />
http://mahara/<br />
<br />
'''15.''' You should see the Mahara installer page. If you do, congratulations! Your development environment is now set up.<br />
<br />
===Trouble-shooting===<br />
<br />
<br />
====Ubuntu 18.04 & PHP 7.2====<br />
If you are using '''Ubuntu 18.04''' and php 7.2, you may need to use the "php7.2-*" and installing all at once doesn't work for you:<br />
<br />
To help with installing you should install in chunks to help diagnose / fix problems. First do:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get install make curl wget xvfb git gitk postgresql<br />
</syntaxhighlight><br />
<br />
Once that is installed do:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get install php7.2-common php-cli libapache2-mod-php7.2 php7.2-curl php7.2-gd<br />
</syntaxhighlight><br />
<br />
If you get the error "The following packages have unmet dependencies" try downgrading your php7.2-common to a compatible version:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get install php7.2-common=7.2.3-1ubuntu1<br />
</syntaxhighlight><br />
<br />
then run the previous command again<br />
<br />
Once that is installed do:<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get install php-json php-ldap php-pgsql php-xmlrpc php-zip php-xml php-mbstring nodejs node-gyp </syntaxhighlight><br />
<br />
You may also need to install some specific php7.2 versions of these:<br />
<syntaxhighlight lang="bash"><br />
sudo apt install php7.2-pgsql php7.2-xml php7.2-xmlrpc php7.2-mbstring<br />
</syntaxhighlight><br />
<br />
and then:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get install libssl-dev<br />
</syntaxhighlight><br />
<br />
If you get the error "The following packages have unmet dependencies", try downgrading your libssl1.1 to a compatible version:<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get install libssl1.1=1.1.0g-2ubuntu4<br />
</syntaxhighlight><br />
<br />
then run the previous command again.<br />
<br />
<br />
====Enabling apache2's version of PHP====<br />
<br />
When you do:<br />
<syntaxhighlight lang="bash"><br />
sudo a2enmod php7.2<br />
</syntaxhighlight><br />
<br />
And see errors like:<br />
Considering dependency mpm_prefork for php7.2:<br />
Considering conflict mpm_event for mpm_prefork:<br />
ERROR: Module mpm_event is enabled - cannot proceed due to conflicts. It needs to be disabled first!<br />
Considering conflict mpm_worker for mpm_prefork:<br />
ERROR: Could not enable dependency mpm_prefork for php7.2, aborting<br />
<br />
You will need to disable the chasing MPM options:<br />
<syntaxhighlight lang="bash"><br />
sudo a2dismod mpm_prefork<br />
sudo a2dismod mpm_worker<br />
sudo a2dismod mpm_event<br />
</syntaxhighlight><br />
<br />
Then do:<br />
<syntaxhighlight lang="bash"><br />
sudo a2enmod php7.2<br />
</syntaxhighlight><br />
<br />
this way the php7.2 mod should auto enable the correct MPM.<br />
<br />
<br />
====Dataroot & Ubuntu 18.04/PHP 7.2====<br />
<br />
If you are '''upgrading to Ubuntu 18.04/PHP 7.2''' from earlier version you will also need to go into your dataroot directory (path is defined in the config.php file) and delete the 'dwoo' and 'sessions' sub-directories found there. They will be automatically generated again.<br />
<br />
<br />
====Using MySql8====<br />
<br />
If you are going to be using '''MySql 8''' or later, you will need to do the following:<br />
<br />
*To install MySql 8 on Ubuntu 16.04 see https://www.digitalocean.com/community/tutorials/how-to-install-the-latest-mysql-on-ubuntu-16-04<br />
<br />
We need to add a line to our mysql conf file so that we can log in with older format passwords, so edit:<br />
<syntaxhighlight lang="bash"><br />
vi /etc/mysql/mysql.conf.d/mysqld.cnf<br />
</syntaxhighlight><br />
And make sure we have<br />
<syntaxhighlight lang="bash"><br />
[mysqld]<br />
default_authentication_plugin=mysql_native_password<br />
</syntaxhighlight><br />
<br />
You will need to set the db user to use the native password<br />
<br />
CREATE USER 'maharauser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mahara';<br />
<br />
=====MySQL in Docker=====<br />
If you have Docker available you can [[System Administrator's Guide/Installing Mahara/MySQL and Docker|spin it up a dedicated container for it]].<br />
<br />
====Installing Node versions====<br />
<br />
Check which version of Node you are running with<br />
<syntaxhighlight lang="bash"><br />
node -v<br />
</syntaxhighlight><br />
If you are running one of the long term service (lts) versions, 8.x or 10.x, that should work with Mahara fine. If you are running a higher version, or Node is not installed, you will need to add a version to run with Mahara.<br />
<br />
You can find various instructions on how to upgrade NodeJS on your distribution depending on your preference on package manager. (There are a couple of links at the bottom of this section.)<br />
<br />
A straight-forward way to manage multiple versions of Node is to use NVM:<br />
<br />
*[https://github.com/creationix/nvm#install-script/ How to install NVM]<br />
<br />
Once you have it installed run:<br />
<syntaxhighlight lang="bash"><br />
nvm install --lts<br />
nvm use --lts<br />
</syntaxhighlight><br />
This will download the latest lts version of Node and set it to default. Then if you need to switch versions for other projects, you can do so with "nvm use <version>".<br />
<br />
Links to alternative ways of installing Node:<br />
<br />
*[https://nodejs.org/en/download/package-manager/ Installing Node.js via package manager]<br />
*[https://tecadmin.net/install-latest-nodejs-npm-on-ubuntu/ How to Install Latest Nodejs & Npm on Ubuntu 16.04 & 14.04]<br />
<br />
<br />
<br />
ts-php versions - also add set alternatives here<br />
Note on changing versions: you can see which version apache is using by adding phpinfo() in your code.<br />
<br />
==Adding another branch==<br />
<br />
'''1.''' Create a new local branch for it in git (replace '''1.10 / 110''' with the version of Mahara for which you want to add a branch)<br />
<syntaxhighlight lang="bash"><br />
$ cd ~/code/mahara<br />
$ git checkout -t origin/1.10_STABLE<br />
</syntaxhighlight><br />
<br />
'''2.''' Create the sitedata directory for the new branch:<br />
<syntaxhighlight lang="bash"><br />
$ sudo mkdir /var/lib/maharadata/110stable<br />
$ sudo chown www-data:www-data /var/lib/maharadata/110stable<br />
</syntaxhighlight><br />
<br />
'''3.''' Create a database:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres createdb -Omaharauser mahara-110stable<br />
</syntaxhighlight><br />
<br />
'''4.''' Change your ~/code/mahara/htdocs/config.php to point to the 1.10 branch:<br />
<syntaxhighlight lang="php"><br />
$branch = '110stable';<br />
</syntaxhighlight><br />
<br />
'''5.''' Go to the site in your browser to run the Mahara installer:<br />
<br />
http://mahara/<br />
<br />
&nbsp;<br />
<br />
==Switching back to the main branch==<br />
<br />
'''1.''' Change the config.php file:<br />
<syntaxhighlight lang="php"><br />
$branch = 'main';<br />
</syntaxhighlight><br />
<br />
'''2.''' Switch to the right git branch:<br />
<syntaxhighlight lang="bash"><br />
$ cd ~/code/mahara/<br />
$ git checkout main<br />
</syntaxhighlight><br />
<br />
&nbsp;<br />
==Reset the database==<br />
<br />
'''1.''' Delete the old database:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres dropdb mahara-main<br />
</syntaxhighlight><br />
<br />
'''2.''' Create a new one with the same name:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres createdb -Omaharauser mahara-main<br />
</syntaxhighlight><br />
<br />
'''3.''' Go to the site in your browser to run the Mahara installer again:<br />
<br />
http://mahara/<br />
<br />
If you reset the database a lot, you might want to try out the "maharawipe.sh" utility at https://github.com/agwells/mahara-devtools<br />
<br />
==Testing a change submitted to Gerrit==<br />
<br />
'''1.''' Go to the change page, for example:<br />
<syntaxhighlight lang="bash"><br />
https://reviews.mahara.org/#change,230<br />
</syntaxhighlight><br />
<br />
'''2.''' In your local repository, switch to the branch listed in the Gerrit change (in this case: main):<br />
<syntaxhighlight lang="bash"><br />
$ cd ~/code/mahara<br />
$ git checkout main<br />
</syntaxhighlight><br />
<br />
'''3.''' Update your config.php to use the right branch, too.<br />
<br />
'''4.''' Copy the "Anonymous Git" URL in the "Download" section of "Patch Set X" and run it in ~/code/mahara to check the branch out, for example:<br />
<syntaxhighlight lang="bash"><br />
$ git fetch git://reviews.mahara.org/git/mahara refs/changes/30/230/1 && git checkout FETCH_HEAD<br />
$ make css<br />
</syntaxhighlight><br />
<br />
'''5.''' After finishing the testing, go back to main:<br />
<syntaxhighlight lang="bash"><br />
$ git checkout main<br />
$ make css<br />
</syntaxhighlight><br />
<br />
&nbsp;<br />
<br />
==Submitting a change to Gerrit==<br />
<br />
If you want to contribute a patch to the Mahara project yourself, please check out the wiki page on [[Developer_Area/Contributing_Code | contributing code]]. There is also a [[Developer_Area/Contributing_Code/Troubleshooting_your_Gerrit_connection | troubleshooting page]] in case you run into issues pushing code to Gerrit.<br />
<br />
&nbsp;<br />
==Copying a local install to another==<br />
<br />
This example uses the directory 15stable as an example for the new install and the 14stable install as database and sitedata directory to copy.<br />
<br />
'''1.''' Do a checkout of the code into a new directory:<br />
<syntaxhighlight lang="bash"><br />
$ cd ~<br />
$ mkdir code<br />
$ cd code<br />
$ git clone git@git.mahara.org:mahara/mahara.git 15stable<br />
</syntaxhighlight><br />
<br />
'''2.''' Copy the database:<br />
<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres pg_dump -Fc mahara-14stable > 14stable.pg<br />
$ sudo -u postgres createdb -Omaharauser mahara-15stable<br />
$ sudo -u postgres pg_restore -O -j4 -d mahara-15stable -U maharauser -W -h localhost 14stable.pg<br />
</syntaxhighlight><br />
<br />
If you've not given the user 'maharauser' full privileges yet (should only need to do this once)<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON SCHEMA public TO maharauser;'<br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO maharauser;'<br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO maharauser;'<br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO maharauser;'<br />
</syntaxhighlight><br />
<br />
'''3.''' Change the wwwroot in the new database:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres psql mahara-15stable<br />
delete from config where field = 'wwwroot';<br />
Ctrl + d to exit<br />
</syntaxhighlight><br />
<br />
'''4.''' Create the config file ~/code/mahara/htdocs/config.php:<br />
<syntaxhighlight lang="php"><br />
<?php<br />
$cfg = new StdClass;<br />
<br />
$branch = '15stable';<br />
<br />
// database connection details<br />
// valid values for dbtype are 'postgres8' and 'mysql5'<br />
$cfg->dbtype = 'postgres8';<br />
$cfg->dbhost = 'localhost';<br />
$cfg->dbuser = 'maharauser';<br />
$cfg->dbname = "mahara-$branch";<br />
$cfg->dbpass = 'mahara'; <br />
$cfg->dbprefix = '''''''; <br />
<br />
$cfg->dataroot = "/var/lib/maharadata/$branch";<br />
<br />
$cfg->sendemail = true;<br />
$cfg->sendallemailto = 'your email address';<br />
<br />
$cfg->log_dbg_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->log_info_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->log_warn_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->log_environ_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->perftofoot = true;<br />
</syntaxhighlight> <br />
<br />
'''5.''' Copy the source sitedata directory into the new sitedata folder:<br />
<syntaxhighlight lang="bash"><br />
$ sudo cp -r /var/lib/maharadata/14stable/ /var/lib/maharadata/15stable<br />
$ sudo chown -R www-data:www-data /var/lib/maharadata/15stable<br />
</syntaxhighlight><br />
<br />
'''6.''' Add a new entry to /etc/hosts:<br />
<syntaxhighlight lang="bash"><br />
127.0.0.1 15stable<br />
</syntaxhighlight><br />
<br />
'''7.''' Create a new Apache vhost file in /etc/apache2/sites-available/15stable.conf:<br />
<syntaxhighlight lang="apacheconf"><br />
<VirtualHost *:80><br />
ServerName 15stable<br />
DocumentRoot /home/<your username>/code/15stable/htdocs<br />
<br />
<Directory /home/<your username>/code><br />
Options Indexes FollowSymLinks MultiViews<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
<br />
ErrorLog /var/log/apache2/error.log<br />
LogLevel info<br />
<br />
CustomLog /var/log/apache2/access.log combined<br />
DirectoryIndex index.php index.html<br />
</VirtualHost><br />
</syntaxhighlight><br />
<br />
'''8.''' Enable the site in Apache:<br />
<syntaxhighlight lang="bash"><br />
$ sudo a2ensite 15stable<br />
$ sudo apache2ctl configtest<br />
$ sudo apache2ctl graceful<br />
</syntaxhighlight><br />
<br />
'''9.''' Go to the site in your browser to run the Mahara installer:<br />
<syntaxhighlight lang="bash"><br />
http://15stable/<br />
</syntaxhighlight><br />
<br />
'''10.''' Resetting the admin password:<br />
<br />
If you do not know the login info for the copied site's database or the new site uses a different 'passwordsaltmain' from the old one you can reset a users password via the CLI script "reset_password.php", for example if you need to reset the 'admin' user's password you can go:<br />
<br />
sudo -u www-data php htdocs/admin/cli/reset_password.php -u=admin -p=changeme<br />
<br />
This will reset the password and on next login you will be prompted to change the password again to something more robust.<br />
<br />
&nbsp;<br />
<br />
==Elasticsearch==<br />
<br />
If you want to test the Elasticsearch search plugin, you'll also need to set up and run an Elasticsearch server. See [[Developer Area/Setting up Elasticsearch]].<br />
&nbsp;<br />
==ClamAV==<br />
If you want to test the ClamAV virus protection see [[Developer Area/Setting up ClamAV|Setting up ClamAV]]<br />
<br />
&nbsp;<br />
==Set up site for local https://==<br />
<br />
You will need to set up your Mahara developer site with an SSL certificate if you want to use the web services functionality as that is only available over https.<br />
<br />
You should already have Apache 2 installed on your computer. Otherwise, Mahara wouldn't run. Install the openssl and ssl-cert packages:<br />
<br />
<syntaxhighlight lang="bash"><br />
$ sudo apt-get install openssl ssl-cert<br />
</syntaxhighlight><br />
<br />
'''1.''' Enable SSL in Apache 2:<br />
<syntaxhighlight lang="bash"><br />
$ cd /etc/apache2/mods-enabled/<br />
$ ls<br />
$ sudo a2enmod ssl<br />
$ service apache2 restart<br />
$ ls<br />
</syntaxhighlight><br />
<br />
You should see "ssl.conf" and "ssl.load"<br />
<br />
'''2.''' You'll need to check that the port for SSL traffic is configured.<br />
<syntaxhighlight lang="bash"><br />
$ cd ..<br />
$ cat ports.conf<br />
</syntaxhighlight><br />
<br />
If you see '''<IfModule ssl_module> Listen 443''', you are good to go.<br />
<br />
'''3.''' Enable SSL also in your Mahara Apache 2 config file.<br />
<syntaxhighlight lang="bash"><br />
$ vim sites-available/mahara.conf (or the name of your config file of the site for which you want to enable SSL)<br />
</syntaxhighlight><br />
<br />
Paste the following into the .conf file after the </VirtualHost> for port 80. The last re-write rules are only necessary if you use the "Clean URL" functionality.<br />
<syntaxhighlight lang="apache"><br />
<IfModule mod_ssl.c><br />
<VirtualHost *:443><br />
ServerName mahara<br />
<br />
DocumentRoot /home/'''<your username>'''/code/mahara/htdocs<br />
<Directory /home/'''<your username>'''/code><br />
Options Indexes FollowSymLinks MultiViews<br />
AllowOverride None<br />
Require all granted<br />
</Directory><br />
<br />
ErrorLog /var/log/apache2/mahara-ssl-error.log<br />
LogLevel info<br />
<br />
CustomLog /var/log/apache2/mahara-ssl-access.log combined<br />
<br />
# SSL Engine Switch:<br />
# Enable/Disable SSL for this virtual host.<br />
SSLEngine on<br />
<br />
# A self-signed (snakeoil) certificate can be created by installing<br />
# the ssl-cert package. See<br />
# /usr/share/doc/apache2.2-common/README.Debian.gz for more info.<br />
# If both key and certificate are stored in the same file, only the<br />
# SSLCertificateFile directive is needed.<br />
SSLCertificateFile /etc/apache2/ssl/apache.pem<br />
SSLCertificateKeyFile /etc/apache2/ssl/apache.key<br />
<br />
# Server Certificate Chain:<br />
# Point SSLCertificateChainFile at a file containing the<br />
# concatenation of PEM encoded CA certificates which form the<br />
# certificate chain for the server certificate. Alternatively<br />
# the referenced file can be the same as SSLCertificateFile<br />
# when the CA certificates are directly appended to the server<br />
# certificate for convinience.<br />
#SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt<br />
<br />
# Certificate Authority (CA):<br />
# Set the CA certificate verification path where to find CA<br />
# certificates for client authentication or alternatively one<br />
# huge file containing all of them (file must be PEM encoded)<br />
# Note: Inside SSLCACertificatePath you need hash symlinks<br />
# to point to the certificate files. Use the provided<br />
# Makefile to update the hash symlinks after changes.<br />
#SSLCACertificatePath /etc/ssl/certs/<br />
#SSLCACertificateFile /etc/apache2/ssl.crt/ca-bundle.crt<br />
# Certificate Revocation Lists (CRL):<br />
# Set the CA revocation path where to find CA CRLs for client<br />
# authentication or alternatively one huge file containing all<br />
# of them (file must be PEM encoded)<br />
# Note: Inside SSLCARevocationPath you need hash symlinks<br />
# to point to the certificate files. Use the provided<br />
# Makefile to update the hash symlinks after changes.<br />
#SSLCARevocationPath /etc/apache2/ssl.crl/<br />
#SSLCARevocationFile /etc/apache2/ssl.crl/ca-bundle.crl<br />
<br />
# Client Authentication (Type):<br />
# Client certificate verification type and depth. Types are<br />
# none, optional, require and optional_no_ca. Depth is a<br />
# number which specifies how deeply to verify the certificate<br />
# issuer chain before deciding the certificate is not valid.<br />
#SSLVerifyClient require<br />
#SSLVerifyDepth 10<br />
<br />
# Access Control:<br />
# With SSLRequire you can do per-directory access control based<br />
# on arbitrary complex boolean expressions containing server<br />
# variable checks and other lookup directives. The syntax is a<br />
# mixture between C and Perl. See the mod_ssl documentation<br />
# for more details.<br />
#<Location /><br />
#SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \<br />
# and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \<br />
# and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \<br />
# and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \<br />
# and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20 ) \<br />
# or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/<br />
#</Location><br />
<br />
# SSL Engine Options:<br />
# Set various options for the SSL engine.<br />
# o FakeBasicAuth:<br />
# Translate the client X.509 into a Basic Authorisation. This means that<br />
# the standard Auth/DBMAuth methods can be used for access control. The<br />
# user name is the `one line' version of the client's X.509 certificate.<br />
# Note that no password is obtained from the user. Every entry in the user<br />
# file needs this password: `xxj31ZMTZzkVA'.<br />
# o ExportCertData:<br />
# This exports two additional environment variables: SSL_CLIENT_CERT and<br />
# SSL_SERVER_CERT. These contain the PEM-encoded certificates of the<br />
# server (always existing) and the client (only existing when client<br />
# authentication is used). This can be used to import the certificates<br />
# into CGI scripts.<br />
# o StdEnvVars:<br />
# This exports the standard SSL/TLS related `SSL_*' environment variables.<br />
# Per default this exportation is switched off for performance reasons,<br />
# because the extraction step is an expensive operation and is usually<br />
# useless for serving static content. So one usually enables the<br />
# exportation for CGI and SSI requests only.<br />
# o StrictRequire:<br />
# This denies access when "SSLRequireSSL" or "SSLRequire" applied even<br />
# under a "Satisfy any" situation, i.e. when it applies access is denied<br />
# and no other module can change it.<br />
# o OptRenegotiate:<br />
# This enables optimized SSL connection renegotiation handling when SSL<br />
# directives are used in per-directory context.<br />
#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire<br />
<FilesMatch "\.(cgi|shtml|phtml|php)$"><br />
SSLOptions +StdEnvVars<br />
</FilesMatch><br />
<br />
# SSL Protocol Adjustments:<br />
# The safe and default but still SSL/TLS standard compliant shutdown<br />
# approach is that mod_ssl sends the close notify alert but doesn't wait for<br />
# the close notify alert from client. When you need a different shutdown<br />
# approach you can use one of the following variables:<br />
# o ssl-unclean-shutdown:<br />
# This forces an unclean shutdown when the connection is closed, i.e. no<br />
# SSL close notify alert is send or allowed to received. This violates<br />
# the SSL/TLS standard but is needed for some brain-dead browsers. Use<br />
# this when you receive I/O errors because of the standard approach where<br />
# mod_ssl sends the close notify alert.<br />
# o ssl-accurate-shutdown:<br />
# This forces an accurate shutdown when the connection is closed, i.e. a<br />
# SSL close notify alert is send and mod_ssl waits for the close notify<br />
# alert of the client. This is 100% SSL/TLS standard compliant, but in<br />
# practice often causes hanging connections with brain-dead browsers. Use<br />
# this only for browsers where you know that their SSL implementation<br />
# works correctly.<br />
# Notice: Most problems of broken clients are also related to the HTTP<br />
# keep-alive facility, so you usually additionally want to disable<br />
# keep-alive for those clients, too. Use variable "nokeepalive" for this.<br />
# Similarly, one has to force some clients to use HTTP/1.0 to workaround<br />
# their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and<br />
# "force-response-1.0" for this.<br />
BrowserMatch "MSIE [2-6]" \<br />
nokeepalive ssl-unclean-shutdown \<br />
downgrade-1.0 force-response-1.0<br />
# MSIE 7 and newer should be able to use keepalive<br />
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown<br />
<br />
<IfModule mod_rewrite.c><br />
RewriteEngine on<br />
RewriteRule ^/user/([a-z0-9-]+)/?$ /user/view.php?profile=$1&%{QUERY_STRING}<br />
RewriteRule ^/user/([a-z0-9-]+)/([a-z0-9-]+)/?$ /view/view.php?profile=$1&page=$2&%{QUERY_STRING}<br />
RewriteRule ^/group/([a-z0-9-]+)/?$ /group/view.php?homepage=$1&%{QUERY_STRING}<br />
RewriteRule ^/group/([a-z0-9-]+)/([a-z0-9-]+)/?$ /view/view.php?homepage=$1&page=$2&%{QUERY_STRING}<br />
</IfModule><br />
</VirtualHost><br />
</IfModule><br />
</syntaxhighlight><br />
<br />
'''4.''' Create the SSL folder in /etc/apache2/ if it doesn't already exist:<br />
<syntaxhighlight lang="bash"><br />
$ sudo mkdir /etc/apache2/ssl<br />
</syntaxhighlight><br />
<br />
'''5.''' Run the following command to set up your local cert and follow the ensuing steps for generating it:<br />
<syntaxhighlight lang="bash"><br />
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.pem<br />
</syntaxhighlight><br />
<br />
When it asks you for the "Common name", you can put your local server's name.<br />
<br />
'''6.''' Restart Apache.<br />
<syntaxhighlight lang="bash"><br />
$ sudo service apache2 restart<br />
</syntaxhighlight><br />
<br />
If you have an error message that pertains to your SSL site, you'll need to fix it first before continuing.<br />
<br />
'''7.''' Test the Apache config:<br />
<syntaxhighlight lang="bash"><br />
$ sudo apache2ctl configtest<br />
</syntaxhighlight><br />
<br />
'''8.''' Delete the old wwwroot as that still points to http://. If you left it, you wouldn't see all assetts.<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres psql mahara-main<br />
delete from config where field = 'wwwroot';<br />
Ctrl + d to exit<br />
</syntaxhighlight><br />
<br />
'''9.''' Go to your Mahara URL and use '''https://'''. Since you created a self-signed cert, your connection will be untrusted. Proceed anyway.<br />
<br />
'''10.''' Now you can use your developer site with web services as well.<br />
<br />
==Set up Behat==<br />
<br />
You can use the automated testing suite from Mahara 15.04 on. There is a [[Testing/Behat_Testing/Setup | separate installation page for Behat]].</div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Developer_Environment&diff=13367Developer Area/Developer Environment2022-09-13T23:49:37Z<p>Robertl: </p>
<hr />
<div>{{:Developer_Area/tabs}} <!-- to add further tabs, update the following page https://wiki.mahara.org/wiki/Developer_Area/tabs ... this will automatically cascade the changes to all relevant pages --><br />
<br />
<div style="float:right">__TOC__</div><br />
<br />
This page explains how to set up a copy of Mahara for development purposes.<br />
<br />
==The Docker version==<br />
<br />
Included in the main codebase is a docker version of Mahara with Behat capabilities. Before you try this, you will need to have Docker installed.<br />
See: https://docs.docker.com/engine/install/ubuntu/<br />
<br />
The instructions for running the docker version are here:<br><br />
https://git.mahara.org/mahara/mahara/-/blob/main/docker/README.md<br />
<br />
Please feel free to update if there are missing instructions that would be helpful to others.<br />
<br />
==The short version==<br />
<br />
Mahara is a fairly standard PHP web application. You mainly need to place it in your web server and give it a database, and a file storage directory. If you haven't set up a PHP web application before, skip to "the long version" down below.<br />
<br />
#Set up your Apache web server. For development purposes, it is often handy to have the web root sitting inside your home directory.<br />
#Retrieve a copy of the Mahara codebase. Place it in your Apache web root.<br />
#Create a Mahara "dataroot" directory '''outside''' of your web root. Make it read/writeable by Apache.<br />
#Create a database instance and database user for Mahara to use.<br />
#Edit the Mahara "config.php" file so that Mahara knows the location of its dataroot directory, and its database login credentials.<br />
#Run the Mahara installer by visiting your Mahara site in your web browser. If you are missing any required PHP modules, Mahara should tell you. Depending on what you already have installed, you may need one or more of these:<br />
#*If you're on '''Ubuntu 16.04''' or later<br />
#*#<syntaxhighlight lang="text" inline="">php-pgsql</syntaxhighlight><br />
#*#<syntaxhighlight lang="text" inline="">php-gd</syntaxhighlight><br />
#*#<syntaxhighlight lang="text" inline="">php-curl</syntaxhighlight><br />
#*#<syntaxhighlight lang="text" inline="">php-intl</syntaxhighlight><br />
#*#<syntaxhighlight lang="text" inline="">php-json</syntaxhighlight><br />
#*#<syntaxhighlight lang="text" inline="">php-zip</syntaxhighlight><br />
#*If you are using Mysql instead of Postgres<br />
#*#<syntaxhighlight lang="text" inline="">php7.4-mysql</syntaxhighlight> or<br />
#*#<syntaxhighlight lang="text" inline="">php-mysql</syntaxhighlight><br />
<br />
==The long version (for Windows)==<br />
<br />
If you want to install your developer environment on Windows, please [[Developer_Area/Developer_Environment_(Windows) | check the Windows instructions]].<br />
<br />
==The long version (for Linux)==<br />
<br />
The instructions explain one way to set up an installation of Mahara for development purposes. These instructions are specifically for Ubuntu Linux, although the process will probably be quite similar in other Linux versions.<br />
<br />
Note: Please have an apache2 installed on your server<br />
<syntaxhighlight lang="bash"><br />
sudo apt install apache2<br />
</syntaxhighlight><br />
<br />
'''The following instructions are for Ubuntu 16.04 and above unless otherwise noted.'''<br />
<br />
'''1.''' Install required packages:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo apt install \<br />
make curl wget xvfb git gitk postgresql php7.4-common php-cli libapache2-mod-php7.4 \<br />
php7.4-curl php7.4-gd php-json php-ldap php-pgsql php-xmlrpc php-zip php-xml php-mbstring \<br />
nodejs node-gyp php7.4-pgsql php7.4-xml php7.4-xmlrpc php7.4-mbstring php7.4-intl libssl-dev npm<br />
</syntaxhighlight><br />
<br />
<small>Note on php versions: At the time of writing (Nov 2020), php 7.4 has a year of active development remaining, and we are expecting the release of php 8.0 sometime soon. Php 7.4 is currently the recommended version to install. Sometimes there is a generic package _and_ a version-specific package to be installed. [PHP supported versions](https://www.php.net/supported-versions.php)</small><br />
<br />
If you see any errors with the install, you may want to try installing in chunks. See the Troubleshooting section<br />
<br />
Set 7.4 as apache2's version of php<br />
<syntaxhighlight lang="bash"><br />
sudo a2enmod php7.4<br />
</syntaxhighlight><br />
<br />
Check which version of Node you are running with <syntaxhighlight lang="bash" inline="">node -v</syntaxhighlight><br />
<br />
If you are running one of the long term service (lts) versions, 8.x or 10.x, that should work with Mahara fine. If you are running a higher version, or Node is not installed, you will need to add a version to run with Mahara.<br />
<br />
'''2.''' Get a copy of the Mahara code from git. We'll put it under your home directory, in a new directory called "code":<br />
See also [[Developer_Area/Getting_Code_from_Git|Getting Code from Git]]<br />
<br />
<syntaxhighlight lang="bash"><br />
cd ~<br />
mkdir code<br />
cd code<br />
git clone https://git.mahara.org/mahara/mahara.git<br />
</syntaxhighlight><br />
<br />
'''Or, if that failed, use:'''<br />
<br />
<syntaxhighlight lang="bash"><br />
$ git clone https://github.com/MaharaProject/mahara.git<br />
</syntaxhighlight><br />
<br />
'''Or, if you have an account on the Mahara gitlab then do the following:'''<br />
<br />
<syntaxhighlight lang="bash"><br />
$ git clone git@git.mahara.org:mahara/mahara.git<br />
</syntaxhighlight><br />
<br />
'''3.''' Give the Apache web server access to your Mahara code directory:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo chmod a+rx ~/code/mahara<br />
</syntaxhighlight><br />
<br />
'''3a.''' To avoid a possible 403 error later, confirm that your code directory permissions are also drwxr-xr-x<br />
<syntaxhighlight lang="bash"><br />
ls -la ~/<br />
</syntaxhighlight><br />
To fix, run:<br />
<syntaxhighlight lang="bash"><br />
sudo chmod a+rx ~/code<br />
</syntaxhighlight><br />
<br />
Your home directory permissions should be drwx--x--x<br />
Check with:<br />
<syntaxhighlight lang="bash"><br />
ls -la /home<br />
</syntaxhighlight><br />
Fix with:<br />
<syntaxhighlight lang="bash"><br />
sudo chmod a+x /home/[name of your home directory]<br />
</syntaxhighlight><br />
<br />
'''4.''' Create a PostgreSQL database user:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo -u postgres createuser -P -D -R -S maharauser<br />
</syntaxhighlight><br />
<br />
You'll be prompted for a password. Enter '''maharapassword''' for the password.<br />
<br />
If Postgres is not available, check its status and if it says that it's inactive, start the service:<br />
<br />
<syntaxhighlight lang="bash"><br />
service postgresql status<br />
sudo service postgresql start<br />
</syntaxhighlight><br />
<br />
Now create a database:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo -u postgres createdb -Omaharauser mahara-main<br />
</syntaxhighlight><br />
<br />
'''5.''' Using a text editor, copy these contents into a file and save it to <syntaxhighlight lang="text" inline="">~/code/mahara/htdocs/config.php</syntaxhighlight>:<br />
<br />
<syntaxhighlight lang="php"><br />
<?php<br />
$cfg = new stdClass();<br />
<br />
$branch = 'main';<br />
<br />
// database connection details<br />
// valid values for dbtype are 'postgres8' and 'mysql5'<br />
$cfg->dbtype = 'postgres';<br />
$cfg->dbhost = 'localhost';<br />
$cfg->dbuser = 'maharauser';<br />
$cfg->dbname = "mahara-$branch";<br />
$cfg->dbpass = 'maharapassword'; <br />
<br />
$cfg->dataroot = "/var/lib/maharadata/$branch";<br />
<br />
$cfg->sendemail = true;<br />
$cfg->sendallemailto = '<your email address>';<br />
<br />
$cfg->productionmode = false;<br />
$cfg->perftofoot = true;<br />
</syntaxhighlight><br />
<br />
Make sure to replace <syntaxhighlight lang="text" inline=""><your email address></syntaxhighlight> with your email address.<br />
<br />
If you're mainly testing, and you don't find the stack traces in these screen messages particularly useful, adding <syntaxhighlight lang="text" inline="">$cfg->log_backtrace_levels = LOG_LEVEL_ENVIRON;</syntaxhighlight> to config.php will display important warning messages on a single line, without stack traces.<br />
<br />
'''6.''' Create a dataroot directory (this is where Mahara stores uploaded files):<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo mkdir /var/lib/maharadata<br />
sudo mkdir /var/lib/maharadata/main<br />
sudo chown www-data:www-data /var/lib/maharadata/main<br />
</syntaxhighlight><br />
<br />
'''7.''' Set up a new local domain name "mahara" for your Mahara site, in /etc/hosts:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo sh -c "echo '127.0.0.1 mahara' >> /etc/hosts"<br />
</syntaxhighlight><br />
<br />
'''8.''' Increase your PHP "post_max_size" setting to 32M in php.ini:<br />
<br />
If you are using '''Ubuntu 16.04''' or later, these files will be under the version of php you are using, e.g. /etc/php/7.4:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo sh -c "echo 'post_max_size = 37M' >> /etc/php/7.4/cli/php.ini"<br />
sudo sh -c "echo 'upload_max_filesize = 32M' >> /etc/php/7.4/cli/php.ini"<br />
sudo sh -c "echo 'post_max_size = 37M' >> /etc/php/7.4/apache2/php.ini"<br />
sudo sh -c "echo 'upload_max_filesize = 32M' >> /etc/php/7.4/apache2/php.ini"<br />
</syntaxhighlight><br />
<br />
Note: The 'post_max_size' is slightly bigger as a POST command also contains some wrapper information. That wrapper is just text strings and relates to how much the form submits. So usually, 1MB should be enough, but to be on the safe side, 5MB would be better, which then also works for larger uploads.<br />
<br />
'''9.''' Create an Apache configuration file to point to your copy of Mahara. You can do this by first copying the following contents into a file called "mahara.conf", saved in your home directory.<br />
See also: [[Developer_Area/Changing_Hostnames|Changing Hostnames]]<br />
<br />
<syntaxhighlight lang="apache"><br />
<VirtualHost *:80><br />
ServerName mahara<br />
DocumentRoot /home/<your username>/code/mahara/htdocs<br />
<br />
<Directory /home/<your username>/code><br />
Options Indexes FollowSymLinks MultiViews<br />
Require all granted<br />
</Directory><br />
<br />
ErrorLog /var/log/apache2/error.log<br />
LogLevel info<br />
<br />
CustomLog /var/log/apache2/access.log combined<br />
DirectoryIndex index.php index.html<br />
</VirtualHost><br />
</syntaxhighlight><br />
<br />
Then copy the file into your Apache sites-enable directory. The name to give the file will also vary depending on what version of Ubuntu you are using.<br />
<br />
<syntaxhighlight lang="text" inline="">sudo cp ~/mahara.conf /etc/apache2/sites-available/mahara.conf</syntaxhighlight><br />
<br />
'''10.''' Enable the site in Apache:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo a2ensite mahara<br />
sudo apache2ctl configtest<br />
sudo apache2ctl graceful<br />
</syntaxhighlight><br />
<br />
'''11.''' Set up cron:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo vim /etc/cron.d/mahara<br />
* * * * * www-data /usr/bin/php /home/<your username>/code/mahara/htdocs/lib/cron.php<br />
</syntaxhighlight><br />
<br />
If you do not wish to get cron emails every minute, use the following instead:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo vim /etc/cron.d/mahara<br />
* * * * * www-data /usr/bin/php /home/<your username>/code/mahara/htdocs/lib/cron.php >/dev/null 2>&1<br />
</syntaxhighlight><br />
<br />
<br />
Save your file.<br />
<br />
'''12.''' Set up npm and gulp<br />
<br />
The main Mahara git repository includes SCSS files that compile into CSS files, instead of including CSS files directly. We compile these using a Gulp (NodeJS) script that's included with the code. This can easily be invoked via our Makefile by doing "make css", but it requires setting up a couple of additional items first.<br />
<br />
First you'll need to run "npm install" from within the Mahara code directory, to get npm to properly set up all the proper caches and such.<br />
<br />
<syntaxhighlight lang="bash"><br />
cd /home/<your username>/code/mahara<br />
npm install<br />
</syntaxhighlight><br />
<br />
Once that's finished, you'll need to install the npm "gulp" package using the "-g" (global) flag, so that "gulp" can be run as a CLI command. This requires using sudo.<br />
<br />
<syntaxhighlight lang="bash"><br />
cd /home/<your username>/code/mahara<br />
sudo npm install -g gulp<br />
</syntaxhighlight><br />
<br />
'''Note that Mahara runs with at least version 10.x of node. This section needs updating'''<br />
Note: In Mahara 18.10 we upgraded dependencies to work with latest node 8.x (LTS), you may need to update node via: <br />
<syntaxhighlight lang="bash"><br />
sudo npm cache clean -f<br />
sudo npm install -g n <br />
sudo n 8.11.3 (latest at patch)<br />
</syntaxhighlight><br />
Then update node-sass bindings:<br />
<syntaxhighlight lang="bash"><br />
sudo npm rebuild node-sass<br />
</syntaxhighlight><br />
<br />
'''13.''' Build the CSS<br />
<br />
Now that this is done, you can build the CSS files. The easiest way to do this is by doing "make css" in the Mahara code directory. This will run the necessary series of instructions written out in the Makefile.<br />
<br />
<syntaxhighlight lang="bash"><br />
cd /home/<your username>/code/mahara<br />
make css<br />
</syntaxhighlight><br />
<br />
If you see a lot of errors, such as depreciation warnings for .css files, try deleting /home/<your username>/code/mahara/package-lock.json and then re-running "nvm install" and "make css", which should resolve the issues.<br />
<br />
If you run 'make css' and see the following "ERROR: Can't find the "nvm" executable ..." try the following:<br />
<br />
Steps (for me) to get nvm working<br />
* Install nvm<br />
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash<br />
<br />
* Make the .nvm.sh<br />
cd ~/.nvm && chmod 755 nvm.sh<br />
<br />
* Set the first nvm version manually to create a default<br />
./nvm.sh && nvm install 12<br />
<br />
'''13a.''' Build the CSS in non-production mode<br />
<br />
Sometimes it gets confusing where the sass info comes from to compile the css files. Too make things easier you can edit the 'Makefile' and change the production mode to false<br />
<br />
production = false<br />
<br />
Then run the "make css" again - this will compile the *.css files in an easier to read format with comments about which sass file contributed to the chuck of css code, eg:<br />
<br />
<syntaxhighlight lang="css"><br />
/* line 27, /home/robertl/code/mahara-devel/mahara/htdocs/theme/raw/sass/layout/_footer.scss */<br />
.admin .footer .footer-inner {<br />
padding: 10px; }<br />
/* line 36, /home/robertl/code/mahara-devel/mahara/htdocs/theme/default/sass/layout/_footer.scss */<br />
.admin .footer .footer-inner {<br />
padding: 20px 10px;<br />
background: none;<br />
border: 0;<br />
border-radius: 0; }<br />
</syntaxhighlight><br />
<br />
'''14.''' Go to the site in your browser.<br />
<br />
http://mahara/<br />
<br />
'''15.''' You should see the Mahara installer page. If you do, congratulations! Your development environment is now set up.<br />
<br />
===Trouble-shooting===<br />
<br />
<br />
====Ubuntu 18.04 & PHP 7.2====<br />
If you are using '''Ubuntu 18.04''' and php 7.2, you may need to use the "php7.2-*" and installing all at once doesn't work for you:<br />
<br />
To help with installing you should install in chunks to help diagnose / fix problems. First do:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get install make curl wget xvfb git gitk postgresql<br />
</syntaxhighlight><br />
<br />
Once that is installed do:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get install php7.2-common php-cli libapache2-mod-php7.2 php7.2-curl php7.2-gd<br />
</syntaxhighlight><br />
<br />
If you get the error "The following packages have unmet dependencies" try downgrading your php7.2-common to a compatible version:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get install php7.2-common=7.2.3-1ubuntu1<br />
</syntaxhighlight><br />
<br />
then run the previous command again<br />
<br />
Once that is installed do:<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get install php-json php-ldap php-pgsql php-xmlrpc php-zip php-xml php-mbstring nodejs node-gyp </syntaxhighlight><br />
<br />
You may also need to install some specific php7.2 versions of these:<br />
<syntaxhighlight lang="bash"><br />
sudo apt install php7.2-pgsql php7.2-xml php7.2-xmlrpc php7.2-mbstring<br />
</syntaxhighlight><br />
<br />
and then:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get install libssl-dev<br />
</syntaxhighlight><br />
<br />
If you get the error "The following packages have unmet dependencies", try downgrading your libssl1.1 to a compatible version:<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get install libssl1.1=1.1.0g-2ubuntu4<br />
</syntaxhighlight><br />
<br />
then run the previous command again.<br />
<br />
<br />
====Enabling apache2's version of PHP====<br />
<br />
When you do:<br />
<syntaxhighlight lang="bash"><br />
sudo a2enmod php7.2<br />
</syntaxhighlight><br />
<br />
And see errors like:<br />
Considering dependency mpm_prefork for php7.2:<br />
Considering conflict mpm_event for mpm_prefork:<br />
ERROR: Module mpm_event is enabled - cannot proceed due to conflicts. It needs to be disabled first!<br />
Considering conflict mpm_worker for mpm_prefork:<br />
ERROR: Could not enable dependency mpm_prefork for php7.2, aborting<br />
<br />
You will need to disable the chasing MPM options:<br />
<syntaxhighlight lang="bash"><br />
sudo a2dismod mpm_prefork<br />
sudo a2dismod mpm_worker<br />
sudo a2dismod mpm_event<br />
</syntaxhighlight><br />
<br />
Then do:<br />
<syntaxhighlight lang="bash"><br />
sudo a2enmod php7.2<br />
</syntaxhighlight><br />
<br />
this way the php7.2 mod should auto enable the correct MPM.<br />
<br />
<br />
====Dataroot & Ubuntu 18.04/PHP 7.2====<br />
<br />
If you are '''upgrading to Ubuntu 18.04/PHP 7.2''' from earlier version you will also need to go into your dataroot directory (path is defined in the config.php file) and delete the 'dwoo' and 'sessions' sub-directories found there. They will be automatically generated again.<br />
<br />
<br />
====Using MySql8====<br />
<br />
If you are going to be using '''MySql 8''' or later, you will need to do the following:<br />
<br />
*To install MySql 8 on Ubuntu 16.04 see https://www.digitalocean.com/community/tutorials/how-to-install-the-latest-mysql-on-ubuntu-16-04<br />
<br />
We need to add a line to our mysql conf file so that we can log in with older format passwords, so edit:<br />
<syntaxhighlight lang="bash"><br />
vi /etc/mysql/mysql.conf.d/mysqld.cnf<br />
</syntaxhighlight><br />
And make sure we have<br />
<syntaxhighlight lang="bash"><br />
[mysqld]<br />
default_authentication_plugin=mysql_native_password<br />
</syntaxhighlight><br />
<br />
You will need to set the db user to use the native password<br />
<br />
CREATE USER 'maharauser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mahara';<br />
<br />
=====MySQL in Docker=====<br />
If you have Docker available you can [[System Administrator's Guide/Installing Mahara/MySQL and Docker|spin it up a dedicated container for it]].<br />
<br />
====Installing Node versions====<br />
<br />
Check which version of Node you are running with<br />
<syntaxhighlight lang="bash"><br />
node -v<br />
</syntaxhighlight><br />
If you are running one of the long term service (lts) versions, 8.x or 10.x, that should work with Mahara fine. If you are running a higher version, or Node is not installed, you will need to add a version to run with Mahara.<br />
<br />
You can find various instructions on how to upgrade NodeJS on your distribution depending on your preference on package manager. (There are a couple of links at the bottom of this section.)<br />
<br />
A straight-forward way to manage multiple versions of Node is to use NVM:<br />
<br />
*[https://github.com/creationix/nvm#install-script/ How to install NVM]<br />
<br />
Once you have it installed run:<br />
<syntaxhighlight lang="bash"><br />
nvm install --lts<br />
nvm use --lts<br />
</syntaxhighlight><br />
This will download the latest lts version of Node and set it to default. Then if you need to switch versions for other projects, you can do so with "nvm use <version>".<br />
<br />
Links to alternative ways of installing Node:<br />
<br />
*[https://nodejs.org/en/download/package-manager/ Installing Node.js via package manager]<br />
*[https://tecadmin.net/install-latest-nodejs-npm-on-ubuntu/ How to Install Latest Nodejs & Npm on Ubuntu 16.04 & 14.04]<br />
<br />
<br />
<br />
ts-php versions - also add set alternatives here<br />
Note on changing versions: you can see which version apache is using by adding phpinfo() in your code.<br />
<br />
==Adding another branch==<br />
<br />
'''1.''' Create a new local branch for it in git (replace '''1.10 / 110''' with the version of Mahara for which you want to add a branch)<br />
<syntaxhighlight lang="bash"><br />
$ cd ~/code/mahara<br />
$ git checkout -t origin/1.10_STABLE<br />
</syntaxhighlight><br />
<br />
'''2.''' Create the sitedata directory for the new branch:<br />
<syntaxhighlight lang="bash"><br />
$ sudo mkdir /var/lib/maharadata/110stable<br />
$ sudo chown www-data:www-data /var/lib/maharadata/110stable<br />
</syntaxhighlight><br />
<br />
'''3.''' Create a database:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres createdb -Omaharauser mahara-110stable<br />
</syntaxhighlight><br />
<br />
'''4.''' Change your ~/code/mahara/htdocs/config.php to point to the 1.10 branch:<br />
<syntaxhighlight lang="php"><br />
$branch = '110stable';<br />
</syntaxhighlight><br />
<br />
'''5.''' Go to the site in your browser to run the Mahara installer:<br />
<br />
http://mahara/<br />
<br />
&nbsp;<br />
<br />
==Switching back to the main branch==<br />
<br />
'''1.''' Change the config.php file:<br />
<syntaxhighlight lang="php"><br />
$branch = 'main';<br />
</syntaxhighlight><br />
<br />
'''2.''' Switch to the right git branch:<br />
<syntaxhighlight lang="bash"><br />
$ cd ~/code/mahara/<br />
$ git checkout main<br />
</syntaxhighlight><br />
<br />
&nbsp;<br />
==Reset the database==<br />
<br />
'''1.''' Delete the old database:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres dropdb mahara-main<br />
</syntaxhighlight><br />
<br />
'''2.''' Create a new one with the same name:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres createdb -Omaharauser mahara-main<br />
</syntaxhighlight><br />
<br />
'''3.''' Go to the site in your browser to run the Mahara installer again:<br />
<br />
http://mahara/<br />
<br />
If you reset the database a lot, you might want to try out the "maharawipe.sh" utility at https://github.com/agwells/mahara-devtools<br />
<br />
==Testing a change submitted to Gerrit==<br />
<br />
'''1.''' Go to the change page, for example:<br />
<syntaxhighlight lang="bash"><br />
https://reviews.mahara.org/#change,230<br />
</syntaxhighlight><br />
<br />
'''2.''' In your local repository, switch to the branch listed in the Gerrit change (in this case: main):<br />
<syntaxhighlight lang="bash"><br />
$ cd ~/code/mahara<br />
$ git checkout main<br />
</syntaxhighlight><br />
<br />
'''3.''' Update your config.php to use the right branch, too.<br />
<br />
'''4.''' Copy the "Anonymous Git" URL in the "Download" section of "Patch Set X" and run it in ~/code/mahara to check the branch out, for example:<br />
<syntaxhighlight lang="bash"><br />
$ git fetch git://reviews.mahara.org/git/mahara refs/changes/30/230/1 && git checkout FETCH_HEAD<br />
$ make css<br />
</syntaxhighlight><br />
<br />
'''5.''' After finishing the testing, go back to main:<br />
<syntaxhighlight lang="bash"><br />
$ git checkout main<br />
$ make css<br />
</syntaxhighlight><br />
<br />
&nbsp;<br />
<br />
==Submitting a change to Gerrit==<br />
<br />
If you want to contribute a patch to the Mahara project yourself, please check out the wiki page on [[Developer_Area/Contributing_Code | contributing code]]. There is also a [[Developer_Area/Contributing_Code/Troubleshooting_your_Gerrit_connection | troubleshooting page]] in case you run into issues pushing code to Gerrit.<br />
<br />
&nbsp;<br />
==Copying a local install to another==<br />
<br />
This example uses the directory 15stable as an example for the new install and the 14stable install as database and sitedata directory to copy.<br />
<br />
'''1.''' Do a checkout of the code into a new directory:<br />
<syntaxhighlight lang="bash"><br />
$ cd ~<br />
$ mkdir code<br />
$ cd code<br />
$ git clone git@git.mahara.org:mahara/mahara.git 15stable<br />
</syntaxhighlight><br />
<br />
'''2.''' Copy the database:<br />
<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres pg_dump -Fc mahara-14stable > 14stable.pg<br />
$ sudo -u postgres createdb -Omaharauser mahara-15stable<br />
$ sudo -u postgres pg_restore -O -j4 -d mahara-15stable -U maharauser -W -h localhost 14stable.pg<br />
</syntaxhighlight><br />
<br />
If you've not given the user 'maharauser' full privileges yet (should only need to do this once)<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON SCHEMA public TO maharauser;'<br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO maharauser;'<br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO maharauser;'<br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO maharauser;'<br />
</syntaxhighlight><br />
<br />
'''3.''' Change the wwwroot in the new database:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres psql mahara-15stable<br />
delete from config where field = 'wwwroot';<br />
Ctrl + d to exit<br />
</syntaxhighlight><br />
<br />
'''4.''' Create the config file ~/code/mahara/htdocs/config.php:<br />
<syntaxhighlight lang="php"><br />
<?php<br />
$cfg = new StdClass;<br />
<br />
$branch = '15stable';<br />
<br />
// database connection details<br />
// valid values for dbtype are 'postgres8' and 'mysql5'<br />
$cfg->dbtype = 'postgres8';<br />
$cfg->dbhost = 'localhost';<br />
$cfg->dbuser = 'maharauser';<br />
$cfg->dbname = "mahara-$branch";<br />
$cfg->dbpass = 'mahara'; <br />
$cfg->dbprefix = '''''''; <br />
<br />
$cfg->dataroot = "/var/lib/maharadata/$branch";<br />
<br />
$cfg->sendemail = true;<br />
$cfg->sendallemailto = 'your email address';<br />
<br />
$cfg->log_dbg_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->log_info_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->log_warn_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->log_environ_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->perftofoot = true;<br />
</syntaxhighlight> <br />
<br />
'''5.''' Copy the source sitedata directory into the new sitedata folder:<br />
<syntaxhighlight lang="bash"><br />
$ sudo cp -r /var/lib/maharadata/14stable/ /var/lib/maharadata/15stable<br />
$ sudo chown -R www-data:www-data /var/lib/maharadata/15stable<br />
</syntaxhighlight><br />
<br />
'''6.''' Add a new entry to /etc/hosts:<br />
<syntaxhighlight lang="bash"><br />
127.0.0.1 15stable<br />
</syntaxhighlight><br />
<br />
'''7.''' Create a new Apache vhost file in /etc/apache2/sites-available/15stable.conf:<br />
<syntaxhighlight lang="apacheconf"><br />
<VirtualHost *:80><br />
ServerName 15stable<br />
DocumentRoot /home/<your username>/code/15stable/htdocs<br />
<br />
<Directory /home/<your username>/code><br />
Options Indexes FollowSymLinks MultiViews<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
<br />
ErrorLog /var/log/apache2/error.log<br />
LogLevel info<br />
<br />
CustomLog /var/log/apache2/access.log combined<br />
DirectoryIndex index.php index.html<br />
</VirtualHost><br />
</syntaxhighlight><br />
<br />
'''8.''' Enable the site in Apache:<br />
<syntaxhighlight lang="bash"><br />
$ sudo a2ensite 15stable<br />
$ sudo apache2ctl configtest<br />
$ sudo apache2ctl graceful<br />
</syntaxhighlight><br />
<br />
'''9.''' Go to the site in your browser to run the Mahara installer:<br />
<syntaxhighlight lang="bash"><br />
http://15stable/<br />
</syntaxhighlight><br />
<br />
'''10.''' Resetting the admin password:<br />
<br />
If you do not know the login info for the copied site's database or the new site uses a different 'passwordsaltmain' from the old one you can reset a users password via the CLI script "reset_password.php", for example if you need to reset the 'admin' user's password you can go:<br />
<br />
sudo -u www-data php htdocs/admin/cli/reset_password.php -u=admin -p=changeme<br />
<br />
This will reset the password and on next login you will be prompted to change the password again to something more robust.<br />
<br />
&nbsp;<br />
<br />
==Elasticsearch==<br />
<br />
If you want to test the Elasticsearch search plugin, you'll also need to set up and run an Elasticsearch server. See [[Developer Area/Setting up Elasticsearch]].<br />
&nbsp;<br />
==ClamAV==<br />
If you want to test the ClamAV virus protection see [[Developer Area/Setting up ClamAV|Setting up ClamAV]]<br />
<br />
&nbsp;<br />
==Set up site for local https://==<br />
<br />
You will need to set up your Mahara developer site with an SSL certificate if you want to use the web services functionality as that is only available over https.<br />
<br />
You should already have Apache 2 installed on your computer. Otherwise, Mahara wouldn't run. Install the openssl and ssl-cert packages:<br />
<br />
<syntaxhighlight lang="bash"><br />
$ sudo apt-get install openssl ssl-cert<br />
</syntaxhighlight><br />
<br />
'''1.''' Enable SSL in Apache 2:<br />
<syntaxhighlight lang="bash"><br />
$ cd /etc/apache2/mods-enabled/<br />
$ ls<br />
$ sudo a2enmod ssl<br />
$ service apache2 restart<br />
$ ls<br />
</syntaxhighlight><br />
<br />
You should see "ssl.conf" and "ssl.load"<br />
<br />
'''2.''' You'll need to check that the port for SSL traffic is configured.<br />
<syntaxhighlight lang="bash"><br />
$ cd ..<br />
$ cat ports.conf<br />
</syntaxhighlight><br />
<br />
If you see '''<IfModule ssl_module> Listen 443''', you are good to go.<br />
<br />
'''3.''' Enable SSL also in your Mahara Apache 2 config file.<br />
<syntaxhighlight lang="bash"><br />
$ vim sites-available/mahara.conf (or the name of your config file of the site for which you want to enable SSL)<br />
</syntaxhighlight><br />
<br />
Paste the following into the .conf file after the </VirtualHost> for port 80. The last re-write rules are only necessary if you use the "Clean URL" functionality.<br />
<syntaxhighlight lang="apache"><br />
<IfModule mod_ssl.c><br />
<VirtualHost *:443><br />
ServerName mahara<br />
<br />
DocumentRoot /home/'''<your username>'''/code/mahara/htdocs<br />
<Directory /home/'''<your username>'''/code><br />
Options Indexes FollowSymLinks MultiViews<br />
AllowOverride None<br />
Require all granted<br />
</Directory><br />
<br />
ErrorLog /var/log/apache2/mahara-ssl-error.log<br />
LogLevel info<br />
<br />
CustomLog /var/log/apache2/mahara-ssl-access.log combined<br />
<br />
# SSL Engine Switch:<br />
# Enable/Disable SSL for this virtual host.<br />
SSLEngine on<br />
<br />
# A self-signed (snakeoil) certificate can be created by installing<br />
# the ssl-cert package. See<br />
# /usr/share/doc/apache2.2-common/README.Debian.gz for more info.<br />
# If both key and certificate are stored in the same file, only the<br />
# SSLCertificateFile directive is needed.<br />
SSLCertificateFile /etc/apache2/ssl/apache.pem<br />
SSLCertificateKeyFile /etc/apache2/ssl/apache.key<br />
<br />
# Server Certificate Chain:<br />
# Point SSLCertificateChainFile at a file containing the<br />
# concatenation of PEM encoded CA certificates which form the<br />
# certificate chain for the server certificate. Alternatively<br />
# the referenced file can be the same as SSLCertificateFile<br />
# when the CA certificates are directly appended to the server<br />
# certificate for convinience.<br />
#SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt<br />
<br />
# Certificate Authority (CA):<br />
# Set the CA certificate verification path where to find CA<br />
# certificates for client authentication or alternatively one<br />
# huge file containing all of them (file must be PEM encoded)<br />
# Note: Inside SSLCACertificatePath you need hash symlinks<br />
# to point to the certificate files. Use the provided<br />
# Makefile to update the hash symlinks after changes.<br />
#SSLCACertificatePath /etc/ssl/certs/<br />
#SSLCACertificateFile /etc/apache2/ssl.crt/ca-bundle.crt<br />
# Certificate Revocation Lists (CRL):<br />
# Set the CA revocation path where to find CA CRLs for client<br />
# authentication or alternatively one huge file containing all<br />
# of them (file must be PEM encoded)<br />
# Note: Inside SSLCARevocationPath you need hash symlinks<br />
# to point to the certificate files. Use the provided<br />
# Makefile to update the hash symlinks after changes.<br />
#SSLCARevocationPath /etc/apache2/ssl.crl/<br />
#SSLCARevocationFile /etc/apache2/ssl.crl/ca-bundle.crl<br />
<br />
# Client Authentication (Type):<br />
# Client certificate verification type and depth. Types are<br />
# none, optional, require and optional_no_ca. Depth is a<br />
# number which specifies how deeply to verify the certificate<br />
# issuer chain before deciding the certificate is not valid.<br />
#SSLVerifyClient require<br />
#SSLVerifyDepth 10<br />
<br />
# Access Control:<br />
# With SSLRequire you can do per-directory access control based<br />
# on arbitrary complex boolean expressions containing server<br />
# variable checks and other lookup directives. The syntax is a<br />
# mixture between C and Perl. See the mod_ssl documentation<br />
# for more details.<br />
#<Location /><br />
#SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \<br />
# and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \<br />
# and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \<br />
# and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \<br />
# and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20 ) \<br />
# or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/<br />
#</Location><br />
<br />
# SSL Engine Options:<br />
# Set various options for the SSL engine.<br />
# o FakeBasicAuth:<br />
# Translate the client X.509 into a Basic Authorisation. This means that<br />
# the standard Auth/DBMAuth methods can be used for access control. The<br />
# user name is the `one line' version of the client's X.509 certificate.<br />
# Note that no password is obtained from the user. Every entry in the user<br />
# file needs this password: `xxj31ZMTZzkVA'.<br />
# o ExportCertData:<br />
# This exports two additional environment variables: SSL_CLIENT_CERT and<br />
# SSL_SERVER_CERT. These contain the PEM-encoded certificates of the<br />
# server (always existing) and the client (only existing when client<br />
# authentication is used). This can be used to import the certificates<br />
# into CGI scripts.<br />
# o StdEnvVars:<br />
# This exports the standard SSL/TLS related `SSL_*' environment variables.<br />
# Per default this exportation is switched off for performance reasons,<br />
# because the extraction step is an expensive operation and is usually<br />
# useless for serving static content. So one usually enables the<br />
# exportation for CGI and SSI requests only.<br />
# o StrictRequire:<br />
# This denies access when "SSLRequireSSL" or "SSLRequire" applied even<br />
# under a "Satisfy any" situation, i.e. when it applies access is denied<br />
# and no other module can change it.<br />
# o OptRenegotiate:<br />
# This enables optimized SSL connection renegotiation handling when SSL<br />
# directives are used in per-directory context.<br />
#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire<br />
<FilesMatch "\.(cgi|shtml|phtml|php)$"><br />
SSLOptions +StdEnvVars<br />
</FilesMatch><br />
<br />
# SSL Protocol Adjustments:<br />
# The safe and default but still SSL/TLS standard compliant shutdown<br />
# approach is that mod_ssl sends the close notify alert but doesn't wait for<br />
# the close notify alert from client. When you need a different shutdown<br />
# approach you can use one of the following variables:<br />
# o ssl-unclean-shutdown:<br />
# This forces an unclean shutdown when the connection is closed, i.e. no<br />
# SSL close notify alert is send or allowed to received. This violates<br />
# the SSL/TLS standard but is needed for some brain-dead browsers. Use<br />
# this when you receive I/O errors because of the standard approach where<br />
# mod_ssl sends the close notify alert.<br />
# o ssl-accurate-shutdown:<br />
# This forces an accurate shutdown when the connection is closed, i.e. a<br />
# SSL close notify alert is send and mod_ssl waits for the close notify<br />
# alert of the client. This is 100% SSL/TLS standard compliant, but in<br />
# practice often causes hanging connections with brain-dead browsers. Use<br />
# this only for browsers where you know that their SSL implementation<br />
# works correctly.<br />
# Notice: Most problems of broken clients are also related to the HTTP<br />
# keep-alive facility, so you usually additionally want to disable<br />
# keep-alive for those clients, too. Use variable "nokeepalive" for this.<br />
# Similarly, one has to force some clients to use HTTP/1.0 to workaround<br />
# their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and<br />
# "force-response-1.0" for this.<br />
BrowserMatch "MSIE [2-6]" \<br />
nokeepalive ssl-unclean-shutdown \<br />
downgrade-1.0 force-response-1.0<br />
# MSIE 7 and newer should be able to use keepalive<br />
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown<br />
<br />
<IfModule mod_rewrite.c><br />
RewriteEngine on<br />
RewriteRule ^/user/([a-z0-9-]+)/?$ /user/view.php?profile=$1&%{QUERY_STRING}<br />
RewriteRule ^/user/([a-z0-9-]+)/([a-z0-9-]+)/?$ /view/view.php?profile=$1&page=$2&%{QUERY_STRING}<br />
RewriteRule ^/group/([a-z0-9-]+)/?$ /group/view.php?homepage=$1&%{QUERY_STRING}<br />
RewriteRule ^/group/([a-z0-9-]+)/([a-z0-9-]+)/?$ /view/view.php?homepage=$1&page=$2&%{QUERY_STRING}<br />
</IfModule><br />
</VirtualHost><br />
</IfModule><br />
</syntaxhighlight><br />
<br />
'''4.''' Create the SSL folder in /etc/apache2/ if it doesn't already exist:<br />
<syntaxhighlight lang="bash"><br />
$ sudo mkdir /etc/apache2/ssl<br />
</syntaxhighlight><br />
<br />
'''5.''' Run the following command to set up your local cert and follow the ensuing steps for generating it:<br />
<syntaxhighlight lang="bash"><br />
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.pem<br />
</syntaxhighlight><br />
<br />
When it asks you for the "Common name", you can put your local server's name.<br />
<br />
'''6.''' Restart Apache.<br />
<syntaxhighlight lang="bash"><br />
$ sudo service apache2 restart<br />
</syntaxhighlight><br />
<br />
If you have an error message that pertains to your SSL site, you'll need to fix it first before continuing.<br />
<br />
'''7.''' Test the Apache config:<br />
<syntaxhighlight lang="bash"><br />
$ sudo apache2ctl configtest<br />
</syntaxhighlight><br />
<br />
'''8.''' Delete the old wwwroot as that still points to http://. If you left it, you wouldn't see all assetts.<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres psql mahara-main<br />
delete from config where field = 'wwwroot';<br />
Ctrl + d to exit<br />
</syntaxhighlight><br />
<br />
'''9.''' Go to your Mahara URL and use '''https://'''. Since you created a self-signed cert, your connection will be untrusted. Proceed anyway.<br />
<br />
'''10.''' Now you can use your developer site with web services as well.<br />
<br />
==Set up Behat==<br />
<br />
You can use the automated testing suite from Mahara 15.04 on. There is a [[Testing/Behat_Testing/Setup | separate installation page for Behat]].</div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Developer_Environment&diff=13352Developer Area/Developer Environment2022-08-17T01:27:05Z<p>Robertl: /* The long version (for Linux) */</p>
<hr />
<div>{{:Developer_Area/tabs}} <!-- to add further tabs, update the following page https://wiki.mahara.org/wiki/Developer_Area/tabs ... this will automatically cascade the changes to all relevant pages --><br />
<br />
<div style="float:right">__TOC__</div><br />
<br />
This page explains how to set up a copy of Mahara for development purposes.<br />
<br />
==The Docker version==<br />
<br />
Included in the main codebase is a docker version of Mahara with Behat capabilities. Before you try this, you will need to have Docker installed.<br />
See: https://docs.docker.com/engine/install/ubuntu/<br />
<br />
The instructions for running the docker version are here:<br><br />
https://git.mahara.org/mahara/mahara/-/blob/main/docker/README.md<br />
<br />
Please feel free to update if there are missing instructions that would be helpful to others.<br />
<br />
==The short version==<br />
<br />
Mahara is a fairly standard PHP web application. You mainly need to place it in your web server and give it a database, and a file storage directory. If you haven't set up a PHP web application before, skip to "the long version" down below.<br />
<br />
#Set up your Apache web server. For development purposes, it is often handy to have the web root sitting inside your home directory.<br />
#Retrieve a copy of the Mahara codebase. Place it in your Apache web root.<br />
#Create a Mahara "dataroot" directory '''outside''' of your web root. Make it read/writeable by Apache.<br />
#Create a database instance and database user for Mahara to use.<br />
#Edit the Mahara "config.php" file so that Mahara knows the location of its dataroot directory, and its database login credentials.<br />
#Run the Mahara installer by visiting your Mahara site in your web browser. If you are missing any required PHP modules, Mahara should tell you. Depending on what you already have installed, you may need one or more of these:<br />
#*If you're on '''Ubuntu 16.04''' or later<br />
#*#<syntaxhighlight lang="text" inline="">php-pgsql</syntaxhighlight><br />
#*#<syntaxhighlight lang="text" inline="">php-gd</syntaxhighlight><br />
#*#<syntaxhighlight lang="text" inline="">php-curl</syntaxhighlight><br />
#*#<syntaxhighlight lang="text" inline="">php-intl</syntaxhighlight><br />
#*#<syntaxhighlight lang="text" inline="">php-json</syntaxhighlight><br />
#*#<syntaxhighlight lang="text" inline="">php-zip</syntaxhighlight><br />
#*If you are using Mysql instead of Postgres<br />
#*#<syntaxhighlight lang="text" inline="">php7.4-mysql</syntaxhighlight> or<br />
#*#<syntaxhighlight lang="text" inline="">php-mysql</syntaxhighlight><br />
<br />
==The long version (for Windows)==<br />
<br />
If you want to install your developer environment on Windows, please [[Developer_Area/Developer_Environment_(Windows) | check the Windows instructions]].<br />
<br />
==The long version (for Linux)==<br />
<br />
The instructions explain one way to set up an installation of Mahara for development purposes. These instructions are specifically for Ubuntu Linux, although the process will probably be quite similar in other Linux versions.<br />
<br />
Note: Please have an apache2 installed on your server<br />
<syntaxhighlight lang="bash"><br />
sudo apt install apache2<br />
</syntaxhighlight><br />
<br />
'''The following instructions are for Ubuntu 16.04 and above unless otherwise noted.'''<br />
<br />
'''1.''' Install required packages:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo apt install \<br />
make curl wget xvfb git gitk postgresql php7.4-common php-cli libapache2-mod-php7.4 \<br />
php7.4-curl php7.4-gd php-json php-ldap php-pgsql php-xmlrpc php-zip php-xml php-mbstring \<br />
nodejs node-gyp php7.4-pgsql php7.4-xml php7.4-xmlrpc php7.4-mbstring php7.4-intl libssl-dev npm<br />
</syntaxhighlight><br />
<br />
<small>Note on php versions: At the time of writing (Nov 2020), php 7.4 has a year of active development remaining, and we are expecting the release of php 8.0 sometime soon. Php 7.4 is currently the recommended version to install. Sometimes there is a generic package _and_ a version-specific package to be installed. [PHP supported versions](https://www.php.net/supported-versions.php)</small><br />
<br />
If you see any errors with the install, you may want to try installing in chunks. See the Troubleshooting section<br />
<br />
Set 7.4 as apache2's version of php<br />
<syntaxhighlight lang="bash"><br />
sudo a2enmod php7.4<br />
</syntaxhighlight><br />
<br />
Check which version of Node you are running with <syntaxhighlight lang="bash" inline="">node -v</syntaxhighlight><br />
<br />
If you are running one of the long term service (lts) versions, 8.x or 10.x, that should work with Mahara fine. If you are running a higher version, or Node is not installed, you will need to add a version to run with Mahara.<br />
<br />
'''2.''' Get a copy of the Mahara code from git. We'll put it under your home directory, in a new directory called "code":<br />
See also [[Developer_Area/Getting_Code_from_Git|Getting Code from Git]]<br />
<br />
<syntaxhighlight lang="bash"><br />
cd ~<br />
mkdir code<br />
cd code<br />
git clone https://git.mahara.org/mahara/mahara.git<br />
</syntaxhighlight><br />
<br />
'''Or, if that failed, use:'''<br />
<br />
<syntaxhighlight lang="bash"><br />
$ git clone https://github.com/MaharaProject/mahara.git<br />
</syntaxhighlight><br />
<br />
'''Or, if you have an account on the Mahara gitlab then do the following:'''<br />
<br />
<syntaxhighlight lang="bash"><br />
$ git clone git@git.mahara.org:mahara/mahara.git<br />
</syntaxhighlight><br />
<br />
'''3.''' Give the Apache web server access to your Mahara code directory:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo chmod a+rx ~/code/mahara<br />
</syntaxhighlight><br />
<br />
'''3a.''' To avoid a possible 403 error later, confirm that your code directory permissions are also drwxr-xr-x<br />
<syntaxhighlight lang="bash"><br />
ls -la ~/<br />
</syntaxhighlight><br />
To fix, run:<br />
<syntaxhighlight lang="bash"><br />
sudo chmod a+rx ~/code<br />
</syntaxhighlight><br />
<br />
Your home directory permissions should be drwx--x--x<br />
Check with:<br />
<syntaxhighlight lang="bash"><br />
ls -la /home<br />
</syntaxhighlight><br />
Fix with:<br />
<syntaxhighlight lang="bash"><br />
sudo chmod a+x /home/[name of your home directory]<br />
</syntaxhighlight><br />
<br />
'''4.''' Create a PostgreSQL database user:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo -u postgres createuser -P -D -R -S maharauser<br />
</syntaxhighlight><br />
<br />
You'll be prompted for a password. Enter '''maharapassword''' for the password.<br />
<br />
If Postgres is not available, check its status and if it says that it's inactive, start the service:<br />
<br />
<syntaxhighlight lang="bash"><br />
service postgresql status<br />
sudo service postgresql start<br />
</syntaxhighlight><br />
<br />
Now create a database:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo -u postgres createdb -Omaharauser mahara-main<br />
</syntaxhighlight><br />
<br />
'''5.''' Using a text editor, copy these contents into a file and save it to <syntaxhighlight lang="text" inline="">~/code/mahara/htdocs/config.php</syntaxhighlight>:<br />
<br />
<syntaxhighlight lang="php"><br />
<?php<br />
$cfg = new stdClass();<br />
<br />
$branch = 'main';<br />
<br />
// database connection details<br />
// valid values for dbtype are 'postgres8' and 'mysql5'<br />
$cfg->dbtype = 'postgres';<br />
$cfg->dbhost = 'localhost';<br />
$cfg->dbuser = 'maharauser';<br />
$cfg->dbname = "mahara-$branch";<br />
$cfg->dbpass = 'maharapassword'; <br />
<br />
$cfg->dataroot = "/var/lib/maharadata/$branch";<br />
<br />
$cfg->sendemail = true;<br />
$cfg->sendallemailto = '<your email address>';<br />
<br />
$cfg->productionmode = false;<br />
$cfg->perftofoot = true;<br />
</syntaxhighlight><br />
<br />
Make sure to replace <syntaxhighlight lang="text" inline=""><your email address></syntaxhighlight> with your email address.<br />
<br />
If you're mainly testing, and you don't find the stack traces in these screen messages particularly useful, adding <syntaxhighlight lang="text" inline="">$cfg->log_backtrace_levels = LOG_LEVEL_ENVIRON;</syntaxhighlight> to config.php will display important warning messages on a single line, without stack traces.<br />
<br />
'''6.''' Create a dataroot directory (this is where Mahara stores uploaded files):<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo mkdir /var/lib/maharadata<br />
sudo mkdir /var/lib/maharadata/main<br />
sudo chown www-data:www-data /var/lib/maharadata/main<br />
</syntaxhighlight><br />
<br />
'''7.''' Set up a new local domain name "mahara" for your Mahara site, in /etc/hosts:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo sh -c "echo '127.0.0.1 mahara' >> /etc/hosts"<br />
</syntaxhighlight><br />
<br />
'''8.''' Increase your PHP "post_max_size" setting to 32M in php.ini:<br />
<br />
If you are using '''Ubuntu 16.04''' or later, these files will be under the version of php you are using, e.g. /etc/php/7.4:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo sh -c "echo 'post_max_size = 37M' >> /etc/php/7.4/cli/php.ini"<br />
sudo sh -c "echo 'upload_max_filesize = 32M' >> /etc/php/7.4/cli/php.ini"<br />
sudo sh -c "echo 'post_max_size = 37M' >> /etc/php/7.4/apache2/php.ini"<br />
sudo sh -c "echo 'upload_max_filesize = 32M' >> /etc/php/7.4/apache2/php.ini"<br />
</syntaxhighlight><br />
<br />
Note: The 'post_max_size' is slightly bigger as a POST command also contains some wrapper information. That wrapper is just text strings and relates to how much the form submits. So usually, 1MB should be enough, but to be on the safe side, 5MB would be better, which then also works for larger uploads.<br />
<br />
'''9.''' Create an Apache configuration file to point to your copy of Mahara. You can do this by first copying the following contents into a file called "mahara.conf", saved in your home directory.<br />
See also: [[Developer_Area/Changing_Hostnames|Changing Hostnames]]<br />
<br />
<syntaxhighlight lang="apache"><br />
<VirtualHost *:80><br />
ServerName mahara<br />
DocumentRoot /home/<your username>/code/mahara/htdocs<br />
<br />
<Directory /home/<your username>/code><br />
Options Indexes FollowSymLinks MultiViews<br />
Require all granted<br />
</Directory><br />
<br />
ErrorLog /var/log/apache2/error.log<br />
LogLevel info<br />
<br />
CustomLog /var/log/apache2/access.log combined<br />
DirectoryIndex index.php index.html<br />
</VirtualHost><br />
</syntaxhighlight><br />
<br />
Then copy the file into your Apache sites-enable directory. The name to give the file will also vary depending on what version of Ubuntu you are using.<br />
<br />
<syntaxhighlight lang="text" inline="">sudo cp ~/mahara.conf /etc/apache2/sites-available/mahara.conf</syntaxhighlight><br />
<br />
'''10.''' Enable the site in Apache:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo a2ensite mahara<br />
sudo apache2ctl configtest<br />
sudo apache2ctl graceful<br />
</syntaxhighlight><br />
<br />
'''11.''' Set up cron:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo vim /etc/cron.d/mahara<br />
* * * * * www-data /usr/bin/php /home/<your username>/code/mahara/htdocs/lib/cron.php<br />
</syntaxhighlight><br />
<br />
If you do not wish to get cron emails every minute, use the following instead:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo vim /etc/cron.d/mahara<br />
* * * * * www-data /usr/bin/php /home/<your username>/code/mahara/htdocs/lib/cron.php >/dev/null 2>&1<br />
</syntaxhighlight><br />
<br />
<br />
Save your file.<br />
<br />
'''12.''' Set up npm and gulp<br />
<br />
The main Mahara git repository includes SCSS files that compile into CSS files, instead of including CSS files directly. We compile these using a Gulp (NodeJS) script that's included with the code. This can easily be invoked via our Makefile by doing "make css", but it requires setting up a couple of additional items first.<br />
<br />
First you'll need to run "npm install" from within the Mahara code directory, to get npm to properly set up all the proper caches and such.<br />
<br />
<syntaxhighlight lang="bash"><br />
cd /home/<your username>/code/mahara<br />
npm install<br />
</syntaxhighlight><br />
<br />
Once that's finished, you'll need to install the npm "gulp" package using the "-g" (global) flag, so that "gulp" can be run as a CLI command. This requires using sudo.<br />
<br />
<syntaxhighlight lang="bash"><br />
cd /home/<your username>/code/mahara<br />
sudo npm install -g gulp<br />
</syntaxhighlight><br />
<br />
'''Note that Mahara runs with at least version 10.x of node. This section needs updating'''<br />
Note: In Mahara 18.10 we upgraded dependencies to work with latest node 8.x (LTS), you may need to update node via: <br />
<syntaxhighlight lang="bash"><br />
sudo npm cache clean -f<br />
sudo npm install -g n <br />
sudo n 8.11.3 (latest at patch)<br />
</syntaxhighlight><br />
Then update node-sass bindings:<br />
<syntaxhighlight lang="bash"><br />
sudo npm rebuild node-sass<br />
</syntaxhighlight><br />
<br />
'''13.''' Build the CSS<br />
<br />
Now that this is done, you can build the CSS files. The easiest way to do this is by doing "make css" in the Mahara code directory. This will run the necessary series of instructions written out in the Makefile.<br />
<br />
<syntaxhighlight lang="bash"><br />
cd /home/<your username>/code/mahara<br />
make css<br />
</syntaxhighlight><br />
<br />
If you see a lot of errors, such as depreciation warnings for .css files, try deleting /home/<your username>/code/mahara/package-lock.json and then re-running "nvm install" and "make css", which should resolve the issues.<br />
<br />
'''13a.''' Build the CSS in non-production mode<br />
<br />
Sometimes it gets confusing where the sass info comes from to compile the css files. Too make things easier you can edit the 'Makefile' and change the production mode to false<br />
<br />
production = false<br />
<br />
Then run the "make css" again - this will compile the *.css files in an easier to read format with comments about which sass file contributed to the chuck of css code, eg:<br />
<br />
<syntaxhighlight lang="css"><br />
/* line 27, /home/robertl/code/mahara-devel/mahara/htdocs/theme/raw/sass/layout/_footer.scss */<br />
.admin .footer .footer-inner {<br />
padding: 10px; }<br />
/* line 36, /home/robertl/code/mahara-devel/mahara/htdocs/theme/default/sass/layout/_footer.scss */<br />
.admin .footer .footer-inner {<br />
padding: 20px 10px;<br />
background: none;<br />
border: 0;<br />
border-radius: 0; }<br />
</syntaxhighlight><br />
<br />
'''14.''' Go to the site in your browser.<br />
<br />
http://mahara/<br />
<br />
'''15.''' You should see the Mahara installer page. If you do, congratulations! Your development environment is now set up.<br />
<br />
===Trouble-shooting===<br />
<br />
<br />
====Ubuntu 18.04 & PHP 7.2====<br />
If you are using '''Ubuntu 18.04''' and php 7.2, you may need to use the "php7.2-*" and installing all at once doesn't work for you:<br />
<br />
To help with installing you should install in chunks to help diagnose / fix problems. First do:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get install make curl wget xvfb git gitk postgresql<br />
</syntaxhighlight><br />
<br />
Once that is installed do:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get install php7.2-common php-cli libapache2-mod-php7.2 php7.2-curl php7.2-gd<br />
</syntaxhighlight><br />
<br />
If you get the error "The following packages have unmet dependencies" try downgrading your php7.2-common to a compatible version:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get install php7.2-common=7.2.3-1ubuntu1<br />
</syntaxhighlight><br />
<br />
then run the previous command again<br />
<br />
Once that is installed do:<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get install php-json php-ldap php-pgsql php-xmlrpc php-zip php-xml php-mbstring nodejs node-gyp </syntaxhighlight><br />
<br />
You may also need to install some specific php7.2 versions of these:<br />
<syntaxhighlight lang="bash"><br />
sudo apt install php7.2-pgsql php7.2-xml php7.2-xmlrpc php7.2-mbstring<br />
</syntaxhighlight><br />
<br />
and then:<br />
<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get install libssl-dev<br />
</syntaxhighlight><br />
<br />
If you get the error "The following packages have unmet dependencies", try downgrading your libssl1.1 to a compatible version:<br />
<syntaxhighlight lang="bash"><br />
sudo apt-get install libssl1.1=1.1.0g-2ubuntu4<br />
</syntaxhighlight><br />
<br />
then run the previous command again.<br />
<br />
<br />
====Enabling apache2's version of PHP====<br />
<br />
When you do:<br />
<syntaxhighlight lang="bash"><br />
sudo a2enmod php7.2<br />
</syntaxhighlight><br />
<br />
And see errors like:<br />
Considering dependency mpm_prefork for php7.2:<br />
Considering conflict mpm_event for mpm_prefork:<br />
ERROR: Module mpm_event is enabled - cannot proceed due to conflicts. It needs to be disabled first!<br />
Considering conflict mpm_worker for mpm_prefork:<br />
ERROR: Could not enable dependency mpm_prefork for php7.2, aborting<br />
<br />
You will need to disable the chasing MPM options:<br />
<syntaxhighlight lang="bash"><br />
sudo a2dismod mpm_prefork<br />
sudo a2dismod mpm_worker<br />
sudo a2dismod mpm_event<br />
</syntaxhighlight><br />
<br />
Then do:<br />
<syntaxhighlight lang="bash"><br />
sudo a2enmod php7.2<br />
</syntaxhighlight><br />
<br />
this way the php7.2 mod should auto enable the correct MPM.<br />
<br />
<br />
====Dataroot & Ubuntu 18.04/PHP 7.2====<br />
<br />
If you are '''upgrading to Ubuntu 18.04/PHP 7.2''' from earlier version you will also need to go into your dataroot directory (path is defined in the config.php file) and delete the 'dwoo' and 'sessions' sub-directories found there. They will be automatically generated again.<br />
<br />
<br />
====Using MySql8====<br />
<br />
If you are going to be using '''MySql 8''' or later, you will need to do the following:<br />
<br />
*To install MySql 8 on Ubuntu 16.04 see https://www.digitalocean.com/community/tutorials/how-to-install-the-latest-mysql-on-ubuntu-16-04<br />
<br />
We need to add a line to our mysql conf file so that we can log in with older format passwords, so edit:<br />
<syntaxhighlight lang="bash"><br />
vi /etc/mysql/mysql.conf.d/mysqld.cnf<br />
</syntaxhighlight><br />
And make sure we have<br />
<syntaxhighlight lang="bash"><br />
[mysqld]<br />
default_authentication_plugin=mysql_native_password<br />
</syntaxhighlight><br />
<br />
You will need to set the db user to use the native password<br />
<br />
CREATE USER 'maharauser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mahara';<br />
<br />
=====MySQL in Docker=====<br />
If you have Docker available you can [[System Administrator's Guide/Installing Mahara/MySQL and Docker|spin it up a dedicated container for it]].<br />
<br />
====Installing Node versions====<br />
<br />
Check which version of Node you are running with<br />
<syntaxhighlight lang="bash"><br />
node -v<br />
</syntaxhighlight><br />
If you are running one of the long term service (lts) versions, 8.x or 10.x, that should work with Mahara fine. If you are running a higher version, or Node is not installed, you will need to add a version to run with Mahara.<br />
<br />
You can find various instructions on how to upgrade NodeJS on your distribution depending on your preference on package manager. (There are a couple of links at the bottom of this section.)<br />
<br />
A straight-forward way to manage multiple versions of Node is to use NVM:<br />
<br />
*[https://github.com/creationix/nvm#install-script/ How to install NVM]<br />
<br />
Once you have it installed run:<br />
<syntaxhighlight lang="bash"><br />
nvm install --lts<br />
nvm use --lts<br />
</syntaxhighlight><br />
This will download the latest lts version of Node and set it to default. Then if you need to switch versions for other projects, you can do so with "nvm use <version>".<br />
<br />
Links to alternative ways of installing Node:<br />
<br />
*[https://nodejs.org/en/download/package-manager/ Installing Node.js via package manager]<br />
*[https://tecadmin.net/install-latest-nodejs-npm-on-ubuntu/ How to Install Latest Nodejs & Npm on Ubuntu 16.04 & 14.04]<br />
<br />
<br />
<br />
ts-php versions - also add set alternatives here<br />
Note on changing versions: you can see which version apache is using by adding phpinfo() in your code.<br />
<br />
==Adding another branch==<br />
<br />
'''1.''' Create a new local branch for it in git (replace '''1.10 / 110''' with the version of Mahara for which you want to add a branch)<br />
<syntaxhighlight lang="bash"><br />
$ cd ~/code/mahara<br />
$ git checkout -t origin/1.10_STABLE<br />
</syntaxhighlight><br />
<br />
'''2.''' Create the sitedata directory for the new branch:<br />
<syntaxhighlight lang="bash"><br />
$ sudo mkdir /var/lib/maharadata/110stable<br />
$ sudo chown www-data:www-data /var/lib/maharadata/110stable<br />
</syntaxhighlight><br />
<br />
'''3.''' Create a database:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres createdb -Omaharauser mahara-110stable<br />
</syntaxhighlight><br />
<br />
'''4.''' Change your ~/code/mahara/htdocs/config.php to point to the 1.10 branch:<br />
<syntaxhighlight lang="php"><br />
$branch = '110stable';<br />
</syntaxhighlight><br />
<br />
'''5.''' Go to the site in your browser to run the Mahara installer:<br />
<br />
http://mahara/<br />
<br />
&nbsp;<br />
<br />
==Switching back to the main branch==<br />
<br />
'''1.''' Change the config.php file:<br />
<syntaxhighlight lang="php"><br />
$branch = 'main';<br />
</syntaxhighlight><br />
<br />
'''2.''' Switch to the right git branch:<br />
<syntaxhighlight lang="bash"><br />
$ cd ~/code/mahara/<br />
$ git checkout main<br />
</syntaxhighlight><br />
<br />
&nbsp;<br />
==Reset the database==<br />
<br />
'''1.''' Delete the old database:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres dropdb mahara-main<br />
</syntaxhighlight><br />
<br />
'''2.''' Create a new one with the same name:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres createdb -Omaharauser mahara-main<br />
</syntaxhighlight><br />
<br />
'''3.''' Go to the site in your browser to run the Mahara installer again:<br />
<br />
http://mahara/<br />
<br />
If you reset the database a lot, you might want to try out the "maharawipe.sh" utility at https://github.com/agwells/mahara-devtools<br />
<br />
==Testing a change submitted to Gerrit==<br />
<br />
'''1.''' Go to the change page, for example:<br />
<syntaxhighlight lang="bash"><br />
https://reviews.mahara.org/#change,230<br />
</syntaxhighlight><br />
<br />
'''2.''' In your local repository, switch to the branch listed in the Gerrit change (in this case: main):<br />
<syntaxhighlight lang="bash"><br />
$ cd ~/code/mahara<br />
$ git checkout main<br />
</syntaxhighlight><br />
<br />
'''3.''' Update your config.php to use the right branch, too.<br />
<br />
'''4.''' Copy the "Anonymous Git" URL in the "Download" section of "Patch Set X" and run it in ~/code/mahara to check the branch out, for example:<br />
<syntaxhighlight lang="bash"><br />
$ git fetch git://reviews.mahara.org/git/mahara refs/changes/30/230/1 && git checkout FETCH_HEAD<br />
$ make css<br />
</syntaxhighlight><br />
<br />
'''5.''' After finishing the testing, go back to main:<br />
<syntaxhighlight lang="bash"><br />
$ git checkout main<br />
$ make css<br />
</syntaxhighlight><br />
<br />
&nbsp;<br />
<br />
==Submitting a change to Gerrit==<br />
<br />
If you want to contribute a patch to the Mahara project yourself, please check out the wiki page on [[Developer_Area/Contributing_Code | contributing code]]. There is also a [[Developer_Area/Contributing_Code/Troubleshooting_your_Gerrit_connection | troubleshooting page]] in case you run into issues pushing code to Gerrit.<br />
<br />
&nbsp;<br />
==Copying a local install to another==<br />
<br />
This example uses the directory 15stable as an example for the new install and the 14stable install as database and sitedata directory to copy.<br />
<br />
'''1.''' Do a checkout of the code into a new directory:<br />
<syntaxhighlight lang="bash"><br />
$ cd ~<br />
$ mkdir code<br />
$ cd code<br />
$ git clone git@git.mahara.org:mahara/mahara.git 15stable<br />
</syntaxhighlight><br />
<br />
'''2.''' Copy the database:<br />
<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres pg_dump -Fc mahara-14stable > 14stable.pg<br />
$ sudo -u postgres createdb -Omaharauser mahara-15stable<br />
$ sudo -u postgres pg_restore -O -j4 -d mahara-15stable -U maharauser -W -h localhost 14stable.pg<br />
</syntaxhighlight><br />
<br />
If you've not given the user 'maharauser' full privileges yet (should only need to do this once)<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON SCHEMA public TO maharauser;'<br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO maharauser;'<br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO maharauser;'<br />
$ sudo -u postgres psql -d mahara-15stable -c 'GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO maharauser;'<br />
</syntaxhighlight><br />
<br />
'''3.''' Change the wwwroot in the new database:<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres psql mahara-15stable<br />
delete from config where field = 'wwwroot';<br />
Ctrl + d to exit<br />
</syntaxhighlight><br />
<br />
'''4.''' Create the config file ~/code/mahara/htdocs/config.php:<br />
<syntaxhighlight lang="php"><br />
<?php<br />
$cfg = new StdClass;<br />
<br />
$branch = '15stable';<br />
<br />
// database connection details<br />
// valid values for dbtype are 'postgres8' and 'mysql5'<br />
$cfg->dbtype = 'postgres8';<br />
$cfg->dbhost = 'localhost';<br />
$cfg->dbuser = 'maharauser';<br />
$cfg->dbname = "mahara-$branch";<br />
$cfg->dbpass = 'mahara'; <br />
$cfg->dbprefix = '''''''; <br />
<br />
$cfg->dataroot = "/var/lib/maharadata/$branch";<br />
<br />
$cfg->sendemail = true;<br />
$cfg->sendallemailto = 'your email address';<br />
<br />
$cfg->log_dbg_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->log_info_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->log_warn_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->log_environ_targets = LOG_TARGET_SCREEN | LOG_TARGET_ERRORLOG;<br />
$cfg->perftofoot = true;<br />
</syntaxhighlight> <br />
<br />
'''5.''' Copy the source sitedata directory into the new sitedata folder:<br />
<syntaxhighlight lang="bash"><br />
$ sudo cp -r /var/lib/maharadata/14stable/ /var/lib/maharadata/15stable<br />
$ sudo chown -R www-data:www-data /var/lib/maharadata/15stable<br />
</syntaxhighlight><br />
<br />
'''6.''' Add a new entry to /etc/hosts:<br />
<syntaxhighlight lang="bash"><br />
127.0.0.1 15stable<br />
</syntaxhighlight><br />
<br />
'''7.''' Create a new Apache vhost file in /etc/apache2/sites-available/15stable.conf:<br />
<syntaxhighlight lang="apacheconf"><br />
<VirtualHost *:80><br />
ServerName 15stable<br />
DocumentRoot /home/<your username>/code/15stable/htdocs<br />
<br />
<Directory /home/<your username>/code><br />
Options Indexes FollowSymLinks MultiViews<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
<br />
ErrorLog /var/log/apache2/error.log<br />
LogLevel info<br />
<br />
CustomLog /var/log/apache2/access.log combined<br />
DirectoryIndex index.php index.html<br />
</VirtualHost><br />
</syntaxhighlight><br />
<br />
'''8.''' Enable the site in Apache:<br />
<syntaxhighlight lang="bash"><br />
$ sudo a2ensite 15stable<br />
$ sudo apache2ctl configtest<br />
$ sudo apache2ctl graceful<br />
</syntaxhighlight><br />
<br />
'''9.''' Go to the site in your browser to run the Mahara installer:<br />
<syntaxhighlight lang="bash"><br />
http://15stable/<br />
</syntaxhighlight><br />
<br />
'''10.''' Resetting the admin password:<br />
<br />
If you do not know the login info for the copied site's database or the new site uses a different 'passwordsaltmain' from the old one you can reset a users password via the CLI script "reset_password.php", for example if you need to reset the 'admin' user's password you can go:<br />
<br />
sudo -u www-data php htdocs/admin/cli/reset_password.php -u=admin -p=changeme<br />
<br />
This will reset the password and on next login you will be prompted to change the password again to something more robust.<br />
<br />
&nbsp;<br />
<br />
==Elasticsearch==<br />
<br />
If you want to test the Elasticsearch search plugin, you'll also need to set up and run an Elasticsearch server. See [[Developer Area/Setting up Elasticsearch]].<br />
&nbsp;<br />
==ClamAV==<br />
If you want to test the ClamAV virus protection see [[Developer Area/Setting up ClamAV|Setting up ClamAV]]<br />
<br />
&nbsp;<br />
==Set up site for local https://==<br />
<br />
You will need to set up your Mahara developer site with an SSL certificate if you want to use the web services functionality as that is only available over https.<br />
<br />
You should already have Apache 2 installed on your computer. Otherwise, Mahara wouldn't run. Install the openssl and ssl-cert packages:<br />
<br />
<syntaxhighlight lang="bash"><br />
$ sudo apt-get install openssl ssl-cert<br />
</syntaxhighlight><br />
<br />
'''1.''' Enable SSL in Apache 2:<br />
<syntaxhighlight lang="bash"><br />
$ cd /etc/apache2/mods-enabled/<br />
$ ls<br />
$ sudo a2enmod ssl<br />
$ service apache2 restart<br />
$ ls<br />
</syntaxhighlight><br />
<br />
You should see "ssl.conf" and "ssl.load"<br />
<br />
'''2.''' You'll need to check that the port for SSL traffic is configured.<br />
<syntaxhighlight lang="bash"><br />
$ cd ..<br />
$ cat ports.conf<br />
</syntaxhighlight><br />
<br />
If you see '''<IfModule ssl_module> Listen 443''', you are good to go.<br />
<br />
'''3.''' Enable SSL also in your Mahara Apache 2 config file.<br />
<syntaxhighlight lang="bash"><br />
$ vim sites-available/mahara.conf (or the name of your config file of the site for which you want to enable SSL)<br />
</syntaxhighlight><br />
<br />
Paste the following into the .conf file after the </VirtualHost> for port 80. The last re-write rules are only necessary if you use the "Clean URL" functionality.<br />
<syntaxhighlight lang="apache"><br />
<IfModule mod_ssl.c><br />
<VirtualHost *:443><br />
ServerName mahara<br />
<br />
DocumentRoot /home/'''<your username>'''/code/mahara/htdocs<br />
<Directory /home/'''<your username>'''/code><br />
Options Indexes FollowSymLinks MultiViews<br />
AllowOverride None<br />
Require all granted<br />
</Directory><br />
<br />
ErrorLog /var/log/apache2/mahara-ssl-error.log<br />
LogLevel info<br />
<br />
CustomLog /var/log/apache2/mahara-ssl-access.log combined<br />
<br />
# SSL Engine Switch:<br />
# Enable/Disable SSL for this virtual host.<br />
SSLEngine on<br />
<br />
# A self-signed (snakeoil) certificate can be created by installing<br />
# the ssl-cert package. See<br />
# /usr/share/doc/apache2.2-common/README.Debian.gz for more info.<br />
# If both key and certificate are stored in the same file, only the<br />
# SSLCertificateFile directive is needed.<br />
SSLCertificateFile /etc/apache2/ssl/apache.pem<br />
SSLCertificateKeyFile /etc/apache2/ssl/apache.key<br />
<br />
# Server Certificate Chain:<br />
# Point SSLCertificateChainFile at a file containing the<br />
# concatenation of PEM encoded CA certificates which form the<br />
# certificate chain for the server certificate. Alternatively<br />
# the referenced file can be the same as SSLCertificateFile<br />
# when the CA certificates are directly appended to the server<br />
# certificate for convinience.<br />
#SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt<br />
<br />
# Certificate Authority (CA):<br />
# Set the CA certificate verification path where to find CA<br />
# certificates for client authentication or alternatively one<br />
# huge file containing all of them (file must be PEM encoded)<br />
# Note: Inside SSLCACertificatePath you need hash symlinks<br />
# to point to the certificate files. Use the provided<br />
# Makefile to update the hash symlinks after changes.<br />
#SSLCACertificatePath /etc/ssl/certs/<br />
#SSLCACertificateFile /etc/apache2/ssl.crt/ca-bundle.crt<br />
# Certificate Revocation Lists (CRL):<br />
# Set the CA revocation path where to find CA CRLs for client<br />
# authentication or alternatively one huge file containing all<br />
# of them (file must be PEM encoded)<br />
# Note: Inside SSLCARevocationPath you need hash symlinks<br />
# to point to the certificate files. Use the provided<br />
# Makefile to update the hash symlinks after changes.<br />
#SSLCARevocationPath /etc/apache2/ssl.crl/<br />
#SSLCARevocationFile /etc/apache2/ssl.crl/ca-bundle.crl<br />
<br />
# Client Authentication (Type):<br />
# Client certificate verification type and depth. Types are<br />
# none, optional, require and optional_no_ca. Depth is a<br />
# number which specifies how deeply to verify the certificate<br />
# issuer chain before deciding the certificate is not valid.<br />
#SSLVerifyClient require<br />
#SSLVerifyDepth 10<br />
<br />
# Access Control:<br />
# With SSLRequire you can do per-directory access control based<br />
# on arbitrary complex boolean expressions containing server<br />
# variable checks and other lookup directives. The syntax is a<br />
# mixture between C and Perl. See the mod_ssl documentation<br />
# for more details.<br />
#<Location /><br />
#SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \<br />
# and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \<br />
# and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \<br />
# and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \<br />
# and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20 ) \<br />
# or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/<br />
#</Location><br />
<br />
# SSL Engine Options:<br />
# Set various options for the SSL engine.<br />
# o FakeBasicAuth:<br />
# Translate the client X.509 into a Basic Authorisation. This means that<br />
# the standard Auth/DBMAuth methods can be used for access control. The<br />
# user name is the `one line' version of the client's X.509 certificate.<br />
# Note that no password is obtained from the user. Every entry in the user<br />
# file needs this password: `xxj31ZMTZzkVA'.<br />
# o ExportCertData:<br />
# This exports two additional environment variables: SSL_CLIENT_CERT and<br />
# SSL_SERVER_CERT. These contain the PEM-encoded certificates of the<br />
# server (always existing) and the client (only existing when client<br />
# authentication is used). This can be used to import the certificates<br />
# into CGI scripts.<br />
# o StdEnvVars:<br />
# This exports the standard SSL/TLS related `SSL_*' environment variables.<br />
# Per default this exportation is switched off for performance reasons,<br />
# because the extraction step is an expensive operation and is usually<br />
# useless for serving static content. So one usually enables the<br />
# exportation for CGI and SSI requests only.<br />
# o StrictRequire:<br />
# This denies access when "SSLRequireSSL" or "SSLRequire" applied even<br />
# under a "Satisfy any" situation, i.e. when it applies access is denied<br />
# and no other module can change it.<br />
# o OptRenegotiate:<br />
# This enables optimized SSL connection renegotiation handling when SSL<br />
# directives are used in per-directory context.<br />
#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire<br />
<FilesMatch "\.(cgi|shtml|phtml|php)$"><br />
SSLOptions +StdEnvVars<br />
</FilesMatch><br />
<br />
# SSL Protocol Adjustments:<br />
# The safe and default but still SSL/TLS standard compliant shutdown<br />
# approach is that mod_ssl sends the close notify alert but doesn't wait for<br />
# the close notify alert from client. When you need a different shutdown<br />
# approach you can use one of the following variables:<br />
# o ssl-unclean-shutdown:<br />
# This forces an unclean shutdown when the connection is closed, i.e. no<br />
# SSL close notify alert is send or allowed to received. This violates<br />
# the SSL/TLS standard but is needed for some brain-dead browsers. Use<br />
# this when you receive I/O errors because of the standard approach where<br />
# mod_ssl sends the close notify alert.<br />
# o ssl-accurate-shutdown:<br />
# This forces an accurate shutdown when the connection is closed, i.e. a<br />
# SSL close notify alert is send and mod_ssl waits for the close notify<br />
# alert of the client. This is 100% SSL/TLS standard compliant, but in<br />
# practice often causes hanging connections with brain-dead browsers. Use<br />
# this only for browsers where you know that their SSL implementation<br />
# works correctly.<br />
# Notice: Most problems of broken clients are also related to the HTTP<br />
# keep-alive facility, so you usually additionally want to disable<br />
# keep-alive for those clients, too. Use variable "nokeepalive" for this.<br />
# Similarly, one has to force some clients to use HTTP/1.0 to workaround<br />
# their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and<br />
# "force-response-1.0" for this.<br />
BrowserMatch "MSIE [2-6]" \<br />
nokeepalive ssl-unclean-shutdown \<br />
downgrade-1.0 force-response-1.0<br />
# MSIE 7 and newer should be able to use keepalive<br />
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown<br />
<br />
<IfModule mod_rewrite.c><br />
RewriteEngine on<br />
RewriteRule ^/user/([a-z0-9-]+)/?$ /user/view.php?profile=$1&%{QUERY_STRING}<br />
RewriteRule ^/user/([a-z0-9-]+)/([a-z0-9-]+)/?$ /view/view.php?profile=$1&page=$2&%{QUERY_STRING}<br />
RewriteRule ^/group/([a-z0-9-]+)/?$ /group/view.php?homepage=$1&%{QUERY_STRING}<br />
RewriteRule ^/group/([a-z0-9-]+)/([a-z0-9-]+)/?$ /view/view.php?homepage=$1&page=$2&%{QUERY_STRING}<br />
</IfModule><br />
</VirtualHost><br />
</IfModule><br />
</syntaxhighlight><br />
<br />
'''4.''' Create the SSL folder in /etc/apache2/ if it doesn't already exist:<br />
<syntaxhighlight lang="bash"><br />
$ sudo mkdir /etc/apache2/ssl<br />
</syntaxhighlight><br />
<br />
'''5.''' Run the following command to set up your local cert and follow the ensuing steps for generating it:<br />
<syntaxhighlight lang="bash"><br />
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.pem<br />
</syntaxhighlight><br />
<br />
When it asks you for the "Common name", you can put your local server's name.<br />
<br />
'''6.''' Restart Apache.<br />
<syntaxhighlight lang="bash"><br />
$ sudo service apache2 restart<br />
</syntaxhighlight><br />
<br />
If you have an error message that pertains to your SSL site, you'll need to fix it first before continuing.<br />
<br />
'''7.''' Test the Apache config:<br />
<syntaxhighlight lang="bash"><br />
$ sudo apache2ctl configtest<br />
</syntaxhighlight><br />
<br />
'''8.''' Delete the old wwwroot as that still points to http://. If you left it, you wouldn't see all assetts.<br />
<syntaxhighlight lang="bash"><br />
$ sudo -u postgres psql mahara-main<br />
delete from config where field = 'wwwroot';<br />
Ctrl + d to exit<br />
</syntaxhighlight><br />
<br />
'''9.''' Go to your Mahara URL and use '''https://'''. Since you created a self-signed cert, your connection will be untrusted. Proceed anyway.<br />
<br />
'''10.''' Now you can use your developer site with web services as well.<br />
<br />
==Set up Behat==<br />
<br />
You can use the automated testing suite from Mahara 15.04 on. There is a [[Testing/Behat_Testing/Setup | separate installation page for Behat]].</div>Robertlhttps://wiki.mahara.org/index.php?title=Releases&diff=13295Releases2022-06-16T02:33:02Z<p>Robertl: /* Current and upcoming releases */</p>
<hr />
<div>=Release cycle and version support=<br />
<p>A new major version of Mahara is released every 6 months, in April and October. The version numbers reflect the year and the month in which a version was released. See [[Developer_Area/Version_Numbering_Policy|Version Numbering Policy]] for more details.<br><br />
<br />
{| class="wikitable" style="padding:0em; text-align:left" summary="Mahara's six monthly cycle for April and October releases."<br />
! scope="col" style="text-align:left; background-color:#566d31; color:#fff;" |Release cycle<br />
! scope="col" style="text-align:left;" |Nov - Apr<br />
! scope="col" style="text-align:left;" |May - Oct<br />
|-<br />
! scope="row" style="text-align:left;" |Feature freeze<br />
| style="background-color:#fff;" |Early February<br />
| style="background-color:#fff;" |Early August<br />
|-<br />
! scope="row" style="text-align:left;" |UI freeze<br />
| style="background-color:#fff;" |Early March<br />
| style="background-color:#fff;" |Early September<br />
|-<br />
! scope="row" style="text-align:left;" |Release candidate<br />
| style="background-color:#fff;" |Mid March<br />
| style="background-color:#fff;" |Mid September<br />
|-<br />
! scope="row" style="text-align:left;" |Official release<br />
| style="background-color:#fff;" |Late April<br />
| style="background-color:#fff;" |Late October<br />
|-<br />
|}<br />
<ul><br />
<li> Each release has 16 weeks before feature freeze.</li><br />
<li>For each release, We've put feature freeze at a month before the release candidate. Only non-feature bug fixes will be committed after this </li><br />
<li>The week before the release candidates is a UI freeze. This is a freeze to string changes and theme changes. String or UI fixes will need to be at least high importance.</li><br />
</ul></p><br />
<p></p><br />
<p><strong>The standard support lifetime of a major version is 18 months (3 release cycles):</strong><br><br />
<ul><br />
<li>Receives bug fixes and security fixes for the first 6 months</li><br />
<li>Receives security fixes only, for an additional 12 months</li><br />
</ul><br />
In the event that a major release substantially breaks backwards compatibility, we may declare the previous release to be an extended support release which will receive security fixes for 30 months (5 release cycles), in order to give sites more time to upgrade.</p><br />
<br />
=Older releases (pre Mahara 1.6)=<br />
<br />
Prior to Mahara 1.6, Mahara major versions were released as needed, according to no particular schedule. During the transition period to the 6 month release cycle, support for the older releases was provided for 2 release cycles.<br />
<br />
=Current and upcoming releases=<br />
<p>The latest <strong>stable</strong> version of Mahara is 22.04, released on 27 April 2022.</p><br />
<br />
<p>'''Note:''' This page is updated manually, and sometimes falls behind. For 100% up-to-date information, look for the release labelled "Current Stable Release" on our [https://launchpad.net/mahara/+series Launchpad release page], or use the "Download" link on the front page of https://mahara.org</p><br />
<br />
{| class="wikitable"<br />
| style="background:#ba2025; color:#fff" |Unsupported<br />
| style="background:#566d31; color:#fff" |Currently in support<br />
|Not yet released<br />
|}<br />
<br />
<!-- This is the template for the table sections below<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff"|'''[https://mahara.org/interaction/forum/topic.php?id= Major point release number]'''<br />
|<br />
* [https://launchpad.net/mahara/ Minor point release number]<br />
| '''Major point release date''' <br><br />
* Minor point release dates<br />
| style="background:#566d31; color:#fff" | End of support date<br />
|-<br />
--><br />
<br />
{| class="wikitable" summary="Release notes for major and minor versions of Mahara, official release dates and version support end date. Versions are listed in reverse chronological order. Table is four columns wide and 22 rows deep."<br />
|+ style="text-align:left;" |Mahara release notes and end of support<br />
|-<br />
! style="text-align:left;" |Major release<br />
! style="text-align:left;" |Minor release<br />
! style="text-align:left;" |Release date<br />
! style="text-align:left;" |End of support<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=9097 22.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/22.04.2#release-notes 22.04.2]<br />
*[https://launchpad.net/mahara/+milestone/22.04.1#release-notes 22.04.1]<br />
*[https://launchpad.net/mahara/+milestone/22.04.0#release-notes 22.04.0]<br />
|'''27 April 2022''' <br><br />
<br />
*16 June 2022<br />
*2 May 2022<br />
*27 April 2022<br />
| style="background:#566d31; color:#fff" |October 2023<br />
|-<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8955 21.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/21.10.3#release-notes 21.10.3]<br />
*[https://launchpad.net/mahara/+milestone/21.10.2#release-notes 21.10.2]<br />
*[https://launchpad.net/mahara/+milestone/21.10.1#release-notes 21.10.1]<br />
*[https://launchpad.net/mahara/+milestone/21.10.0#release-notes 21.10.0]<br />
|'''29 October 2021''' <br><br />
<br />
*2 May 2022<br />
*27 April 2022<br />
*9 February 2022<br />
*29 October 2021<br />
| style="background:#566d31; color:#fff" |April 2023<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8817 21.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/21.04.4#release-notes 21.04.5]<br />
*[https://launchpad.net/mahara/+milestone/21.04.4#release-notes 21.04.4]<br />
*[https://launchpad.net/mahara/+milestone/21.04.3#release-notes 21.04.3]<br />
*[https://launchpad.net/mahara/+milestone/21.04.2#release-notes 21.04.2]<br />
*[https://launchpad.net/mahara/+milestone/21.04.1#release-notes 21.04.1]<br />
*[https://launchpad.net/mahara/+milestone/21.04.0#release-notes 21.04.0]<br />
|'''30 April 2021''' <br><br />
<br />
*2 May 2022<br />
*27 April 2022<br />
*9 February 2022<br />
*29 October 2021<br />
*21 May 2021<br />
*30 April 2021<br />
| style="background:#566d31; color:#fff" |October 2022<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8728 20.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/20.10.6#release-notes 20.10.6]<br />
*[https://launchpad.net/mahara/+milestone/20.10.5#release-notes 20.10.5]<br />
*[https://launchpad.net/mahara/+milestone/20.10.4#release-notes 20.10.4]<br />
*[https://launchpad.net/mahara/+milestone/20.10.3#release-notes 20.10.3]<br />
*[https://launchpad.net/mahara/+milestone/20.10.2#release-notes 20.10.2]<br />
*[https://launchpad.net/mahara/+milestone/20.10.1#release-notes 20.10.1]<br />
*[https://launchpad.net/mahara/+milestone/20.10.0#release-notes 20.10.0]<br />
|'''22 October 2020'''<br><br />
<br />
*2 May 2022<br />
*27 April 2022<br />
*9 February 2022<br />
*29 October 2021<br />
*21 May 2021<br />
*4 May 2021<br />
*22 October 2020<br />
| style="background:#ba2025; color:#fff" |April 2022 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8611 20.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/20.04.5#release-notes 20.04.5]<br />
*[https://launchpad.net/mahara/+milestone/20.04.4#release-notes 20.04.4]<br />
*[https://launchpad.net/mahara/+milestone/20.04.3#release-notes 20.04.3]<br />
*[https://launchpad.net/mahara/+milestone/20.04.2#release-notes 20.04.2]<br />
*[https://launchpad.net/mahara/+milestone/20.04.1#release-notes 20.04.1]<br />
*[https://launchpad.net/mahara/20.04/20.04.0#release-notes 20.04.0]<br />
|'''29 April 2020'''<br><br />
<br />
*29 October 2021<br />
*22 May 2021<br />
*4 May 2021<br />
*22 October 2020<br />
*4 August 2020<br />
*29 April 2020<br />
| style="background:#ba2025; color:#fff" |October 2021 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8533 19.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/19.10.6#releasenotes 19.10.6]<br />
*[https://launchpad.net/mahara/+milestone/19.10.5#releasenotes 19.10.5]<br />
*[https://launchpad.net/mahara/+milestone/19.10.4#release-notes 19.10.4]<br />
*[https://launchpad.net/mahara/+milestone/19.10.3#release-notes 19.10.3]<br />
*[https://launchpad.net/mahara/+milestone/19.10.2#release-notes 19.10.2]<br />
*[https://launchpad.net/mahara/19.10/19.10.1#release-notes 19.10.1]<br />
*[https://launchpad.net/mahara/19.10/19.10.0#release-notes 19.10.0]<br />
|'''31 October 2019''' <br><br />
<br />
*4 May 2021<br />
*22 October 2020<br />
*4 August 2020<br />
*30 April 2020<br />
*4 April 2020<br />
*12 November 2019<br />
*31 October 2019<br />
| style="background:#ba2025; color:#fff" |April 2021 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8444 19.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/19.04/19.04.5#release-notes 19.04.5]<br />
*[https://launchpad.net/mahara/19.04/19.04.4#release-notes 19.04.4]<br />
*[https://launchpad.net/mahara/19.04/19.04.3#release-notes 19.04.3]<br />
*[https://launchpad.net/mahara/19.04/19.04.2#release-notes 19.04.2]<br />
*[https://launchpad.net/mahara/19.04/19.04.1#release-notes 19.04.1]<br />
*[https://launchpad.net/mahara/19.04/19.04.0#release-notes 19.04.0]<br />
|'''30 April 2019''' <br><br />
<br />
*30 April 2020<br />
*4 March 2020<br />
*12 November 2019<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
| style="background:#ba2025; color:#fff" |October 2020 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8365 18.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/18.10/18.10.6#release-notes 18.10.6]<br />
*[https://launchpad.net/mahara/18.10/18.10.5#release-notes 18.10.5]<br />
*[https://launchpad.net/mahara/18.10/18.10.4#release-notes 18.10.4]<br />
*[https://launchpad.net/mahara/18.10/18.10.3#release-notes 18.10.3]<br />
*[https://launchpad.net/mahara/18.10/18.10.2#release-notes 18.10.2]<br />
*[https://launchpad.net/mahara/18.10/18.10.1#release-notes 18.10.1]<br />
*[https://launchpad.net/mahara/18.10/18.10.0#release-notes 18.10.0]<br />
|'''25 October 2018''' <br><br />
<br />
*30 April 2020<br />
*4 March 2020<br />
*12 November 2019<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
*25 October 2018<br />
| style="background:#ba2025; color:#fff" |April 2020 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8216 18.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/18.04/18.04.6#release-notes 18.04.6]<br />
*[https://launchpad.net/mahara/18.04/18.04.5#release-notes 18.04.5]<br />
*[https://launchpad.net/mahara/18.04/18.04.4#release-notes 18.04.4]<br />
*[https://launchpad.net/mahara/18.04/18.04.3#release-notes 18.04.3]<br />
*[https://launchpad.net/mahara/18.04/18.04.2#release-notes 18.04.2]<br />
*[https://launchpad.net/mahara/18.04/18.04.1#release-notes 18.04.1]<br />
*[https://launchpad.net/mahara/18.04/18.04.0#release-notes 18.04.0]<br />
|'''6 April 2018''' <br><br />
<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
| style="background:#ba2025; color:#fff" |October 2019 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8084 17.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/17.10/17.10.9#release-notes 17.10.9]<br />
*[https://launchpad.net/mahara/17.10/17.10.8#release-notes 17.10.8]<br />
*[https://launchpad.net/mahara/17.10/17.10.7#release-notes 17.10.7]<br />
*[https://launchpad.net/mahara/17.10/17.10.6#release-notes 17.10.6]<br />
*[https://launchpad.net/mahara/17.10/17.10.5#release-notes 17.10.5]<br />
*[https://launchpad.net/mahara/17.10/17.10.4#release-notes 17.10.4]<br />
*[https://launchpad.net/mahara/17.10/17.10.3#release-notes 17.10.3]<br />
*[https://launchpad.net/mahara/17.10/17.10.2#release-notes 17.10.2]<br />
*[https://launchpad.net/mahara/17.10/17.10.1#release-notes 17.10.1]<br />
*[https://launchpad.net/mahara/17.10/17.10.0#release-notes 17.10.0]<br />
|'''30 October 2017''' <br><br />
<br />
*30 April 2019<br />
*30 April 2019<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*14 December 2017<br />
*30 October 2017<br />
| style="background:#ba2025; color:#fff;" |30 April 2019 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7926 17.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/17.04/17.04.10#release-notes 17.04.10]<br />
*[https://launchpad.net/mahara/17.04/17.04.9#release-notes 17.04.9]<br />
*[https://launchpad.net/mahara/17.04/17.04.8#release-notes 17.04.8]<br />
*[https://launchpad.net/mahara/17.04/17.04.7#release-notes 17.04.7]<br />
*[https://launchpad.net/mahara/17.04/17.04.6#release-notes 17.04.6]<br />
*[https://launchpad.net/mahara/17.04/17.04.5#release-notes 17.04.5]<br />
*[https://launchpad.net/mahara/17.04/17.04.4#release-notes 17.04.4]<br />
*[https://launchpad.net/mahara/17.04/17.04.3#release-notes 17.04.3]<br />
*[https://launchpad.net/mahara/17.04/17.04.2#release-notes 17.04.2]<br />
*[https://launchpad.net/mahara/17.04/17.04.1#release-notes 17.04.1]<br />
*[https://launchpad.net/mahara/17.04/17.04.0#release-notes 17.04.0]<br />
|'''27 April 2017''' <br><br />
<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*12 May 2017<br />
*27 April 2017<br />
| style="background:#ba2025; color:#fff" |25 October 2018 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7750 16.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/16.10/16.10.9#release-notes 16.10.9]<br />
*[https://launchpad.net/mahara/16.10/16.10.8#release-notes 16.10.8]<br />
*[https://launchpad.net/mahara/16.10/16.10.7#release-notes 16.10.7]<br />
*[https://launchpad.net/mahara/16.10/16.10.6#release-notes 16.10.6]<br />
*[https://launchpad.net/mahara/16.10/16.10.5#release-notes 16.10.5]<br />
*[https://launchpad.net/mahara/16.10/16.10.4#release-notes 16.10.4]<br />
*[https://launchpad.net/mahara/16.10/16.10.3#release-notes 16.10.3]<br />
*[https://launchpad.net/mahara/16.10/16.10.2#release-notes 16.10.2]<br />
*[https://launchpad.net/mahara/16.10/16.10.1#release-notes 16.10.1]<br />
*[https://launchpad.net/mahara/16.10/16.10.0#release-notes 16.10.0]<br />
|'''21 October 2016''' <br><br />
<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*13 December 2016<br />
*21 October 2016<br />
| style="background:#ba2025; color:#fff" |06 April 2018 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7585 16.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/16.04/16.04.9#release-notes 16.04.9]<br />
*[https://launchpad.net/mahara/16.04/16.04.8#release-notes 16.04.8]<br />
*[https://launchpad.net/mahara/16.04/16.04.7#release-notes 16.04.7]<br />
*[https://launchpad.net/mahara/16.04/16.04.6#release-notes 16.04.6]<br />
*[https://launchpad.net/mahara/16.04/16.04.5#release-notes 16.04.5]<br />
*[https://launchpad.net/mahara/16.04/16.04.4#release-notes 16.04.4]<br />
*[https://launchpad.net/mahara/16.04/16.04.3#release-notes 16.04.3]<br />
*[https://launchpad.net/mahara/16.04/16.04.2#release-notes 16.04.2]<br />
*[https://launchpad.net/mahara/16.04/16.04.1#release-notes 16.04.1]<br />
*[https://launchpad.net/mahara/16.04/16.04.0#release-notes 16.04.0]<br />
|'''28 April 2016''' <br><br />
<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*11 July 2016<br />
*9 June 2016<br />
*28 April 2016<br />
| style="background:#ba2025; color:#fff" |30 October 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7420 15.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/15.10/15.10.8#release-notes 15.10.8]<br />
*[https://launchpad.net/mahara/15.10/15.10.7#release-notes 15.10.7]<br />
*[https://launchpad.net/mahara/15.10/15.10.6#release-notes 15.10.6]<br />
*[https://launchpad.net/mahara/15.10/15.10.5#release-notes 15.10.5]<br />
*[https://launchpad.net/mahara/15.10/15.10.4#release-notes 15.10.4]<br />
*[https://launchpad.net/mahara/15.10/15.10.3#release-notes 15.10.3]<br />
*[https://launchpad.net/mahara/15.10/15.10.2#release-notes 15.10.2]<br />
*[https://launchpad.net/mahara/15.10/15.10.1#release-notes 15.10.1]<br />
*[https://launchpad.net/mahara/15.10/15.10.0#release-notes 15.10.0]<br />
|'''23 October 2015''' <br><br />
<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*11 July 2016<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*23 October 2015<br />
| style="background:#ba2025; color:#fff" |26 April 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7171 15.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/15.04/15.04.15#release-notes 15.04.15]<br />
*[https://launchpad.net/mahara/15.04/15.04.14#release-notes 15.04.14]<br />
*[https://launchpad.net/mahara/15.04/15.04.13#release-notes 15.04.13]<br />
*[https://launchpad.net/mahara/15.04/15.04.12#release-notes 15.04.12]<br />
*[https://launchpad.net/mahara/15.04/15.04.11#release-notes 15.04.11]<br />
*[https://launchpad.net/mahara/15.04/15.04.10#release-notes 15.04.10]<br />
*[https://launchpad.net/mahara/15.04/15.04.9#release-notes 15.04.9]<br />
*[https://launchpad.net/mahara/15.04/15.04.8#release-notes 15.04.8]<br />
*[https://launchpad.net/mahara/15.04/15.04.7#release-notes 15.04.7]<br />
*[https://launchpad.net/mahara/15.04/15.04.6#release-notes 15.04.6]<br />
*[https://launchpad.net/mahara/15.04/15.04.5#release-notes 15.04.5]<br />
*[https://launchpad.net/mahara/15.04/15.04.4#release-notes 15.04.4]<br />
*[https://launchpad.net/mahara/15.04/15.04.3#release-notes 15.04.3]<br />
*[https://launchpad.net/mahara/15.04/15.04.2#release-notes 15.04.2]<br />
*[https://launchpad.net/mahara/15.04/15.04.1#release-notes 15.04.1]<br />
*[https://launchpad.net/mahara/15.04/15.04.0#release-notes 15.04.0]<br />
|'''23 October 2015''' <br><br />
<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*12 July 2016<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*29 May 2015<br />
*17 April 2015<br />
| style="background:#ba2025; color:#fff" |30 October 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=6509 1.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.10/1.10.10#release-notes 1.10.10]<br />
*[https://launchpad.net/mahara/1.10/1.10.9#release-notes 1.10.9]<br />
*[https://launchpad.net/mahara/1.10/1.10.8#release-notes 1.10.8]<br />
*[https://launchpad.net/mahara/1.10/1.10.7#release-notes 1.10.7]<br />
*[https://launchpad.net/mahara/1.10/1.10.6#release-notes 1.10.6]<br />
*[https://launchpad.net/mahara/1.10/1.10.5#release-notes 1.10.5]<br />
*[https://launchpad.net/mahara/1.10/1.10.4#release-notes 1.10.4]<br />
*[https://launchpad.net/mahara/1.10/1.10.3#release-notes 1.10.3]<br />
*[https://launchpad.net/mahara/1.10/1.10.2#release-notes 1.10.2]<br />
*[https://launchpad.net/mahara/1.10/1.10.1#release-notes 1.10.1]<br />
*[https://launchpad.net/mahara/1.10/1.10.0#release-notes 1.10.0]<br />
|'''21 October 2014''' <br><br />
<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*29 May 2015<br />
*20 April 2015<br />
*13 January 2015<br />
*26 November 2014<br />
*21 October 2014<br />
| style="background:#ba2025; color:#fff" |2 May 2016 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=6254 1.9]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.9/1.9.9#release-notes 1.9.9]<br />
*[https://launchpad.net/mahara/1.9/1.9.8#release-notes 1.9.8]<br />
*[https://launchpad.net/mahara/1.9/1.9.7#release-notes 1.9.7]<br />
*[https://launchpad.net/mahara/1.9/1.9.6#release-notes 1.9.6]<br />
*[https://launchpad.net/mahara/1.9/1.9.5#release-notes 1.9.5]<br />
*[https://launchpad.net/mahara/1.9/1.9.4#release-notes 1.9.4]<br />
*[https://launchpad.net/mahara/1.9/1.9.3#release-notes 1.9.3]<br />
*[https://launchpad.net/mahara/1.9/1.9.2#release-notes 1.9.2]<br />
*[https://launchpad.net/mahara/1.9/1.9.1#release-notes 1.9.1]<br />
*[https://launchpad.net/mahara/1.9/1.9.0#release-notes 1.9.0]<br />
|'''15 April 2014''' <br><br />
<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*26 November 2014<br />
*22 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*15 April 2014<br />
| style="background:#ba2025; color:#fff" |27 October 2015 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=5833 1.8]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.8/1.8.7#release-notes 1.8.7]<br />
*[https://launchpad.net/mahara/1.8/1.8.6#release-notes 1.8.6]<br />
*[https://launchpad.net/mahara/1.8/1.8.5#release-notes 1.8.5]<br />
*[https://launchpad.net/mahara/1.8/1.8.4#release-notes 1.8.4]<br />
*[https://launchpad.net/mahara/1.8/1.8.3#release-notes 1.8.3]<br />
*[https://launchpad.net/mahara/1.8/1.8.2#release-notes 1.8.2]<br />
*[https://launchpad.net/mahara/1.8/1.8.1#release-notes 1.8.1]<br />
*[https://launchpad.net/mahara/1.8/1.8.0#release-notes 1.8.0]<br />
|'''24 October 2013''' <br><br />
<br />
*20 April 2015<br />
*26 November 2014<br />
*22 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*3 April 2014<br />
*18 December 2013<br />
*24 October 2013<br />
| style="background:#ba2025; color:#fff" |20 April 2015 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=5371 1.7]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.7/1.7.8#release-notes 1.7.8]<br />
*[https://launchpad.net/mahara/1.7/1.7.7#release-notes 1.7.7]<br />
*[https://launchpad.net/mahara/1.7/1.7.6#release-notes 1.7.6]<br />
*[https://launchpad.net/mahara/1.7/1.7.5#release-notes 1.7.5]<br />
*[https://launchpad.net/mahara/1.7/1.7.4#release-notes 1.7.4]<br />
*[https://launchpad.net/mahara/1.7/1.7.3#release-notes 1.7.3]<br />
*[https://launchpad.net/mahara/1.7/1.7.2#release-notes 1.7.2]<br />
*[https://launchpad.net/mahara/1.7/1.7.1#release-notes 1.7.1]<br />
*[https://launchpad.net/mahara/1.7/1.7.0#release-notes 1.7.0]<br />
|'''19 April 2013''' <br><br />
<br />
*21 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*29 October 2013<br />
*3 October 2013<br />
*3 April 2014<br />
*18 December 2013<br />
*24 October 2013<br />
*19 April 2013<br />
| style="background:#ba2025; color:#fff" |21 October 2014 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=4967 1.6]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.6/1.6.10#release-notes 1.6.10]<br />
*[https://launchpad.net/mahara/1.6/1.6.9#release-notes 1.6.9]<br />
*[https://launchpad.net/mahara/1.6/1.6.8#release-notes 1.6.8]<br />
*[https://launchpad.net/mahara/1.6/1.6.7#release-notes 1.6.7]<br />
*[https://launchpad.net/mahara/1.6/1.6.6#release-notes 1.6.6]<br />
*[https://launchpad.net/mahara/1.6/1.6.5#release-notes 1.6.5]<br />
*[https://launchpad.net/mahara/1.6/1.6.4#release-notes 1.6.4]<br />
*[https://launchpad.net/mahara/1.6/1.6.3#release-notes 1.6.3]<br />
*[https://launchpad.net/mahara/1.6/1.6.2#release-notes 1.6.2]<br />
*[https://launchpad.net/mahara/1.6/1.6.1#release-notes 1.6.1]<br />
*[https://launchpad.net/mahara/1.6/1.6.0#release-notes 1.6.0]<br />
|'''19 October 2019''' <br><br />
<br />
*13 May 2014<br />
*3 April 2014<br />
*29 October 2013<br />
*3 October 2013<br />
*25 July 2013<br />
*2 May 2013<br />
*15 April 2013<br />
*15 February 2013<br />
*23 November 2012<br />
*24 October 2012<br />
*19 October 2012<br />
| style="background:#ba2025; color:#fff" |29 April 2014 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=4469 1.5]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.5/1.5.13#release-notes 1.5.13]<br />
*[https://launchpad.net/mahara/1.5/1.5.12#release-notes 1.5.12]<br />
*[https://launchpad.net/mahara/1.5/1.5.11#release-notes 1.5.11]<br />
*[https://launchpad.net/mahara/1.5/1.5.10#release-notes 1.5.10]<br />
*[https://launchpad.net/mahara/1.5/1.5.9#release-notes 1.5.9]<br />
*[https://launchpad.net/mahara/1.5/1.5.8#release-notes 1.5.8]<br />
*[https://launchpad.net/mahara/1.5/1.5.7#release-notes 1.5.7]<br />
*[https://launchpad.net/mahara/1.5/1.5.6#release-notes 1.5.6]<br />
*[https://launchpad.net/mahara/1.5/1.5.4#release-notes 1.5.4]<br />
*[https://launchpad.net/mahara/1.5/1.5.3#release-notes 1.5.3]<br />
*[https://launchpad.net/mahara/1.5/1.5.2#release-notes 1.5.2]<br />
*[https://launchpad.net/mahara/1.5/1.5.1#release-notes 1.5.1]<br />
*[https://launchpad.net/mahara/1.5/1.5.0#release-notes 1.5.0]<br />
|'''17 April 2012''' <br><br />
<br />
*25 October 2013<br />
*3 October 2013<br />
*24 July 2013<br />
*2 May 2013<br />
*15 April 2013<br />
*15 February 2013<br />
*23 November 2012<br />
*17 October 2012<br />
*10 October 2012<br />
*14 September 2012<br />
*31 July 2012<br />
*3 May 2012<br />
*17 April 2012<br />
| style="background:#ba2025; color:#fff" |29 October 2013 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=3744 1.4]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.6 1.4.6]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.5 1.4.5]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.4 1.4.4]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.3 1.4.3]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.2 1.4.2]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.1 1.4.1]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.0 1.4.0]<br />
|'''13 June 2011''' <br><br />
<br />
*17 October 2012<br />
*10 October 2012<br />
*14 September 2012<br />
*31 July 2011<br />
*6 March 2011<br />
*3 November 2011<br />
*13 June 2011<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=2252 1.3]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.3.8 1.3.8]<br />
*[https://launchpad.net/mahara/+milestone/1.3.7 1.3.7]<br />
*[https://launchpad.net/mahara/+milestone/1.3.6 1.3.6]<br />
*[https://launchpad.net/mahara/+milestone/1.3.5 1.3.5]<br />
*[https://launchpad.net/mahara/+milestone/1.3.4 1.3.4]<br />
*[https://launchpad.net/mahara/+milestone/1.3.3 1.3.3]<br />
*[https://launchpad.net/mahara/+milestone/1.3.2 1.3.2]<br />
*[https://launchpad.net/mahara/+milestone/1.3.1 1.3.1]<br />
*[https://launchpad.net/mahara/+milestone/1.3.0 1.3.0]<br />
|'''10 September 2010''' <br><br />
<br />
*5 March 2012<br />
*3 Novemver 2011<br />
*10 May 2011<br />
*28 March 2011<br />
*24 March 2011<br />
*7 November 2010<br />
*8 October 2010<br />
*17 September 2010<br />
*10 September 2010<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=1226 1.2]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.2.9 1.2.9]<br />
*[https://launchpad.net/mahara/+milestone/1.2..8 1.2.8]<br />
*[https://launchpad.net/mahara/+milestone/1.2.7 1.2.7]<br />
*[https://launchpad.net/mahara/+milestone/1.2.6 1.2.6]<br />
*[https://launchpad.net/mahara/+milestone/1.2.5 1.2.5]<br />
*[https://launchpad.net/mahara/+milestone/1.2.4 1.2.4]<br />
*[https://launchpad.net/mahara/+milestone/1.2.3 1.2.3]<br />
*[https://launchpad.net/mahara/+milestone/1.2.2 1.2.2]<br />
*[https://launchpad.net/mahara/+milestone/1.2.1 1.2.1]<br />
*[https://launchpad.net/mahara/+milestone/1.2.0 1.2.0]<br />
|'''16 November 2009''' <br><br />
<br />
*10 May 2011<br />
*24 March 2011<br />
*1 September 2011<br />
*2 July 2010<br />
*6 April 2010<br />
*8 February 2010<br />
*8 December 2009<br />
*8 December 2009<br />
*16 November 2009<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://launchpad.net/mahara/+milestone/1.0.10 1.1]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.1.9 1.1.9]<br />
*[https://launchpad.net/mahara/+milestone/1.1.8 1.1.8]<br />
*[https://launchpad.net/mahara/+milestone/1.1.7 1.1.7]<br />
*[https://launchpad.net/mahara/+milestone/1.1.6 1.1.6]<br />
*[https://launchpad.net/mahara/+milestone/1.1.5 1.1.5]<br />
*[https://launchpad.net/mahara/+milestone/1.1.4 1.1.4]<br />
*[https://launchpad.net/mahara/+milestone/1.1.3 1.1.3]<br />
*[https://launchpad.net/mahara/+milestone/1.1.2 1.1.2]<br />
*[https://launchpad.net/mahara/+milestone/1.1.1 1.1.1]<br />
*[https://launchpad.net/mahara/+milestone/1.1.0 1.1.0]<br />
|'''25 February 2009''' <br><br />
<br />
*2 July 2010<br />
*6 April 2010<br />
*28 October 2009<br />
*21 June 2009<br />
*10 June 2009<br />
*21 April 2009<br />
*9 March 2009<br />
*26 February 2009<br />
*25 February 2009<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=292 1.0]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.0.15 1.0.15]<br />
*[https://launchpad.net/mahara/+milestone/1.0.14 1.0.14]<br />
*[https://launchpad.net/mahara/+milestone/1.0.13 1.0.13]<br />
*[https://launchpad.net/mahara/+milestone/1.0.12 1.0.12]<br />
*[https://launchpad.net/mahara/+milestone/1.0.11 1.0.11]<br />
*[https://launchpad.net/mahara/+milestone/1.0.10 1.0.10]<br />
*[[Releases/1.0.9|1.0.9]]<br />
*[[Releases/1.0.8|1.0.8]]<br />
*[[Releases/1.0.7|1.0.7]]<br />
|'''9 March 2009''' <br><br />
<br />
*2 July 2010<br />
*6 April 2010<br />
*28 October 2009<br />
*21 June 2009<br />
*21 April 2009<br />
*9 March 2009<br />
*Unavailable<br />
*Unavailable<br />
*Unavailable<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
|}<br />
<br />
=Definition of support=<br />
<br />
Being "supported" means:<br />
<br />
*The release team is committed to making available updates to Mahara that are security related. See [[Security]] to find out how to report security bugs to us.<br />
*Occasionally, some other serious bug fixes will be included, but these are not guaranteed. If you find another type of bug, please let us know by reporting it on the mahara.org forums or directly on Launchpad: https://bugs.launchpad.net/mahara/+filebug<br />
<br />
=Specific backporting rules=<br />
<br />
When deciding which bugs to backport to supported branches, these are the general principles:<br />
<br />
*'''[[Security]] bugs'''<br />
**'''All''' Critical and High priority security bugs should be backported.<br />
**'''Nearly all''' Medium and Low priority security bugs should be backported. At the maintenance team's discretion, these might not be backported if:<br />
***Backporting would be technically difficult due to differences between Mahara versions.<br />
***The bug fix requires database upgrades or dataroot manipulations.<br />
***The bug fix otherwise introduces a high risk of [https://en.wikipedia.org/wiki/Software_regression regressions].<br />
<br />
*'''Non-security bugs'''<br />
**'''All''' Critical bugs should be backported.<br />
**'''Most''' High priority bugs should be backported. At the maintenance team's discretion, these might not be backported if:<br />
***Backporting would be technically difficult due to differences between Mahara versions.<br />
***The bug fix requires database upgrades or dataroot manipulations.<br />
***The bug fix otherwise introduces a high risk of [https://en.wikipedia.org/wiki/Software_regression regressions].<br />
**'''No''' Medium or Low priority non-security bugs are backported.<br />
**'''No''' Wishlist bugs are backported. Wishlist items are only added to the current development branch.<br />
<br />
If you want to backport certain bug fixes or new features to your own instance of Mahara, you can do so on your own as the code is available.<br />
<br />
See [[Developer_Area/Bug_Status#Importance|Bug Status:Importance]] for the guidelines on how we decide whether a bug is Critical, High, Medium, or Low.<br />
<br />
[[Category:Release Notes]]</div>Robertlhttps://wiki.mahara.org/index.php?title=Testing_Area/Behat_Testing/Setup&diff=13270Testing Area/Behat Testing/Setup2022-05-20T02:41:58Z<p>Robertl: </p>
<hr />
<div>{{note|These instructions for the Behat setup are only for machines running Linux. They will not work for Windows machines.}}<br />
<br />
1. Set up your [[Developer_Area/Developer_Environment | developer environment]] if you haven't already done so.<br />
<br />
2. Install Behat's dependencies:<br />
<syntaxhighlight lang="bash"><br />
$ sudo apt-get install curl openjdk-8-jre-headless<br />
</syntaxhighlight><br />
<br />
3. Add the following config settings to the bottom of your Mahara config.php file inside the htdocs/ subdirectory of the Mahara codebase. <br />
<br />
{{note|If /var/www/maharadata is not where you created your dataroot, you'll need to replace that with the correct path in the following commands}}<br />
<br />
<syntaxhighlight lang="bash"><br />
// Behat config<br />
$cfg->behat_dbprefix = 'behat_'; // must not empty<br />
$cfg->behat_dataroot = "/var/lib/maharadata/master_behat"; // The Behat copy of maharadata.<br />
$cfg->behat_wwwroot = 'http://localhost:8000'; // Must be this<br />
$cfg->behat_selenium2 = "http://127.0.0.1:4444/wd/hub"; // Must be this<br />
<br />
// If you want failed step screenshots appear<br />
$cfg->behat_view_screenshots = true;<br />
</syntaxhighlight><br />
<br />
{{note|There should be a behat_dataroot for each Mahara instance that you set up. Here the one for the master branch / this Mahara instance is created.}}<br />
{{note|If the directory for $cfg->behat_dataroot does not exist then it will need to be created.}}<br />
<br />
4. Make your Behat data directory (check this matches what you set in config.php):<br />
<syntaxhighlight lang="bash"><br />
$ sudo mkdir /var/lib/maharadata/master_behat<br />
</syntaxhighlight><br />
<br />
5. Make the directory and any subdirectories writeable by Mahara (check the directory is correct): <br />
<syntaxhighlight lang="bash"><br />
$ sudo chmod 777 -R /var/lib/maharadata/master_behat<br />
</syntaxhighlight><br />
<span id="chown"></span><br />
6. Change the directory and any subdirectories permissions to be owned by apache user (check the directory is correct):<br />
<syntaxhighlight lang="bash"><br />
$ sudo chown -R www-data:www-data /var/lib/maharadata/master_behat<br />
</syntaxhighlight><br />
<br />
*For Ubuntu, apache runs with user www-data<br />
*For Centos, apache runs with user apache<br />
<br />
7. Run Behat tests (change into your Mahara code directory first) as the apache user:<br />
<syntaxhighlight lang="bash"><br />
$ cd<br />
$ cd code/mahara<br />
./test/behat/mahara_behat.sh run<br />
</syntaxhighlight><br />
<br />
Or if you have sudo access:<br />
<syntaxhighlight lang="bash"><br />
$ cd<br />
$ cd code/mahara<br />
sudo -u www-data ./test/behat/mahara_behat.sh run<br />
</syntaxhighlight><br />
<br />
<br />
For the first time of running Behat, you need to wait for the Behat environment initialisation. This can take a while.<br />
<br />
To run all tests:<br />
./test/behat/mahara_behat.sh run<br />
<br />
To run your specific tests marked with @yourtags:<br />
./test/behat/mahara_behat.sh run @yourtags<br />
<br />
To run a particular feature file:<br />
./test/behat/mahara_behat.sh run my_file.feature<br />
<br />
The run / runheadless / rundebug / rundebugheadless / runfresh are interchangable with run in above commands<br />
<br />
[[Category:Behat]]<br />
<br />
==Running Behat tests with html report and screenshots on failed steps==<br />
<br />
To run tests with html output, add the flag 'html' to your test run command, e.g:<br />
<br />
<syntaxhighlight lang="bash">./test/behat/mahara_behat.sh run create_page.feature html</syntaxhighlight><br />
<br />
This will automatically open an html report of the test run in your browser. If there were failed steps, the the html report plugin takes a screenshot of the page that failed.<br />
You can find the screenshots in your behat dataroot (usually /var/lib/maharadata/master_behat) at the following path:<br />
behat/html_results/<feature title>/<scenario title>.png<br />
<br />
If you set<br />
<br />
$cfg->behat_view_screenshots = true;<br />
<br />
in your config.php file then the images will be opened up in image browser (Ubuntu eog only)<br />
<br />
Hopefully we will rig up the report to link to the screenshot soon.<br />
<br />
==How to Run Mahara behat test on Chrome for versions older than 17.04==<br />
<br />
{{note|Mahara behat is running on chrome driver by default in 17:04+}}<br />
<br />
This is steps for older versions of Mahara<br />
<br />
1. Download chromedriver here http://www.seleniumhq.org/download/ ( download the latest release)<br />
<br />
2. Start selenium Server with chrome driver<br />
<br />
$ java -jar selenium-server-standalone-2.53.1.jar -Dwebdriver.chrome.driver=path of chromedriver<br />
<br />
3. Change the behat.yml file as follows,<br />
<br />
Here is the file path var/lib/maharadata/master_behat/behat.yml<br />
<br />
when you open the beaht.yml file replace the following code with the lines that contain sessions to goutte=NUll( Niranjan or Lovesh can exactly tell you where to replcae the code if it is confusing) and save it<br />
<br />
javascript_session: selenium2<br />
selenium2:<br />
browser: chrome<br />
goutte: ~<br />
<br />
4. Run the behat test without rundebug <br />
<br />
for example ./test/behat/mahara_behat.sh run example.feature<br />
<br />
==Debugging==<br />
<br />
Go here for tips: https://wiki.mahara.org/wiki/Testing/Behat_Testing/Error_%26_Solutions</div>Robertlhttps://wiki.mahara.org/index.php?title=Testing_Area/Behat_Testing/Setup&diff=13269Testing Area/Behat Testing/Setup2022-05-20T02:40:47Z<p>Robertl: /* Running Behat tests with html report and screenshots on failed steps */</p>
<hr />
<div>{{note|These instructions for the Behat setup are only for machines running Linux. They will not work for Windows machines.}}<br />
<br />
1. Set up your [[Developer_Area/Developer_Environment | developer environment]] if you haven't already done so.<br />
<br />
2. Install Behat's dependencies:<br />
<syntaxhighlight lang="bash"><br />
$ sudo apt-get install curl openjdk-8-jre-headless<br />
</syntaxhighlight><br />
<br />
3. Add the following config settings to the bottom of your Mahara config.php file inside the htdocs/ subdirectory of the Mahara codebase. <br />
<br />
{{note|If /var/www/maharadata is not where you created your dataroot, you'll need to replace that with the correct path in the following commands}}<br />
<br />
<syntaxhighlight lang="bash"><br />
// Behat config<br />
$cfg->behat_dbprefix = 'behat_'; // must not empty<br />
$cfg->behat_dataroot = "/var/lib/maharadata/master_behat"; // The Behat copy of maharadata.<br />
$cfg->behat_wwwroot = 'http://localhost:8000'; // Must be this<br />
$cfg->behat_selenium2 = "http://127.0.0.1:4444/wd/hub"; // Must be this<br />
</syntaxhighlight><br />
<br />
{{note|There should be a behat_dataroot for each Mahara instance that you set up. Here the one for the master branch / this Mahara instance is created.}}<br />
{{note|If the directory for $cfg->behat_dataroot does not exist then it will need to be created.}}<br />
<br />
4. Make your Behat data directory (check this matches what you set in config.php):<br />
<syntaxhighlight lang="bash"><br />
$ sudo mkdir /var/lib/maharadata/master_behat<br />
</syntaxhighlight><br />
<br />
5. Make the directory and any subdirectories writeable by Mahara (check the directory is correct): <br />
<syntaxhighlight lang="bash"><br />
$ sudo chmod 777 -R /var/lib/maharadata/master_behat<br />
</syntaxhighlight><br />
<span id="chown"></span><br />
6. Change the directory and any subdirectories permissions to be owned by apache user (check the directory is correct): <br />
<syntaxhighlight lang="bash"><br />
$ sudo chown -R www-data:www-data /var/lib/maharadata/master_behat<br />
</syntaxhighlight><br />
<br />
* For Ubuntu, apache runs with user www-data<br />
* For Centos, apache runs with user apache<br />
<br />
7. Run Behat tests (change into your Mahara code directory first) as the apache user:<br />
<syntaxhighlight lang="bash"><br />
$ cd<br />
$ cd code/mahara<br />
./test/behat/mahara_behat.sh run<br />
</syntaxhighlight><br />
<br />
Or if you have sudo access:<br />
<syntaxhighlight lang="bash"><br />
$ cd<br />
$ cd code/mahara<br />
sudo -u www-data ./test/behat/mahara_behat.sh run<br />
</syntaxhighlight><br />
<br />
<br />
For the first time of running Behat, you need to wait for the Behat environment initialisation. This can take a while.<br />
<br />
To run all tests:<br />
./test/behat/mahara_behat.sh run<br />
<br />
To run your specific tests marked with @yourtags:<br />
./test/behat/mahara_behat.sh run @yourtags<br />
<br />
To run a particular feature file:<br />
./test/behat/mahara_behat.sh run my_file.feature<br />
<br />
The run / runheadless / rundebug / rundebugheadless / runfresh are interchangable with run in above commands<br />
<br />
[[Category:Behat]]<br />
<br />
== Running Behat tests with html report and screenshots on failed steps ==<br />
<br />
To run tests with html output, add the flag 'html' to your test run command, e.g:<br />
<br />
<syntaxhighlight lang="bash">./test/behat/mahara_behat.sh run create_page.feature html</syntaxhighlight><br />
<br />
This will automatically open an html report of the test run in your browser. If there were failed steps, the the html report plugin takes a screenshot of the page that failed.<br />
You can find the screenshots in your behat dataroot (usually /var/lib/maharadata/master_behat) at the following path:<br />
behat/html_results/<feature title>/<scenario title>.png<br />
<br />
If you set<br />
<br />
$cfg->behat_view_screenshots = true;<br />
<br />
in your config.php file then the images will be opened up in image browser (Ubuntu eog only)<br />
<br />
Hopefully we will rig up the report to link to the screenshot soon.<br />
<br />
== How to Run Mahara behat test on Chrome for versions older than 17.04==<br />
<br />
{{note|Mahara behat is running on chrome driver by default in 17:04+}}<br />
<br />
This is steps for older versions of Mahara<br />
<br />
1. Download chromedriver here http://www.seleniumhq.org/download/ ( download the latest release)<br />
<br />
2. Start selenium Server with chrome driver<br />
<br />
$ java -jar selenium-server-standalone-2.53.1.jar -Dwebdriver.chrome.driver=path of chromedriver<br />
<br />
3. Change the behat.yml file as follows,<br />
<br />
Here is the file path var/lib/maharadata/master_behat/behat.yml<br />
<br />
when you open the beaht.yml file replace the following code with the lines that contain sessions to goutte=NUll( Niranjan or Lovesh can exactly tell you where to replcae the code if it is confusing) and save it<br />
<br />
javascript_session: selenium2<br />
selenium2:<br />
browser: chrome<br />
goutte: ~<br />
<br />
4. Run the behat test without rundebug <br />
<br />
for example ./test/behat/mahara_behat.sh run example.feature<br />
<br />
== Debugging ==<br />
<br />
Go here for tips: https://wiki.mahara.org/wiki/Testing/Behat_Testing/Error_%26_Solutions</div>Robertlhttps://wiki.mahara.org/index.php?title=System_Administrator%27s_Guide/Cron_Job&diff=13268System Administrator's Guide/Cron Job2022-05-19T08:40:37Z<p>Robertl: /* Calling cron.php via the web */</p>
<hr />
<div>Some tasks in Mahara need to be run at scheduled times. This is achieved by use of a '''cron job'''. You set up a job to visit a Mahara script every minute, and it takes care of the rest.<br />
<br />
Some of the jobs it does include:<br />
<br />
* Updating syndicated RSS feeds<br />
* Mailing out forum post updates and other batch notifications<br />
* Cleaning up old files to save space<br />
<br />
<div id="section_1"><br />
<br />
==How to set up the cron job==<br />
<br />
The cron script is <code>lib/cron.php</code>. You need to set up a job to visit this script every minute - either through the web by visiting http://your-mahara-site.org/lib/cron.php, or by the command line, calling php /path/to/mahara/htdocs/lib/cron.php. Both ways have their advantages and disadvantages.<br />
<br />
<div id="section_2"><br />
<br />
===Calling cron.php via the web===<br />
<br />
This is a simple way to get cron going. In your crontab, you need only put a line like this, note you need to add the secreturl value from your config file in:<br />
<br />
<nowiki>* * * * * curl http://your-mahara-site.org/lib/cron.php?urlsecret=mysupersecret &gt;&gt; /dev/null 2&gt;&amp;1</nowiki><br />
<br />
It reads, "every minute, use 'curl' to hit the cron.php script".<br />
<br />
This way is very simple.<br />
<br />
Note: Calling cron.php via the web produces no output to the browser. Output is in the web server error logs, which you don't normally want, but it's better than exposing potentially revealing output to the public.<br />
<br />
Another even more simpler way is using webcron:<br />
<br />
By registering on webcron service site likes https://www.easycron.com, you can add a cron job with URL "http://your-mahara-site.org/lib/cron.php". Your URL will then be called periodically according to your setting, so that your cron.php will get executed.<br />
<br />
</div><div id="section_3"><br />
<br />
===Calling cron.php via the command line===<br />
<br />
This way is slightly more difficult, but allows you to log the cron output separately. The trick is, you have to run the cron job as the web server user, so it has all the rights it needs. You can either do this by installing the cron job into the web server user's crontab, or by installing it into root's crontab with the user field set to the web server user:<br />
<br />
In the web server user's crontab:<br />
<nowiki>sudo crontab -u www-data -e</nowiki><br />
<nowiki>* * * * * php /path/to/mahara/htdocs/lib/cron.php &gt;&gt; /path/to/mahara/cron.log 2&gt;&amp;1</nowiki><br />
<br />
Or, in root's crontab (substitute www-data with the web server user):<br />
<br />
<nowiki>* * * * * www-data php /path/to/mahara/htdocs/lib/cron.php &gt;&gt; /path/to/mahara/cron.log 2&gt;&amp;1<br />
</nowiki><br />
<br />
This way has a couple of caveats:<br />
<br />
* Make sure that the log file can be written to by the web server user. On debian, you could make a directory /var/log/mahara-cron, and chown that to www-data. Then you could make the logfile path /var/log/mahara-cron/cron.log.<br />
* The php.ini used by command line PHP is not the same as the one used by Apache PHP. E.g., in Debian, Apache uses /etc/php5/apache2/php.ini, while the command line PHP uses /etc/php5/cli/php.ini. So either you make sure both of them are the same, or it may make sense to use the -c flag with your PHP call, like so: <nowiki>* * * * * php -c /etc/php5/apache2/php.ini /path/to/mahara/htdocs/lib/cron.php &gt;&gt; /path/to/mahara/cron.log 2&gt;&amp;1</nowiki><br />
* Under some distributions (e.g. Debian), the manner in which extensions are loaded can cause php to Segmentation Fault. This appears to be caused by the php curl module being loaded before the postgres module. You can fix this by moving curl.ini to something lexically later (e.g. Z99_curl.ini).<br />
<br />
</div></div><br />
<br />
===Sample Output===<br />
<br />
(RedHat crontab)<br />
<nowiki>*/30 * * * * php /path/to/mahara/htdocs/lib/cron.php >> /path/to/logfiles/mahara.log 2>&1<br />
<br />
[DBG] b4 (lib/cron.php:45) ---------- cron running Wed, 03 Oct 2012 12:00:02 -0700 ----------<br />
[DBG] b4 (lib/cron.php:90) Running PluginBlocktypeExternalfeed::refresh_feeds<br />
[DBG] b4 (lib/cron.php:90) Running PluginInteractionForum::interaction_forum_new_post<br />
[DBG] b4 (lib/cron.php:146) Running core cron rebuild_artefact_parent_cache_dirty<br />
[DBG] b4 (lib/cron.php:146) Running core cron activity_process_queue<br />
[DBG] b4 (lib/cron.php:146) Running core cron import_process_queue<br />
[DBG] b4 (lib/cron.php:168) ---------- cron finished Wed, 03 Oct 2012 12:00:29 -0700 ----------<br />
</nowiki></div>Robertlhttps://wiki.mahara.org/index.php?title=System_Administrator%27s_Guide/Cron_Job&diff=13267System Administrator's Guide/Cron Job2022-05-19T08:39:00Z<p>Robertl: /* Calling cron.php via the command line */</p>
<hr />
<div>Some tasks in Mahara need to be run at scheduled times. This is achieved by use of a '''cron job'''. You set up a job to visit a Mahara script every minute, and it takes care of the rest.<br />
<br />
Some of the jobs it does include:<br />
<br />
* Updating syndicated RSS feeds<br />
* Mailing out forum post updates and other batch notifications<br />
* Cleaning up old files to save space<br />
<br />
<div id="section_1"><br />
<br />
==How to set up the cron job==<br />
<br />
The cron script is <code>lib/cron.php</code>. You need to set up a job to visit this script every minute - either through the web by visiting http://your-mahara-site.org/lib/cron.php, or by the command line, calling php /path/to/mahara/htdocs/lib/cron.php. Both ways have their advantages and disadvantages.<br />
<br />
<div id="section_2"><br />
<br />
===Calling cron.php via the web===<br />
<br />
This is a simple way to get cron going. In your crontab, you need only put a line like this:<br />
<br />
<nowiki>* * * * * curl http://your-mahara-site.org/lib/cron.php &gt;&gt; /dev/null 2&gt;&amp;1</nowiki><br />
<br />
It reads, "every minute, use 'curl' to hit the cron.php script".<br />
<br />
This way is very simple.<br />
<br />
Note: Calling cron.php via the web produces no output to the browser. Output is in the web server error logs, which you don't normally want, but it's better than exposing potentially revealing output to the public.<br />
<br />
Another even more simpler way is using webcron:<br />
<br />
By registering on webcron service site likes https://www.easycron.com, you can add a cron job with URL "http://your-mahara-site.org/lib/cron.php". Your URL will then be called periodically according to your setting, so that your cron.php will get executed.<br />
<br />
</div><div id="section_3"><br />
<br />
===Calling cron.php via the command line===<br />
<br />
This way is slightly more difficult, but allows you to log the cron output separately. The trick is, you have to run the cron job as the web server user, so it has all the rights it needs. You can either do this by installing the cron job into the web server user's crontab, or by installing it into root's crontab with the user field set to the web server user:<br />
<br />
In the web server user's crontab:<br />
<nowiki>sudo crontab -u www-data -e</nowiki><br />
<nowiki>* * * * * php /path/to/mahara/htdocs/lib/cron.php &gt;&gt; /path/to/mahara/cron.log 2&gt;&amp;1</nowiki><br />
<br />
Or, in root's crontab (substitute www-data with the web server user):<br />
<br />
<nowiki>* * * * * www-data php /path/to/mahara/htdocs/lib/cron.php &gt;&gt; /path/to/mahara/cron.log 2&gt;&amp;1<br />
</nowiki><br />
<br />
This way has a couple of caveats:<br />
<br />
* Make sure that the log file can be written to by the web server user. On debian, you could make a directory /var/log/mahara-cron, and chown that to www-data. Then you could make the logfile path /var/log/mahara-cron/cron.log.<br />
* The php.ini used by command line PHP is not the same as the one used by Apache PHP. E.g., in Debian, Apache uses /etc/php5/apache2/php.ini, while the command line PHP uses /etc/php5/cli/php.ini. So either you make sure both of them are the same, or it may make sense to use the -c flag with your PHP call, like so: <nowiki>* * * * * php -c /etc/php5/apache2/php.ini /path/to/mahara/htdocs/lib/cron.php &gt;&gt; /path/to/mahara/cron.log 2&gt;&amp;1</nowiki><br />
* Under some distributions (e.g. Debian), the manner in which extensions are loaded can cause php to Segmentation Fault. This appears to be caused by the php curl module being loaded before the postgres module. You can fix this by moving curl.ini to something lexically later (e.g. Z99_curl.ini).<br />
<br />
</div></div><br />
<br />
===Sample Output===<br />
<br />
(RedHat crontab)<br />
<nowiki>*/30 * * * * php /path/to/mahara/htdocs/lib/cron.php >> /path/to/logfiles/mahara.log 2>&1<br />
<br />
[DBG] b4 (lib/cron.php:45) ---------- cron running Wed, 03 Oct 2012 12:00:02 -0700 ----------<br />
[DBG] b4 (lib/cron.php:90) Running PluginBlocktypeExternalfeed::refresh_feeds<br />
[DBG] b4 (lib/cron.php:90) Running PluginInteractionForum::interaction_forum_new_post<br />
[DBG] b4 (lib/cron.php:146) Running core cron rebuild_artefact_parent_cache_dirty<br />
[DBG] b4 (lib/cron.php:146) Running core cron activity_process_queue<br />
[DBG] b4 (lib/cron.php:146) Running core cron import_process_queue<br />
[DBG] b4 (lib/cron.php:168) ---------- cron finished Wed, 03 Oct 2012 12:00:29 -0700 ----------<br />
</nowiki></div>Robertlhttps://wiki.mahara.org/index.php?title=User:Gold/PHP_8_Scratchpad&diff=13251User:Gold/PHP 8 Scratchpad2022-05-16T02:23:17Z<p>Robertl: /* Behat & PHPUnit testing */</p>
<hr />
<div>Just a place to scratch out thoughts on how to measure progress on PHP8 compliance that will give us some confidence and a sense of progress.<br />
<br />
== How to start ==<br />
We need to be able to measure what is not currently working.<br />
<br />
=== Behat & PHPUnit testing ===<br />
We currently use this quite a bit. I would propose that we start with these as the initial measurement tool.<br />
<br />
This would mean that we first need to get the behat tests to test using the target version of PHP. Then run the tests and assume that all failures are related to PHP8 non-compliance.<br />
<br />
PHPUnit will need to be updated so it is compatible with PHP 8.1 -> I note PHPUnit supports PHP 8.0 starting from version 9.3.0.<br />
<br />
=== Other tools ===<br />
All tools have an option to specifically test for PHP 8.1.<br />
<br />
* [https://github.com/phan/phan Phan] - Static analysis that prefers to prove incorrectness rather than correctness and minimize false-positives.<br />
* [https://github.com/PHPCompatibility/PHPCompatibility PHPCompatibility] is an extension for [https://github.com/squizlabs/PHP_CodeSniffer PHP_CodeSniffer].<br />
* [https://github.com/wunderio/grumphp-php-compatibility grumphp-php-compatibility] is an extension of PHPCompatibility that allows it to word with [https://github.com/phpro/grumphp GrumPHP] (aka Bad Santa).<br />
<br />
== How to work ==<br />
=== Development Environment ===<br />
I'm going to maintain a single codebase to work from for this. I'll set up Apache to host 2 sites from it. One running on PHP 7.4 and the other on PHP 8.1. This will give the opportunity to test things in the browser in a very quick and simple manner. They will have a shared config so they'll have the same DB and maharadata area.<br />
<br />
=== Committing code ===<br />
I want this to be a quick, rapid process. A large number of very small patchsets. Each resolving a single Behat test.<br />
<br />
The commit message on a patchset will need to be small and concise. Ideally, just a reference to the behat test that this patchset fixes.<br />
<br />
There will be edge cases. I see these being where a fix on one test cascades out to multiple other tests and/or areas of Mahara. In these cases the commit message will need to be more comprehensive.<br />
<br />
== Measurement ==<br />
Once we have an idea of the amount of work we will have an idea on what is needed.<br />
<br />
=== Reporting ===<br />
If the number is large(ish) I'd like to add a dashboard or chatbot that reports on the progress.<br />
<br />
==== Code analysis ====<br />
A number of the Code Analysis tools have an option to output their findings in a machine readable format. These could be used in the reporting also.<br />
<br />
==== Gerrit ====<br />
Providing tags on patchsets are consistent we should be able to have a script search and scrape numbers from the Gerrit API. It is looking like this will be a simple thing. e.g. curl https://reviews.mahara.org/changes/?q=status:merged+topic:PHPStan<br />
<br />
Having looked at search options it looks like 'intopic' is preferred over 'topic' as we have multiple tags in this field. I also see that 'PHP8' has been used a few times already. I would suggest 'PHP8Compat' as the tag to use to make filtering easier to spot for this task.</div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Common_issues&diff=13245Developer Area/Common issues2022-05-11T23:25:49Z<p>Robertl: </p>
<hr />
<div>===Elastic search triggers not dropped properly===<br />
<br />
At the moment we use DB triggers for elastic search updates, but we're looking into a better alternative. While we're working on it, some people might have this problem.<br />
<br />
====PROBLEM====<br />
DB postgres.<br />
Having elastic search set up on the site.<br />
While running cron, we have an error that looks like this:<br />
-5: ERROR: trigger "search_elasticsearch_interaction_forum_post" for relation "interaction_forum_post" already exists] in EXECUTE("CREATE TRIGGER "search_elasticsearch_interaction_forum_post" BEFORE INSERT OR UPDATE OR DELETE ON "interaction_forum_post"<br />
<br />
This means the cron got stuck while trying to drop/re-create the triggers.<br />
<br />
====SOLUTION====<br />
We need to manually remove the trigger that was not dropped. And also check if we need to delete the record in pg_depend table.<br />
<br />
#search for the trigger name in pg_trigger table<br />
<br />
select oid,tgname,tgfoid from pg_trigger where tgname ='search_elasticsearch_interaction_forum_post';<br />
<br />
#with that result, if there's a record in pg_depend where pg_depend.refobjid=pg_trigger.tgfoid and pg_depend.objid=pg_trigger.oid, then delete it<br />
#delete the trigger with name 'search_elasticsearch_interaction_forum_post'<br />
<br />
=====This is how the tables should look like when everything's ok:=====<br />
<br />
'''select oid,tgname,tgfoid from pg_trigger where tgname like '%elastic%';'''<br />
oid | tgname | tgfoid <br />
14471173 | search_elasticsearch_usr | 14471170<br />
14471174 | search_elasticsearch_interaction_instance | 14471170<br />
14471175 | search_elasticsearch_interaction_forum_post | 14471170<br />
14471176 | search_elasticsearch_group | 14471170<br />
14471177 | search_elasticsearch_view | 14471170<br />
14471178 | search_elasticsearch_artefact | 14471171<br />
14471179 | search_elasticsearch_view_artefact | 14471172<br />
14471180 | search_elasticsearch_block_instance | 14471170<br />
14471181 | search_elasticsearch_collection | 14471170<br />
<br />
'''select objid,refobjid from pg_depend where refobjid in (14471170,14471171,14471172);'''<br />
objid | refobjid <br />
14471173 | 14471170 <br />
14471174 | 14471170 <br />
14471175 | 14471170 <br />
14471176 | 14471170 <br />
14471177 | 14471170 <br />
14471178 | 14471171 <br />
14471179 | 14471172 <br />
14471180 | 14471170 <br />
14471181 | 14471170 <br />
<br />
'''select oid,proname from pg_proc where proname like '%elas%';'''<br />
oid | proname <br />
14471170 | search_elasticsearch_queue_trigger<br />
14471171 | search_elasticsearch_queue_artefact_trigger<br />
14471172 | search_elasticsearch_queue2_trigger<br />
<br />
===PDF export===<br />
<br />
====Chrome / Chromium installed via Snap====<br />
When the PDF export process was implemented it worked in Ubuntu because Chromium Browser was installed via apt-get. But then later Chromium was installed via Snap or apt-get. And later still via Snap only.<br />
<br />
If your system installs Chromium via snap then to get Chrome-php to work you will need to adjust a couple of things because Snap will only create folders in a /home/ dir path and www-data has it's default home directory in /var/www/<br />
<br />
So to get around this problem we can update the home directory for 'www-data' user.<br />
But keep in mind you are changing the Ubuntu Apache defaults and it may break some things in your setup from working.<br />
<br />
'''TRY AT YOUR OWN RISK !!!!'''<br />
<br />
1) As 'root' user - create a new directory in /home/ called 'www-data' with the following permissions: 755<br />
<br />
2) Go into the /home/www-data/ directory and create a new directory called 'snap' that is owned by 'www-data' and permissions: 755<br />
<br />
3) Update the path to www-data home directory: sudo usermod -d /home/www-data www-data<br />
<br />
You may need to restart the machine<br />
<br />
Then when you try and do an export with PDF Export active it should now work!</div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Common_issues&diff=13244Developer Area/Common issues2022-05-11T23:19:52Z<p>Robertl: </p>
<hr />
<div>===Elastic search triggers not dropped properly===<br />
<br />
At the moment we use DB triggers for elastic search updates, but we're looking into a better alternative. While we're working on it, some people might have this problem.<br />
<br />
====PROBLEM====<br />
DB postgres.<br />
Having elastic search set up on the site.<br />
While running cron, we have an error that looks like this:<br />
-5: ERROR: trigger "search_elasticsearch_interaction_forum_post" for relation "interaction_forum_post" already exists] in EXECUTE("CREATE TRIGGER "search_elasticsearch_interaction_forum_post" BEFORE INSERT OR UPDATE OR DELETE ON "interaction_forum_post"<br />
<br />
This means the cron got stuck while trying to drop/re-create the triggers.<br />
<br />
====SOLUTION====<br />
We need to manually remove the trigger that was not dropped. And also check if we need to delete the record in pg_depend table.<br />
<br />
#search for the trigger name in pg_trigger table<br />
<br />
select oid,tgname,tgfoid from pg_trigger where tgname ='search_elasticsearch_interaction_forum_post';<br />
<br />
#with that result, if there's a record in pg_depend where pg_depend.refobjid=pg_trigger.tgfoid and pg_depend.objid=pg_trigger.oid, then delete it<br />
#delete the trigger with name 'search_elasticsearch_interaction_forum_post'<br />
<br />
=====This is how the tables should look like when everything's ok:=====<br />
<br />
'''select oid,tgname,tgfoid from pg_trigger where tgname like '%elastic%';'''<br />
oid | tgname | tgfoid <br />
14471173 | search_elasticsearch_usr | 14471170<br />
14471174 | search_elasticsearch_interaction_instance | 14471170<br />
14471175 | search_elasticsearch_interaction_forum_post | 14471170<br />
14471176 | search_elasticsearch_group | 14471170<br />
14471177 | search_elasticsearch_view | 14471170<br />
14471178 | search_elasticsearch_artefact | 14471171<br />
14471179 | search_elasticsearch_view_artefact | 14471172<br />
14471180 | search_elasticsearch_block_instance | 14471170<br />
14471181 | search_elasticsearch_collection | 14471170<br />
<br />
'''select objid,refobjid from pg_depend where refobjid in (14471170,14471171,14471172);'''<br />
objid | refobjid <br />
14471173 | 14471170 <br />
14471174 | 14471170 <br />
14471175 | 14471170 <br />
14471176 | 14471170 <br />
14471177 | 14471170 <br />
14471178 | 14471171 <br />
14471179 | 14471172 <br />
14471180 | 14471170 <br />
14471181 | 14471170 <br />
<br />
'''select oid,proname from pg_proc where proname like '%elas%';'''<br />
oid | proname <br />
14471170 | search_elasticsearch_queue_trigger<br />
14471171 | search_elasticsearch_queue_artefact_trigger<br />
14471172 | search_elasticsearch_queue2_trigger<br />
<br />
=== PDF export ===<br />
<br />
==== Chrome / Chromium installed via Snap ====<br />
When the PDF export process was implemented it worked in Ubuntu because Chromium Browser was installed via apt-get. But then later Chromium was installed via Snap or apt-get. And later still via Snap only.<br />
<br />
If your system installs Chromium via snap then to get Chrome-php to work you will need to adjust a couple of things because Snap will only create folders in a /home/ dir path and www-data has it's default home directory in /var/www/<br />
<br />
So to get around this problem we can update the home directory for 'www-data' user.<br />
But keep in mind you are changing the Ubuntu Apache defaults and it may break some things in your setup from working.<br />
<br />
TRY AT YOUR OWN RISK<br />
<br />
1) As 'root' user - create a new directory in /home/ called 'www-data' with the following permissions: 755<br />
2) Go into the /home/www-data/ directory and create a new directory called 'snap' that is owned by 'www-data' and permissions: 755<br />
3) Update the path to www-data home directory: sudo usermod -d /home/www-data www-data<br />
<br />
You may need to restart the machine<br />
<br />
Then when you try and do an export with Pdfexport active it should work!</div>Robertlhttps://wiki.mahara.org/index.php?title=Releases&diff=13099Releases2022-05-02T02:29:26Z<p>Robertl: /* Current and upcoming releases */</p>
<hr />
<div>=Release cycle and version support=<br />
<p>A new major version of Mahara is released every 6 months, in April and October. The version numbers reflect the year and the month in which a version was released. See [[Developer_Area/Version_Numbering_Policy|Version Numbering Policy]] for more details.<br><br />
<br />
{| class="wikitable" style="padding:0em; text-align:left" summary="Mahara's six monthly cycle for April and October releases."<br />
! scope="col" style="text-align:left; background-color:#566d31; color:#fff;" |Release cycle<br />
! scope="col" style="text-align:left;" |Nov - Apr<br />
! scope="col" style="text-align:left;" |May - Oct<br />
|-<br />
! scope="row" style="text-align:left;" |Feature freeze<br />
| style="background-color:#fff;" |Early February<br />
| style="background-color:#fff;" |Early August<br />
|-<br />
! scope="row" style="text-align:left;" |UI freeze<br />
| style="background-color:#fff;" |Early March<br />
| style="background-color:#fff;" |Early September<br />
|-<br />
! scope="row" style="text-align:left;" |Release candidate<br />
| style="background-color:#fff;" |Mid March<br />
| style="background-color:#fff;" |Mid September<br />
|-<br />
! scope="row" style="text-align:left;" |Official release<br />
| style="background-color:#fff;" |Late April<br />
| style="background-color:#fff;" |Late October<br />
|-<br />
|}<br />
<ul><br />
<li> Each release has 16 weeks before feature freeze.</li><br />
<li>For each release, We've put feature freeze at a month before the release candidate. Only non-feature bug fixes will be committed after this </li><br />
<li>The week before the release candidates is a UI freeze. This is a freeze to string changes and theme changes. String or UI fixes will need to be at least high importance.</li><br />
</ul></p><br />
<p></p><br />
<p><strong>The standard support lifetime of a major version is 18 months (3 release cycles):</strong><br><br />
<ul><br />
<li>Receives bug fixes and security fixes for the first 6 months</li><br />
<li>Receives security fixes only, for an additional 12 months</li><br />
</ul><br />
In the event that a major release substantially breaks backwards compatibility, we may declare the previous release to be an extended support release which will receive security fixes for 30 months (5 release cycles), in order to give sites more time to upgrade.</p><br />
<br />
=Older releases (pre Mahara 1.6)=<br />
<br />
Prior to Mahara 1.6, Mahara major versions were released as needed, according to no particular schedule. During the transition period to the 6 month release cycle, support for the older releases was provided for 2 release cycles.<br />
<br />
=Current and upcoming releases=<br />
<p>The latest <strong>stable</strong> version of Mahara is 22.04, released on 27 April 2022.</p><br />
<br />
<p>'''Note:''' This page is updated manually, and sometimes falls behind. For 100% up-to-date information, look for the release labelled "Current Stable Release" on our [https://launchpad.net/mahara/+series Launchpad release page], or use the "Download" link on the front page of https://mahara.org</p><br />
<br />
{| class="wikitable"<br />
| style="background:#ba2025; color:#fff" |Unsupported<br />
| style="background:#566d31; color:#fff" |Currently in support<br />
|Not yet released<br />
|}<br />
<br />
<!-- This is the template for the table sections below<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff"|'''[https://mahara.org/interaction/forum/topic.php?id= Major point release number]'''<br />
|<br />
* [https://launchpad.net/mahara/ Minor point release number]<br />
| '''Major point release date''' <br><br />
* Minor point release dates<br />
| style="background:#566d31; color:#fff" | End of support date<br />
|-<br />
--><br />
<br />
{| class="wikitable" summary="Release notes for major and minor versions of Mahara, official release dates and version support end date. Versions are listed in reverse chronological order. Table is four columns wide and 22 rows deep."<br />
|+ style="text-align:left;" |Mahara release notes and end of support<br />
|-<br />
! style="text-align:left;" |Major release<br />
! style="text-align:left;" |Minor release<br />
! style="text-align:left;" |Release date<br />
! style="text-align:left;" |End of support<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=9097 22.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/22.04.0#release-notes 22.04.0]<br />
|'''27 April 2022'''<br />
| style="background:#566d31; color:#fff" |October 2023<br />
|-<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8955 21.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/21.10.3#release-notes 21.10.3]<br />
*[https://launchpad.net/mahara/+milestone/21.10.2#release-notes 21.10.2]<br />
*[https://launchpad.net/mahara/+milestone/21.10.1#release-notes 21.10.1]<br />
*[https://launchpad.net/mahara/+milestone/21.10.0#release-notes 21.10.0]<br />
|'''29 October 2021''' <br><br />
<br />
*2 May 2022<br />
*27 April 2022<br />
*9 February 2022<br />
*29 October 2021<br />
| style="background:#566d31; color:#fff" |April 2023<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8817 21.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/21.04.4#release-notes 21.04.4]<br />
*[https://launchpad.net/mahara/+milestone/21.04.3#release-notes 21.04.3]<br />
*[https://launchpad.net/mahara/+milestone/21.04.2#release-notes 21.04.2]<br />
*[https://launchpad.net/mahara/+milestone/21.04.1#release-notes 21.04.1]<br />
*[https://launchpad.net/mahara/+milestone/21.04.0#release-notes 21.04.0]<br />
|'''30 April 2021''' <br><br />
<br />
*27 April 2022<br />
*9 February 2022<br />
*29 October 2021<br />
*21 May 2021<br />
*30 April 2021<br />
| style="background:#566d31; color:#fff" |October 2022<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8728 20.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/20.10.6#release-notes 20.10.6]<br />
*[https://launchpad.net/mahara/+milestone/20.10.5#release-notes 20.10.5]<br />
*[https://launchpad.net/mahara/+milestone/20.10.4#release-notes 20.10.4]<br />
*[https://launchpad.net/mahara/+milestone/20.10.3#release-notes 20.10.3]<br />
*[https://launchpad.net/mahara/+milestone/20.10.2#release-notes 20.10.2]<br />
*[https://launchpad.net/mahara/+milestone/20.10.1#release-notes 20.10.1]<br />
*[https://launchpad.net/mahara/+milestone/20.10.0#release-notes 20.10.0]<br />
|'''22 October 2020'''<br><br />
<br />
*2 May 2022<br />
*27 April 2022<br />
*9 February 2022<br />
*29 October 2021<br />
*21 May 2021<br />
*4 May 2021<br />
*22 October 2020<br />
| style="background:#ba2025; color:#fff" |April 2022 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8611 20.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/20.04.5#release-notes 20.04.5]<br />
*[https://launchpad.net/mahara/+milestone/20.04.4#release-notes 20.04.4]<br />
*[https://launchpad.net/mahara/+milestone/20.04.3#release-notes 20.04.3]<br />
*[https://launchpad.net/mahara/+milestone/20.04.2#release-notes 20.04.2]<br />
*[https://launchpad.net/mahara/+milestone/20.04.1#release-notes 20.04.1]<br />
*[https://launchpad.net/mahara/20.04/20.04.0#release-notes 20.04.0]<br />
|'''29 April 2020'''<br><br />
<br />
*29 October 2021<br />
*22 May 2021<br />
*4 May 2021<br />
*22 October 2020<br />
*4 August 2020<br />
*29 April 2020<br />
| style="background:#ba2025; color:#fff" |October 2021 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8533 19.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/19.10.6#releasenotes 19.10.6]<br />
*[https://launchpad.net/mahara/+milestone/19.10.5#releasenotes 19.10.5]<br />
*[https://launchpad.net/mahara/+milestone/19.10.4#release-notes 19.10.4]<br />
*[https://launchpad.net/mahara/+milestone/19.10.3#release-notes 19.10.3]<br />
*[https://launchpad.net/mahara/+milestone/19.10.2#release-notes 19.10.2]<br />
*[https://launchpad.net/mahara/19.10/19.10.1#release-notes 19.10.1]<br />
*[https://launchpad.net/mahara/19.10/19.10.0#release-notes 19.10.0]<br />
|'''31 October 2019''' <br><br />
<br />
*4 May 2021<br />
*22 October 2020<br />
*4 August 2020<br />
*30 April 2020<br />
*4 April 2020<br />
*12 November 2019<br />
*31 October 2019<br />
| style="background:#ba2025; color:#fff" |April 2021 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8444 19.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/19.04/19.04.5#release-notes 19.04.5]<br />
*[https://launchpad.net/mahara/19.04/19.04.4#release-notes 19.04.4]<br />
*[https://launchpad.net/mahara/19.04/19.04.3#release-notes 19.04.3]<br />
*[https://launchpad.net/mahara/19.04/19.04.2#release-notes 19.04.2]<br />
*[https://launchpad.net/mahara/19.04/19.04.1#release-notes 19.04.1]<br />
*[https://launchpad.net/mahara/19.04/19.04.0#release-notes 19.04.0]<br />
|'''30 April 2019''' <br><br />
<br />
*30 April 2020<br />
*4 March 2020<br />
*12 November 2019<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
| style="background:#ba2025; color:#fff" |October 2020 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8365 18.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/18.10/18.10.6#release-notes 18.10.6]<br />
*[https://launchpad.net/mahara/18.10/18.10.5#release-notes 18.10.5]<br />
*[https://launchpad.net/mahara/18.10/18.10.4#release-notes 18.10.4]<br />
*[https://launchpad.net/mahara/18.10/18.10.3#release-notes 18.10.3]<br />
*[https://launchpad.net/mahara/18.10/18.10.2#release-notes 18.10.2]<br />
*[https://launchpad.net/mahara/18.10/18.10.1#release-notes 18.10.1]<br />
*[https://launchpad.net/mahara/18.10/18.10.0#release-notes 18.10.0]<br />
|'''25 October 2018''' <br><br />
<br />
*30 April 2020<br />
*4 March 2020<br />
*12 November 2019<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
*25 October 2018<br />
| style="background:#ba2025; color:#fff" |April 2020 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8216 18.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/18.04/18.04.6#release-notes 18.04.6]<br />
*[https://launchpad.net/mahara/18.04/18.04.5#release-notes 18.04.5]<br />
*[https://launchpad.net/mahara/18.04/18.04.4#release-notes 18.04.4]<br />
*[https://launchpad.net/mahara/18.04/18.04.3#release-notes 18.04.3]<br />
*[https://launchpad.net/mahara/18.04/18.04.2#release-notes 18.04.2]<br />
*[https://launchpad.net/mahara/18.04/18.04.1#release-notes 18.04.1]<br />
*[https://launchpad.net/mahara/18.04/18.04.0#release-notes 18.04.0]<br />
|'''6 April 2018''' <br><br />
<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
| style="background:#ba2025; color:#fff" |October 2019 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8084 17.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/17.10/17.10.9#release-notes 17.10.9]<br />
*[https://launchpad.net/mahara/17.10/17.10.8#release-notes 17.10.8]<br />
*[https://launchpad.net/mahara/17.10/17.10.7#release-notes 17.10.7]<br />
*[https://launchpad.net/mahara/17.10/17.10.6#release-notes 17.10.6]<br />
*[https://launchpad.net/mahara/17.10/17.10.5#release-notes 17.10.5]<br />
*[https://launchpad.net/mahara/17.10/17.10.4#release-notes 17.10.4]<br />
*[https://launchpad.net/mahara/17.10/17.10.3#release-notes 17.10.3]<br />
*[https://launchpad.net/mahara/17.10/17.10.2#release-notes 17.10.2]<br />
*[https://launchpad.net/mahara/17.10/17.10.1#release-notes 17.10.1]<br />
*[https://launchpad.net/mahara/17.10/17.10.0#release-notes 17.10.0]<br />
|'''30 October 2017''' <br><br />
<br />
*30 April 2019<br />
*30 April 2019<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*14 December 2017<br />
*30 October 2017<br />
| style="background:#ba2025; color:#fff;" |30 April 2019 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7926 17.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/17.04/17.04.10#release-notes 17.04.10]<br />
*[https://launchpad.net/mahara/17.04/17.04.9#release-notes 17.04.9]<br />
*[https://launchpad.net/mahara/17.04/17.04.8#release-notes 17.04.8]<br />
*[https://launchpad.net/mahara/17.04/17.04.7#release-notes 17.04.7]<br />
*[https://launchpad.net/mahara/17.04/17.04.6#release-notes 17.04.6]<br />
*[https://launchpad.net/mahara/17.04/17.04.5#release-notes 17.04.5]<br />
*[https://launchpad.net/mahara/17.04/17.04.4#release-notes 17.04.4]<br />
*[https://launchpad.net/mahara/17.04/17.04.3#release-notes 17.04.3]<br />
*[https://launchpad.net/mahara/17.04/17.04.2#release-notes 17.04.2]<br />
*[https://launchpad.net/mahara/17.04/17.04.1#release-notes 17.04.1]<br />
*[https://launchpad.net/mahara/17.04/17.04.0#release-notes 17.04.0]<br />
|'''27 April 2017''' <br><br />
<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*12 May 2017<br />
*27 April 2017<br />
| style="background:#ba2025; color:#fff" |25 October 2018 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7750 16.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/16.10/16.10.9#release-notes 16.10.9]<br />
*[https://launchpad.net/mahara/16.10/16.10.8#release-notes 16.10.8]<br />
*[https://launchpad.net/mahara/16.10/16.10.7#release-notes 16.10.7]<br />
*[https://launchpad.net/mahara/16.10/16.10.6#release-notes 16.10.6]<br />
*[https://launchpad.net/mahara/16.10/16.10.5#release-notes 16.10.5]<br />
*[https://launchpad.net/mahara/16.10/16.10.4#release-notes 16.10.4]<br />
*[https://launchpad.net/mahara/16.10/16.10.3#release-notes 16.10.3]<br />
*[https://launchpad.net/mahara/16.10/16.10.2#release-notes 16.10.2]<br />
*[https://launchpad.net/mahara/16.10/16.10.1#release-notes 16.10.1]<br />
*[https://launchpad.net/mahara/16.10/16.10.0#release-notes 16.10.0]<br />
|'''21 October 2016''' <br><br />
<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*13 December 2016<br />
*21 October 2016<br />
| style="background:#ba2025; color:#fff" |06 April 2018 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7585 16.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/16.04/16.04.9#release-notes 16.04.9]<br />
*[https://launchpad.net/mahara/16.04/16.04.8#release-notes 16.04.8]<br />
*[https://launchpad.net/mahara/16.04/16.04.7#release-notes 16.04.7]<br />
*[https://launchpad.net/mahara/16.04/16.04.6#release-notes 16.04.6]<br />
*[https://launchpad.net/mahara/16.04/16.04.5#release-notes 16.04.5]<br />
*[https://launchpad.net/mahara/16.04/16.04.4#release-notes 16.04.4]<br />
*[https://launchpad.net/mahara/16.04/16.04.3#release-notes 16.04.3]<br />
*[https://launchpad.net/mahara/16.04/16.04.2#release-notes 16.04.2]<br />
*[https://launchpad.net/mahara/16.04/16.04.1#release-notes 16.04.1]<br />
*[https://launchpad.net/mahara/16.04/16.04.0#release-notes 16.04.0]<br />
|'''28 April 2016''' <br><br />
<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*11 July 2016<br />
*9 June 2016<br />
*28 April 2016<br />
| style="background:#ba2025; color:#fff" |30 October 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7420 15.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/15.10/15.10.8#release-notes 15.10.8]<br />
*[https://launchpad.net/mahara/15.10/15.10.7#release-notes 15.10.7]<br />
*[https://launchpad.net/mahara/15.10/15.10.6#release-notes 15.10.6]<br />
*[https://launchpad.net/mahara/15.10/15.10.5#release-notes 15.10.5]<br />
*[https://launchpad.net/mahara/15.10/15.10.4#release-notes 15.10.4]<br />
*[https://launchpad.net/mahara/15.10/15.10.3#release-notes 15.10.3]<br />
*[https://launchpad.net/mahara/15.10/15.10.2#release-notes 15.10.2]<br />
*[https://launchpad.net/mahara/15.10/15.10.1#release-notes 15.10.1]<br />
*[https://launchpad.net/mahara/15.10/15.10.0#release-notes 15.10.0]<br />
|'''23 October 2015''' <br><br />
<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*11 July 2016<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*23 October 2015<br />
| style="background:#ba2025; color:#fff" |26 April 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7171 15.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/15.04/15.04.15#release-notes 15.04.15]<br />
*[https://launchpad.net/mahara/15.04/15.04.14#release-notes 15.04.14]<br />
*[https://launchpad.net/mahara/15.04/15.04.13#release-notes 15.04.13]<br />
*[https://launchpad.net/mahara/15.04/15.04.12#release-notes 15.04.12]<br />
*[https://launchpad.net/mahara/15.04/15.04.11#release-notes 15.04.11]<br />
*[https://launchpad.net/mahara/15.04/15.04.10#release-notes 15.04.10]<br />
*[https://launchpad.net/mahara/15.04/15.04.9#release-notes 15.04.9]<br />
*[https://launchpad.net/mahara/15.04/15.04.8#release-notes 15.04.8]<br />
*[https://launchpad.net/mahara/15.04/15.04.7#release-notes 15.04.7]<br />
*[https://launchpad.net/mahara/15.04/15.04.6#release-notes 15.04.6]<br />
*[https://launchpad.net/mahara/15.04/15.04.5#release-notes 15.04.5]<br />
*[https://launchpad.net/mahara/15.04/15.04.4#release-notes 15.04.4]<br />
*[https://launchpad.net/mahara/15.04/15.04.3#release-notes 15.04.3]<br />
*[https://launchpad.net/mahara/15.04/15.04.2#release-notes 15.04.2]<br />
*[https://launchpad.net/mahara/15.04/15.04.1#release-notes 15.04.1]<br />
*[https://launchpad.net/mahara/15.04/15.04.0#release-notes 15.04.0]<br />
|'''23 October 2015''' <br><br />
<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*12 July 2016<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*29 May 2015<br />
*17 April 2015<br />
| style="background:#ba2025; color:#fff" |30 October 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=6509 1.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.10/1.10.10#release-notes 1.10.10]<br />
*[https://launchpad.net/mahara/1.10/1.10.9#release-notes 1.10.9]<br />
*[https://launchpad.net/mahara/1.10/1.10.8#release-notes 1.10.8]<br />
*[https://launchpad.net/mahara/1.10/1.10.7#release-notes 1.10.7]<br />
*[https://launchpad.net/mahara/1.10/1.10.6#release-notes 1.10.6]<br />
*[https://launchpad.net/mahara/1.10/1.10.5#release-notes 1.10.5]<br />
*[https://launchpad.net/mahara/1.10/1.10.4#release-notes 1.10.4]<br />
*[https://launchpad.net/mahara/1.10/1.10.3#release-notes 1.10.3]<br />
*[https://launchpad.net/mahara/1.10/1.10.2#release-notes 1.10.2]<br />
*[https://launchpad.net/mahara/1.10/1.10.1#release-notes 1.10.1]<br />
*[https://launchpad.net/mahara/1.10/1.10.0#release-notes 1.10.0]<br />
|'''21 October 2014''' <br><br />
<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*29 May 2015<br />
*20 April 2015<br />
*13 January 2015<br />
*26 November 2014<br />
*21 October 2014<br />
| style="background:#ba2025; color:#fff" |2 May 2016 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=6254 1.9]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.9/1.9.9#release-notes 1.9.9]<br />
*[https://launchpad.net/mahara/1.9/1.9.8#release-notes 1.9.8]<br />
*[https://launchpad.net/mahara/1.9/1.9.7#release-notes 1.9.7]<br />
*[https://launchpad.net/mahara/1.9/1.9.6#release-notes 1.9.6]<br />
*[https://launchpad.net/mahara/1.9/1.9.5#release-notes 1.9.5]<br />
*[https://launchpad.net/mahara/1.9/1.9.4#release-notes 1.9.4]<br />
*[https://launchpad.net/mahara/1.9/1.9.3#release-notes 1.9.3]<br />
*[https://launchpad.net/mahara/1.9/1.9.2#release-notes 1.9.2]<br />
*[https://launchpad.net/mahara/1.9/1.9.1#release-notes 1.9.1]<br />
*[https://launchpad.net/mahara/1.9/1.9.0#release-notes 1.9.0]<br />
|'''15 April 2014''' <br><br />
<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*26 November 2014<br />
*22 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*15 April 2014<br />
| style="background:#ba2025; color:#fff" |27 October 2015 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=5833 1.8]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.8/1.8.7#release-notes 1.8.7]<br />
*[https://launchpad.net/mahara/1.8/1.8.6#release-notes 1.8.6]<br />
*[https://launchpad.net/mahara/1.8/1.8.5#release-notes 1.8.5]<br />
*[https://launchpad.net/mahara/1.8/1.8.4#release-notes 1.8.4]<br />
*[https://launchpad.net/mahara/1.8/1.8.3#release-notes 1.8.3]<br />
*[https://launchpad.net/mahara/1.8/1.8.2#release-notes 1.8.2]<br />
*[https://launchpad.net/mahara/1.8/1.8.1#release-notes 1.8.1]<br />
*[https://launchpad.net/mahara/1.8/1.8.0#release-notes 1.8.0]<br />
|'''24 October 2013''' <br><br />
<br />
*20 April 2015<br />
*26 November 2014<br />
*22 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*3 April 2014<br />
*18 December 2013<br />
*24 October 2013<br />
| style="background:#ba2025; color:#fff" |20 April 2015 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=5371 1.7]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.7/1.7.8#release-notes 1.7.8]<br />
*[https://launchpad.net/mahara/1.7/1.7.7#release-notes 1.7.7]<br />
*[https://launchpad.net/mahara/1.7/1.7.6#release-notes 1.7.6]<br />
*[https://launchpad.net/mahara/1.7/1.7.5#release-notes 1.7.5]<br />
*[https://launchpad.net/mahara/1.7/1.7.4#release-notes 1.7.4]<br />
*[https://launchpad.net/mahara/1.7/1.7.3#release-notes 1.7.3]<br />
*[https://launchpad.net/mahara/1.7/1.7.2#release-notes 1.7.2]<br />
*[https://launchpad.net/mahara/1.7/1.7.1#release-notes 1.7.1]<br />
*[https://launchpad.net/mahara/1.7/1.7.0#release-notes 1.7.0]<br />
|'''19 April 2013''' <br><br />
<br />
*21 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*29 October 2013<br />
*3 October 2013<br />
*3 April 2014<br />
*18 December 2013<br />
*24 October 2013<br />
*19 April 2013<br />
| style="background:#ba2025; color:#fff" |21 October 2014 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=4967 1.6]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.6/1.6.10#release-notes 1.6.10]<br />
*[https://launchpad.net/mahara/1.6/1.6.9#release-notes 1.6.9]<br />
*[https://launchpad.net/mahara/1.6/1.6.8#release-notes 1.6.8]<br />
*[https://launchpad.net/mahara/1.6/1.6.7#release-notes 1.6.7]<br />
*[https://launchpad.net/mahara/1.6/1.6.6#release-notes 1.6.6]<br />
*[https://launchpad.net/mahara/1.6/1.6.5#release-notes 1.6.5]<br />
*[https://launchpad.net/mahara/1.6/1.6.4#release-notes 1.6.4]<br />
*[https://launchpad.net/mahara/1.6/1.6.3#release-notes 1.6.3]<br />
*[https://launchpad.net/mahara/1.6/1.6.2#release-notes 1.6.2]<br />
*[https://launchpad.net/mahara/1.6/1.6.1#release-notes 1.6.1]<br />
*[https://launchpad.net/mahara/1.6/1.6.0#release-notes 1.6.0]<br />
|'''19 October 2019''' <br><br />
<br />
*13 May 2014<br />
*3 April 2014<br />
*29 October 2013<br />
*3 October 2013<br />
*25 July 2013<br />
*2 May 2013<br />
*15 April 2013<br />
*15 February 2013<br />
*23 November 2012<br />
*24 October 2012<br />
*19 October 2012<br />
| style="background:#ba2025; color:#fff" |29 April 2014 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=4469 1.5]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.5/1.5.13#release-notes 1.5.13]<br />
*[https://launchpad.net/mahara/1.5/1.5.12#release-notes 1.5.12]<br />
*[https://launchpad.net/mahara/1.5/1.5.11#release-notes 1.5.11]<br />
*[https://launchpad.net/mahara/1.5/1.5.10#release-notes 1.5.10]<br />
*[https://launchpad.net/mahara/1.5/1.5.9#release-notes 1.5.9]<br />
*[https://launchpad.net/mahara/1.5/1.5.8#release-notes 1.5.8]<br />
*[https://launchpad.net/mahara/1.5/1.5.7#release-notes 1.5.7]<br />
*[https://launchpad.net/mahara/1.5/1.5.6#release-notes 1.5.6]<br />
*[https://launchpad.net/mahara/1.5/1.5.4#release-notes 1.5.4]<br />
*[https://launchpad.net/mahara/1.5/1.5.3#release-notes 1.5.3]<br />
*[https://launchpad.net/mahara/1.5/1.5.2#release-notes 1.5.2]<br />
*[https://launchpad.net/mahara/1.5/1.5.1#release-notes 1.5.1]<br />
*[https://launchpad.net/mahara/1.5/1.5.0#release-notes 1.5.0]<br />
|'''17 April 2012''' <br><br />
<br />
*25 October 2013<br />
*3 October 2013<br />
*24 July 2013<br />
*2 May 2013<br />
*15 April 2013<br />
*15 February 2013<br />
*23 November 2012<br />
*17 October 2012<br />
*10 October 2012<br />
*14 September 2012<br />
*31 July 2012<br />
*3 May 2012<br />
*17 April 2012<br />
| style="background:#ba2025; color:#fff" |29 October 2013 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=3744 1.4]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.6 1.4.6]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.5 1.4.5]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.4 1.4.4]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.3 1.4.3]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.2 1.4.2]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.1 1.4.1]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.0 1.4.0]<br />
|'''13 June 2011''' <br><br />
<br />
*17 October 2012<br />
*10 October 2012<br />
*14 September 2012<br />
*31 July 2011<br />
*6 March 2011<br />
*3 November 2011<br />
*13 June 2011<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=2252 1.3]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.3.8 1.3.8]<br />
*[https://launchpad.net/mahara/+milestone/1.3.7 1.3.7]<br />
*[https://launchpad.net/mahara/+milestone/1.3.6 1.3.6]<br />
*[https://launchpad.net/mahara/+milestone/1.3.5 1.3.5]<br />
*[https://launchpad.net/mahara/+milestone/1.3.4 1.3.4]<br />
*[https://launchpad.net/mahara/+milestone/1.3.3 1.3.3]<br />
*[https://launchpad.net/mahara/+milestone/1.3.2 1.3.2]<br />
*[https://launchpad.net/mahara/+milestone/1.3.1 1.3.1]<br />
*[https://launchpad.net/mahara/+milestone/1.3.0 1.3.0]<br />
|'''10 September 2010''' <br><br />
<br />
*5 March 2012<br />
*3 Novemver 2011<br />
*10 May 2011<br />
*28 March 2011<br />
*24 March 2011<br />
*7 November 2010<br />
*8 October 2010<br />
*17 September 2010<br />
*10 September 2010<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=1226 1.2]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.2.9 1.2.9]<br />
*[https://launchpad.net/mahara/+milestone/1.2..8 1.2.8]<br />
*[https://launchpad.net/mahara/+milestone/1.2.7 1.2.7]<br />
*[https://launchpad.net/mahara/+milestone/1.2.6 1.2.6]<br />
*[https://launchpad.net/mahara/+milestone/1.2.5 1.2.5]<br />
*[https://launchpad.net/mahara/+milestone/1.2.4 1.2.4]<br />
*[https://launchpad.net/mahara/+milestone/1.2.3 1.2.3]<br />
*[https://launchpad.net/mahara/+milestone/1.2.2 1.2.2]<br />
*[https://launchpad.net/mahara/+milestone/1.2.1 1.2.1]<br />
*[https://launchpad.net/mahara/+milestone/1.2.0 1.2.0]<br />
|'''16 November 2009''' <br><br />
<br />
*10 May 2011<br />
*24 March 2011<br />
*1 September 2011<br />
*2 July 2010<br />
*6 April 2010<br />
*8 February 2010<br />
*8 December 2009<br />
*8 December 2009<br />
*16 November 2009<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://launchpad.net/mahara/+milestone/1.0.10 1.1]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.1.9 1.1.9]<br />
*[https://launchpad.net/mahara/+milestone/1.1.8 1.1.8]<br />
*[https://launchpad.net/mahara/+milestone/1.1.7 1.1.7]<br />
*[https://launchpad.net/mahara/+milestone/1.1.6 1.1.6]<br />
*[https://launchpad.net/mahara/+milestone/1.1.5 1.1.5]<br />
*[https://launchpad.net/mahara/+milestone/1.1.4 1.1.4]<br />
*[https://launchpad.net/mahara/+milestone/1.1.3 1.1.3]<br />
*[https://launchpad.net/mahara/+milestone/1.1.2 1.1.2]<br />
*[https://launchpad.net/mahara/+milestone/1.1.1 1.1.1]<br />
*[https://launchpad.net/mahara/+milestone/1.1.0 1.1.0]<br />
|'''25 February 2009''' <br><br />
<br />
*2 July 2010<br />
*6 April 2010<br />
*28 October 2009<br />
*21 June 2009<br />
*10 June 2009<br />
*21 April 2009<br />
*9 March 2009<br />
*26 February 2009<br />
*25 February 2009<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=292 1.0]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.0.15 1.0.15]<br />
*[https://launchpad.net/mahara/+milestone/1.0.14 1.0.14]<br />
*[https://launchpad.net/mahara/+milestone/1.0.13 1.0.13]<br />
*[https://launchpad.net/mahara/+milestone/1.0.12 1.0.12]<br />
*[https://launchpad.net/mahara/+milestone/1.0.11 1.0.11]<br />
*[https://launchpad.net/mahara/+milestone/1.0.10 1.0.10]<br />
*[[Releases/1.0.9|1.0.9]]<br />
*[[Releases/1.0.8|1.0.8]]<br />
*[[Releases/1.0.7|1.0.7]]<br />
|'''9 March 2009''' <br><br />
<br />
*2 July 2010<br />
*6 April 2010<br />
*28 October 2009<br />
*21 June 2009<br />
*21 April 2009<br />
*9 March 2009<br />
*Unavailable<br />
*Unavailable<br />
*Unavailable<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
|}<br />
<br />
=Definition of support=<br />
<br />
Being "supported" means:<br />
<br />
*The release team is committed to making available updates to Mahara that are security related. See [[Security]] to find out how to report security bugs to us.<br />
*Occasionally, some other serious bug fixes will be included, but these are not guaranteed. If you find another type of bug, please let us know by reporting it on the mahara.org forums or directly on Launchpad: https://bugs.launchpad.net/mahara/+filebug<br />
<br />
=Specific backporting rules=<br />
<br />
When deciding which bugs to backport to supported branches, these are the general principles:<br />
<br />
*'''[[Security]] bugs'''<br />
**'''All''' Critical and High priority security bugs should be backported.<br />
**'''Nearly all''' Medium and Low priority security bugs should be backported. At the maintenance team's discretion, these might not be backported if:<br />
***Backporting would be technically difficult due to differences between Mahara versions.<br />
***The bug fix requires database upgrades or dataroot manipulations.<br />
***The bug fix otherwise introduces a high risk of [https://en.wikipedia.org/wiki/Software_regression regressions].<br />
<br />
*'''Non-security bugs'''<br />
**'''All''' Critical bugs should be backported.<br />
**'''Most''' High priority bugs should be backported. At the maintenance team's discretion, these might not be backported if:<br />
***Backporting would be technically difficult due to differences between Mahara versions.<br />
***The bug fix requires database upgrades or dataroot manipulations.<br />
***The bug fix otherwise introduces a high risk of [https://en.wikipedia.org/wiki/Software_regression regressions].<br />
**'''No''' Medium or Low priority non-security bugs are backported.<br />
**'''No''' Wishlist bugs are backported. Wishlist items are only added to the current development branch.<br />
<br />
If you want to backport certain bug fixes or new features to your own instance of Mahara, you can do so on your own as the code is available.<br />
<br />
See [[Developer_Area/Bug_Status#Importance|Bug Status:Importance]] for the guidelines on how we decide whether a bug is Critical, High, Medium, or Low.<br />
<br />
[[Category:Release Notes]]</div>Robertlhttps://wiki.mahara.org/index.php?title=Releases&diff=13098Releases2022-05-02T02:28:57Z<p>Robertl: /* Current and upcoming releases */</p>
<hr />
<div>=Release cycle and version support=<br />
<p>A new major version of Mahara is released every 6 months, in April and October. The version numbers reflect the year and the month in which a version was released. See [[Developer_Area/Version_Numbering_Policy|Version Numbering Policy]] for more details.<br><br />
<br />
{| class="wikitable" style="padding:0em; text-align:left" summary="Mahara's six monthly cycle for April and October releases."<br />
! scope="col" style="text-align:left; background-color:#566d31; color:#fff;" |Release cycle<br />
! scope="col" style="text-align:left;" |Nov - Apr<br />
! scope="col" style="text-align:left;" |May - Oct<br />
|-<br />
! scope="row" style="text-align:left;" |Feature freeze<br />
| style="background-color:#fff;" |Early February<br />
| style="background-color:#fff;" |Early August<br />
|-<br />
! scope="row" style="text-align:left;" |UI freeze<br />
| style="background-color:#fff;" |Early March<br />
| style="background-color:#fff;" |Early September<br />
|-<br />
! scope="row" style="text-align:left;" |Release candidate<br />
| style="background-color:#fff;" |Mid March<br />
| style="background-color:#fff;" |Mid September<br />
|-<br />
! scope="row" style="text-align:left;" |Official release<br />
| style="background-color:#fff;" |Late April<br />
| style="background-color:#fff;" |Late October<br />
|-<br />
|}<br />
<ul><br />
<li> Each release has 16 weeks before feature freeze.</li><br />
<li>For each release, We've put feature freeze at a month before the release candidate. Only non-feature bug fixes will be committed after this </li><br />
<li>The week before the release candidates is a UI freeze. This is a freeze to string changes and theme changes. String or UI fixes will need to be at least high importance.</li><br />
</ul></p><br />
<p></p><br />
<p><strong>The standard support lifetime of a major version is 18 months (3 release cycles):</strong><br><br />
<ul><br />
<li>Receives bug fixes and security fixes for the first 6 months</li><br />
<li>Receives security fixes only, for an additional 12 months</li><br />
</ul><br />
In the event that a major release substantially breaks backwards compatibility, we may declare the previous release to be an extended support release which will receive security fixes for 30 months (5 release cycles), in order to give sites more time to upgrade.</p><br />
<br />
=Older releases (pre Mahara 1.6)=<br />
<br />
Prior to Mahara 1.6, Mahara major versions were released as needed, according to no particular schedule. During the transition period to the 6 month release cycle, support for the older releases was provided for 2 release cycles.<br />
<br />
=Current and upcoming releases=<br />
<p>The latest <strong>stable</strong> version of Mahara is 22.04, released on 27 April 2022.</p><br />
<br />
<p>'''Note:''' This page is updated manually, and sometimes falls behind. For 100% up-to-date information, look for the release labelled "Current Stable Release" on our [https://launchpad.net/mahara/+series Launchpad release page], or use the "Download" link on the front page of https://mahara.org</p><br />
<br />
{| class="wikitable"<br />
| style="background:#ba2025; color:#fff" |Unsupported<br />
| style="background:#566d31; color:#fff" |Currently in support<br />
|Not yet released<br />
|}<br />
<br />
<!-- This is the template for the table sections below<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff"|'''[https://mahara.org/interaction/forum/topic.php?id= Major point release number]'''<br />
|<br />
* [https://launchpad.net/mahara/ Minor point release number]<br />
| '''Major point release date''' <br><br />
* Minor point release dates<br />
| style="background:#566d31; color:#fff" | End of support date<br />
|-<br />
--><br />
<br />
{| class="wikitable" summary="Release notes for major and minor versions of Mahara, official release dates and version support end date. Versions are listed in reverse chronological order. Table is four columns wide and 22 rows deep."<br />
|+ style="text-align:left;" |Mahara release notes and end of support<br />
|-<br />
! style="text-align:left;" |Major release<br />
! style="text-align:left;" |Minor release<br />
! style="text-align:left;" |Release date<br />
! style="text-align:left;" |End of support<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=9097 22.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/22.04.0#release-notes 22.04.0]<br />
|'''27 April 2022'''<br />
| style="background:#566d31; color:#fff" |October 2023<br />
|-<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8955 21.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/21.10.3#release-notes 21.10.3]<br />
*[https://launchpad.net/mahara/+milestone/21.10.2#release-notes 21.10.2]<br />
*[https://launchpad.net/mahara/+milestone/21.10.1#release-notes 21.10.1]<br />
*[https://launchpad.net/mahara/+milestone/21.10.0#release-notes 21.10.0]<br />
|'''29 October 2021''' <br><br />
<br />
*2 May 2022<br />
*27 April 2022<br />
*9 February 2022<br />
*29 October 2021<br />
| style="background:#566d31; color:#fff" |April 2023<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8817 21.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/21.04.4#release-notes 21.04.4]<br />
*[https://launchpad.net/mahara/+milestone/21.04.3#release-notes 21.04.3]<br />
*[https://launchpad.net/mahara/+milestone/21.04.2#release-notes 21.04.2]<br />
*[https://launchpad.net/mahara/+milestone/21.04.1#release-notes 21.04.1]<br />
*[https://launchpad.net/mahara/+milestone/21.04.0#release-notes 21.04.0]<br />
|'''30 April 2021''' <br><br />
<br />
*2 May 2022<br />
*27 April 2022<br />
*9 February 2022<br />
*29 October 2021<br />
*21 May 2021<br />
*30 April 2021<br />
| style="background:#566d31; color:#fff" |October 2022<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8728 20.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/20.10.6#release-notes 20.10.6]<br />
*[https://launchpad.net/mahara/+milestone/20.10.5#release-notes 20.10.5]<br />
*[https://launchpad.net/mahara/+milestone/20.10.4#release-notes 20.10.4]<br />
*[https://launchpad.net/mahara/+milestone/20.10.3#release-notes 20.10.3]<br />
*[https://launchpad.net/mahara/+milestone/20.10.2#release-notes 20.10.2]<br />
*[https://launchpad.net/mahara/+milestone/20.10.1#release-notes 20.10.1]<br />
*[https://launchpad.net/mahara/+milestone/20.10.0#release-notes 20.10.0]<br />
|'''22 October 2020'''<br><br />
<br />
*27 April 2022<br />
*9 February 2022<br />
*29 October 2021<br />
*21 May 2021<br />
*4 May 2021<br />
*22 October 2020<br />
| style="background:#ba2025; color:#fff" |April 2022 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8611 20.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/20.04.5#release-notes 20.04.5]<br />
*[https://launchpad.net/mahara/+milestone/20.04.4#release-notes 20.04.4]<br />
*[https://launchpad.net/mahara/+milestone/20.04.3#release-notes 20.04.3]<br />
*[https://launchpad.net/mahara/+milestone/20.04.2#release-notes 20.04.2]<br />
*[https://launchpad.net/mahara/+milestone/20.04.1#release-notes 20.04.1]<br />
*[https://launchpad.net/mahara/20.04/20.04.0#release-notes 20.04.0]<br />
|'''29 April 2020'''<br><br />
<br />
*29 October 2021<br />
*22 May 2021<br />
*4 May 2021<br />
*22 October 2020<br />
*4 August 2020<br />
*29 April 2020<br />
| style="background:#ba2025; color:#fff" |October 2021 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8533 19.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/19.10.6#releasenotes 19.10.6]<br />
*[https://launchpad.net/mahara/+milestone/19.10.5#releasenotes 19.10.5]<br />
*[https://launchpad.net/mahara/+milestone/19.10.4#release-notes 19.10.4]<br />
*[https://launchpad.net/mahara/+milestone/19.10.3#release-notes 19.10.3]<br />
*[https://launchpad.net/mahara/+milestone/19.10.2#release-notes 19.10.2]<br />
*[https://launchpad.net/mahara/19.10/19.10.1#release-notes 19.10.1]<br />
*[https://launchpad.net/mahara/19.10/19.10.0#release-notes 19.10.0]<br />
|'''31 October 2019''' <br><br />
<br />
*4 May 2021<br />
*22 October 2020<br />
*4 August 2020<br />
*30 April 2020<br />
*4 April 2020<br />
*12 November 2019<br />
*31 October 2019<br />
| style="background:#ba2025; color:#fff" |April 2021 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8444 19.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/19.04/19.04.5#release-notes 19.04.5]<br />
*[https://launchpad.net/mahara/19.04/19.04.4#release-notes 19.04.4]<br />
*[https://launchpad.net/mahara/19.04/19.04.3#release-notes 19.04.3]<br />
*[https://launchpad.net/mahara/19.04/19.04.2#release-notes 19.04.2]<br />
*[https://launchpad.net/mahara/19.04/19.04.1#release-notes 19.04.1]<br />
*[https://launchpad.net/mahara/19.04/19.04.0#release-notes 19.04.0]<br />
|'''30 April 2019''' <br><br />
<br />
*30 April 2020<br />
*4 March 2020<br />
*12 November 2019<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
| style="background:#ba2025; color:#fff" |October 2020 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8365 18.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/18.10/18.10.6#release-notes 18.10.6]<br />
*[https://launchpad.net/mahara/18.10/18.10.5#release-notes 18.10.5]<br />
*[https://launchpad.net/mahara/18.10/18.10.4#release-notes 18.10.4]<br />
*[https://launchpad.net/mahara/18.10/18.10.3#release-notes 18.10.3]<br />
*[https://launchpad.net/mahara/18.10/18.10.2#release-notes 18.10.2]<br />
*[https://launchpad.net/mahara/18.10/18.10.1#release-notes 18.10.1]<br />
*[https://launchpad.net/mahara/18.10/18.10.0#release-notes 18.10.0]<br />
|'''25 October 2018''' <br><br />
<br />
*30 April 2020<br />
*4 March 2020<br />
*12 November 2019<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
*25 October 2018<br />
| style="background:#ba2025; color:#fff" |April 2020 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8216 18.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/18.04/18.04.6#release-notes 18.04.6]<br />
*[https://launchpad.net/mahara/18.04/18.04.5#release-notes 18.04.5]<br />
*[https://launchpad.net/mahara/18.04/18.04.4#release-notes 18.04.4]<br />
*[https://launchpad.net/mahara/18.04/18.04.3#release-notes 18.04.3]<br />
*[https://launchpad.net/mahara/18.04/18.04.2#release-notes 18.04.2]<br />
*[https://launchpad.net/mahara/18.04/18.04.1#release-notes 18.04.1]<br />
*[https://launchpad.net/mahara/18.04/18.04.0#release-notes 18.04.0]<br />
|'''6 April 2018''' <br><br />
<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
| style="background:#ba2025; color:#fff" |October 2019 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8084 17.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/17.10/17.10.9#release-notes 17.10.9]<br />
*[https://launchpad.net/mahara/17.10/17.10.8#release-notes 17.10.8]<br />
*[https://launchpad.net/mahara/17.10/17.10.7#release-notes 17.10.7]<br />
*[https://launchpad.net/mahara/17.10/17.10.6#release-notes 17.10.6]<br />
*[https://launchpad.net/mahara/17.10/17.10.5#release-notes 17.10.5]<br />
*[https://launchpad.net/mahara/17.10/17.10.4#release-notes 17.10.4]<br />
*[https://launchpad.net/mahara/17.10/17.10.3#release-notes 17.10.3]<br />
*[https://launchpad.net/mahara/17.10/17.10.2#release-notes 17.10.2]<br />
*[https://launchpad.net/mahara/17.10/17.10.1#release-notes 17.10.1]<br />
*[https://launchpad.net/mahara/17.10/17.10.0#release-notes 17.10.0]<br />
|'''30 October 2017''' <br><br />
<br />
*30 April 2019<br />
*30 April 2019<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*14 December 2017<br />
*30 October 2017<br />
| style="background:#ba2025; color:#fff;" |30 April 2019 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7926 17.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/17.04/17.04.10#release-notes 17.04.10]<br />
*[https://launchpad.net/mahara/17.04/17.04.9#release-notes 17.04.9]<br />
*[https://launchpad.net/mahara/17.04/17.04.8#release-notes 17.04.8]<br />
*[https://launchpad.net/mahara/17.04/17.04.7#release-notes 17.04.7]<br />
*[https://launchpad.net/mahara/17.04/17.04.6#release-notes 17.04.6]<br />
*[https://launchpad.net/mahara/17.04/17.04.5#release-notes 17.04.5]<br />
*[https://launchpad.net/mahara/17.04/17.04.4#release-notes 17.04.4]<br />
*[https://launchpad.net/mahara/17.04/17.04.3#release-notes 17.04.3]<br />
*[https://launchpad.net/mahara/17.04/17.04.2#release-notes 17.04.2]<br />
*[https://launchpad.net/mahara/17.04/17.04.1#release-notes 17.04.1]<br />
*[https://launchpad.net/mahara/17.04/17.04.0#release-notes 17.04.0]<br />
|'''27 April 2017''' <br><br />
<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*12 May 2017<br />
*27 April 2017<br />
| style="background:#ba2025; color:#fff" |25 October 2018 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7750 16.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/16.10/16.10.9#release-notes 16.10.9]<br />
*[https://launchpad.net/mahara/16.10/16.10.8#release-notes 16.10.8]<br />
*[https://launchpad.net/mahara/16.10/16.10.7#release-notes 16.10.7]<br />
*[https://launchpad.net/mahara/16.10/16.10.6#release-notes 16.10.6]<br />
*[https://launchpad.net/mahara/16.10/16.10.5#release-notes 16.10.5]<br />
*[https://launchpad.net/mahara/16.10/16.10.4#release-notes 16.10.4]<br />
*[https://launchpad.net/mahara/16.10/16.10.3#release-notes 16.10.3]<br />
*[https://launchpad.net/mahara/16.10/16.10.2#release-notes 16.10.2]<br />
*[https://launchpad.net/mahara/16.10/16.10.1#release-notes 16.10.1]<br />
*[https://launchpad.net/mahara/16.10/16.10.0#release-notes 16.10.0]<br />
|'''21 October 2016''' <br><br />
<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*13 December 2016<br />
*21 October 2016<br />
| style="background:#ba2025; color:#fff" |06 April 2018 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7585 16.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/16.04/16.04.9#release-notes 16.04.9]<br />
*[https://launchpad.net/mahara/16.04/16.04.8#release-notes 16.04.8]<br />
*[https://launchpad.net/mahara/16.04/16.04.7#release-notes 16.04.7]<br />
*[https://launchpad.net/mahara/16.04/16.04.6#release-notes 16.04.6]<br />
*[https://launchpad.net/mahara/16.04/16.04.5#release-notes 16.04.5]<br />
*[https://launchpad.net/mahara/16.04/16.04.4#release-notes 16.04.4]<br />
*[https://launchpad.net/mahara/16.04/16.04.3#release-notes 16.04.3]<br />
*[https://launchpad.net/mahara/16.04/16.04.2#release-notes 16.04.2]<br />
*[https://launchpad.net/mahara/16.04/16.04.1#release-notes 16.04.1]<br />
*[https://launchpad.net/mahara/16.04/16.04.0#release-notes 16.04.0]<br />
|'''28 April 2016''' <br><br />
<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*11 July 2016<br />
*9 June 2016<br />
*28 April 2016<br />
| style="background:#ba2025; color:#fff" |30 October 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7420 15.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/15.10/15.10.8#release-notes 15.10.8]<br />
*[https://launchpad.net/mahara/15.10/15.10.7#release-notes 15.10.7]<br />
*[https://launchpad.net/mahara/15.10/15.10.6#release-notes 15.10.6]<br />
*[https://launchpad.net/mahara/15.10/15.10.5#release-notes 15.10.5]<br />
*[https://launchpad.net/mahara/15.10/15.10.4#release-notes 15.10.4]<br />
*[https://launchpad.net/mahara/15.10/15.10.3#release-notes 15.10.3]<br />
*[https://launchpad.net/mahara/15.10/15.10.2#release-notes 15.10.2]<br />
*[https://launchpad.net/mahara/15.10/15.10.1#release-notes 15.10.1]<br />
*[https://launchpad.net/mahara/15.10/15.10.0#release-notes 15.10.0]<br />
|'''23 October 2015''' <br><br />
<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*11 July 2016<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*23 October 2015<br />
| style="background:#ba2025; color:#fff" |26 April 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7171 15.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/15.04/15.04.15#release-notes 15.04.15]<br />
*[https://launchpad.net/mahara/15.04/15.04.14#release-notes 15.04.14]<br />
*[https://launchpad.net/mahara/15.04/15.04.13#release-notes 15.04.13]<br />
*[https://launchpad.net/mahara/15.04/15.04.12#release-notes 15.04.12]<br />
*[https://launchpad.net/mahara/15.04/15.04.11#release-notes 15.04.11]<br />
*[https://launchpad.net/mahara/15.04/15.04.10#release-notes 15.04.10]<br />
*[https://launchpad.net/mahara/15.04/15.04.9#release-notes 15.04.9]<br />
*[https://launchpad.net/mahara/15.04/15.04.8#release-notes 15.04.8]<br />
*[https://launchpad.net/mahara/15.04/15.04.7#release-notes 15.04.7]<br />
*[https://launchpad.net/mahara/15.04/15.04.6#release-notes 15.04.6]<br />
*[https://launchpad.net/mahara/15.04/15.04.5#release-notes 15.04.5]<br />
*[https://launchpad.net/mahara/15.04/15.04.4#release-notes 15.04.4]<br />
*[https://launchpad.net/mahara/15.04/15.04.3#release-notes 15.04.3]<br />
*[https://launchpad.net/mahara/15.04/15.04.2#release-notes 15.04.2]<br />
*[https://launchpad.net/mahara/15.04/15.04.1#release-notes 15.04.1]<br />
*[https://launchpad.net/mahara/15.04/15.04.0#release-notes 15.04.0]<br />
|'''23 October 2015''' <br><br />
<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*12 July 2016<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*29 May 2015<br />
*17 April 2015<br />
| style="background:#ba2025; color:#fff" |30 October 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=6509 1.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.10/1.10.10#release-notes 1.10.10]<br />
*[https://launchpad.net/mahara/1.10/1.10.9#release-notes 1.10.9]<br />
*[https://launchpad.net/mahara/1.10/1.10.8#release-notes 1.10.8]<br />
*[https://launchpad.net/mahara/1.10/1.10.7#release-notes 1.10.7]<br />
*[https://launchpad.net/mahara/1.10/1.10.6#release-notes 1.10.6]<br />
*[https://launchpad.net/mahara/1.10/1.10.5#release-notes 1.10.5]<br />
*[https://launchpad.net/mahara/1.10/1.10.4#release-notes 1.10.4]<br />
*[https://launchpad.net/mahara/1.10/1.10.3#release-notes 1.10.3]<br />
*[https://launchpad.net/mahara/1.10/1.10.2#release-notes 1.10.2]<br />
*[https://launchpad.net/mahara/1.10/1.10.1#release-notes 1.10.1]<br />
*[https://launchpad.net/mahara/1.10/1.10.0#release-notes 1.10.0]<br />
|'''21 October 2014''' <br><br />
<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*29 May 2015<br />
*20 April 2015<br />
*13 January 2015<br />
*26 November 2014<br />
*21 October 2014<br />
| style="background:#ba2025; color:#fff" |2 May 2016 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=6254 1.9]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.9/1.9.9#release-notes 1.9.9]<br />
*[https://launchpad.net/mahara/1.9/1.9.8#release-notes 1.9.8]<br />
*[https://launchpad.net/mahara/1.9/1.9.7#release-notes 1.9.7]<br />
*[https://launchpad.net/mahara/1.9/1.9.6#release-notes 1.9.6]<br />
*[https://launchpad.net/mahara/1.9/1.9.5#release-notes 1.9.5]<br />
*[https://launchpad.net/mahara/1.9/1.9.4#release-notes 1.9.4]<br />
*[https://launchpad.net/mahara/1.9/1.9.3#release-notes 1.9.3]<br />
*[https://launchpad.net/mahara/1.9/1.9.2#release-notes 1.9.2]<br />
*[https://launchpad.net/mahara/1.9/1.9.1#release-notes 1.9.1]<br />
*[https://launchpad.net/mahara/1.9/1.9.0#release-notes 1.9.0]<br />
|'''15 April 2014''' <br><br />
<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*26 November 2014<br />
*22 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*15 April 2014<br />
| style="background:#ba2025; color:#fff" |27 October 2015 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=5833 1.8]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.8/1.8.7#release-notes 1.8.7]<br />
*[https://launchpad.net/mahara/1.8/1.8.6#release-notes 1.8.6]<br />
*[https://launchpad.net/mahara/1.8/1.8.5#release-notes 1.8.5]<br />
*[https://launchpad.net/mahara/1.8/1.8.4#release-notes 1.8.4]<br />
*[https://launchpad.net/mahara/1.8/1.8.3#release-notes 1.8.3]<br />
*[https://launchpad.net/mahara/1.8/1.8.2#release-notes 1.8.2]<br />
*[https://launchpad.net/mahara/1.8/1.8.1#release-notes 1.8.1]<br />
*[https://launchpad.net/mahara/1.8/1.8.0#release-notes 1.8.0]<br />
|'''24 October 2013''' <br><br />
<br />
*20 April 2015<br />
*26 November 2014<br />
*22 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*3 April 2014<br />
*18 December 2013<br />
*24 October 2013<br />
| style="background:#ba2025; color:#fff" |20 April 2015 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=5371 1.7]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.7/1.7.8#release-notes 1.7.8]<br />
*[https://launchpad.net/mahara/1.7/1.7.7#release-notes 1.7.7]<br />
*[https://launchpad.net/mahara/1.7/1.7.6#release-notes 1.7.6]<br />
*[https://launchpad.net/mahara/1.7/1.7.5#release-notes 1.7.5]<br />
*[https://launchpad.net/mahara/1.7/1.7.4#release-notes 1.7.4]<br />
*[https://launchpad.net/mahara/1.7/1.7.3#release-notes 1.7.3]<br />
*[https://launchpad.net/mahara/1.7/1.7.2#release-notes 1.7.2]<br />
*[https://launchpad.net/mahara/1.7/1.7.1#release-notes 1.7.1]<br />
*[https://launchpad.net/mahara/1.7/1.7.0#release-notes 1.7.0]<br />
|'''19 April 2013''' <br><br />
<br />
*21 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*29 October 2013<br />
*3 October 2013<br />
*3 April 2014<br />
*18 December 2013<br />
*24 October 2013<br />
*19 April 2013<br />
| style="background:#ba2025; color:#fff" |21 October 2014 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=4967 1.6]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.6/1.6.10#release-notes 1.6.10]<br />
*[https://launchpad.net/mahara/1.6/1.6.9#release-notes 1.6.9]<br />
*[https://launchpad.net/mahara/1.6/1.6.8#release-notes 1.6.8]<br />
*[https://launchpad.net/mahara/1.6/1.6.7#release-notes 1.6.7]<br />
*[https://launchpad.net/mahara/1.6/1.6.6#release-notes 1.6.6]<br />
*[https://launchpad.net/mahara/1.6/1.6.5#release-notes 1.6.5]<br />
*[https://launchpad.net/mahara/1.6/1.6.4#release-notes 1.6.4]<br />
*[https://launchpad.net/mahara/1.6/1.6.3#release-notes 1.6.3]<br />
*[https://launchpad.net/mahara/1.6/1.6.2#release-notes 1.6.2]<br />
*[https://launchpad.net/mahara/1.6/1.6.1#release-notes 1.6.1]<br />
*[https://launchpad.net/mahara/1.6/1.6.0#release-notes 1.6.0]<br />
|'''19 October 2019''' <br><br />
<br />
*13 May 2014<br />
*3 April 2014<br />
*29 October 2013<br />
*3 October 2013<br />
*25 July 2013<br />
*2 May 2013<br />
*15 April 2013<br />
*15 February 2013<br />
*23 November 2012<br />
*24 October 2012<br />
*19 October 2012<br />
| style="background:#ba2025; color:#fff" |29 April 2014 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=4469 1.5]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.5/1.5.13#release-notes 1.5.13]<br />
*[https://launchpad.net/mahara/1.5/1.5.12#release-notes 1.5.12]<br />
*[https://launchpad.net/mahara/1.5/1.5.11#release-notes 1.5.11]<br />
*[https://launchpad.net/mahara/1.5/1.5.10#release-notes 1.5.10]<br />
*[https://launchpad.net/mahara/1.5/1.5.9#release-notes 1.5.9]<br />
*[https://launchpad.net/mahara/1.5/1.5.8#release-notes 1.5.8]<br />
*[https://launchpad.net/mahara/1.5/1.5.7#release-notes 1.5.7]<br />
*[https://launchpad.net/mahara/1.5/1.5.6#release-notes 1.5.6]<br />
*[https://launchpad.net/mahara/1.5/1.5.4#release-notes 1.5.4]<br />
*[https://launchpad.net/mahara/1.5/1.5.3#release-notes 1.5.3]<br />
*[https://launchpad.net/mahara/1.5/1.5.2#release-notes 1.5.2]<br />
*[https://launchpad.net/mahara/1.5/1.5.1#release-notes 1.5.1]<br />
*[https://launchpad.net/mahara/1.5/1.5.0#release-notes 1.5.0]<br />
|'''17 April 2012''' <br><br />
<br />
*25 October 2013<br />
*3 October 2013<br />
*24 July 2013<br />
*2 May 2013<br />
*15 April 2013<br />
*15 February 2013<br />
*23 November 2012<br />
*17 October 2012<br />
*10 October 2012<br />
*14 September 2012<br />
*31 July 2012<br />
*3 May 2012<br />
*17 April 2012<br />
| style="background:#ba2025; color:#fff" |29 October 2013 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=3744 1.4]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.6 1.4.6]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.5 1.4.5]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.4 1.4.4]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.3 1.4.3]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.2 1.4.2]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.1 1.4.1]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.0 1.4.0]<br />
|'''13 June 2011''' <br><br />
<br />
*17 October 2012<br />
*10 October 2012<br />
*14 September 2012<br />
*31 July 2011<br />
*6 March 2011<br />
*3 November 2011<br />
*13 June 2011<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=2252 1.3]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.3.8 1.3.8]<br />
*[https://launchpad.net/mahara/+milestone/1.3.7 1.3.7]<br />
*[https://launchpad.net/mahara/+milestone/1.3.6 1.3.6]<br />
*[https://launchpad.net/mahara/+milestone/1.3.5 1.3.5]<br />
*[https://launchpad.net/mahara/+milestone/1.3.4 1.3.4]<br />
*[https://launchpad.net/mahara/+milestone/1.3.3 1.3.3]<br />
*[https://launchpad.net/mahara/+milestone/1.3.2 1.3.2]<br />
*[https://launchpad.net/mahara/+milestone/1.3.1 1.3.1]<br />
*[https://launchpad.net/mahara/+milestone/1.3.0 1.3.0]<br />
|'''10 September 2010''' <br><br />
<br />
*5 March 2012<br />
*3 Novemver 2011<br />
*10 May 2011<br />
*28 March 2011<br />
*24 March 2011<br />
*7 November 2010<br />
*8 October 2010<br />
*17 September 2010<br />
*10 September 2010<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=1226 1.2]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.2.9 1.2.9]<br />
*[https://launchpad.net/mahara/+milestone/1.2..8 1.2.8]<br />
*[https://launchpad.net/mahara/+milestone/1.2.7 1.2.7]<br />
*[https://launchpad.net/mahara/+milestone/1.2.6 1.2.6]<br />
*[https://launchpad.net/mahara/+milestone/1.2.5 1.2.5]<br />
*[https://launchpad.net/mahara/+milestone/1.2.4 1.2.4]<br />
*[https://launchpad.net/mahara/+milestone/1.2.3 1.2.3]<br />
*[https://launchpad.net/mahara/+milestone/1.2.2 1.2.2]<br />
*[https://launchpad.net/mahara/+milestone/1.2.1 1.2.1]<br />
*[https://launchpad.net/mahara/+milestone/1.2.0 1.2.0]<br />
|'''16 November 2009''' <br><br />
<br />
*10 May 2011<br />
*24 March 2011<br />
*1 September 2011<br />
*2 July 2010<br />
*6 April 2010<br />
*8 February 2010<br />
*8 December 2009<br />
*8 December 2009<br />
*16 November 2009<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://launchpad.net/mahara/+milestone/1.0.10 1.1]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.1.9 1.1.9]<br />
*[https://launchpad.net/mahara/+milestone/1.1.8 1.1.8]<br />
*[https://launchpad.net/mahara/+milestone/1.1.7 1.1.7]<br />
*[https://launchpad.net/mahara/+milestone/1.1.6 1.1.6]<br />
*[https://launchpad.net/mahara/+milestone/1.1.5 1.1.5]<br />
*[https://launchpad.net/mahara/+milestone/1.1.4 1.1.4]<br />
*[https://launchpad.net/mahara/+milestone/1.1.3 1.1.3]<br />
*[https://launchpad.net/mahara/+milestone/1.1.2 1.1.2]<br />
*[https://launchpad.net/mahara/+milestone/1.1.1 1.1.1]<br />
*[https://launchpad.net/mahara/+milestone/1.1.0 1.1.0]<br />
|'''25 February 2009''' <br><br />
<br />
*2 July 2010<br />
*6 April 2010<br />
*28 October 2009<br />
*21 June 2009<br />
*10 June 2009<br />
*21 April 2009<br />
*9 March 2009<br />
*26 February 2009<br />
*25 February 2009<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=292 1.0]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.0.15 1.0.15]<br />
*[https://launchpad.net/mahara/+milestone/1.0.14 1.0.14]<br />
*[https://launchpad.net/mahara/+milestone/1.0.13 1.0.13]<br />
*[https://launchpad.net/mahara/+milestone/1.0.12 1.0.12]<br />
*[https://launchpad.net/mahara/+milestone/1.0.11 1.0.11]<br />
*[https://launchpad.net/mahara/+milestone/1.0.10 1.0.10]<br />
*[[Releases/1.0.9|1.0.9]]<br />
*[[Releases/1.0.8|1.0.8]]<br />
*[[Releases/1.0.7|1.0.7]]<br />
|'''9 March 2009''' <br><br />
<br />
*2 July 2010<br />
*6 April 2010<br />
*28 October 2009<br />
*21 June 2009<br />
*21 April 2009<br />
*9 March 2009<br />
*Unavailable<br />
*Unavailable<br />
*Unavailable<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
|}<br />
<br />
=Definition of support=<br />
<br />
Being "supported" means:<br />
<br />
*The release team is committed to making available updates to Mahara that are security related. See [[Security]] to find out how to report security bugs to us.<br />
*Occasionally, some other serious bug fixes will be included, but these are not guaranteed. If you find another type of bug, please let us know by reporting it on the mahara.org forums or directly on Launchpad: https://bugs.launchpad.net/mahara/+filebug<br />
<br />
=Specific backporting rules=<br />
<br />
When deciding which bugs to backport to supported branches, these are the general principles:<br />
<br />
*'''[[Security]] bugs'''<br />
**'''All''' Critical and High priority security bugs should be backported.<br />
**'''Nearly all''' Medium and Low priority security bugs should be backported. At the maintenance team's discretion, these might not be backported if:<br />
***Backporting would be technically difficult due to differences between Mahara versions.<br />
***The bug fix requires database upgrades or dataroot manipulations.<br />
***The bug fix otherwise introduces a high risk of [https://en.wikipedia.org/wiki/Software_regression regressions].<br />
<br />
*'''Non-security bugs'''<br />
**'''All''' Critical bugs should be backported.<br />
**'''Most''' High priority bugs should be backported. At the maintenance team's discretion, these might not be backported if:<br />
***Backporting would be technically difficult due to differences between Mahara versions.<br />
***The bug fix requires database upgrades or dataroot manipulations.<br />
***The bug fix otherwise introduces a high risk of [https://en.wikipedia.org/wiki/Software_regression regressions].<br />
**'''No''' Medium or Low priority non-security bugs are backported.<br />
**'''No''' Wishlist bugs are backported. Wishlist items are only added to the current development branch.<br />
<br />
If you want to backport certain bug fixes or new features to your own instance of Mahara, you can do so on your own as the code is available.<br />
<br />
See [[Developer_Area/Bug_Status#Importance|Bug Status:Importance]] for the guidelines on how we decide whether a bug is Critical, High, Medium, or Low.<br />
<br />
[[Category:Release Notes]]</div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Old_release_Instructions&diff=13045Developer Area/Old release Instructions2022-04-27T20:53:19Z<p>Robertl: /* Update community sites install (currently Catalyst hosted) */</p>
<hr />
<div>(Old page for release instructions)<br />
<br />
=Apply for CVE numbers (for security fixes) before the publication of the release=<br />
At least a few days before the release (best as soon as a bug report exists) apply for one or more [https://cve.mitre.org/cve/request_id.html CVE numbers] for reported security issues. Each issue needs to have its own CVE number.<br />
<br />
While CVE numbers are not a requirement, they are useful for administrators who monitor security announcements. It is a good practice thing to do.<br />
<br />
Use the [https://cveform.mitre.org/ request form with MITRE] as we don't put Mahara into a distro anymore.<br />
<br />
🚨 '''IMPORTANT !!!''' 🚨<br />
<br />
Please note that this form can '''ONLY''' be used if the issue hasn't been made public yet.<br />
<br />
*CVE numbers that we receive are embargoed and do not leak details until we let MITRE know that they can be published.<br />
*Once you received a CVE number, please add it to the Launchpad bug for that issue so it can be tracked. It takes at least a couple of days after having received the CVE numbers until Launchpad accepts the CVE number via the CVE number field.<br />
*Add the description, vulnerability, impact (if needed), and the discoverer credit to the Launchpad bug so that the information is readily available for the security announcement. '''Catalyst NZ staff''' also have access to that information on Seafile along with a running record of which bugs have been reported to MITRE (or others if needed).<br />
<br />
=Let partners know one week prior to the release=<br />
Let Mahara Partners know in the [https://mahara.org/interaction/forum/view.php?id=1136 Partner forum] that a release is upcoming. Details are not shared though as the reports are still embargoed.<br />
=Pre-requisites for doing the release=<br />
<br />
*You must have a [[Developer Area/Release Instructions/Creating a GPG key|valid GPG key]] and you need to add it to Launchpad (see https://launchpad.net/~username/+editpgpkeys).<br />
*You must have lp-upload-project installed:<br />
<br />
apt-get install lptools<br />
OLD INFORMATION - please ignore<br />
<br />
*Configure lptools to '''write public information''' on Launchpad on your behalf:<br />
<br />
manage-credentials create -c ubuntu-dev-tools -l 2<br />
(Note: This won't work for Ubuntus after Maverick, as manage-credentials appears to have gone away. You will need to install lptools to proceed with the script usage.)<br />
=Make sure your mahara-scripts checkout is up to date=<br />
You need to have an up-to-date version of the [https://git.mahara.org/scripts/mahara-scripts mahara-scripts] repo in order to get the latest copy of the [http://git.mahara.org/scripts/mahara-scripts/blobs/master/release.php release script]. That's the only repo you need to have since the release script will clone the git.mahara.org repo all by itself.<br />
=Run the first part of the release script=<br />
[[File:File_Siren.gif|link=https://wiki.mahara.org/wiki/File:File_Siren.gif]]'''IMPORTANT !!!'''[[File:File_Siren.gif|link=https://wiki.mahara.org/wiki/File:File_Siren.gif]]<br />
<br />
(ignore for release candidates)'''Make sure that any security reviews/patches are merged before proceeding. THESE PATCHES ARE MARKED STATUS: Private. If you do not have the ability to see the security patches, that is you do not have the +2 review status - ask someone on the security team to merge them for you and to make public the related Launchpad bugs.'''<br />
<br />
Using the script you got in the previous step, run the first step of it like this:<br />
./release.php X.Y.Z X.Y_DEV (For rc X.Yrc1)<br />
This will create tarballs as well as a changelog and some release notes to paste into Launchpad. It will also spit out another script (release-X.Y.Z-cleanup.sh) to be run later.<br />
<br />
'''Important''' Check the terminal output in case there are gpg errors, for example<br />
<br />
Tag new version bump commit as 'X.YRC2_RELEASE' error: gpg failed to sign the data error: unable to sign the tag<br />
<br />
So this is what I did to fix it, all commands are on commandline:<br />
<br />
1) Updated the gpg program to use: git config --global gpg.program gpg2<br />
<br />
2) Tested if it was working: echo "test" | gpg2 --clearsign<br />
<br />
It wasn't so I had to do: export GPG_TTY=$(tty)<br />
<br />
then run again echo "test" | gpg2 --clearsign<br />
<br />
After all that when I ran release.php command again it didn't give me the error<br />
<br />
<br />
Note that the repos that will be pushed back to git.mahara.org are live in your /tmp. '''Do not reboot your machine''' in the middle of doing a release or you will have to run through the release script again.<br />
<br />
Note: For release candidates the commit message should be empty.<br />
=Testing=<br />
As we do continuous behat testing throughout development we only need to do the basic manual testing. Here is the testing that needs to be done using the tarballs you generated in the last step:<br />
<br />
#untar the tar that release.php generated somewhere and make sure you can connect to it via web installer<br />
#drop the db and create a new blank one to test install<br />
<br />
The install should be run 4 times, both on MySQL and Postgres and both via the web interface and CLI script.<br />
<br />
'''Note:''' If we are doing a .0 release the install will complain about missing $versions->$currentmajorversion->latest release number but don't panic this is because the local copy of the release has the series version that doesn't exist upstream yet so we can ignore this warning·<br />
<br />
Once we are all happy with that we need to run these manual upgrade tests:<br />
<br />
#install a fresh X.Y.Z-1 site, then upgrade to Z.Y.Z on Postgres, via web interface, and quickly check that everything works (create a portfolio, a blog with a blog post, a group with a forum and a forum post)<br />
#repeat that last step on MySQL<br />
<br />
=Create the release on Launchpad=<br />
Go to https://launchpad.net/mahara/+milestone/X.Y.Z<br />
<br />
First move any bugs that are not going to be part of this release to the next milestone in the series, eg if this is X.Y.3 then move to X.Y.4. You may need to make the milestone if it doesn't already exist via https://launchpad.net/mahara/X.Y and using the 'create milestone' link.<br />
<br />
Then click on "create release" and give it today's date.<br />
<br />
Leave "Keep the X.Y.Z milestone active." '''unchecked'''.<br />
<br />
Paste in the release notes and the changelog that were generated for you by the release script. You can remove the "bump version number" commits from the changelog since they aren't very useful :)<br />
=Sign and upload the tarballs=<br />
Run the next part of the release script, i.e. the script that was spit out by the release script.<br />
./release-X.Y.Z-cleanup.sh<br />
You will be prompted for enter release notes and a changelog. This will happen once for each archive file that is being uploaded, so you'll see six prompts total. Any data you enter here will go into the Launchpad release page. So, you can either enter it here, or leave it empty here and enter it directly into the Launchpad webpage.<br />
<br />
'''Note I''': If running this file stops before completion for any reason you will need to edit it and comment out the bits that did finish so that you don't run those buts twice then try the script again. For example the script does the bit where it pushes the tag to the git remote and signs the zipped files but doesn't upload them - you would need to comment out the 'git push' lines and the 'gpg --armor' lines.<br />
<br />
'''Note II''': If the zipped files fail to upload to Launchpad via the script then you will need to manually upload the zipped files and their corresponding .asc files. To do this go to the milestone page in Launchpad and click the 'Add download file' link. Set the description to: release tarball and choose the matching zipped and .asc file to upload<br />
<br />
You will need to do this for all the three types: .zip, .tar.bz2, .tar.gz<br />
<br />
This may happen if you get "keyring.errors.InitError: Failed to unlock the collection!" returned when trying to upload the files to launchpad<br />
=Update bugs on the tracker=<br />
On [https://bugs.launchpad.net/mahara Launchpad], click on all of the bugs targeted for that milestone and move them from "Fix committed" to "Fix released".<br />
<br />
To save some clicking you can go to the milestone page and open all the bugs in new tabs at once by pasting the following into the browser console (firefox)<br />
var result = document.evaluate("//tbody//tr[contains(., 'Committed')]//a[contains(@href, 'bugs')]", document, null, XPathResult.ANY_TYPE,null ); var mycount=0; while(node = result.iterateNext()) { window.open(node.href, '_blank'); mycount++; if (mycount == 50) { break; } }<br />
You will ned to allow popups for the site for this to work and it will open up to 50 bugs where the status is 'Committed'. If you have more than 50 to do - mark the first ones 'released' - refresh the list and do again.<br />
<br />
Now is also a good time to create the next release number in the series. Any remaining bugs that were not fixed for this release may be transferred to the next one, if they're still on the roadmap but were simply delayed.<br />
=Put the release notes on the wiki page=<br />
This is just adding a link to the right page on Launchpad, we no longer have a duplicate copy of the release notes on the wiki.<br />
<br />
[[Releases|Release notes page]]<br />
=Language packs=<br />
[[Developer_Area/Language_Packs/Launchpad_Branching | Create a new translation branch on launchpad.net and update the language scripts]] for the new release so that they appear on [http://langpacks.mahara.org/ http://langpacks.mahara.org]<br />
=Security forum posts=<br />
If this release includes security fixes, then publish advisories on the [https://mahara.org/interaction/forum/view.php?id=43 security forum].<br />
<br />
Here's a sample forum post:<br />
Title: Security issue relating to (Category) <1.0.5, <1.1.3, <1.2.0<br />
<br />
<description of issue><br />
<br />
Category: (XSS, Access control, Privacy, Spam, Privilege escalation, Session fixation, Etc.)<br />
Severity: (Critical, High, Medium, Low)<br />
Versions affected: <1.0.5, <1.1.3, <1.2.0<br />
Reported by:<br />
Bug reports: (launchpad URL)<br />
CVE reference: (If you have one; if not, this can be added later) <br />
<br />
Sticky: No<br />
Closed: No<br />
It can be tricky to decide what to put down for "Category". This should be the "category" in the security sense (like a category on the OWASP site) rather than category of Mahara functionality. Some categories we have used in the past:<br />
<br />
*Injection<br />
*Password security<br />
*Cross-site scripting (XSS)<br />
*Cross-site request forgery (CSRF)<br />
*Access control (i.e., users being able to bypass content sharing permissions)<br />
*Privacy (i.e., we tell a user that a piece of information is private but then we accidentally display it publicly)<br />
*Session fixation<br />
*Privilege escalation<br />
*Disclosure of system information<br />
*Stored XSS<br />
*Session management<br />
*User Authorization<br />
<br />
=News forum posts=<br />
Post announcement in the news forum at [http://www.mahara.org/ http://mahara.org/]<br />
<br />
Include links to the security advisories and a link to the [https://launchpad.net/mahara/+download download page] on Launchpad.<br />
<br />
Now is a good time to notify translators about changed strings, if this is a stable release. I tend to do this with a forum post in the Translations forum.<br />
<br />
Here is a sample minor release announcement:<br />
Title: Mahara security release: 15.04.1, 1.10.4, 1.9.6<br />
<br />
Hi all,<br />
<br />
Today we're announcing new minor releases for the Mahara 15.04, Mahara 1.10, and Mahara 1.9 series.<br />
<br />
These releases include <X> security fix<es> relating to <list of issues>, as well as several bug <br />
fixes. Site administrators are advised to upgrade as soon as possible.<br />
<br />
Release packages, as well as a full list of changes, are available on our Launchpad project:<br />
<br />
15.04.1: https://launchpad.net/mahara/+milestone/15.04.1<br />
1.10.4: https://launchpad.net/mahara/+milestone/1.10.4<br />
1.9.6: https://launchpad.net/mahara/+milestone/1.9.6<br />
<br />
<if this is the last release for a series:><br />
Note: the 1.9.6 release is the last supported release in the 1.9 series. <br />
<br />
Special thanks, as always, to everyone who helped by reporting bugs, submitting patches, and testing <br />
the changes!<br />
<br />
Sticky: No<br />
Closed: Yes<br />
=Quick announcements=<br />
<br />
*Change the topic of #mahara and include a link to forum topic on #mahara-dev<br />
*Put a note on:<br />
**[https://twitter.com/maharaproject Twitter]<br />
**[http://freecode.com/projects/mahara freecode] (formerly Freshmeat)<br />
**[https://www.linkedin.com/groups?home=&gid=2037561 LinkedIn]<br />
**Facebook [https://www.facebook.com/groups/maharausergroup/ MUG], [https://www.facebook.com/groups/MaharaDE13/ Mahara DE], [https://www.facebook.com/groups/moodlemaharameetup/ Moodle-Mahara Meetup], [https://www.facebook.com/groups/mahara.users/ Mahara in Japanese]<br />
<br />
You may need to ask a previous release manager to get access to some of these accounts.<br />
=Update community sites install (currently Catalyst hosted)=<br />
<br />
*demo.mahara.org, including prep site and change the version number and release date on the homepage and dashboard page, via Admin menu -> Configure site -> Static pages (both logged in and logged out ones) also update the Admin menu -> Configure site -> Menus to have the external link to go to new youtube video (both logged in and logged out ones)<br />
*mahara.org (at minimum to latest minor point release of the supported version it runs on)<br />
*master.dev.mahara.org<br />
<br />
They are all deployed using Catalyst's standard internal hosting deployment scripts. Also update the installed language packs on the demo site. As a guideline, language packs that are 90% or more translated should be installed.<br />
<br />
=Update MITRE about release for CVE number publication=<br />
If the release included security updates for which CVE numbers had been issued, [https://cveform.mitre.org/ request an update to the CVE number] so it can be published.</div>Robertlhttps://wiki.mahara.org/index.php?title=Releases&diff=13012Releases2022-04-27T02:40:49Z<p>Robertl: /* Current and upcoming releases */</p>
<hr />
<div>=Release cycle and version support=<br />
<p>A new major version of Mahara is released every 6 months, in April and October. The version numbers reflect the year and the month in which a version was released. See [[Developer_Area/Version_Numbering_Policy|Version Numbering Policy]] for more details.<br><br />
<br />
{| class="wikitable" style="padding:0em; text-align:left" summary="Mahara's six monthly cycle for April and October releases."<br />
! scope="col" style="text-align:left; background-color:#566d31; color:#fff;" |Release cycle<br />
! scope="col" style="text-align:left;" |Nov - Apr<br />
! scope="col" style="text-align:left;" |May - Oct<br />
|-<br />
! scope="row" style="text-align:left;" |Feature freeze<br />
| style="background-color:#fff;" |Early February<br />
| style="background-color:#fff;" |Early August<br />
|-<br />
! scope="row" style="text-align:left;" |UI freeze<br />
| style="background-color:#fff;" |Early March<br />
| style="background-color:#fff;" |Early September<br />
|-<br />
! scope="row" style="text-align:left;" |Release candidate<br />
| style="background-color:#fff;" |Mid March<br />
| style="background-color:#fff;" |Mid September<br />
|-<br />
! scope="row" style="text-align:left;" |Official release<br />
| style="background-color:#fff;" |Late April<br />
| style="background-color:#fff;" |Late October<br />
|-<br />
|}<br />
<ul><br />
<li> Each release has 16 weeks before feature freeze.</li><br />
<li>For each release, We've put feature freeze at a month before the release candidate. Only non-feature bug fixes will be committed after this </li><br />
<li>The week before the release candidates is a UI freeze. This is a freeze to string changes and theme changes. String or UI fixes will need to be at least high importance.</li><br />
</ul></p><br />
<p></p><br />
<p><strong>The standard support lifetime of a major version is 18 months (3 release cycles):</strong><br><br />
<ul><br />
<li>Receives bug fixes and security fixes for the first 6 months</li><br />
<li>Receives security fixes only, for an additional 12 months</li><br />
</ul><br />
In the event that a major release substantially breaks backwards compatibility, we may declare the previous release to be an extended support release which will receive security fixes for 30 months (5 release cycles), in order to give sites more time to upgrade.</p><br />
<br />
=Older releases (pre Mahara 1.6)=<br />
<br />
Prior to Mahara 1.6, Mahara major versions were released as needed, according to no particular schedule. During the transition period to the 6 month release cycle, support for the older releases was provided for 2 release cycles.<br />
<br />
=Current and upcoming releases=<br />
<p>The latest <strong>stable</strong> version of Mahara is 22.04, released on 27 April 2022.</p><br />
<br />
<p>'''Note:''' This page is updated manually, and sometimes falls behind. For 100% up-to-date information, look for the release labelled "Current Stable Release" on our [https://launchpad.net/mahara/+series Launchpad release page], or use the "Download" link on the front page of https://mahara.org</p><br />
<br />
{| class="wikitable"<br />
| style="background:#ba2025; color:#fff" |Unsupported<br />
| style="background:#566d31; color:#fff" |Currently in support<br />
|Not yet released<br />
|}<br />
<br />
<!-- This is the template for the table sections below<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff"|'''[https://mahara.org/interaction/forum/topic.php?id= Major point release number]'''<br />
|<br />
* [https://launchpad.net/mahara/ Minor point release number]<br />
| '''Major point release date''' <br><br />
* Minor point release dates<br />
| style="background:#566d31; color:#fff" | End of support date<br />
|-<br />
--><br />
<br />
{| class="wikitable" summary="Release notes for major and minor versions of Mahara, official release dates and version support end date. Versions are listed in reverse chronological order. Table is four columns wide and 22 rows deep."<br />
|+ style="text-align:left;" |Mahara release notes and end of support<br />
|-<br />
! style="text-align:left;" |Major release<br />
! style="text-align:left;" |Minor release<br />
! style="text-align:left;" |Release date<br />
! style="text-align:left;" |End of support<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id= 22.04]'''<br />
// TODO: update link<br />
|<br />
*[https://launchpad.net/mahara/+milestone/22.04.0#release-notes 22.04.0]<br />
|'''27 April 2022'''<br />
| style="background:#566d31; color:#fff" |October 2024<br />
|-<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8955 21.10]'''<br />
|<br><br />
*[https://launchpad.net/mahara/+milestone/21.10.2#release-notes 21.10.2]<br />
*[https://launchpad.net/mahara/+milestone/21.10.1#release-notes 21.10.1]<br />
*[https://launchpad.net/mahara/+milestone/21.10.0#release-notes 21.10.0]<br />
|'''29 October 2021''' <br><br />
<br />
*27 April 2022<br />
*9 February 2022<br />
*29 October 2021<br />
| style="background:#566d31; color:#fff" |April 2023<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8817 21.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/21.04.4#release-notes 21.04.4]<br />
*[https://launchpad.net/mahara/+milestone/21.04.3#release-notes 21.04.3]<br />
*[https://launchpad.net/mahara/+milestone/21.04.2#release-notes 21.04.2]<br />
*[https://launchpad.net/mahara/+milestone/21.04.1#release-notes 21.04.1]<br />
*[https://launchpad.net/mahara/+milestone/21.04.0#release-notes 21.04.0]<br />
|'''30 April 2021''' <br><br />
<br />
*27 April 2022<br />
*9 February 2022<br />
*29 October 2021<br />
*21 May 2021<br />
*30 April 2021<br />
| style="background:#566d31; color:#fff" |October 2022<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8728 20.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/20.10.5#release-notes 20.10.5]<br />
*[https://launchpad.net/mahara/+milestone/20.10.4#release-notes 20.10.4]<br />
*[https://launchpad.net/mahara/+milestone/20.10.3#release-notes 20.10.3]<br />
*[https://launchpad.net/mahara/+milestone/20.10.2#release-notes 20.10.2]<br />
*[https://launchpad.net/mahara/+milestone/20.10.1#release-notes 20.10.1]<br />
*[https://launchpad.net/mahara/+milestone/20.10.0#release-notes 20.10.0]<br />
|'''22 October 2020'''<br><br />
<br />
*27 April 2022<br />
*9 February 2022<br />
*29 October 2021<br />
*21 May 2021<br />
*4 May 2021<br />
*22 October 2020<br />
| style="background:#ba2025; color:#fff" |April 2022 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8611 20.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/20.04.5#release-notes 20.04.5]<br />
*[https://launchpad.net/mahara/+milestone/20.04.4#release-notes 20.04.4]<br />
*[https://launchpad.net/mahara/+milestone/20.04.3#release-notes 20.04.3]<br />
*[https://launchpad.net/mahara/+milestone/20.04.2#release-notes 20.04.2]<br />
*[https://launchpad.net/mahara/+milestone/20.04.1#release-notes 20.04.1]<br />
*[https://launchpad.net/mahara/20.04/20.04.0#release-notes 20.04.0]<br />
|'''29 April 2020'''<br><br />
<br />
*29 October 2021<br />
*22 May 2021<br />
*4 May 2021<br />
*22 October 2020<br />
*4 August 2020<br />
*29 April 2020<br />
| style="background:#ba2025; color:#fff" |October 2021 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8533 19.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/19.10.6#releasenotes 19.10.6]<br />
*[https://launchpad.net/mahara/+milestone/19.10.5#releasenotes 19.10.5]<br />
*[https://launchpad.net/mahara/+milestone/19.10.4#release-notes 19.10.4]<br />
*[https://launchpad.net/mahara/+milestone/19.10.3#release-notes 19.10.3]<br />
*[https://launchpad.net/mahara/+milestone/19.10.2#release-notes 19.10.2]<br />
*[https://launchpad.net/mahara/19.10/19.10.1#release-notes 19.10.1]<br />
*[https://launchpad.net/mahara/19.10/19.10.0#release-notes 19.10.0]<br />
|'''31 October 2019''' <br><br />
<br />
*4 May 2021<br />
*22 October 2020<br />
*4 August 2020<br />
*30 April 2020<br />
*4 April 2020<br />
*12 November 2019<br />
*31 October 2019<br />
| style="background:#ba2025; color:#fff" |April 2021 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8444 19.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/19.04/19.04.5#release-notes 19.04.5]<br />
*[https://launchpad.net/mahara/19.04/19.04.4#release-notes 19.04.4]<br />
*[https://launchpad.net/mahara/19.04/19.04.3#release-notes 19.04.3]<br />
*[https://launchpad.net/mahara/19.04/19.04.2#release-notes 19.04.2]<br />
*[https://launchpad.net/mahara/19.04/19.04.1#release-notes 19.04.1]<br />
*[https://launchpad.net/mahara/19.04/19.04.0#release-notes 19.04.0]<br />
|'''30 April 2019''' <br><br />
<br />
*30 April 2020<br />
*4 March 2020<br />
*12 November 2019<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
| style="background:#ba2025; color:#fff" |October 2020 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8365 18.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/18.10/18.10.6#release-notes 18.10.6]<br />
*[https://launchpad.net/mahara/18.10/18.10.5#release-notes 18.10.5]<br />
*[https://launchpad.net/mahara/18.10/18.10.4#release-notes 18.10.4]<br />
*[https://launchpad.net/mahara/18.10/18.10.3#release-notes 18.10.3]<br />
*[https://launchpad.net/mahara/18.10/18.10.2#release-notes 18.10.2]<br />
*[https://launchpad.net/mahara/18.10/18.10.1#release-notes 18.10.1]<br />
*[https://launchpad.net/mahara/18.10/18.10.0#release-notes 18.10.0]<br />
|'''25 October 2018''' <br><br />
<br />
*30 April 2020<br />
*4 March 2020<br />
*12 November 2019<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
*25 October 2018<br />
| style="background:#ba2025; color:#fff" |April 2020 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8216 18.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/18.04/18.04.6#release-notes 18.04.6]<br />
*[https://launchpad.net/mahara/18.04/18.04.5#release-notes 18.04.5]<br />
*[https://launchpad.net/mahara/18.04/18.04.4#release-notes 18.04.4]<br />
*[https://launchpad.net/mahara/18.04/18.04.3#release-notes 18.04.3]<br />
*[https://launchpad.net/mahara/18.04/18.04.2#release-notes 18.04.2]<br />
*[https://launchpad.net/mahara/18.04/18.04.1#release-notes 18.04.1]<br />
*[https://launchpad.net/mahara/18.04/18.04.0#release-notes 18.04.0]<br />
|'''6 April 2018''' <br><br />
<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
| style="background:#ba2025; color:#fff" |October 2019 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8084 17.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/17.10/17.10.9#release-notes 17.10.9]<br />
*[https://launchpad.net/mahara/17.10/17.10.8#release-notes 17.10.8]<br />
*[https://launchpad.net/mahara/17.10/17.10.7#release-notes 17.10.7]<br />
*[https://launchpad.net/mahara/17.10/17.10.6#release-notes 17.10.6]<br />
*[https://launchpad.net/mahara/17.10/17.10.5#release-notes 17.10.5]<br />
*[https://launchpad.net/mahara/17.10/17.10.4#release-notes 17.10.4]<br />
*[https://launchpad.net/mahara/17.10/17.10.3#release-notes 17.10.3]<br />
*[https://launchpad.net/mahara/17.10/17.10.2#release-notes 17.10.2]<br />
*[https://launchpad.net/mahara/17.10/17.10.1#release-notes 17.10.1]<br />
*[https://launchpad.net/mahara/17.10/17.10.0#release-notes 17.10.0]<br />
|'''30 October 2017''' <br><br />
<br />
*30 April 2019<br />
*30 April 2019<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*14 December 2017<br />
*30 October 2017<br />
| style="background:#ba2025; color:#fff;" |30 April 2019 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7926 17.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/17.04/17.04.10#release-notes 17.04.10]<br />
*[https://launchpad.net/mahara/17.04/17.04.9#release-notes 17.04.9]<br />
*[https://launchpad.net/mahara/17.04/17.04.8#release-notes 17.04.8]<br />
*[https://launchpad.net/mahara/17.04/17.04.7#release-notes 17.04.7]<br />
*[https://launchpad.net/mahara/17.04/17.04.6#release-notes 17.04.6]<br />
*[https://launchpad.net/mahara/17.04/17.04.5#release-notes 17.04.5]<br />
*[https://launchpad.net/mahara/17.04/17.04.4#release-notes 17.04.4]<br />
*[https://launchpad.net/mahara/17.04/17.04.3#release-notes 17.04.3]<br />
*[https://launchpad.net/mahara/17.04/17.04.2#release-notes 17.04.2]<br />
*[https://launchpad.net/mahara/17.04/17.04.1#release-notes 17.04.1]<br />
*[https://launchpad.net/mahara/17.04/17.04.0#release-notes 17.04.0]<br />
|'''27 April 2017''' <br><br />
<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*12 May 2017<br />
*27 April 2017<br />
| style="background:#ba2025; color:#fff" |25 October 2018 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7750 16.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/16.10/16.10.9#release-notes 16.10.9]<br />
*[https://launchpad.net/mahara/16.10/16.10.8#release-notes 16.10.8]<br />
*[https://launchpad.net/mahara/16.10/16.10.7#release-notes 16.10.7]<br />
*[https://launchpad.net/mahara/16.10/16.10.6#release-notes 16.10.6]<br />
*[https://launchpad.net/mahara/16.10/16.10.5#release-notes 16.10.5]<br />
*[https://launchpad.net/mahara/16.10/16.10.4#release-notes 16.10.4]<br />
*[https://launchpad.net/mahara/16.10/16.10.3#release-notes 16.10.3]<br />
*[https://launchpad.net/mahara/16.10/16.10.2#release-notes 16.10.2]<br />
*[https://launchpad.net/mahara/16.10/16.10.1#release-notes 16.10.1]<br />
*[https://launchpad.net/mahara/16.10/16.10.0#release-notes 16.10.0]<br />
|'''21 October 2016''' <br><br />
<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*13 December 2016<br />
*21 October 2016<br />
| style="background:#ba2025; color:#fff" |06 April 2018 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7585 16.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/16.04/16.04.9#release-notes 16.04.9]<br />
*[https://launchpad.net/mahara/16.04/16.04.8#release-notes 16.04.8]<br />
*[https://launchpad.net/mahara/16.04/16.04.7#release-notes 16.04.7]<br />
*[https://launchpad.net/mahara/16.04/16.04.6#release-notes 16.04.6]<br />
*[https://launchpad.net/mahara/16.04/16.04.5#release-notes 16.04.5]<br />
*[https://launchpad.net/mahara/16.04/16.04.4#release-notes 16.04.4]<br />
*[https://launchpad.net/mahara/16.04/16.04.3#release-notes 16.04.3]<br />
*[https://launchpad.net/mahara/16.04/16.04.2#release-notes 16.04.2]<br />
*[https://launchpad.net/mahara/16.04/16.04.1#release-notes 16.04.1]<br />
*[https://launchpad.net/mahara/16.04/16.04.0#release-notes 16.04.0]<br />
|'''28 April 2016''' <br><br />
<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*11 July 2016<br />
*9 June 2016<br />
*28 April 2016<br />
| style="background:#ba2025; color:#fff" |30 October 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7420 15.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/15.10/15.10.8#release-notes 15.10.8]<br />
*[https://launchpad.net/mahara/15.10/15.10.7#release-notes 15.10.7]<br />
*[https://launchpad.net/mahara/15.10/15.10.6#release-notes 15.10.6]<br />
*[https://launchpad.net/mahara/15.10/15.10.5#release-notes 15.10.5]<br />
*[https://launchpad.net/mahara/15.10/15.10.4#release-notes 15.10.4]<br />
*[https://launchpad.net/mahara/15.10/15.10.3#release-notes 15.10.3]<br />
*[https://launchpad.net/mahara/15.10/15.10.2#release-notes 15.10.2]<br />
*[https://launchpad.net/mahara/15.10/15.10.1#release-notes 15.10.1]<br />
*[https://launchpad.net/mahara/15.10/15.10.0#release-notes 15.10.0]<br />
|'''23 October 2015''' <br><br />
<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*11 July 2016<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*23 October 2015<br />
| style="background:#ba2025; color:#fff" |26 April 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7171 15.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/15.04/15.04.15#release-notes 15.04.15]<br />
*[https://launchpad.net/mahara/15.04/15.04.14#release-notes 15.04.14]<br />
*[https://launchpad.net/mahara/15.04/15.04.13#release-notes 15.04.13]<br />
*[https://launchpad.net/mahara/15.04/15.04.12#release-notes 15.04.12]<br />
*[https://launchpad.net/mahara/15.04/15.04.11#release-notes 15.04.11]<br />
*[https://launchpad.net/mahara/15.04/15.04.10#release-notes 15.04.10]<br />
*[https://launchpad.net/mahara/15.04/15.04.9#release-notes 15.04.9]<br />
*[https://launchpad.net/mahara/15.04/15.04.8#release-notes 15.04.8]<br />
*[https://launchpad.net/mahara/15.04/15.04.7#release-notes 15.04.7]<br />
*[https://launchpad.net/mahara/15.04/15.04.6#release-notes 15.04.6]<br />
*[https://launchpad.net/mahara/15.04/15.04.5#release-notes 15.04.5]<br />
*[https://launchpad.net/mahara/15.04/15.04.4#release-notes 15.04.4]<br />
*[https://launchpad.net/mahara/15.04/15.04.3#release-notes 15.04.3]<br />
*[https://launchpad.net/mahara/15.04/15.04.2#release-notes 15.04.2]<br />
*[https://launchpad.net/mahara/15.04/15.04.1#release-notes 15.04.1]<br />
*[https://launchpad.net/mahara/15.04/15.04.0#release-notes 15.04.0]<br />
|'''23 October 2015''' <br><br />
<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*12 July 2016<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*29 May 2015<br />
*17 April 2015<br />
| style="background:#ba2025; color:#fff" |30 October 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=6509 1.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.10/1.10.10#release-notes 1.10.10]<br />
*[https://launchpad.net/mahara/1.10/1.10.9#release-notes 1.10.9]<br />
*[https://launchpad.net/mahara/1.10/1.10.8#release-notes 1.10.8]<br />
*[https://launchpad.net/mahara/1.10/1.10.7#release-notes 1.10.7]<br />
*[https://launchpad.net/mahara/1.10/1.10.6#release-notes 1.10.6]<br />
*[https://launchpad.net/mahara/1.10/1.10.5#release-notes 1.10.5]<br />
*[https://launchpad.net/mahara/1.10/1.10.4#release-notes 1.10.4]<br />
*[https://launchpad.net/mahara/1.10/1.10.3#release-notes 1.10.3]<br />
*[https://launchpad.net/mahara/1.10/1.10.2#release-notes 1.10.2]<br />
*[https://launchpad.net/mahara/1.10/1.10.1#release-notes 1.10.1]<br />
*[https://launchpad.net/mahara/1.10/1.10.0#release-notes 1.10.0]<br />
|'''21 October 2014''' <br><br />
<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*29 May 2015<br />
*20 April 2015<br />
*13 January 2015<br />
*26 November 2014<br />
*21 October 2014<br />
| style="background:#ba2025; color:#fff" |2 May 2016 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=6254 1.9]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.9/1.9.9#release-notes 1.9.9]<br />
*[https://launchpad.net/mahara/1.9/1.9.8#release-notes 1.9.8]<br />
*[https://launchpad.net/mahara/1.9/1.9.7#release-notes 1.9.7]<br />
*[https://launchpad.net/mahara/1.9/1.9.6#release-notes 1.9.6]<br />
*[https://launchpad.net/mahara/1.9/1.9.5#release-notes 1.9.5]<br />
*[https://launchpad.net/mahara/1.9/1.9.4#release-notes 1.9.4]<br />
*[https://launchpad.net/mahara/1.9/1.9.3#release-notes 1.9.3]<br />
*[https://launchpad.net/mahara/1.9/1.9.2#release-notes 1.9.2]<br />
*[https://launchpad.net/mahara/1.9/1.9.1#release-notes 1.9.1]<br />
*[https://launchpad.net/mahara/1.9/1.9.0#release-notes 1.9.0]<br />
|'''15 April 2014''' <br><br />
<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*26 November 2014<br />
*22 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*15 April 2014<br />
| style="background:#ba2025; color:#fff" |27 October 2015 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=5833 1.8]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.8/1.8.7#release-notes 1.8.7]<br />
*[https://launchpad.net/mahara/1.8/1.8.6#release-notes 1.8.6]<br />
*[https://launchpad.net/mahara/1.8/1.8.5#release-notes 1.8.5]<br />
*[https://launchpad.net/mahara/1.8/1.8.4#release-notes 1.8.4]<br />
*[https://launchpad.net/mahara/1.8/1.8.3#release-notes 1.8.3]<br />
*[https://launchpad.net/mahara/1.8/1.8.2#release-notes 1.8.2]<br />
*[https://launchpad.net/mahara/1.8/1.8.1#release-notes 1.8.1]<br />
*[https://launchpad.net/mahara/1.8/1.8.0#release-notes 1.8.0]<br />
|'''24 October 2013''' <br><br />
<br />
*20 April 2015<br />
*26 November 2014<br />
*22 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*3 April 2014<br />
*18 December 2013<br />
*24 October 2013<br />
| style="background:#ba2025; color:#fff" |20 April 2015 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=5371 1.7]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.7/1.7.8#release-notes 1.7.8]<br />
*[https://launchpad.net/mahara/1.7/1.7.7#release-notes 1.7.7]<br />
*[https://launchpad.net/mahara/1.7/1.7.6#release-notes 1.7.6]<br />
*[https://launchpad.net/mahara/1.7/1.7.5#release-notes 1.7.5]<br />
*[https://launchpad.net/mahara/1.7/1.7.4#release-notes 1.7.4]<br />
*[https://launchpad.net/mahara/1.7/1.7.3#release-notes 1.7.3]<br />
*[https://launchpad.net/mahara/1.7/1.7.2#release-notes 1.7.2]<br />
*[https://launchpad.net/mahara/1.7/1.7.1#release-notes 1.7.1]<br />
*[https://launchpad.net/mahara/1.7/1.7.0#release-notes 1.7.0]<br />
|'''19 April 2013''' <br><br />
<br />
*21 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*29 October 2013<br />
*3 October 2013<br />
*3 April 2014<br />
*18 December 2013<br />
*24 October 2013<br />
*19 April 2013<br />
| style="background:#ba2025; color:#fff" |21 October 2014 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=4967 1.6]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.6/1.6.10#release-notes 1.6.10]<br />
*[https://launchpad.net/mahara/1.6/1.6.9#release-notes 1.6.9]<br />
*[https://launchpad.net/mahara/1.6/1.6.8#release-notes 1.6.8]<br />
*[https://launchpad.net/mahara/1.6/1.6.7#release-notes 1.6.7]<br />
*[https://launchpad.net/mahara/1.6/1.6.6#release-notes 1.6.6]<br />
*[https://launchpad.net/mahara/1.6/1.6.5#release-notes 1.6.5]<br />
*[https://launchpad.net/mahara/1.6/1.6.4#release-notes 1.6.4]<br />
*[https://launchpad.net/mahara/1.6/1.6.3#release-notes 1.6.3]<br />
*[https://launchpad.net/mahara/1.6/1.6.2#release-notes 1.6.2]<br />
*[https://launchpad.net/mahara/1.6/1.6.1#release-notes 1.6.1]<br />
*[https://launchpad.net/mahara/1.6/1.6.0#release-notes 1.6.0]<br />
|'''19 October 2019''' <br><br />
<br />
*13 May 2014<br />
*3 April 2014<br />
*29 October 2013<br />
*3 October 2013<br />
*25 July 2013<br />
*2 May 2013<br />
*15 April 2013<br />
*15 February 2013<br />
*23 November 2012<br />
*24 October 2012<br />
*19 October 2012<br />
| style="background:#ba2025; color:#fff" |29 April 2014 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=4469 1.5]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.5/1.5.13#release-notes 1.5.13]<br />
*[https://launchpad.net/mahara/1.5/1.5.12#release-notes 1.5.12]<br />
*[https://launchpad.net/mahara/1.5/1.5.11#release-notes 1.5.11]<br />
*[https://launchpad.net/mahara/1.5/1.5.10#release-notes 1.5.10]<br />
*[https://launchpad.net/mahara/1.5/1.5.9#release-notes 1.5.9]<br />
*[https://launchpad.net/mahara/1.5/1.5.8#release-notes 1.5.8]<br />
*[https://launchpad.net/mahara/1.5/1.5.7#release-notes 1.5.7]<br />
*[https://launchpad.net/mahara/1.5/1.5.6#release-notes 1.5.6]<br />
*[https://launchpad.net/mahara/1.5/1.5.4#release-notes 1.5.4]<br />
*[https://launchpad.net/mahara/1.5/1.5.3#release-notes 1.5.3]<br />
*[https://launchpad.net/mahara/1.5/1.5.2#release-notes 1.5.2]<br />
*[https://launchpad.net/mahara/1.5/1.5.1#release-notes 1.5.1]<br />
*[https://launchpad.net/mahara/1.5/1.5.0#release-notes 1.5.0]<br />
|'''17 April 2012''' <br><br />
<br />
*25 October 2013<br />
*3 October 2013<br />
*24 July 2013<br />
*2 May 2013<br />
*15 April 2013<br />
*15 February 2013<br />
*23 November 2012<br />
*17 October 2012<br />
*10 October 2012<br />
*14 September 2012<br />
*31 July 2012<br />
*3 May 2012<br />
*17 April 2012<br />
| style="background:#ba2025; color:#fff" |29 October 2013 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=3744 1.4]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.6 1.4.6]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.5 1.4.5]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.4 1.4.4]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.3 1.4.3]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.2 1.4.2]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.1 1.4.1]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.0 1.4.0]<br />
|'''13 June 2011''' <br><br />
<br />
*17 October 2012<br />
*10 October 2012<br />
*14 September 2012<br />
*31 July 2011<br />
*6 March 2011<br />
*3 November 2011<br />
*13 June 2011<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=2252 1.3]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.3.8 1.3.8]<br />
*[https://launchpad.net/mahara/+milestone/1.3.7 1.3.7]<br />
*[https://launchpad.net/mahara/+milestone/1.3.6 1.3.6]<br />
*[https://launchpad.net/mahara/+milestone/1.3.5 1.3.5]<br />
*[https://launchpad.net/mahara/+milestone/1.3.4 1.3.4]<br />
*[https://launchpad.net/mahara/+milestone/1.3.3 1.3.3]<br />
*[https://launchpad.net/mahara/+milestone/1.3.2 1.3.2]<br />
*[https://launchpad.net/mahara/+milestone/1.3.1 1.3.1]<br />
*[https://launchpad.net/mahara/+milestone/1.3.0 1.3.0]<br />
|'''10 September 2010''' <br><br />
<br />
*5 March 2012<br />
*3 Novemver 2011<br />
*10 May 2011<br />
*28 March 2011<br />
*24 March 2011<br />
*7 November 2010<br />
*8 October 2010<br />
*17 September 2010<br />
*10 September 2010<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=1226 1.2]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.2.9 1.2.9]<br />
*[https://launchpad.net/mahara/+milestone/1.2..8 1.2.8]<br />
*[https://launchpad.net/mahara/+milestone/1.2.7 1.2.7]<br />
*[https://launchpad.net/mahara/+milestone/1.2.6 1.2.6]<br />
*[https://launchpad.net/mahara/+milestone/1.2.5 1.2.5]<br />
*[https://launchpad.net/mahara/+milestone/1.2.4 1.2.4]<br />
*[https://launchpad.net/mahara/+milestone/1.2.3 1.2.3]<br />
*[https://launchpad.net/mahara/+milestone/1.2.2 1.2.2]<br />
*[https://launchpad.net/mahara/+milestone/1.2.1 1.2.1]<br />
*[https://launchpad.net/mahara/+milestone/1.2.0 1.2.0]<br />
|'''16 November 2009''' <br><br />
<br />
*10 May 2011<br />
*24 March 2011<br />
*1 September 2011<br />
*2 July 2010<br />
*6 April 2010<br />
*8 February 2010<br />
*8 December 2009<br />
*8 December 2009<br />
*16 November 2009<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://launchpad.net/mahara/+milestone/1.0.10 1.1]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.1.9 1.1.9]<br />
*[https://launchpad.net/mahara/+milestone/1.1.8 1.1.8]<br />
*[https://launchpad.net/mahara/+milestone/1.1.7 1.1.7]<br />
*[https://launchpad.net/mahara/+milestone/1.1.6 1.1.6]<br />
*[https://launchpad.net/mahara/+milestone/1.1.5 1.1.5]<br />
*[https://launchpad.net/mahara/+milestone/1.1.4 1.1.4]<br />
*[https://launchpad.net/mahara/+milestone/1.1.3 1.1.3]<br />
*[https://launchpad.net/mahara/+milestone/1.1.2 1.1.2]<br />
*[https://launchpad.net/mahara/+milestone/1.1.1 1.1.1]<br />
*[https://launchpad.net/mahara/+milestone/1.1.0 1.1.0]<br />
|'''25 February 2009''' <br><br />
<br />
*2 July 2010<br />
*6 April 2010<br />
*28 October 2009<br />
*21 June 2009<br />
*10 June 2009<br />
*21 April 2009<br />
*9 March 2009<br />
*26 February 2009<br />
*25 February 2009<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=292 1.0]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.0.15 1.0.15]<br />
*[https://launchpad.net/mahara/+milestone/1.0.14 1.0.14]<br />
*[https://launchpad.net/mahara/+milestone/1.0.13 1.0.13]<br />
*[https://launchpad.net/mahara/+milestone/1.0.12 1.0.12]<br />
*[https://launchpad.net/mahara/+milestone/1.0.11 1.0.11]<br />
*[https://launchpad.net/mahara/+milestone/1.0.10 1.0.10]<br />
*[[Releases/1.0.9|1.0.9]]<br />
*[[Releases/1.0.8|1.0.8]]<br />
*[[Releases/1.0.7|1.0.7]]<br />
|'''9 March 2009''' <br><br />
<br />
*2 July 2010<br />
*6 April 2010<br />
*28 October 2009<br />
*21 June 2009<br />
*21 April 2009<br />
*9 March 2009<br />
*Unavailable<br />
*Unavailable<br />
*Unavailable<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
|}<br />
<br />
=Definition of support=<br />
<br />
Being "supported" means:<br />
<br />
*The release team is committed to making available updates to Mahara that are security related. See [[Security]] to find out how to report security bugs to us.<br />
*Occasionally, some other serious bug fixes will be included, but these are not guaranteed. If you find another type of bug, please let us know by reporting it on the mahara.org forums or directly on Launchpad: https://bugs.launchpad.net/mahara/+filebug<br />
<br />
=Specific backporting rules=<br />
<br />
When deciding which bugs to backport to supported branches, these are the general principles:<br />
<br />
*'''[[Security]] bugs'''<br />
**'''All''' Critical and High priority security bugs should be backported.<br />
**'''Nearly all''' Medium and Low priority security bugs should be backported. At the maintenance team's discretion, these might not be backported if:<br />
***Backporting would be technically difficult due to differences between Mahara versions.<br />
***The bug fix requires database upgrades or dataroot manipulations.<br />
***The bug fix otherwise introduces a high risk of [https://en.wikipedia.org/wiki/Software_regression regressions].<br />
<br />
*'''Non-security bugs'''<br />
**'''All''' Critical bugs should be backported.<br />
**'''Most''' High priority bugs should be backported. At the maintenance team's discretion, these might not be backported if:<br />
***Backporting would be technically difficult due to differences between Mahara versions.<br />
***The bug fix requires database upgrades or dataroot manipulations.<br />
***The bug fix otherwise introduces a high risk of [https://en.wikipedia.org/wiki/Software_regression regressions].<br />
**'''No''' Medium or Low priority non-security bugs are backported.<br />
**'''No''' Wishlist bugs are backported. Wishlist items are only added to the current development branch.<br />
<br />
If you want to backport certain bug fixes or new features to your own instance of Mahara, you can do so on your own as the code is available.<br />
<br />
See [[Developer_Area/Bug_Status#Importance|Bug Status:Importance]] for the guidelines on how we decide whether a bug is Critical, High, Medium, or Low.<br />
<br />
[[Category:Release Notes]]</div>Robertlhttps://wiki.mahara.org/index.php?title=Releases&diff=12995Releases2022-04-27T01:06:34Z<p>Robertl: /* Current and upcoming releases */</p>
<hr />
<div>=Release cycle and version support=<br />
<p>A new major version of Mahara is released every 6 months, in April and October. The version numbers reflect the year and the month in which a version was released. See [[Developer_Area/Version_Numbering_Policy|Version Numbering Policy]] for more details.<br><br />
<br />
{| class="wikitable" style="padding:0em; text-align:left" summary="Mahara's six monthly cycle for April and October releases."<br />
! scope="col" style="text-align:left; background-color:#566d31; color:#fff;" |Release cycle<br />
! scope="col" style="text-align:left;" |Nov - Apr<br />
! scope="col" style="text-align:left;" |May - Oct<br />
|-<br />
! scope="row" style="text-align:left;" |Feature freeze<br />
| style="background-color:#fff;" |Early February<br />
| style="background-color:#fff;" |Early August<br />
|-<br />
! scope="row" style="text-align:left;" |UI freeze<br />
| style="background-color:#fff;" |Early March<br />
| style="background-color:#fff;" |Early September<br />
|-<br />
! scope="row" style="text-align:left;" |Release candidate<br />
| style="background-color:#fff;" |Mid March<br />
| style="background-color:#fff;" |Mid September<br />
|-<br />
! scope="row" style="text-align:left;" |Official release<br />
| style="background-color:#fff;" |Late April<br />
| style="background-color:#fff;" |Late October<br />
|-<br />
|}<br />
<ul><br />
<li> Each release has 16 weeks before feature freeze.</li><br />
<li>For each release, We've put feature freeze at a month before the release candidate. Only non-feature bug fixes will be committed after this </li><br />
<li>The week before the release candidates is a UI freeze. This is a freeze to string changes and theme changes. String or UI fixes will need to be at least high importance.</li><br />
</ul></p><br />
<p></p><br />
<p><strong>The standard support lifetime of a major version is 18 months (3 release cycles):</strong><br><br />
<ul><br />
<li>Receives bug fixes and security fixes for the first 6 months</li><br />
<li>Receives security fixes only, for an additional 12 months</li><br />
</ul><br />
In the event that a major release substantially breaks backwards compatibility, we may declare the previous release to be an extended support release which will receive security fixes for 30 months (5 release cycles), in order to give sites more time to upgrade.</p><br />
<br />
=Older releases (pre Mahara 1.6)=<br />
<br />
Prior to Mahara 1.6, Mahara major versions were released as needed, according to no particular schedule. During the transition period to the 6 month release cycle, support for the older releases was provided for 2 release cycles.<br />
<br />
=Current and upcoming releases=<br />
<p>The latest <strong>stable</strong> version of Mahara is 21.10, released on 29 October 2021.</p><br />
<br />
<p>'''Note:''' This page is updated manually, and sometimes falls behind. For 100% up-to-date information, look for the release labelled "Current Stable Release" on our [https://launchpad.net/mahara/+series Launchpad release page], or use the "Download" link on the front page of https://mahara.org</p><br />
<br />
{| class="wikitable"<br />
| style="background:#ba2025; color:#fff" |Unsupported<br />
| style="background:#566d31; color:#fff" |Currently in support<br />
|Not yet released<br />
|}<br />
<br />
<!-- This is the template for the table sections below<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff"|'''[https://mahara.org/interaction/forum/topic.php?id= Major point release number]'''<br />
|<br />
* [https://launchpad.net/mahara/ Minor point release number]<br />
| '''Major point release date''' <br><br />
* Minor point release dates<br />
| style="background:#566d31; color:#fff" | End of support date<br />
|-<br />
--><br />
<br />
{| class="wikitable" summary="Release notes for major and minor versions of Mahara, official release dates and version support end date. Versions are listed in reverse chronological order. Table is four columns wide and 22 rows deep."<br />
|+ style="text-align:left;" |Mahara release notes and end of support<br />
|-<br />
! style="text-align:left;" |Major release<br />
! style="text-align:left;" |Minor release<br />
! style="text-align:left;" |Release date<br />
! style="text-align:left;" |End of support<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8955 21.10]'''<br />
|<br><br />
*[https://launchpad.net/mahara/+milestone/21.10.1#release-notes 21.10.1]<br />
*[https://launchpad.net/mahara/+milestone/21.10.0#release-notes 21.10.0]<br />
|'''29 October 2021''' <br><br />
*9 February 2022<br />
*29 October 2021<br />
| style="background:#566d31; color:#fff" |April 2023<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8817 21.04]'''<br />
|<br><br />
*[https://launchpad.net/mahara/+milestone/21.04.3#release-notes 21.04.3]<br />
*[https://launchpad.net/mahara/+milestone/21.04.2#release-notes 21.04.2]<br />
*[https://launchpad.net/mahara/+milestone/21.04.1#release-notes 21.04.1]<br />
*[https://launchpad.net/mahara/+milestone/21.04.0#release-notes 21.04.0]<br />
|'''30 April 2021''' <br><br />
*9 February 2022<br />
*29 October 2021<br />
*21 May 2021<br />
*30 April 2021<br />
| style="background:#566d31; color:#fff" |October 2022<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8728 20.10]'''<br />
|<br><br />
*[https://launchpad.net/mahara/+milestone/20.10.5#release-notes 20.10.5]<br />
*[https://launchpad.net/mahara/+milestone/20.10.4#release-notes 20.10.4]<br />
*[https://launchpad.net/mahara/+milestone/20.10.3#release-notes 20.10.3]<br />
*[https://launchpad.net/mahara/+milestone/20.10.2#release-notes 20.10.2]<br />
*[https://launchpad.net/mahara/+milestone/20.10.1#release-notes 20.10.1]<br />
*[https://launchpad.net/mahara/+milestone/20.10.0#release-notes 20.10.0]<br />
|'''22 October 2020'''<br><br />
*27 April 2022<br />
*9 February 2022<br />
*29 October 2021<br />
*21 May 2021<br />
*4 May 2021<br />
*22 October 2020<br />
| style="background:#ba2025; color:#fff" |April 2022 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8611 20.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/20.04.5#release-notes 20.04.5]<br />
*[https://launchpad.net/mahara/+milestone/20.04.4#release-notes 20.04.4]<br />
*[https://launchpad.net/mahara/+milestone/20.04.3#release-notes 20.04.3]<br />
*[https://launchpad.net/mahara/+milestone/20.04.2#release-notes 20.04.2]<br />
*[https://launchpad.net/mahara/+milestone/20.04.1#release-notes 20.04.1]<br />
*[https://launchpad.net/mahara/20.04/20.04.0#release-notes 20.04.0]<br />
|'''29 April 2020'''<br><br />
<br />
*29 October 2021<br />
*22 May 2021<br />
*4 May 2021<br />
*22 October 2020<br />
*4 August 2020<br />
*29 April 2020<br />
| style="background:#ba2025; color:#fff" |October 2021 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8533 19.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/19.10.6#releasenotes 19.10.6]<br />
*[https://launchpad.net/mahara/+milestone/19.10.5#releasenotes 19.10.5]<br />
*[https://launchpad.net/mahara/+milestone/19.10.4#release-notes 19.10.4]<br />
*[https://launchpad.net/mahara/+milestone/19.10.3#release-notes 19.10.3]<br />
*[https://launchpad.net/mahara/+milestone/19.10.2#release-notes 19.10.2]<br />
*[https://launchpad.net/mahara/19.10/19.10.1#release-notes 19.10.1]<br />
*[https://launchpad.net/mahara/19.10/19.10.0#release-notes 19.10.0]<br />
|'''31 October 2019''' <br><br />
<br />
*4 May 2021<br />
*22 October 2020<br />
*4 August 2020<br />
*30 April 2020<br />
*4 April 2020<br />
*12 November 2019<br />
*31 October 2019<br />
| style="background:#ba2025; color:#fff" |April 2021 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8444 19.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/19.04/19.04.5#release-notes 19.04.5]<br />
*[https://launchpad.net/mahara/19.04/19.04.4#release-notes 19.04.4]<br />
*[https://launchpad.net/mahara/19.04/19.04.3#release-notes 19.04.3]<br />
*[https://launchpad.net/mahara/19.04/19.04.2#release-notes 19.04.2]<br />
*[https://launchpad.net/mahara/19.04/19.04.1#release-notes 19.04.1]<br />
*[https://launchpad.net/mahara/19.04/19.04.0#release-notes 19.04.0]<br />
|'''30 April 2019''' <br><br />
<br />
*30 April 2020<br />
*4 March 2020<br />
*12 November 2019<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
| style="background:#ba2025; color:#fff" |October 2020 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8365 18.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/18.10/18.10.6#release-notes 18.10.6]<br />
*[https://launchpad.net/mahara/18.10/18.10.5#release-notes 18.10.5]<br />
*[https://launchpad.net/mahara/18.10/18.10.4#release-notes 18.10.4]<br />
*[https://launchpad.net/mahara/18.10/18.10.3#release-notes 18.10.3]<br />
*[https://launchpad.net/mahara/18.10/18.10.2#release-notes 18.10.2]<br />
*[https://launchpad.net/mahara/18.10/18.10.1#release-notes 18.10.1]<br />
*[https://launchpad.net/mahara/18.10/18.10.0#release-notes 18.10.0]<br />
|'''25 October 2018''' <br><br />
<br />
*30 April 2020<br />
*4 March 2020<br />
*12 November 2019<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
*25 October 2018<br />
| style="background:#ba2025; color:#fff" |April 2020 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8216 18.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/18.04/18.04.6#release-notes 18.04.6]<br />
*[https://launchpad.net/mahara/18.04/18.04.5#release-notes 18.04.5]<br />
*[https://launchpad.net/mahara/18.04/18.04.4#release-notes 18.04.4]<br />
*[https://launchpad.net/mahara/18.04/18.04.3#release-notes 18.04.3]<br />
*[https://launchpad.net/mahara/18.04/18.04.2#release-notes 18.04.2]<br />
*[https://launchpad.net/mahara/18.04/18.04.1#release-notes 18.04.1]<br />
*[https://launchpad.net/mahara/18.04/18.04.0#release-notes 18.04.0]<br />
|'''6 April 2018''' <br><br />
<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
| style="background:#ba2025; color:#fff" |October 2019 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8084 17.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/17.10/17.10.9#release-notes 17.10.9]<br />
*[https://launchpad.net/mahara/17.10/17.10.8#release-notes 17.10.8]<br />
*[https://launchpad.net/mahara/17.10/17.10.7#release-notes 17.10.7]<br />
*[https://launchpad.net/mahara/17.10/17.10.6#release-notes 17.10.6]<br />
*[https://launchpad.net/mahara/17.10/17.10.5#release-notes 17.10.5]<br />
*[https://launchpad.net/mahara/17.10/17.10.4#release-notes 17.10.4]<br />
*[https://launchpad.net/mahara/17.10/17.10.3#release-notes 17.10.3]<br />
*[https://launchpad.net/mahara/17.10/17.10.2#release-notes 17.10.2]<br />
*[https://launchpad.net/mahara/17.10/17.10.1#release-notes 17.10.1]<br />
*[https://launchpad.net/mahara/17.10/17.10.0#release-notes 17.10.0]<br />
|'''30 October 2017''' <br><br />
<br />
*30 April 2019<br />
*30 April 2019<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*14 December 2017<br />
*30 October 2017<br />
| style="background:#ba2025; color:#fff;" |30 April 2019 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7926 17.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/17.04/17.04.10#release-notes 17.04.10]<br />
*[https://launchpad.net/mahara/17.04/17.04.9#release-notes 17.04.9]<br />
*[https://launchpad.net/mahara/17.04/17.04.8#release-notes 17.04.8]<br />
*[https://launchpad.net/mahara/17.04/17.04.7#release-notes 17.04.7]<br />
*[https://launchpad.net/mahara/17.04/17.04.6#release-notes 17.04.6]<br />
*[https://launchpad.net/mahara/17.04/17.04.5#release-notes 17.04.5]<br />
*[https://launchpad.net/mahara/17.04/17.04.4#release-notes 17.04.4]<br />
*[https://launchpad.net/mahara/17.04/17.04.3#release-notes 17.04.3]<br />
*[https://launchpad.net/mahara/17.04/17.04.2#release-notes 17.04.2]<br />
*[https://launchpad.net/mahara/17.04/17.04.1#release-notes 17.04.1]<br />
*[https://launchpad.net/mahara/17.04/17.04.0#release-notes 17.04.0]<br />
|'''27 April 2017''' <br><br />
<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*12 May 2017<br />
*27 April 2017<br />
| style="background:#ba2025; color:#fff" |25 October 2018 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7750 16.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/16.10/16.10.9#release-notes 16.10.9]<br />
*[https://launchpad.net/mahara/16.10/16.10.8#release-notes 16.10.8]<br />
*[https://launchpad.net/mahara/16.10/16.10.7#release-notes 16.10.7]<br />
*[https://launchpad.net/mahara/16.10/16.10.6#release-notes 16.10.6]<br />
*[https://launchpad.net/mahara/16.10/16.10.5#release-notes 16.10.5]<br />
*[https://launchpad.net/mahara/16.10/16.10.4#release-notes 16.10.4]<br />
*[https://launchpad.net/mahara/16.10/16.10.3#release-notes 16.10.3]<br />
*[https://launchpad.net/mahara/16.10/16.10.2#release-notes 16.10.2]<br />
*[https://launchpad.net/mahara/16.10/16.10.1#release-notes 16.10.1]<br />
*[https://launchpad.net/mahara/16.10/16.10.0#release-notes 16.10.0]<br />
|'''21 October 2016''' <br><br />
<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*13 December 2016<br />
*21 October 2016<br />
| style="background:#ba2025; color:#fff" |06 April 2018 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7585 16.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/16.04/16.04.9#release-notes 16.04.9]<br />
*[https://launchpad.net/mahara/16.04/16.04.8#release-notes 16.04.8]<br />
*[https://launchpad.net/mahara/16.04/16.04.7#release-notes 16.04.7]<br />
*[https://launchpad.net/mahara/16.04/16.04.6#release-notes 16.04.6]<br />
*[https://launchpad.net/mahara/16.04/16.04.5#release-notes 16.04.5]<br />
*[https://launchpad.net/mahara/16.04/16.04.4#release-notes 16.04.4]<br />
*[https://launchpad.net/mahara/16.04/16.04.3#release-notes 16.04.3]<br />
*[https://launchpad.net/mahara/16.04/16.04.2#release-notes 16.04.2]<br />
*[https://launchpad.net/mahara/16.04/16.04.1#release-notes 16.04.1]<br />
*[https://launchpad.net/mahara/16.04/16.04.0#release-notes 16.04.0]<br />
|'''28 April 2016''' <br><br />
<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*11 July 2016<br />
*9 June 2016<br />
*28 April 2016<br />
| style="background:#ba2025; color:#fff" |30 October 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7420 15.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/15.10/15.10.8#release-notes 15.10.8]<br />
*[https://launchpad.net/mahara/15.10/15.10.7#release-notes 15.10.7]<br />
*[https://launchpad.net/mahara/15.10/15.10.6#release-notes 15.10.6]<br />
*[https://launchpad.net/mahara/15.10/15.10.5#release-notes 15.10.5]<br />
*[https://launchpad.net/mahara/15.10/15.10.4#release-notes 15.10.4]<br />
*[https://launchpad.net/mahara/15.10/15.10.3#release-notes 15.10.3]<br />
*[https://launchpad.net/mahara/15.10/15.10.2#release-notes 15.10.2]<br />
*[https://launchpad.net/mahara/15.10/15.10.1#release-notes 15.10.1]<br />
*[https://launchpad.net/mahara/15.10/15.10.0#release-notes 15.10.0]<br />
|'''23 October 2015''' <br><br />
<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*11 July 2016<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*23 October 2015<br />
| style="background:#ba2025; color:#fff" |26 April 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7171 15.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/15.04/15.04.15#release-notes 15.04.15]<br />
*[https://launchpad.net/mahara/15.04/15.04.14#release-notes 15.04.14]<br />
*[https://launchpad.net/mahara/15.04/15.04.13#release-notes 15.04.13]<br />
*[https://launchpad.net/mahara/15.04/15.04.12#release-notes 15.04.12]<br />
*[https://launchpad.net/mahara/15.04/15.04.11#release-notes 15.04.11]<br />
*[https://launchpad.net/mahara/15.04/15.04.10#release-notes 15.04.10]<br />
*[https://launchpad.net/mahara/15.04/15.04.9#release-notes 15.04.9]<br />
*[https://launchpad.net/mahara/15.04/15.04.8#release-notes 15.04.8]<br />
*[https://launchpad.net/mahara/15.04/15.04.7#release-notes 15.04.7]<br />
*[https://launchpad.net/mahara/15.04/15.04.6#release-notes 15.04.6]<br />
*[https://launchpad.net/mahara/15.04/15.04.5#release-notes 15.04.5]<br />
*[https://launchpad.net/mahara/15.04/15.04.4#release-notes 15.04.4]<br />
*[https://launchpad.net/mahara/15.04/15.04.3#release-notes 15.04.3]<br />
*[https://launchpad.net/mahara/15.04/15.04.2#release-notes 15.04.2]<br />
*[https://launchpad.net/mahara/15.04/15.04.1#release-notes 15.04.1]<br />
*[https://launchpad.net/mahara/15.04/15.04.0#release-notes 15.04.0]<br />
|'''23 October 2015''' <br><br />
<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*12 July 2016<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*29 May 2015<br />
*17 April 2015<br />
| style="background:#ba2025; color:#fff" |30 October 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=6509 1.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.10/1.10.10#release-notes 1.10.10]<br />
*[https://launchpad.net/mahara/1.10/1.10.9#release-notes 1.10.9]<br />
*[https://launchpad.net/mahara/1.10/1.10.8#release-notes 1.10.8]<br />
*[https://launchpad.net/mahara/1.10/1.10.7#release-notes 1.10.7]<br />
*[https://launchpad.net/mahara/1.10/1.10.6#release-notes 1.10.6]<br />
*[https://launchpad.net/mahara/1.10/1.10.5#release-notes 1.10.5]<br />
*[https://launchpad.net/mahara/1.10/1.10.4#release-notes 1.10.4]<br />
*[https://launchpad.net/mahara/1.10/1.10.3#release-notes 1.10.3]<br />
*[https://launchpad.net/mahara/1.10/1.10.2#release-notes 1.10.2]<br />
*[https://launchpad.net/mahara/1.10/1.10.1#release-notes 1.10.1]<br />
*[https://launchpad.net/mahara/1.10/1.10.0#release-notes 1.10.0]<br />
|'''21 October 2014''' <br><br />
<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*29 May 2015<br />
*20 April 2015<br />
*13 January 2015<br />
*26 November 2014<br />
*21 October 2014<br />
| style="background:#ba2025; color:#fff" |2 May 2016 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=6254 1.9]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.9/1.9.9#release-notes 1.9.9]<br />
*[https://launchpad.net/mahara/1.9/1.9.8#release-notes 1.9.8]<br />
*[https://launchpad.net/mahara/1.9/1.9.7#release-notes 1.9.7]<br />
*[https://launchpad.net/mahara/1.9/1.9.6#release-notes 1.9.6]<br />
*[https://launchpad.net/mahara/1.9/1.9.5#release-notes 1.9.5]<br />
*[https://launchpad.net/mahara/1.9/1.9.4#release-notes 1.9.4]<br />
*[https://launchpad.net/mahara/1.9/1.9.3#release-notes 1.9.3]<br />
*[https://launchpad.net/mahara/1.9/1.9.2#release-notes 1.9.2]<br />
*[https://launchpad.net/mahara/1.9/1.9.1#release-notes 1.9.1]<br />
*[https://launchpad.net/mahara/1.9/1.9.0#release-notes 1.9.0]<br />
|'''15 April 2014''' <br><br />
<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*26 November 2014<br />
*22 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*15 April 2014<br />
| style="background:#ba2025; color:#fff" |27 October 2015 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=5833 1.8]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.8/1.8.7#release-notes 1.8.7]<br />
*[https://launchpad.net/mahara/1.8/1.8.6#release-notes 1.8.6]<br />
*[https://launchpad.net/mahara/1.8/1.8.5#release-notes 1.8.5]<br />
*[https://launchpad.net/mahara/1.8/1.8.4#release-notes 1.8.4]<br />
*[https://launchpad.net/mahara/1.8/1.8.3#release-notes 1.8.3]<br />
*[https://launchpad.net/mahara/1.8/1.8.2#release-notes 1.8.2]<br />
*[https://launchpad.net/mahara/1.8/1.8.1#release-notes 1.8.1]<br />
*[https://launchpad.net/mahara/1.8/1.8.0#release-notes 1.8.0]<br />
|'''24 October 2013''' <br><br />
<br />
*20 April 2015<br />
*26 November 2014<br />
*22 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*3 April 2014<br />
*18 December 2013<br />
*24 October 2013<br />
| style="background:#ba2025; color:#fff" |20 April 2015 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=5371 1.7]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.7/1.7.8#release-notes 1.7.8]<br />
*[https://launchpad.net/mahara/1.7/1.7.7#release-notes 1.7.7]<br />
*[https://launchpad.net/mahara/1.7/1.7.6#release-notes 1.7.6]<br />
*[https://launchpad.net/mahara/1.7/1.7.5#release-notes 1.7.5]<br />
*[https://launchpad.net/mahara/1.7/1.7.4#release-notes 1.7.4]<br />
*[https://launchpad.net/mahara/1.7/1.7.3#release-notes 1.7.3]<br />
*[https://launchpad.net/mahara/1.7/1.7.2#release-notes 1.7.2]<br />
*[https://launchpad.net/mahara/1.7/1.7.1#release-notes 1.7.1]<br />
*[https://launchpad.net/mahara/1.7/1.7.0#release-notes 1.7.0]<br />
|'''19 April 2013''' <br><br />
<br />
*21 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*29 October 2013<br />
*3 October 2013<br />
*3 April 2014<br />
*18 December 2013<br />
*24 October 2013<br />
*19 April 2013<br />
| style="background:#ba2025; color:#fff" |21 October 2014 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=4967 1.6]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.6/1.6.10#release-notes 1.6.10]<br />
*[https://launchpad.net/mahara/1.6/1.6.9#release-notes 1.6.9]<br />
*[https://launchpad.net/mahara/1.6/1.6.8#release-notes 1.6.8]<br />
*[https://launchpad.net/mahara/1.6/1.6.7#release-notes 1.6.7]<br />
*[https://launchpad.net/mahara/1.6/1.6.6#release-notes 1.6.6]<br />
*[https://launchpad.net/mahara/1.6/1.6.5#release-notes 1.6.5]<br />
*[https://launchpad.net/mahara/1.6/1.6.4#release-notes 1.6.4]<br />
*[https://launchpad.net/mahara/1.6/1.6.3#release-notes 1.6.3]<br />
*[https://launchpad.net/mahara/1.6/1.6.2#release-notes 1.6.2]<br />
*[https://launchpad.net/mahara/1.6/1.6.1#release-notes 1.6.1]<br />
*[https://launchpad.net/mahara/1.6/1.6.0#release-notes 1.6.0]<br />
|'''19 October 2019''' <br><br />
<br />
*13 May 2014<br />
*3 April 2014<br />
*29 October 2013<br />
*3 October 2013<br />
*25 July 2013<br />
*2 May 2013<br />
*15 April 2013<br />
*15 February 2013<br />
*23 November 2012<br />
*24 October 2012<br />
*19 October 2012<br />
| style="background:#ba2025; color:#fff" |29 April 2014 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=4469 1.5]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.5/1.5.13#release-notes 1.5.13]<br />
*[https://launchpad.net/mahara/1.5/1.5.12#release-notes 1.5.12]<br />
*[https://launchpad.net/mahara/1.5/1.5.11#release-notes 1.5.11]<br />
*[https://launchpad.net/mahara/1.5/1.5.10#release-notes 1.5.10]<br />
*[https://launchpad.net/mahara/1.5/1.5.9#release-notes 1.5.9]<br />
*[https://launchpad.net/mahara/1.5/1.5.8#release-notes 1.5.8]<br />
*[https://launchpad.net/mahara/1.5/1.5.7#release-notes 1.5.7]<br />
*[https://launchpad.net/mahara/1.5/1.5.6#release-notes 1.5.6]<br />
*[https://launchpad.net/mahara/1.5/1.5.4#release-notes 1.5.4]<br />
*[https://launchpad.net/mahara/1.5/1.5.3#release-notes 1.5.3]<br />
*[https://launchpad.net/mahara/1.5/1.5.2#release-notes 1.5.2]<br />
*[https://launchpad.net/mahara/1.5/1.5.1#release-notes 1.5.1]<br />
*[https://launchpad.net/mahara/1.5/1.5.0#release-notes 1.5.0]<br />
|'''17 April 2012''' <br><br />
<br />
*25 October 2013<br />
*3 October 2013<br />
*24 July 2013<br />
*2 May 2013<br />
*15 April 2013<br />
*15 February 2013<br />
*23 November 2012<br />
*17 October 2012<br />
*10 October 2012<br />
*14 September 2012<br />
*31 July 2012<br />
*3 May 2012<br />
*17 April 2012<br />
| style="background:#ba2025; color:#fff" |29 October 2013 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=3744 1.4]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.6 1.4.6]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.5 1.4.5]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.4 1.4.4]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.3 1.4.3]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.2 1.4.2]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.1 1.4.1]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.0 1.4.0]<br />
|'''13 June 2011''' <br><br />
<br />
*17 October 2012<br />
*10 October 2012<br />
*14 September 2012<br />
*31 July 2011<br />
*6 March 2011<br />
*3 November 2011<br />
*13 June 2011<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=2252 1.3]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.3.8 1.3.8]<br />
*[https://launchpad.net/mahara/+milestone/1.3.7 1.3.7]<br />
*[https://launchpad.net/mahara/+milestone/1.3.6 1.3.6]<br />
*[https://launchpad.net/mahara/+milestone/1.3.5 1.3.5]<br />
*[https://launchpad.net/mahara/+milestone/1.3.4 1.3.4]<br />
*[https://launchpad.net/mahara/+milestone/1.3.3 1.3.3]<br />
*[https://launchpad.net/mahara/+milestone/1.3.2 1.3.2]<br />
*[https://launchpad.net/mahara/+milestone/1.3.1 1.3.1]<br />
*[https://launchpad.net/mahara/+milestone/1.3.0 1.3.0]<br />
|'''10 September 2010''' <br><br />
<br />
*5 March 2012<br />
*3 Novemver 2011<br />
*10 May 2011<br />
*28 March 2011<br />
*24 March 2011<br />
*7 November 2010<br />
*8 October 2010<br />
*17 September 2010<br />
*10 September 2010<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=1226 1.2]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.2.9 1.2.9]<br />
*[https://launchpad.net/mahara/+milestone/1.2..8 1.2.8]<br />
*[https://launchpad.net/mahara/+milestone/1.2.7 1.2.7]<br />
*[https://launchpad.net/mahara/+milestone/1.2.6 1.2.6]<br />
*[https://launchpad.net/mahara/+milestone/1.2.5 1.2.5]<br />
*[https://launchpad.net/mahara/+milestone/1.2.4 1.2.4]<br />
*[https://launchpad.net/mahara/+milestone/1.2.3 1.2.3]<br />
*[https://launchpad.net/mahara/+milestone/1.2.2 1.2.2]<br />
*[https://launchpad.net/mahara/+milestone/1.2.1 1.2.1]<br />
*[https://launchpad.net/mahara/+milestone/1.2.0 1.2.0]<br />
|'''16 November 2009''' <br><br />
<br />
*10 May 2011<br />
*24 March 2011<br />
*1 September 2011<br />
*2 July 2010<br />
*6 April 2010<br />
*8 February 2010<br />
*8 December 2009<br />
*8 December 2009<br />
*16 November 2009<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://launchpad.net/mahara/+milestone/1.0.10 1.1]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.1.9 1.1.9]<br />
*[https://launchpad.net/mahara/+milestone/1.1.8 1.1.8]<br />
*[https://launchpad.net/mahara/+milestone/1.1.7 1.1.7]<br />
*[https://launchpad.net/mahara/+milestone/1.1.6 1.1.6]<br />
*[https://launchpad.net/mahara/+milestone/1.1.5 1.1.5]<br />
*[https://launchpad.net/mahara/+milestone/1.1.4 1.1.4]<br />
*[https://launchpad.net/mahara/+milestone/1.1.3 1.1.3]<br />
*[https://launchpad.net/mahara/+milestone/1.1.2 1.1.2]<br />
*[https://launchpad.net/mahara/+milestone/1.1.1 1.1.1]<br />
*[https://launchpad.net/mahara/+milestone/1.1.0 1.1.0]<br />
|'''25 February 2009''' <br><br />
<br />
*2 July 2010<br />
*6 April 2010<br />
*28 October 2009<br />
*21 June 2009<br />
*10 June 2009<br />
*21 April 2009<br />
*9 March 2009<br />
*26 February 2009<br />
*25 February 2009<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=292 1.0]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.0.15 1.0.15]<br />
*[https://launchpad.net/mahara/+milestone/1.0.14 1.0.14]<br />
*[https://launchpad.net/mahara/+milestone/1.0.13 1.0.13]<br />
*[https://launchpad.net/mahara/+milestone/1.0.12 1.0.12]<br />
*[https://launchpad.net/mahara/+milestone/1.0.11 1.0.11]<br />
*[https://launchpad.net/mahara/+milestone/1.0.10 1.0.10]<br />
*[[Releases/1.0.9|1.0.9]]<br />
*[[Releases/1.0.8|1.0.8]]<br />
*[[Releases/1.0.7|1.0.7]]<br />
|'''9 March 2009''' <br><br />
<br />
*2 July 2010<br />
*6 April 2010<br />
*28 October 2009<br />
*21 June 2009<br />
*21 April 2009<br />
*9 March 2009<br />
*Unavailable<br />
*Unavailable<br />
*Unavailable<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
|}<br />
<br />
=Definition of support=<br />
<br />
Being "supported" means:<br />
<br />
*The release team is committed to making available updates to Mahara that are security related. See [[Security]] to find out how to report security bugs to us.<br />
*Occasionally, some other serious bug fixes will be included, but these are not guaranteed. If you find another type of bug, please let us know by reporting it on the mahara.org forums or directly on Launchpad: https://bugs.launchpad.net/mahara/+filebug<br />
<br />
=Specific backporting rules=<br />
<br />
When deciding which bugs to backport to supported branches, these are the general principles:<br />
<br />
*'''[[Security]] bugs'''<br />
**'''All''' Critical and High priority security bugs should be backported.<br />
**'''Nearly all''' Medium and Low priority security bugs should be backported. At the maintenance team's discretion, these might not be backported if:<br />
***Backporting would be technically difficult due to differences between Mahara versions.<br />
***The bug fix requires database upgrades or dataroot manipulations.<br />
***The bug fix otherwise introduces a high risk of [https://en.wikipedia.org/wiki/Software_regression regressions].<br />
<br />
*'''Non-security bugs'''<br />
**'''All''' Critical bugs should be backported.<br />
**'''Most''' High priority bugs should be backported. At the maintenance team's discretion, these might not be backported if:<br />
***Backporting would be technically difficult due to differences between Mahara versions.<br />
***The bug fix requires database upgrades or dataroot manipulations.<br />
***The bug fix otherwise introduces a high risk of [https://en.wikipedia.org/wiki/Software_regression regressions].<br />
**'''No''' Medium or Low priority non-security bugs are backported.<br />
**'''No''' Wishlist bugs are backported. Wishlist items are only added to the current development branch.<br />
<br />
If you want to backport certain bug fixes or new features to your own instance of Mahara, you can do so on your own as the code is available.<br />
<br />
See [[Developer_Area/Bug_Status#Importance|Bug Status:Importance]] for the guidelines on how we decide whether a bug is Critical, High, Medium, or Low.<br />
<br />
[[Category:Release Notes]]</div>Robertlhttps://wiki.mahara.org/index.php?title=Releases&diff=12994Releases2022-04-27T01:04:40Z<p>Robertl: /* Current and upcoming releases */</p>
<hr />
<div>=Release cycle and version support=<br />
<p>A new major version of Mahara is released every 6 months, in April and October. The version numbers reflect the year and the month in which a version was released. See [[Developer_Area/Version_Numbering_Policy|Version Numbering Policy]] for more details.<br><br />
<br />
{| class="wikitable" style="padding:0em; text-align:left" summary="Mahara's six monthly cycle for April and October releases."<br />
! scope="col" style="text-align:left; background-color:#566d31; color:#fff;" |Release cycle<br />
! scope="col" style="text-align:left;" |Nov - Apr<br />
! scope="col" style="text-align:left;" |May - Oct<br />
|-<br />
! scope="row" style="text-align:left;" |Feature freeze<br />
| style="background-color:#fff;" |Early February<br />
| style="background-color:#fff;" |Early August<br />
|-<br />
! scope="row" style="text-align:left;" |UI freeze<br />
| style="background-color:#fff;" |Early March<br />
| style="background-color:#fff;" |Early September<br />
|-<br />
! scope="row" style="text-align:left;" |Release candidate<br />
| style="background-color:#fff;" |Mid March<br />
| style="background-color:#fff;" |Mid September<br />
|-<br />
! scope="row" style="text-align:left;" |Official release<br />
| style="background-color:#fff;" |Late April<br />
| style="background-color:#fff;" |Late October<br />
|-<br />
|}<br />
<ul><br />
<li> Each release has 16 weeks before feature freeze.</li><br />
<li>For each release, We've put feature freeze at a month before the release candidate. Only non-feature bug fixes will be committed after this </li><br />
<li>The week before the release candidates is a UI freeze. This is a freeze to string changes and theme changes. String or UI fixes will need to be at least high importance.</li><br />
</ul></p><br />
<p></p><br />
<p><strong>The standard support lifetime of a major version is 18 months (3 release cycles):</strong><br><br />
<ul><br />
<li>Receives bug fixes and security fixes for the first 6 months</li><br />
<li>Receives security fixes only, for an additional 12 months</li><br />
</ul><br />
In the event that a major release substantially breaks backwards compatibility, we may declare the previous release to be an extended support release which will receive security fixes for 30 months (5 release cycles), in order to give sites more time to upgrade.</p><br />
<br />
=Older releases (pre Mahara 1.6)=<br />
<br />
Prior to Mahara 1.6, Mahara major versions were released as needed, according to no particular schedule. During the transition period to the 6 month release cycle, support for the older releases was provided for 2 release cycles.<br />
<br />
=Current and upcoming releases=<br />
<p>The latest <strong>stable</strong> version of Mahara is 21.10, released on 29 October 2021.</p><br />
<br />
<p>'''Note:''' This page is updated manually, and sometimes falls behind. For 100% up-to-date information, look for the release labelled "Current Stable Release" on our [https://launchpad.net/mahara/+series Launchpad release page], or use the "Download" link on the front page of https://mahara.org</p><br />
<br />
{| class="wikitable"<br />
| style="background:#ba2025; color:#fff" |Unsupported<br />
| style="background:#566d31; color:#fff" |Currently in support<br />
|Not yet released<br />
|}<br />
<br />
<!-- This is the template for the table sections below<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff"|'''[https://mahara.org/interaction/forum/topic.php?id= Major point release number]'''<br />
|<br />
* [https://launchpad.net/mahara/ Minor point release number]<br />
| '''Major point release date''' <br><br />
* Minor point release dates<br />
| style="background:#566d31; color:#fff" | End of support date<br />
|-<br />
--><br />
<br />
{| class="wikitable" summary="Release notes for major and minor versions of Mahara, official release dates and version support end date. Versions are listed in reverse chronological order. Table is four columns wide and 22 rows deep."<br />
|+ style="text-align:left;" |Mahara release notes and end of support<br />
|-<br />
! style="text-align:left;" |Major release<br />
! style="text-align:left;" |Minor release<br />
! style="text-align:left;" |Release date<br />
! style="text-align:left;" |End of support<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8955 21.10]'''<br />
|<br><br />
*[https://launchpad.net/mahara/+milestone/21.10.1#release-notes 21.10.1]<br />
*[https://launchpad.net/mahara/+milestone/21.10.0#release-notes 21.10.0]<br />
|'''29 October 2021''' <br><br />
*9 February 2022<br />
*29 October 2021<br />
| style="background:#566d31; color:#fff" |April 2023<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8817 21.04]'''<br />
|<br><br />
*[https://launchpad.net/mahara/+milestone/21.04.3#release-notes 21.04.3]<br />
*[https://launchpad.net/mahara/+milestone/21.04.2#release-notes 21.04.2]<br />
*[https://launchpad.net/mahara/+milestone/21.04.1#release-notes 21.04.1]<br />
*[https://launchpad.net/mahara/+milestone/21.04.0#release-notes 21.04.0]<br />
|'''30 April 2021''' <br><br />
*9 February 2022<br />
*29 October 2021<br />
*21 May 2021<br />
*30 April 2021<br />
| style="background:#566d31; color:#fff" |October 2022<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8728 20.10]'''<br />
|<br><br />
*[https://launchpad.net/mahara/+milestone/20.10.5#release-notes 20.10.5]<br />
*[https://launchpad.net/mahara/+milestone/20.10.4#release-notes 20.10.4]<br />
*[https://launchpad.net/mahara/+milestone/20.10.3#release-notes 20.10.3]<br />
*[https://launchpad.net/mahara/+milestone/20.10.2#release-notes 20.10.2]<br />
*[https://launchpad.net/mahara/+milestone/20.10.1#release-notes 20.10.1]<br />
*[https://launchpad.net/mahara/+milestone/20.10.0#release-notes 20.10.0]<br />
|'''22 October 2020'''<br><br />
*27 April 2022<br />
*9 February 2022<br />
*29 October 2021<br />
*21 May 2021<br />
*4 May 2021<br />
*22 October 2020<br />
| style="background:#566d31; color:#fff" |April 2022 <br>(security and major bug fix updates only)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8611 20.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/20.04.5#release-notes 20.04.5]<br />
*[https://launchpad.net/mahara/+milestone/20.04.4#release-notes 20.04.4]<br />
*[https://launchpad.net/mahara/+milestone/20.04.3#release-notes 20.04.3]<br />
*[https://launchpad.net/mahara/+milestone/20.04.2#release-notes 20.04.2]<br />
*[https://launchpad.net/mahara/+milestone/20.04.1#release-notes 20.04.1]<br />
*[https://launchpad.net/mahara/20.04/20.04.0#release-notes 20.04.0]<br />
|'''29 April 2020'''<br><br />
<br />
*29 October 2021<br />
*22 May 2021<br />
*4 May 2021<br />
*22 October 2020<br />
*4 August 2020<br />
*29 April 2020<br />
| style="background:#ba2025; color:#fff" |October 2021 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8533 19.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/19.10.6#releasenotes 19.10.6]<br />
*[https://launchpad.net/mahara/+milestone/19.10.5#releasenotes 19.10.5]<br />
*[https://launchpad.net/mahara/+milestone/19.10.4#release-notes 19.10.4]<br />
*[https://launchpad.net/mahara/+milestone/19.10.3#release-notes 19.10.3]<br />
*[https://launchpad.net/mahara/+milestone/19.10.2#release-notes 19.10.2]<br />
*[https://launchpad.net/mahara/19.10/19.10.1#release-notes 19.10.1]<br />
*[https://launchpad.net/mahara/19.10/19.10.0#release-notes 19.10.0]<br />
|'''31 October 2019''' <br><br />
<br />
*4 May 2021<br />
*22 October 2020<br />
*4 August 2020<br />
*30 April 2020<br />
*4 April 2020<br />
*12 November 2019<br />
*31 October 2019<br />
| style="background:#ba2025; color:#fff" |April 2021 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8444 19.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/19.04/19.04.5#release-notes 19.04.5]<br />
*[https://launchpad.net/mahara/19.04/19.04.4#release-notes 19.04.4]<br />
*[https://launchpad.net/mahara/19.04/19.04.3#release-notes 19.04.3]<br />
*[https://launchpad.net/mahara/19.04/19.04.2#release-notes 19.04.2]<br />
*[https://launchpad.net/mahara/19.04/19.04.1#release-notes 19.04.1]<br />
*[https://launchpad.net/mahara/19.04/19.04.0#release-notes 19.04.0]<br />
|'''30 April 2019''' <br><br />
<br />
*30 April 2020<br />
*4 March 2020<br />
*12 November 2019<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
| style="background:#ba2025; color:#fff" |October 2020 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8365 18.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/18.10/18.10.6#release-notes 18.10.6]<br />
*[https://launchpad.net/mahara/18.10/18.10.5#release-notes 18.10.5]<br />
*[https://launchpad.net/mahara/18.10/18.10.4#release-notes 18.10.4]<br />
*[https://launchpad.net/mahara/18.10/18.10.3#release-notes 18.10.3]<br />
*[https://launchpad.net/mahara/18.10/18.10.2#release-notes 18.10.2]<br />
*[https://launchpad.net/mahara/18.10/18.10.1#release-notes 18.10.1]<br />
*[https://launchpad.net/mahara/18.10/18.10.0#release-notes 18.10.0]<br />
|'''25 October 2018''' <br><br />
<br />
*30 April 2020<br />
*4 March 2020<br />
*12 November 2019<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
*25 October 2018<br />
| style="background:#ba2025; color:#fff" |April 2020 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8216 18.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/18.04/18.04.6#release-notes 18.04.6]<br />
*[https://launchpad.net/mahara/18.04/18.04.5#release-notes 18.04.5]<br />
*[https://launchpad.net/mahara/18.04/18.04.4#release-notes 18.04.4]<br />
*[https://launchpad.net/mahara/18.04/18.04.3#release-notes 18.04.3]<br />
*[https://launchpad.net/mahara/18.04/18.04.2#release-notes 18.04.2]<br />
*[https://launchpad.net/mahara/18.04/18.04.1#release-notes 18.04.1]<br />
*[https://launchpad.net/mahara/18.04/18.04.0#release-notes 18.04.0]<br />
|'''6 April 2018''' <br><br />
<br />
*1 November 2019<br />
*23 July 2019<br />
*30 April 2019<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
| style="background:#ba2025; color:#fff" |October 2019 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=8084 17.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/17.10/17.10.9#release-notes 17.10.9]<br />
*[https://launchpad.net/mahara/17.10/17.10.8#release-notes 17.10.8]<br />
*[https://launchpad.net/mahara/17.10/17.10.7#release-notes 17.10.7]<br />
*[https://launchpad.net/mahara/17.10/17.10.6#release-notes 17.10.6]<br />
*[https://launchpad.net/mahara/17.10/17.10.5#release-notes 17.10.5]<br />
*[https://launchpad.net/mahara/17.10/17.10.4#release-notes 17.10.4]<br />
*[https://launchpad.net/mahara/17.10/17.10.3#release-notes 17.10.3]<br />
*[https://launchpad.net/mahara/17.10/17.10.2#release-notes 17.10.2]<br />
*[https://launchpad.net/mahara/17.10/17.10.1#release-notes 17.10.1]<br />
*[https://launchpad.net/mahara/17.10/17.10.0#release-notes 17.10.0]<br />
|'''30 October 2017''' <br><br />
<br />
*30 April 2019<br />
*30 April 2019<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*14 December 2017<br />
*30 October 2017<br />
| style="background:#ba2025; color:#fff;" |30 April 2019 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7926 17.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/17.04/17.04.10#release-notes 17.04.10]<br />
*[https://launchpad.net/mahara/17.04/17.04.9#release-notes 17.04.9]<br />
*[https://launchpad.net/mahara/17.04/17.04.8#release-notes 17.04.8]<br />
*[https://launchpad.net/mahara/17.04/17.04.7#release-notes 17.04.7]<br />
*[https://launchpad.net/mahara/17.04/17.04.6#release-notes 17.04.6]<br />
*[https://launchpad.net/mahara/17.04/17.04.5#release-notes 17.04.5]<br />
*[https://launchpad.net/mahara/17.04/17.04.4#release-notes 17.04.4]<br />
*[https://launchpad.net/mahara/17.04/17.04.3#release-notes 17.04.3]<br />
*[https://launchpad.net/mahara/17.04/17.04.2#release-notes 17.04.2]<br />
*[https://launchpad.net/mahara/17.04/17.04.1#release-notes 17.04.1]<br />
*[https://launchpad.net/mahara/17.04/17.04.0#release-notes 17.04.0]<br />
|'''27 April 2017''' <br><br />
<br />
*25 October 2018<br />
*11 June 2018<br />
*30 May 2018<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*12 May 2017<br />
*27 April 2017<br />
| style="background:#ba2025; color:#fff" |25 October 2018 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7750 16.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/16.10/16.10.9#release-notes 16.10.9]<br />
*[https://launchpad.net/mahara/16.10/16.10.8#release-notes 16.10.8]<br />
*[https://launchpad.net/mahara/16.10/16.10.7#release-notes 16.10.7]<br />
*[https://launchpad.net/mahara/16.10/16.10.6#release-notes 16.10.6]<br />
*[https://launchpad.net/mahara/16.10/16.10.5#release-notes 16.10.5]<br />
*[https://launchpad.net/mahara/16.10/16.10.4#release-notes 16.10.4]<br />
*[https://launchpad.net/mahara/16.10/16.10.3#release-notes 16.10.3]<br />
*[https://launchpad.net/mahara/16.10/16.10.2#release-notes 16.10.2]<br />
*[https://launchpad.net/mahara/16.10/16.10.1#release-notes 16.10.1]<br />
*[https://launchpad.net/mahara/16.10/16.10.0#release-notes 16.10.0]<br />
|'''21 October 2016''' <br><br />
<br />
*6 April 2018<br />
*2 February 2018<br />
*17 January 2018<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*13 December 2016<br />
*21 October 2016<br />
| style="background:#ba2025; color:#fff" |06 April 2018 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7585 16.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/16.04/16.04.9#release-notes 16.04.9]<br />
*[https://launchpad.net/mahara/16.04/16.04.8#release-notes 16.04.8]<br />
*[https://launchpad.net/mahara/16.04/16.04.7#release-notes 16.04.7]<br />
*[https://launchpad.net/mahara/16.04/16.04.6#release-notes 16.04.6]<br />
*[https://launchpad.net/mahara/16.04/16.04.5#release-notes 16.04.5]<br />
*[https://launchpad.net/mahara/16.04/16.04.4#release-notes 16.04.4]<br />
*[https://launchpad.net/mahara/16.04/16.04.3#release-notes 16.04.3]<br />
*[https://launchpad.net/mahara/16.04/16.04.2#release-notes 16.04.2]<br />
*[https://launchpad.net/mahara/16.04/16.04.1#release-notes 16.04.1]<br />
*[https://launchpad.net/mahara/16.04/16.04.0#release-notes 16.04.0]<br />
|'''28 April 2016''' <br><br />
<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*11 July 2016<br />
*9 June 2016<br />
*28 April 2016<br />
| style="background:#ba2025; color:#fff" |30 October 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7420 15.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/15.10/15.10.8#release-notes 15.10.8]<br />
*[https://launchpad.net/mahara/15.10/15.10.7#release-notes 15.10.7]<br />
*[https://launchpad.net/mahara/15.10/15.10.6#release-notes 15.10.6]<br />
*[https://launchpad.net/mahara/15.10/15.10.5#release-notes 15.10.5]<br />
*[https://launchpad.net/mahara/15.10/15.10.4#release-notes 15.10.4]<br />
*[https://launchpad.net/mahara/15.10/15.10.3#release-notes 15.10.3]<br />
*[https://launchpad.net/mahara/15.10/15.10.2#release-notes 15.10.2]<br />
*[https://launchpad.net/mahara/15.10/15.10.1#release-notes 15.10.1]<br />
*[https://launchpad.net/mahara/15.10/15.10.0#release-notes 15.10.0]<br />
|'''23 October 2015''' <br><br />
<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*11 July 2016<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*23 October 2015<br />
| style="background:#ba2025; color:#fff" |26 April 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=7171 15.04]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/15.04/15.04.15#release-notes 15.04.15]<br />
*[https://launchpad.net/mahara/15.04/15.04.14#release-notes 15.04.14]<br />
*[https://launchpad.net/mahara/15.04/15.04.13#release-notes 15.04.13]<br />
*[https://launchpad.net/mahara/15.04/15.04.12#release-notes 15.04.12]<br />
*[https://launchpad.net/mahara/15.04/15.04.11#release-notes 15.04.11]<br />
*[https://launchpad.net/mahara/15.04/15.04.10#release-notes 15.04.10]<br />
*[https://launchpad.net/mahara/15.04/15.04.9#release-notes 15.04.9]<br />
*[https://launchpad.net/mahara/15.04/15.04.8#release-notes 15.04.8]<br />
*[https://launchpad.net/mahara/15.04/15.04.7#release-notes 15.04.7]<br />
*[https://launchpad.net/mahara/15.04/15.04.6#release-notes 15.04.6]<br />
*[https://launchpad.net/mahara/15.04/15.04.5#release-notes 15.04.5]<br />
*[https://launchpad.net/mahara/15.04/15.04.4#release-notes 15.04.4]<br />
*[https://launchpad.net/mahara/15.04/15.04.3#release-notes 15.04.3]<br />
*[https://launchpad.net/mahara/15.04/15.04.2#release-notes 15.04.2]<br />
*[https://launchpad.net/mahara/15.04/15.04.1#release-notes 15.04.1]<br />
*[https://launchpad.net/mahara/15.04/15.04.0#release-notes 15.04.0]<br />
|'''23 October 2015''' <br><br />
<br />
*30 October 2017<br />
*11 September 2017<br />
*25 May 2017<br />
*26 April 2017<br />
*29 December 2016<br />
*25 October 2016<br />
*8 August 2016<br />
*12 July 2016<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*29 May 2015<br />
*17 April 2015<br />
| style="background:#ba2025; color:#fff" |30 October 2017 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=6509 1.10]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.10/1.10.10#release-notes 1.10.10]<br />
*[https://launchpad.net/mahara/1.10/1.10.9#release-notes 1.10.9]<br />
*[https://launchpad.net/mahara/1.10/1.10.8#release-notes 1.10.8]<br />
*[https://launchpad.net/mahara/1.10/1.10.7#release-notes 1.10.7]<br />
*[https://launchpad.net/mahara/1.10/1.10.6#release-notes 1.10.6]<br />
*[https://launchpad.net/mahara/1.10/1.10.5#release-notes 1.10.5]<br />
*[https://launchpad.net/mahara/1.10/1.10.4#release-notes 1.10.4]<br />
*[https://launchpad.net/mahara/1.10/1.10.3#release-notes 1.10.3]<br />
*[https://launchpad.net/mahara/1.10/1.10.2#release-notes 1.10.2]<br />
*[https://launchpad.net/mahara/1.10/1.10.1#release-notes 1.10.1]<br />
*[https://launchpad.net/mahara/1.10/1.10.0#release-notes 1.10.0]<br />
|'''21 October 2014''' <br><br />
<br />
*2 May 2016<br />
*24 March 2016<br />
*27 November 2015<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*29 May 2015<br />
*20 April 2015<br />
*13 January 2015<br />
*26 November 2014<br />
*21 October 2014<br />
| style="background:#ba2025; color:#fff" |2 May 2016 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=6254 1.9]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.9/1.9.9#release-notes 1.9.9]<br />
*[https://launchpad.net/mahara/1.9/1.9.8#release-notes 1.9.8]<br />
*[https://launchpad.net/mahara/1.9/1.9.7#release-notes 1.9.7]<br />
*[https://launchpad.net/mahara/1.9/1.9.6#release-notes 1.9.6]<br />
*[https://launchpad.net/mahara/1.9/1.9.5#release-notes 1.9.5]<br />
*[https://launchpad.net/mahara/1.9/1.9.4#release-notes 1.9.4]<br />
*[https://launchpad.net/mahara/1.9/1.9.3#release-notes 1.9.3]<br />
*[https://launchpad.net/mahara/1.9/1.9.2#release-notes 1.9.2]<br />
*[https://launchpad.net/mahara/1.9/1.9.1#release-notes 1.9.1]<br />
*[https://launchpad.net/mahara/1.9/1.9.0#release-notes 1.9.0]<br />
|'''15 April 2014''' <br><br />
<br />
*27 October 2015<br />
*19 August 2015<br />
*10 July 2015<br />
*26 November 2014<br />
*22 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*15 April 2014<br />
| style="background:#ba2025; color:#fff" |27 October 2015 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=5833 1.8]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.8/1.8.7#release-notes 1.8.7]<br />
*[https://launchpad.net/mahara/1.8/1.8.6#release-notes 1.8.6]<br />
*[https://launchpad.net/mahara/1.8/1.8.5#release-notes 1.8.5]<br />
*[https://launchpad.net/mahara/1.8/1.8.4#release-notes 1.8.4]<br />
*[https://launchpad.net/mahara/1.8/1.8.3#release-notes 1.8.3]<br />
*[https://launchpad.net/mahara/1.8/1.8.2#release-notes 1.8.2]<br />
*[https://launchpad.net/mahara/1.8/1.8.1#release-notes 1.8.1]<br />
*[https://launchpad.net/mahara/1.8/1.8.0#release-notes 1.8.0]<br />
|'''24 October 2013''' <br><br />
<br />
*20 April 2015<br />
*26 November 2014<br />
*22 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*3 April 2014<br />
*18 December 2013<br />
*24 October 2013<br />
| style="background:#ba2025; color:#fff" |20 April 2015 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff;" |'''[https://mahara.org/interaction/forum/topic.php?id=5371 1.7]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.7/1.7.8#release-notes 1.7.8]<br />
*[https://launchpad.net/mahara/1.7/1.7.7#release-notes 1.7.7]<br />
*[https://launchpad.net/mahara/1.7/1.7.6#release-notes 1.7.6]<br />
*[https://launchpad.net/mahara/1.7/1.7.5#release-notes 1.7.5]<br />
*[https://launchpad.net/mahara/1.7/1.7.4#release-notes 1.7.4]<br />
*[https://launchpad.net/mahara/1.7/1.7.3#release-notes 1.7.3]<br />
*[https://launchpad.net/mahara/1.7/1.7.2#release-notes 1.7.2]<br />
*[https://launchpad.net/mahara/1.7/1.7.1#release-notes 1.7.1]<br />
*[https://launchpad.net/mahara/1.7/1.7.0#release-notes 1.7.0]<br />
|'''19 April 2013''' <br><br />
<br />
*21 October 2014<br />
*1 August 2014<br />
*13 May 2014<br />
*29 October 2013<br />
*3 October 2013<br />
*3 April 2014<br />
*18 December 2013<br />
*24 October 2013<br />
*19 April 2013<br />
| style="background:#ba2025; color:#fff" |21 October 2014 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=4967 1.6]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.6/1.6.10#release-notes 1.6.10]<br />
*[https://launchpad.net/mahara/1.6/1.6.9#release-notes 1.6.9]<br />
*[https://launchpad.net/mahara/1.6/1.6.8#release-notes 1.6.8]<br />
*[https://launchpad.net/mahara/1.6/1.6.7#release-notes 1.6.7]<br />
*[https://launchpad.net/mahara/1.6/1.6.6#release-notes 1.6.6]<br />
*[https://launchpad.net/mahara/1.6/1.6.5#release-notes 1.6.5]<br />
*[https://launchpad.net/mahara/1.6/1.6.4#release-notes 1.6.4]<br />
*[https://launchpad.net/mahara/1.6/1.6.3#release-notes 1.6.3]<br />
*[https://launchpad.net/mahara/1.6/1.6.2#release-notes 1.6.2]<br />
*[https://launchpad.net/mahara/1.6/1.6.1#release-notes 1.6.1]<br />
*[https://launchpad.net/mahara/1.6/1.6.0#release-notes 1.6.0]<br />
|'''19 October 2019''' <br><br />
<br />
*13 May 2014<br />
*3 April 2014<br />
*29 October 2013<br />
*3 October 2013<br />
*25 July 2013<br />
*2 May 2013<br />
*15 April 2013<br />
*15 February 2013<br />
*23 November 2012<br />
*24 October 2012<br />
*19 October 2012<br />
| style="background:#ba2025; color:#fff" |29 April 2014 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=4469 1.5]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.5/1.5.13#release-notes 1.5.13]<br />
*[https://launchpad.net/mahara/1.5/1.5.12#release-notes 1.5.12]<br />
*[https://launchpad.net/mahara/1.5/1.5.11#release-notes 1.5.11]<br />
*[https://launchpad.net/mahara/1.5/1.5.10#release-notes 1.5.10]<br />
*[https://launchpad.net/mahara/1.5/1.5.9#release-notes 1.5.9]<br />
*[https://launchpad.net/mahara/1.5/1.5.8#release-notes 1.5.8]<br />
*[https://launchpad.net/mahara/1.5/1.5.7#release-notes 1.5.7]<br />
*[https://launchpad.net/mahara/1.5/1.5.6#release-notes 1.5.6]<br />
*[https://launchpad.net/mahara/1.5/1.5.4#release-notes 1.5.4]<br />
*[https://launchpad.net/mahara/1.5/1.5.3#release-notes 1.5.3]<br />
*[https://launchpad.net/mahara/1.5/1.5.2#release-notes 1.5.2]<br />
*[https://launchpad.net/mahara/1.5/1.5.1#release-notes 1.5.1]<br />
*[https://launchpad.net/mahara/1.5/1.5.0#release-notes 1.5.0]<br />
|'''17 April 2012''' <br><br />
<br />
*25 October 2013<br />
*3 October 2013<br />
*24 July 2013<br />
*2 May 2013<br />
*15 April 2013<br />
*15 February 2013<br />
*23 November 2012<br />
*17 October 2012<br />
*10 October 2012<br />
*14 September 2012<br />
*31 July 2012<br />
*3 May 2012<br />
*17 April 2012<br />
| style="background:#ba2025; color:#fff" |29 October 2013 <br>(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=3744 1.4]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.6 1.4.6]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.5 1.4.5]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.4 1.4.4]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.3 1.4.3]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.2 1.4.2]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.1 1.4.1]<br />
*[https://launchpad.net/mahara/1.4/+milestone/1.4.0 1.4.0]<br />
|'''13 June 2011''' <br><br />
<br />
*17 October 2012<br />
*10 October 2012<br />
*14 September 2012<br />
*31 July 2011<br />
*6 March 2011<br />
*3 November 2011<br />
*13 June 2011<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=2252 1.3]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.3.8 1.3.8]<br />
*[https://launchpad.net/mahara/+milestone/1.3.7 1.3.7]<br />
*[https://launchpad.net/mahara/+milestone/1.3.6 1.3.6]<br />
*[https://launchpad.net/mahara/+milestone/1.3.5 1.3.5]<br />
*[https://launchpad.net/mahara/+milestone/1.3.4 1.3.4]<br />
*[https://launchpad.net/mahara/+milestone/1.3.3 1.3.3]<br />
*[https://launchpad.net/mahara/+milestone/1.3.2 1.3.2]<br />
*[https://launchpad.net/mahara/+milestone/1.3.1 1.3.1]<br />
*[https://launchpad.net/mahara/+milestone/1.3.0 1.3.0]<br />
|'''10 September 2010''' <br><br />
<br />
*5 March 2012<br />
*3 Novemver 2011<br />
*10 May 2011<br />
*28 March 2011<br />
*24 March 2011<br />
*7 November 2010<br />
*8 October 2010<br />
*17 September 2010<br />
*10 September 2010<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=1226 1.2]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.2.9 1.2.9]<br />
*[https://launchpad.net/mahara/+milestone/1.2..8 1.2.8]<br />
*[https://launchpad.net/mahara/+milestone/1.2.7 1.2.7]<br />
*[https://launchpad.net/mahara/+milestone/1.2.6 1.2.6]<br />
*[https://launchpad.net/mahara/+milestone/1.2.5 1.2.5]<br />
*[https://launchpad.net/mahara/+milestone/1.2.4 1.2.4]<br />
*[https://launchpad.net/mahara/+milestone/1.2.3 1.2.3]<br />
*[https://launchpad.net/mahara/+milestone/1.2.2 1.2.2]<br />
*[https://launchpad.net/mahara/+milestone/1.2.1 1.2.1]<br />
*[https://launchpad.net/mahara/+milestone/1.2.0 1.2.0]<br />
|'''16 November 2009''' <br><br />
<br />
*10 May 2011<br />
*24 March 2011<br />
*1 September 2011<br />
*2 July 2010<br />
*6 April 2010<br />
*8 February 2010<br />
*8 December 2009<br />
*8 December 2009<br />
*16 November 2009<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://launchpad.net/mahara/+milestone/1.0.10 1.1]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.1.9 1.1.9]<br />
*[https://launchpad.net/mahara/+milestone/1.1.8 1.1.8]<br />
*[https://launchpad.net/mahara/+milestone/1.1.7 1.1.7]<br />
*[https://launchpad.net/mahara/+milestone/1.1.6 1.1.6]<br />
*[https://launchpad.net/mahara/+milestone/1.1.5 1.1.5]<br />
*[https://launchpad.net/mahara/+milestone/1.1.4 1.1.4]<br />
*[https://launchpad.net/mahara/+milestone/1.1.3 1.1.3]<br />
*[https://launchpad.net/mahara/+milestone/1.1.2 1.1.2]<br />
*[https://launchpad.net/mahara/+milestone/1.1.1 1.1.1]<br />
*[https://launchpad.net/mahara/+milestone/1.1.0 1.1.0]<br />
|'''25 February 2009''' <br><br />
<br />
*2 July 2010<br />
*6 April 2010<br />
*28 October 2009<br />
*21 June 2009<br />
*10 June 2009<br />
*21 April 2009<br />
*9 March 2009<br />
*26 February 2009<br />
*25 February 2009<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
! style="text-align:left; background:#fff" |'''[https://mahara.org/interaction/forum/topic.php?id=292 1.0]'''<br />
|<br><br />
<br />
*[https://launchpad.net/mahara/+milestone/1.0.15 1.0.15]<br />
*[https://launchpad.net/mahara/+milestone/1.0.14 1.0.14]<br />
*[https://launchpad.net/mahara/+milestone/1.0.13 1.0.13]<br />
*[https://launchpad.net/mahara/+milestone/1.0.12 1.0.12]<br />
*[https://launchpad.net/mahara/+milestone/1.0.11 1.0.11]<br />
*[https://launchpad.net/mahara/+milestone/1.0.10 1.0.10]<br />
*[[Releases/1.0.9|1.0.9]]<br />
*[[Releases/1.0.8|1.0.8]]<br />
*[[Releases/1.0.7|1.0.7]]<br />
|'''9 March 2009''' <br><br />
<br />
*2 July 2010<br />
*6 April 2010<br />
*28 October 2009<br />
*21 June 2009<br />
*21 April 2009<br />
*9 March 2009<br />
*Unavailable<br />
*Unavailable<br />
*Unavailable<br />
| style="background:#ba2025; color:#fff" |(no longer supported)<br />
|- style="vertical-align: top;"<br />
|}<br />
<br />
=Definition of support=<br />
<br />
Being "supported" means:<br />
<br />
*The release team is committed to making available updates to Mahara that are security related. See [[Security]] to find out how to report security bugs to us.<br />
*Occasionally, some other serious bug fixes will be included, but these are not guaranteed. If you find another type of bug, please let us know by reporting it on the mahara.org forums or directly on Launchpad: https://bugs.launchpad.net/mahara/+filebug<br />
<br />
=Specific backporting rules=<br />
<br />
When deciding which bugs to backport to supported branches, these are the general principles:<br />
<br />
*'''[[Security]] bugs'''<br />
**'''All''' Critical and High priority security bugs should be backported.<br />
**'''Nearly all''' Medium and Low priority security bugs should be backported. At the maintenance team's discretion, these might not be backported if:<br />
***Backporting would be technically difficult due to differences between Mahara versions.<br />
***The bug fix requires database upgrades or dataroot manipulations.<br />
***The bug fix otherwise introduces a high risk of [https://en.wikipedia.org/wiki/Software_regression regressions].<br />
<br />
*'''Non-security bugs'''<br />
**'''All''' Critical bugs should be backported.<br />
**'''Most''' High priority bugs should be backported. At the maintenance team's discretion, these might not be backported if:<br />
***Backporting would be technically difficult due to differences between Mahara versions.<br />
***The bug fix requires database upgrades or dataroot manipulations.<br />
***The bug fix otherwise introduces a high risk of [https://en.wikipedia.org/wiki/Software_regression regressions].<br />
**'''No''' Medium or Low priority non-security bugs are backported.<br />
**'''No''' Wishlist bugs are backported. Wishlist items are only added to the current development branch.<br />
<br />
If you want to backport certain bug fixes or new features to your own instance of Mahara, you can do so on your own as the code is available.<br />
<br />
See [[Developer_Area/Bug_Status#Importance|Bug Status:Importance]] for the guidelines on how we decide whether a bug is Critical, High, Medium, or Low.<br />
<br />
[[Category:Release Notes]]</div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Release_Instructions&diff=12938Developer Area/Release Instructions2022-04-26T03:06:51Z<p>Robertl: /* Run the first part of the release script */</p>
<hr />
<div>This document details the procedure to follow when building a release for general download. Other documents related to this one include the [[Developer Area/Version Numbering Policy|Version Numbering policy]] and the [[Developer Area/Release Policy|Release Policy]].<br />
<br />
For the purposes of these instructions, assume we are releasing version X.Y.Z of Mahara.<br />
<br />
'''Also see these pages for more instructions:'''<br />
<br />
*[[Developer Area/Release Instructions/Major Release|Major release]]<br />
*[[Developer Area/Release Instructions/Release Candidate|Release candidate]]<br />
<br />
==New version of current page==<br />
<br />
*🟡 [[Developer Area/Release Instructions/Pre-release investigation and tasks|Pre-release investigation and tasks]]<br />
<br />
*🟡 [[Developer_Area/Release_Instructions/Release_day|Release day steps]]<br />
<br />
=Apply for CVE numbers (for security fixes) before the publication of the release=<br />
<br />
At least a few days before the release (best as soon as a bug report exists) apply for one or more [https://cve.mitre.org/cve/request_id.html CVE numbers] for reported security issues. Each issue needs to have its own CVE number.<br />
<br />
While CVE numbers are not a requirement, they are useful for administrators who monitor security announcements. It is a good practice thing to do.<br />
<br />
Use the [https://cveform.mitre.org/ request form with MITRE] as we don't put Mahara into a distro anymore. <br />
<br />
🚨 '''IMPORTANT !!!''' 🚨<br />
<br />
Please note that this form can '''ONLY''' be used if the issue hasn't been made public yet.<br />
<br />
*CVE numbers that we receive are embargoed and do not leak details until we let MITRE know that they can be published.<br />
*Once you received a CVE number, please add it to the Launchpad bug for that issue so it can be tracked. It takes at least a couple of days after having received the CVE numbers until Launchpad accepts the CVE number via the CVE number field.<br />
*Add the description, vulnerability, impact (if needed), and the discoverer credit to the Launchpad bug so that the information is readily available for the security announcement. '''Catalyst NZ staff''' also have access to that information on Seafile along with a running record of which bugs have been reported to MITRE (or others if needed).<br />
<br />
=Let partners know one week prior to the release=<br />
<br />
Let Mahara Partners know in the [https://mahara.org/interaction/forum/view.php?id=1136 Partner forum] that a release is upcoming. Details are not shared though as the reports are still embargoed.<br />
<br />
=Pre-requisites for doing the release=<br />
<br />
*You must have a [[Developer Area/Release Instructions/Creating a GPG key|valid GPG key]] and you need to add it to Launchpad (see https://launchpad.net/~username/+editpgpkeys).<br />
*You must have lp-upload-project installed:<br />
<br />
apt-get install lptools<br />
<br />
OLD INFORMATION - please ignore<br />
<br />
*Configure lptools to '''write public information''' on Launchpad on your behalf:<br />
<br />
manage-credentials create -c ubuntu-dev-tools -l 2<br />
<br />
(Note: This won't work for Ubuntus after Maverick, as manage-credentials appears to have gone away. You will need to install lptools to proceed with the script usage.)<br />
<br />
=Make sure your mahara-scripts checkout is up to date=<br />
<br />
You need to have an up-to-date version of the [https://git.mahara.org/scripts/mahara-scripts mahara-scripts] repo in order to get the latest copy of the [http://git.mahara.org/scripts/mahara-scripts/blobs/master/release.php release script]. That's the only repo you need to have since the release script will clone the git.mahara.org repo all by itself.<br />
<br />
=Run the first part of the release script=<br />
<br />
[[File:File_Siren.gif]]'''IMPORTANT !!!'''[[File:File_Siren.gif]]<br />
<br />
(ignore for release candidates)'''Make sure that any security reviews/patches are merged before proceeding. THESE PATCHES ARE MARKED STATUS: Private. If you do not have the ability to see the security patches, that is you do not have the +2 review status - ask someone on the security team to merge them for you and to make public the related Launchpad bugs.'''<br />
<br />
Using the script you got in the previous step, run the first step of it like this:<br />
<br />
./release.php X.Y.Z X.Y_DEV (For rc X.Yrc1)<br />
<br />
This will create tarballs as well as a changelog and some release notes to paste into Launchpad. It will also spit out another script (release-X.Y.Z-cleanup.sh) to be run later.<br />
<br />
'''Important''' Check the terminal output in case there are gpg errors, for example<br />
<br />
Tag new version bump commit as 'X.YRC2_RELEASE'<br />
error: gpg failed to sign the data<br />
error: unable to sign the tag<br />
<br />
So this is what I did to fix it, all commands are on commandline:<br />
<br />
1) Updated the gpg program to use:<br />
git config --global gpg.program gpg2<br />
<br />
2) Tested if it was working:<br />
echo "test" | gpg2 --clearsign<br />
<br />
It wasn't so I had to do:<br />
export GPG_TTY=$(tty)<br />
<br />
then run again<br />
echo "test" | gpg2 --clearsign<br />
<br />
After all that when I ran release.php command again it didn't give me the error<br />
<br />
<br />
Note that the repos that will be pushed back to git.mahara.org are live in your /tmp. '''Do not reboot your machine''' in the middle of doing a release or you will have to run through the release script again.<br />
<br />
Note: For release candidates the commit message should be empty.<br />
<br />
=Testing=<br />
<br />
As we do continuous behat testing throughout development we only need to do the basic manual testing.<br />
Here is the testing that needs to be done using the tarballs you generated in the last step:<br />
<br />
#untar the tar that release.php generated somewhere and make sure you can connect to it via web installer<br />
#drop the db and create a new blank one to test install<br />
<br />
The install should be run 4 times, both on MySQL and Postgres and both via the web interface and CLI script.<br />
<br />
'''Note:''' If we are doing a .0 release the install will complain about missing $versions->$currentmajorversion->latest release number<br />
but don't panic this is because the local copy of the release has the series version that doesn't exist upstream yet so we can ignore this warning·<br />
<br />
Once we are all happy with that we need to run these manual upgrade tests:<br />
<br />
#install a fresh X.Y.Z-1 site, then upgrade to Z.Y.Z on Postgres, via web interface, and quickly check that everything works (create a portfolio, a blog with a blog post, a group with a forum and a forum post)<br />
#repeat that last step on MySQL<br />
<br />
=Create the release on Launchpad=<br />
<br />
Go to https://launchpad.net/mahara/+milestone/X.Y.Z<br />
<br />
First move any bugs that are not going to be part of this release to the next milestone in the series, eg if this is X.Y.3 then move to X.Y.4. You may need to make the milestone if it doesn't already exist via https://launchpad.net/mahara/X.Y and using the 'create milestone' link.<br />
<br />
Then click on "create release" and give it today's date.<br />
<br />
Leave "Keep the X.Y.Z milestone active." '''unchecked'''.<br />
<br />
Paste in the release notes and the changelog that were generated for you by the release script. You can remove the "bump version number" commits from the changelog since they aren't very useful :)<br />
<br />
=Sign and upload the tarballs=<br />
<br />
Run the next part of the release script, i.e. the script that was spit out by the release script.<br />
<br />
./release-X.Y.Z-cleanup.sh<br />
<br />
You will be prompted for enter release notes and a changelog. This will happen once for each archive file that is being uploaded, so you'll see six prompts total. Any data you enter here will go into the Launchpad release page. So, you can either enter it here, or leave it empty here and enter it directly into the Launchpad webpage.<br />
<br />
'''Note I''': If running this file stops before completion for any reason you will need to edit it and comment out the bits that did finish so that you don't run those buts twice then try the script again.<br />
For example the script does the bit where it pushes the tag to the git remote and signs the zipped files but doesn't upload them - you would need to comment out the 'git push' lines and the 'gpg --armor' lines.<br />
<br />
'''Note II''': If the zipped files fail to upload to Launchpad via the script then you will need to manually upload the zipped files and their corresponding .asc files. To do this go to the milestone page in Launchpad and click the 'Add download file' link.<br />
Set the description to: release tarball<br />
and choose the matching zipped and .asc file to upload<br />
<br />
You will need to do this for all the three types: .zip, .tar.bz2, .tar.gz<br />
<br />
This may happen if you get "keyring.errors.InitError: Failed to unlock the collection!" returned when trying to upload the files to launchpad<br />
<br />
=Update bugs on the tracker=<br />
<br />
On [https://bugs.launchpad.net/mahara Launchpad], click on all of the bugs targeted for that milestone and move them from "Fix committed" to "Fix released".<br />
<br />
To save some clicking you can go to the milestone page and open all the bugs in new tabs at once by pasting the following into the browser console (firefox)<br />
<br />
var result = document.evaluate("//tbody//tr[contains(., 'Committed')]//a[contains(@href, 'bugs')]", document, null, XPathResult.ANY_TYPE,null ); var mycount=0; while(node = result.iterateNext()) { window.open(node.href, '_blank'); mycount++; if (mycount == 50) { break; } }<br />
<br />
You will ned to allow popups for the site for this to work and it will open up to 50 bugs where the status is 'Committed'. If you have more than 50 to do - mark the first ones 'released' - refresh the list and do again. <br />
<br />
Now is also a good time to create the next release number in the series. Any remaining bugs that were not fixed for this release may be transferred to the next one, if they're still on the roadmap but were simply delayed.<br />
<br />
=Put the release notes on the wiki page=<br />
<br />
This is just adding a link to the right page on Launchpad, we no longer have a duplicate copy of the release notes on the wiki.<br />
<br />
[[Releases|Release notes page]]<br />
<br />
=Language packs=<br />
<br />
[[Developer_Area/Language_Packs/Launchpad_Branching | Create a new translation branch on launchpad.net and update the language scripts]] for the new release so that they appear on http://langpacks.mahara.org<br />
<br />
=Security forum posts=<br />
<br />
If this release includes security fixes, then publish advisories on the [https://mahara.org/interaction/forum/view.php?id=43 security forum].<br />
<br />
Here's a sample forum post:<br />
<br />
Title: Security issue relating to (Category) <1.0.5, <1.1.3, <1.2.0<br />
<br />
<description of issue><br />
<br />
Category: (XSS, Access control, Privacy, Spam, Privilege escalation, Session fixation, Etc.)<br />
Severity: (Critical, High, Medium, Low)<br />
Versions affected: <1.0.5, <1.1.3, <1.2.0<br />
Reported by:<br />
Bug reports: (launchpad URL)<br />
CVE reference: (If you have one; if not, this can be added later) <br />
<br />
Sticky: No<br />
Closed: No<br />
<br />
It can be tricky to decide what to put down for "Category". This should be the "category" in the security sense (like a category on the OWASP site) rather than category of Mahara functionality. Some categories we have used in the past:<br />
<br />
*Injection<br />
*Password security<br />
*Cross-site scripting (XSS)<br />
*Cross-site request forgery (CSRF)<br />
*Access control (i.e., users being able to bypass content sharing permissions)<br />
*Privacy (i.e., we tell a user that a piece of information is private but then we accidentally display it publicly)<br />
*Session fixation<br />
*Privilege escalation<br />
*Disclosure of system information<br />
*Stored XSS<br />
*Session management<br />
*User Authorization<br />
<br />
=News forum posts=<br />
<br />
Post announcement in the news forum at [http://www.mahara.org/ http://mahara.org/]<br />
<br />
Include links to the security advisories and a link to the [https://launchpad.net/mahara/+download download page] on Launchpad.<br />
<br />
Now is a good time to notify translators about changed strings, if this is a stable release. I tend to do this with a forum post in the Translations forum.<br />
<br />
Here is a sample minor release announcement:<br />
<br />
Title: Mahara security release: 15.04.1, 1.10.4, 1.9.6<br />
<br />
Hi all,<br />
<br />
Today we're announcing new minor releases for the Mahara 15.04, Mahara 1.10, and Mahara 1.9 series.<br />
<br />
These releases include <X> security fix<es> relating to <list of issues>, as well as several bug <br />
fixes. Site administrators are advised to upgrade as soon as possible.<br />
<br />
Release packages, as well as a full list of changes, are available on our Launchpad project:<br />
<br />
15.04.1: https://launchpad.net/mahara/+milestone/15.04.1<br />
1.10.4: https://launchpad.net/mahara/+milestone/1.10.4<br />
1.9.6: https://launchpad.net/mahara/+milestone/1.9.6<br />
<br />
<if this is the last release for a series:><br />
Note: the 1.9.6 release is the last supported release in the 1.9 series. <br />
<br />
Special thanks, as always, to everyone who helped by reporting bugs, submitting patches, and testing <br />
the changes!<br />
<br />
Sticky: No<br />
Closed: Yes<br />
<br />
=Quick announcements=<br />
<br />
*Change the topic of #mahara and include a link to forum topic on #mahara-dev<br />
*Put a note on:<br />
**[https://twitter.com/maharaproject Twitter]<br />
**[http://freecode.com/projects/mahara freecode] (formerly Freshmeat)<br />
**[https://www.linkedin.com/groups?home=&gid=2037561 LinkedIn]<br />
**Facebook [https://www.facebook.com/groups/maharausergroup/ MUG], [https://www.facebook.com/groups/MaharaDE13/ Mahara DE], [https://www.facebook.com/groups/moodlemaharameetup/ Moodle-Mahara Meetup], [https://www.facebook.com/groups/mahara.users/ Mahara in Japanese]<br />
<br />
You may need to ask a previous release manager to get access to some of these accounts.<br />
<br />
=Update community sites install (currently Catalyst hosted)=<br />
<br />
*demo.mahara.org, including prep site and change the version number and release date on the homepage and dashboard page (via Admin menu -> Configure site -> Static pages)<br />
*mahara.org (at minimum to latest minor point release of the supported version it runs on)<br />
*master.dev.mahara.org<br />
<br />
They are all deployed using Catalyst's standard internal hosting deployment scripts. Also update the installed language packs on the demo site. As a guideline, language packs that are 90% or more translated should be installed.<br />
<br />
=Update MITRE about release for CVE number publication=<br />
<br />
If the release included security updates for which CVE numbers had been issued, [https://cveform.mitre.org/ request an update to the CVE number] so it can be published.<br />
<br />
=Subpages=<br />
<br />
*[[Developer_Area/Release_Instructions/Creating_a_GPG_key|Creating a GPG key]]<br />
*[[Developer_Area/Release_Instructions/Release_script|Release script]]<br />
<br />
[[category:Developer Area]]</div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Release_Instructions/Release_day&diff=12937Developer Area/Release Instructions/Release day2022-04-26T03:05:34Z<p>Robertl: /* 📋 Final checks before starting release day */</p>
<hr />
<div>Not ready? [[Developer Area/Release Instructions/Pre-release investigation and tasks|> Go to 'Pre-release investigation and tasks]]'<br />
<br />
==📋 Final checks before starting release day==<br />
<br />
🚨 Make sure that any security reviews/patches are merged before proceeding 🚨<br />
<br />
🟡 '''Security team''' (if you don't have +2 review status, you won't be able to see these patches)<br />
<br />
*Merge the 'Private' security patches.<br />
*Update the related Launchpad bugs to 'Public security'.<br />
<br />
🟡 '''Release manager'''<br />
<br />
*CVE #'s - Security issues have an assigned CVE number?<br />
*Backporting - security fixes backported to all supported versions that need them?<br />
*Bugs fixed - all bugs going into his release have their fixes ''merged'' for all supported versions?<br />
*Comms - to Mahara partners + drafted the forum posts?<br />
<br />
🟡 '''All devs'''<br />
<br />
*What minor point release are you going to do?<br />
* Have you created a [[Developer Area/Release Instructions/Pre-release investigation and tasks#Creating a release on Launchpad|release]] on the milestone on Launchpad to receive the release generated tarballs?<br />
*<code>git pull [https://git.mahara.org/scripts/mahara-scripts mahara-scripts]</code><br />
*Valid GPG - do you have a [https://wiki.mahara.org/wiki/Developer_Area/Release_Instructions/Creating_a_GPG_key valid GPG key] added to your Launchpad account? See https://launchpad.net/~username/+editpgpkeys<br />
*<code>lptools</code> - do you have the lp-upload-project installed for uploading the release tars? <code> apt-get install lptools</code><br />
<br />
==📓 Prepare the changelog and release notes==<br />
Use the templates below to structure your changelog and release notes.<br />
<br />
====Changelog template:====<br />
Note: You can copy the list of bugs from the milestone page and re-format the list. Remove the 'bump version number' commits text.<br />
Bug XXXXXXX: <Title of bug><br />
<br />
Bug XXXXXXX: <Title of bug><br />
<br />
Bug XXXXXXX: <Title of bug><br />
<br />
...<br /><br />
====Release notes template:====<br />
Note: Replace the <code><XX.XX.X></code> with the milestone/version you are working on.<br />
Mahara <code><XX.XX.X></code> Release Notes<br />
<br />
This is a stable release of Mahara <code><XX.XX></code>. Stable release are fit for general use. <br />
<br />
If you find a bug, please report it to the tracker:<br />
<br />
https://bugs.launchpad.net/mahara/+filebug<br />
<br />
This release includes an upgrade path from 1.1.0. <br />
<br />
If you wish to upgrade, we encourage you to make a copy of your website and test <br />
<br />
the upgrade on it first, to minimise the effect of any potential unforeseen problems.<br />
<br />
==⚡ The release script==<br />
<br />
*A git repo will be created at <code>/tmp/mahara.####/mahara/</code> cloned from https://git.mahara.org/mahara/mahara .<br />
*Pre-built Mahara archives are generated and put into your current folder.<br />
*You will get a <code>release-X.Y.Z-cleanup.sh</code> script to run later.<br />
<br />
===Run the script===<br />
Go into <code>mahara-scripts</code> and run <code>./release.php X.Y.Z X.Y_DEV</code> , i.e. <code>[version number][branch] For rc X.Yrc1</code> <br />
<br />
#When prompted, insert your changelog.<br />
#(TEMPORARY: <code>sshphp</code>) <code>less /tmp/mahara.####/make.log</code> to watch for prompts.<br />
#Respond to the prompts in your terminal with <code>y</code> .<br />
<br />
Any data you enter for the changelog or release notes prompts will go into the Launchpad release page. You can enter it here, or leave it empty here and enter it directly into the Launchpad webpage.<br />
<br />
===Check the terminal output in case there are GPG errors===<br />
E.g. <code>Tag new version bump commit as 'X.YRC2_RELEASE' error: gpg failed to sign the data error: unable to sign the tag</code><br />
<br />
So this is what I did to fix it, all commands are on command line:<br />
<br />
#Update the gpg program with: <code> git config --global gpg.program gpg2 </code><br />
#Test if it is working with: <code> echo "test" | gpg2 --clearsign </code><br />
<br />
It wasn't so I had to do: <code> export GPG_TTY=$(tty)</code><br />
<br />
then run again <code> echo "test" | gpg2 --clearsign</code><br />
<br />
After all that when I ran <code>release.php</code> command again it didn't give me the error.<br />
<br />
'''Do not reboot your machine''' in the middle of doing a release or you will have to run through the release script again.<br />
<br />
Note: For release candidates the commit message should be empty.<br />
<br />
==✅ Testing==<br />
With continuous Behat testing throughout development, we only need to some basic manual testing. <br />
<br />
The following needs to be tested with '''MySQL''' as well as '''PostgreSQL'''.<br />
<br />
===Extract the build and prep the database===<br />
<br />
#Extract the build (<code>.tar</code> or <code>.zip</code>) of your pre-built Mahara and make sure you can connect to it via web installer.<br />
#Drop the database and create a new blank one.<br />
<br />
===Test case: Install the site with CLI and the web interface===<br />
Test that we can install Mahara with the pre-built packages:<br />
<br />
#Install Mahara using the CLI script <code>htdocs/admin/cli/install.php</code>.<br />
#Reset your database.<br />
#Go to your Mahara site and click 'Install'.<br />
#Reset your database.<br />
#Repeat with MySQL/PostgreSQL.<br />
<br />
'''Note:''' If we are doing a <code>.0</code> release the install will complain about missing <code>$versions->$currentmajorversion</code>->latest release number but don't panic this is because the local copy of the release has the series version that doesn't exist upstream yet so we can ignore this warning·<br />
<br />
===Test case: Manual upgrade with CLI and the web interface===<br />
Once we are all happy with that we need to run these manual upgrade tests<br />
<br />
#Install a fresh <code>X.Y.Z-1</code> site (one version before your working one).<br />
#Switch the code to your current release and upgrade to <code>X.Y.Z</code> with the CLI script <code>htdocs/admin/cli/upgrade.php</code>.<br />
#Check that everything works (create a portfolio, a blog with a blog post, a group with a forum and a forum post).<br />
#Reset your database.<br />
#Install a fresh <code>X.Y.Z-1</code><br />
#Switch the code to your current release and upgrade to <code>X.Y.Z</code> by going to the site and clicking 'Upgrade'.<br />
#Repeat with PostgreSQL/MySQL.<br />
<br />
==🚀 Sign and upload the tarballs==<br />
Run upload the release and clean up any temporary files with <code>./release-X.Y.Z-cleanup.sh</code><br />
<br />
'''Note I''': If running this file stops before completion for any reason you will need to edit it and comment out the bits that did finish so that you don't run those buts twice then try the script again. For example the script does the bit where it pushes the tag to the git remote and signs the zipped files but doesn't upload them - you would need to comment out the 'git push' lines and the 'gpg --armor' lines.<br />
<br />
'''Note II''': If the zipped files fail to upload to Launchpad via the script then you will need to manually upload the zipped files and their corresponding .asc files. To do this go to the milestone page in Launchpad and click the 'Add download file' link. Set the description to: release tarball and choose the matching zipped and .asc file to upload<br />
<br />
You will need to do this for all the three types: <code>.zip, .tar.bz2, .tar.gz</code><br />
<br />
==🐛 Update bugs on the tracker==<br />
Go to Launchpad and click on all of the bugs targeted for that milestone and move them from 'Fix committed' to 'Fix released'.<br />
<br />
'''OR''' <br />
<br />
In Firefox, go to the milestone page and open all the bugs in new tabs at once by pasting the following into the browser console.<br />
var result = document.evaluate("//tbody//tr[contains(., 'Committed')]//a[contains(@href, 'bugs')]", document, null, XPathResult.ANY_TYPE,null ); var mycount=0; while(node = result.iterateNext()) { window.open(node.href, '_blank'); mycount++; if (mycount == 50) { break; } }<br />
You will ned to allow popups for the site for this to work and it will open up to 50 bugs where the status is 'Committed'. If you have more than 50 to do - mark the first ones 'released' - refresh the list and do again.<br />
<br />
Now is also a good time to create the next release number in the series. Any remaining bugs that were not fixed for this release may be transferred to the next one, if they're still on the roadmap but were simply delayed.<br />
<br />
==📔 Put the release notes on the wiki page==<br />
This is just adding a link to the right page on Launchpad, we no longer have a duplicate copy of the release notes on the wiki.<br />
<br />
[[Releases|Release notes page]]<br />
<br />
==📗 Update wiki.mahara.org releases page==<br />
🟡 Release manager<br />
<br />
#Go to the [[Releases|releases page]].<br />
#Edit 'Current and upcoming releases.<br />
#Update the text: ''"The latest '''stable''' version of Mahara is <code>MAJOR_VERSION</code> , released on <code>DATE</code>"''<br />
#Add a new entry to the table for the new release.<br />
#Update the major version where 18 months has passed since its release to be 'unsupported'.<br />
<br />
==🌏 Update the language packs==<br />
[[Developer Area/Language Packs/Launchpad Branching|Create a new translation branch on launchpad.net and update the language scripts]] for the new release so that they appear on http://langpacks.mahara.org.<br />
<br />
Note: The number of language packs we support can be more than the supported Mahara versions as some people want to update old lang packs.</div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Release_Instructions/Release_day&diff=12936Developer Area/Release Instructions/Release day2022-04-26T02:32:41Z<p>Robertl: /* 📋 Final checks before starting release day */</p>
<hr />
<div>Not ready? [[Developer Area/Release Instructions/Pre-release investigation and tasks|> Go to 'Pre-release investigation and tasks]]'<br />
<br />
==📋 Final checks before starting release day==<br />
<br />
🚨 Make sure that any security reviews/patches are merged before proceeding 🚨<br />
<br />
🟡 '''Security team''' (if you don't have +2 review status, you won't be able to see these patches)<br />
<br />
*Merge the 'Draft' security patches.<br />
*Update the related Launchpad bugs to 'Public security'.<br />
<br />
🟡 '''Release manager'''<br />
<br />
*CVE #'s - Security issues have an assigned CVE number?<br />
*Backporting - security fixes backported to all supported versions that need them?<br />
*Bugs fixed - all bugs going into his release have their fixes ''merged'' for all supported versions?<br />
*Comms - to Mahara partners + drafted the forum posts?<br />
<br />
🟡 '''All devs'''<br />
<br />
*What minor point release are you going to do?<br />
* Have you created a [[Developer Area/Release Instructions/Pre-release investigation and tasks#Creating a release on Launchpad|release]] on the milestone on Launchpad to receive the release generated tarballs?<br />
*<code>git pull [https://git.mahara.org/scripts/mahara-scripts mahara-scripts]</code><br />
*Valid GPG - do you have a [https://wiki.mahara.org/wiki/Developer_Area/Release_Instructions/Creating_a_GPG_key valid GPG key] added to your Launchpad account? See https://launchpad.net/~username/+editpgpkeys<br />
*<code>lptools</code> - do you have the lp-upload-project installed for uploading the release tars? <code> apt-get install lptools</code><br />
<br />
==📓 Prepare the changelog and release notes==<br />
Use the templates below to structure your changelog and release notes.<br />
<br />
====Changelog template:====<br />
Note: You can copy the list of bugs from the milestone page and re-format the list. Remove the 'bump version number' commits text.<br />
Bug XXXXXXX: <Title of bug><br />
<br />
Bug XXXXXXX: <Title of bug><br />
<br />
Bug XXXXXXX: <Title of bug><br />
<br />
...<br /><br />
====Release notes template:====<br />
Note: Replace the <code><XX.XX.X></code> with the milestone/version you are working on.<br />
Mahara <code><XX.XX.X></code> Release Notes<br />
<br />
This is a stable release of Mahara <code><XX.XX></code>. Stable release are fit for general use. <br />
<br />
If you find a bug, please report it to the tracker:<br />
<br />
https://bugs.launchpad.net/mahara/+filebug<br />
<br />
This release includes an upgrade path from 1.1.0. <br />
<br />
If you wish to upgrade, we encourage you to make a copy of your website and test <br />
<br />
the upgrade on it first, to minimise the effect of any potential unforeseen problems.<br />
<br />
==⚡ The release script==<br />
<br />
*A git repo will be created at <code>/tmp/mahara.####/mahara/</code> cloned from https://git.mahara.org/mahara/mahara .<br />
*Pre-built Mahara archives are generated and put into your current folder.<br />
*You will get a <code>release-X.Y.Z-cleanup.sh</code> script to run later.<br />
<br />
===Run the script===<br />
Go into <code>mahara-scripts</code> and run <code>./release.php X.Y.Z X.Y_DEV</code> , i.e. <code>[version number][branch] For rc X.Yrc1</code> <br />
<br />
#When prompted, insert your changelog.<br />
#(TEMPORARY: <code>sshphp</code>) <code>less /tmp/mahara.####/make.log</code> to watch for prompts.<br />
#Respond to the prompts in your terminal with <code>y</code> .<br />
<br />
Any data you enter for the changelog or release notes prompts will go into the Launchpad release page. You can enter it here, or leave it empty here and enter it directly into the Launchpad webpage.<br />
<br />
===Check the terminal output in case there are GPG errors===<br />
E.g. <code>Tag new version bump commit as 'X.YRC2_RELEASE' error: gpg failed to sign the data error: unable to sign the tag</code><br />
<br />
So this is what I did to fix it, all commands are on command line:<br />
<br />
#Update the gpg program with: <code> git config --global gpg.program gpg2 </code><br />
#Test if it is working with: <code> echo "test" | gpg2 --clearsign </code><br />
<br />
It wasn't so I had to do: <code> export GPG_TTY=$(tty)</code><br />
<br />
then run again <code> echo "test" | gpg2 --clearsign</code><br />
<br />
After all that when I ran <code>release.php</code> command again it didn't give me the error.<br />
<br />
'''Do not reboot your machine''' in the middle of doing a release or you will have to run through the release script again.<br />
<br />
Note: For release candidates the commit message should be empty.<br />
<br />
==✅ Testing==<br />
With continuous Behat testing throughout development, we only need to some basic manual testing. <br />
<br />
The following needs to be tested with '''MySQL''' as well as '''PostgreSQL'''.<br />
<br />
===Extract the build and prep the database===<br />
<br />
#Extract the build (<code>.tar</code> or <code>.zip</code>) of your pre-built Mahara and make sure you can connect to it via web installer.<br />
#Drop the database and create a new blank one.<br />
<br />
===Test case: Install the site with CLI and the web interface===<br />
Test that we can install Mahara with the pre-built packages:<br />
<br />
#Install Mahara using the CLI script <code>htdocs/admin/cli/install.php</code>.<br />
#Reset your database.<br />
#Go to your Mahara site and click 'Install'.<br />
#Reset your database.<br />
#Repeat with MySQL/PostgreSQL.<br />
<br />
'''Note:''' If we are doing a <code>.0</code> release the install will complain about missing <code>$versions->$currentmajorversion</code>->latest release number but don't panic this is because the local copy of the release has the series version that doesn't exist upstream yet so we can ignore this warning·<br />
<br />
===Test case: Manual upgrade with CLI and the web interface===<br />
Once we are all happy with that we need to run these manual upgrade tests<br />
<br />
#Install a fresh <code>X.Y.Z-1</code> site (one version before your working one).<br />
#Switch the code to your current release and upgrade to <code>X.Y.Z</code> with the CLI script <code>htdocs/admin/cli/upgrade.php</code>.<br />
#Check that everything works (create a portfolio, a blog with a blog post, a group with a forum and a forum post).<br />
#Reset your database.<br />
#Install a fresh <code>X.Y.Z-1</code><br />
#Switch the code to your current release and upgrade to <code>X.Y.Z</code> by going to the site and clicking 'Upgrade'.<br />
#Repeat with PostgreSQL/MySQL.<br />
<br />
==🚀 Sign and upload the tarballs==<br />
Run upload the release and clean up any temporary files with <code>./release-X.Y.Z-cleanup.sh</code><br />
<br />
'''Note I''': If running this file stops before completion for any reason you will need to edit it and comment out the bits that did finish so that you don't run those buts twice then try the script again. For example the script does the bit where it pushes the tag to the git remote and signs the zipped files but doesn't upload them - you would need to comment out the 'git push' lines and the 'gpg --armor' lines.<br />
<br />
'''Note II''': If the zipped files fail to upload to Launchpad via the script then you will need to manually upload the zipped files and their corresponding .asc files. To do this go to the milestone page in Launchpad and click the 'Add download file' link. Set the description to: release tarball and choose the matching zipped and .asc file to upload<br />
<br />
You will need to do this for all the three types: <code>.zip, .tar.bz2, .tar.gz</code><br />
<br />
==🐛 Update bugs on the tracker==<br />
Go to Launchpad and click on all of the bugs targeted for that milestone and move them from 'Fix committed' to 'Fix released'.<br />
<br />
'''OR''' <br />
<br />
In Firefox, go to the milestone page and open all the bugs in new tabs at once by pasting the following into the browser console.<br />
var result = document.evaluate("//tbody//tr[contains(., 'Committed')]//a[contains(@href, 'bugs')]", document, null, XPathResult.ANY_TYPE,null ); var mycount=0; while(node = result.iterateNext()) { window.open(node.href, '_blank'); mycount++; if (mycount == 50) { break; } }<br />
You will ned to allow popups for the site for this to work and it will open up to 50 bugs where the status is 'Committed'. If you have more than 50 to do - mark the first ones 'released' - refresh the list and do again.<br />
<br />
Now is also a good time to create the next release number in the series. Any remaining bugs that were not fixed for this release may be transferred to the next one, if they're still on the roadmap but were simply delayed.<br />
<br />
==📔 Put the release notes on the wiki page==<br />
This is just adding a link to the right page on Launchpad, we no longer have a duplicate copy of the release notes on the wiki.<br />
<br />
[[Releases|Release notes page]]<br />
<br />
==📗 Update wiki.mahara.org releases page==<br />
🟡 Release manager<br />
<br />
#Go to the [[Releases|releases page]].<br />
#Edit 'Current and upcoming releases.<br />
#Update the text: ''"The latest '''stable''' version of Mahara is <code>MAJOR_VERSION</code> , released on <code>DATE</code>"''<br />
#Add a new entry to the table for the new release.<br />
#Update the major version where 18 months has passed since its release to be 'unsupported'.<br />
<br />
==🌏 Update the language packs==<br />
[[Developer Area/Language Packs/Launchpad Branching|Create a new translation branch on launchpad.net and update the language scripts]] for the new release so that they appear on http://langpacks.mahara.org.<br />
<br />
Note: The number of language packs we support can be more than the supported Mahara versions as some people want to update old lang packs.</div>Robertlhttps://wiki.mahara.org/index.php?title=System_Administrator%27s_Guide/Requirements&diff=12935System Administrator's Guide/Requirements2022-04-26T02:08:59Z<p>Robertl: /* PHP */</p>
<hr />
<div>The following article lists the software and hardware requirements for Mahara. There is a sister article on [[System Administrator's Guide/Scalability|scalability]] that provides more details in particular about the hardware.<br />
<br />
== Mahara version ==<br />
<br />
We attempt to keep this article up to date to reflect the [[SupportedVersions|latest stable release]] of Mahara. For the system requirements for older Mahara versions, check the README file in the release's zip file, or look in the git repository for your branch or release:<br />
<br />
; 17.04 : https://git.mahara.org/mahara/mahara/blob/17.04_STABLE/README.md<br />
; 17.10 : https://git.mahara.org/mahara/mahara/blob/17.10_STABLE/README.md<br />
; 18.04 : https://git.mahara.org/mahara/mahara/blob/18.04_STABLE/README.md<br />
; 18.10 : https://git.mahara.org/mahara/mahara/blob/18.10_STABLE/README.md<br />
; 19.04 : https://git.mahara.org/mahara/mahara/blob/19.04_STABLE/README.md<br />
; development : https://git.mahara.org/mahara/mahara/blob/master/README.md<br />
<br />
==Software==<br />
<br />
===Recommended Platform===<br />
<br />
Please see the README file in the code that you downloaded for up-to-date information on the system requirements that Mahara supports for the particular version that you are installing.<br />
<br />
Mahara is designed to run on variants of the popular LAMP stack. Apart from the PHP requirement, all other parts can be swapped for alternatives if necessary. However, the platform used by the core developers (and so most thoroughly tested) is:<br />
<br />
* Server OS: '''Ubuntu Linux''' latest LTS<br />
* Web Server: '''Apache2''' latest 2.4.x version<br />
* Database Server: '''PostgreSQL''' latest 9.x version<br />
* Language: '''PHP''' - PHP 7.2+<br />
* Web Browser: latest version of<br />
** '''Firefox'''<br />
** '''Chrome'''<br />
** '''Safari'''<br />
** '''Internet Explorer'''<br />
<br />
===All Possible Software Options===<br />
<br />
While we have a recommended platform, Mahara will run successfully using replacements for parts of the stack. All possible options, supported and unsupported, are listed here.<br />
<br />
====Server OS====<br />
<br />
Mahara is '''officially supported''' on the following operating systems:<br />
<br />
* '''[http://www.debian.org/ Debian GNU/Linux]''', all versions from 6/"Squeeze"<br />
* '''[http://www.ubuntu.com/ Ubuntu GNU/Linux]''', all versions from 12.04/"Lucid Lynx"<br />
<br />
Mahara is not officially supported, but '''known to work or mostly work''', on the following operating systems:<br />
<br />
* '''Most other variants of Linux''', including Red Hat Enterprise Linux, CentOS, Slackware, Fedora and SUSE.<br />
* '''Microsoft Windows''' - all desktop versions from XP, all server versions from Windows Server 2003.<br />
* '''Mac OS X Server''', from Tiger upwards (note that people seem to be having more luck with Leopard and above).<br />
<br />
Currently, we're not certain of the status of Mahara on other operating systems (Solaris springs to mind). If you know more, feel free to add them to the above list!<br />
<br />
====Web Server====<br />
<br />
Mahara is '''officially supported''' on the following web servers:<br />
<br />
* '''[http://httpd.apache.org/ Apache]''', all versions from 2<br />
<br />
Mahara is not officially supported, but '''known to work or mostly work''', on the following web servers:<br />
<br />
* '''[http://nginx.net/ nginx]''' (using fastcgi)<br />
<br />
====Database Server====<br />
<br />
Mahara is officially supported on the following database servers:<br />
<br />
* '''[http://www.postgresql.org/ PostgreSQL]''', all versions from 9.1<br />
* '''[http://www.mysql.com/ MySQL]''', all versions from 5.1. Note that you will need InnoDB table support<br />
** (And equivalent '''[https://mariadb.org MariaDB]''' versions)<br />
<br />
Mahara's database must be in UTF8 encoding. In MySQL, you can use any UTF8 collation you like - generally, you'll pick the one that suits your locale.<br />
<br />
If you are using MySQL 5.1.5 or older, you need to add the SUPER privilege to Mahara's database user in order to enable the Elasticsearch search plugin. (IF you will not be using Elasticsearch, you don't need this.)<br />
<br />
Mahara is not supported or known to work on any other database server.<br />
<br />
====PHP====<br />
<br />
PHP version 7.2.x or later is required. In addition, you'll need the following extensions:<br />
<br />
* gd (include Freetype support)<br />
* curl<br />
* pgsql OR mysqli<br />
* For networking support: openssl and xmlrpc<br />
* mcrypt<br />
* intl - For language internationalisation<br />
* zip and unzip utilities (necessary for portfolio exports)<br />
* Optionally: imagick<br />
* Optionally: adodb (improves performance)<br />
** The ADOdb PHP extension, written in C, which Mahara will automatically detect and use to improve the performance of its database layer.<br />
* Recommended: zlib, zip, bz2<br />
<br />
You should make sure that <code>magic_quotes_gpc</code> is off, and that <code>register_globals</code> is off. Mahara will work around these settings if they're on, but it's better if you turn them off.<br />
<br />
====Web Browser====<br />
<br />
Mahara should work in any modern web browser with JavaScript. However current stable is only actively tested in the following browsers:<br />
<br />
* Firefox - latest version<br />
* Chrome - latest version<br />
* Safari - latest version<br />
* Opera - latest version<br />
* Internet explorer<br />
** IE 9-11 (for Mahara up to 15.04)<br />
** IE 11, or Edge (for Mahara 15.10 and above)<br />
* Mobile (phone or tablet)<br />
** Safara for iOS<br />
** Chrome for Android<br />
<br />
Some Mahara plugins may require browser plugins for full functionality. For instance, the copy button on the secret URL screen requires the Adobe Flash browser plugin.<br />
<br />
==Hardware==<br />
<br />
Mahara has hardware requirements that are extremely similar to other PHP-based web applications. A detailed analysis of this is provided in the [[System Administrator's Guide/Scalability|scalability]] article, but here are some guiding principles:<br />
<br />
* Mahara comprises a PHP application, which is CPU bound, and a database, which is IO bound. If you can put the database on a separate host to the web server(s), you'll be able to tune the machines more appropriately, but this isn't necessary for "small" installations (anything up to a few thousand users).<br />
* Mahara requires somewhere between 8 and 32M of RAM for most script invocations. This means that you'll need a decent amount of RAM for your web server(s) in order to support the most number of '''concurrent''' connections. So don't be too stingy with the amount of RAM you allocate if you're going to use virtualisation, else the system will crash and burn when you get more than one user using it at once :). Consider at least 1G if you can.<br />
* If possible, putting a reverse proxy in front of Apache is a great idea - it'll allow your site to handle more concurrent users, as Apache processes won't have to stick around while serving data to clients.<br />
* Installing Mahara alongside other webapps like Moodle makes sense - they have similar performance profiles. But remember, this will increase the amount of load you're putting on the system. So again, if installing Mahara in a limited resource environment, you might have to increase some limits.<br />
<br />
The minimum requirements are:<br />
<br />
* CPU: any modern CPU produced in the last few years is fine, the faster the better naturally. PHP pages are CPU limited, so faster CPUs mean quicker response times.<br />
* Memory: 256MB at an absolute minimum. 1G or more is recommended.<br />
* Disk: This will depend largely on how much disk quota you want each user to have. For a site of 1000 users, each with a 250M quota, you might need 50G to start with.<br />
<br />
For more detailed information about choosing the right hardware, check out the [[System Administrator's Guide/Scalability|scalability]] article.<br />
<br />
==Requirements FAQ==<br />
<br />
Here are some commonly asked questions about the requirements:<br />
<br />
===Can I use Mahara on Windows?===<br />
<br />
Yes, absolutely!<br />
<br />
Mahara can be used on Windows, by accessing a Mahara site (such as https://mahara.org) on a web browser running on a Windows machine. We regularly test Mahara against recent versions of Internet Explorer and Edge, and actively fix any bugs found for users accessing Mahara from a Windows computer.<br />
<br />
===Can I host Mahara on Windows?===<br />
<br />
Hosting Mahara on Windows (in other words, running Mahara in IIS or Apache via XAMPP, running on a Windows server), is more complicated. For hosting solutions, Mahara has been designed for Linux, Apache, PHP and an SQL database, and currently there has been very little testing for Windows hosted environments. Some people have done it successfully. You might want to search this wiki and the mahara.org forum for the instructions they've used. Because Mahara was designed to run on Apache, you will probably find it easier to use Apache in XAMPP than to use IIS or another webserver software.<br />
<br />
Because [[Developer_Area/Mahara_project_overview#Who_makes_Mahara.3F|Catalyst IT]] is an all-open-source software company, it is very unlikely the Mahara core team will have the resources to support hosting on Windows any time soon. So while you may be able to install Mahara on a Windows server without too much bother, be aware that we do not officially support this and may not be able to assist you if you have any issues.<br />
<br />
===What about hosting Mahara on Solaris/Mac/BSD/Other *nix OS?===<br />
<br />
The developers do not explicitly test for these OSes. While they may well work, there may be issues that the developers cannot help you with. If you come across an issue and work out why it doesn't work, please consider posting in the forums or opening a bug report, so that others may benefit too!<br />
<br />
===Will Mahara ever support Windows/Solaris/Other webservers/Other databases===<br />
<br />
Unfortunately, the answer is probably not, unless someone wants to fund this, or offers their own time and services to implement and maintain this functionality.<br />
<br />
Mahara is [[Developer_Area/Mahara_project_overview#Who_makes_Mahara.3F|primarily maintained and developed]] by the Mahara team at [https://www.catalyst.net.nz Catalyst IT] in New Zealand. The Catalyst IT Mahara team (often referred to as "Mahara HQ") is funded primarily by paid client support, hosting, and customization requests. So our highest priority goes to implementing features or bug fixes that are specifically funded by our clients. If you would like to help support the Mahara project by sponsoring a feature or bug fix, you can buy a [https://www.catalyst.net.nz/what-we-offer/learning-and-development/mahara-support-packages Mahara support package], or contract with Catalyst for larger requests.<br />
<br />
Beyond that, we have a limited number of resources for unfunded maintenance and expansion of the Mahara project. (Catalyst IT is committed to open source software, but is not a charity.) We try to use these resources in areas where they will produce the greatest benefit for the greatest number of Mahara users, and testing Mahara on other hosting platforms is probably not one of those areas.<br />
<br />
However, we are very willing to accept patches or implement small code adaptations to make Mahara run more smoothly on other systems. If you can help with this, see [[Developer Area/Contributing Code]].<br />
<br />
===Can I use shared hosting?===<br />
<br />
Maybe. It depends on your host. Some hosts disable certain functions (e.g. <code>exec</code>) or use safe mode, and these things can badly impact on Mahara functionality. '''Mahara is not explicitly designed to run on shared hosting''' - while it is a goal we keep in mind, and will accept patches for, '''shared hosting by its nature limits what you can do''', and you should endeavour to obtain a VPS or dedicated host if at all possible.<br />
<br />
If you would still like to install Mahara on shared hosting, you can [http://linx.ml/view/view.php?t=4LvhtJH8NgEMfy1Ii3R5 follow the instructions]. This guide will show you how to install Mahara via cPanel and is designed for users who don't have any previous experience with creating websites or setting up databases.<br />
<br />
===npm and nodejs are not available in the Debian repo. How do I install them on my Debian server?===<br />
<br />
You will only need npm or nodejs if you are attempting to compile Mahara's theme CSS for Mahara 15.10 or later, after cloning the Mahara git repository. If you're using an earlier version of Mahara, or you downloaded Mahara from the zip file on Launchpad, the CSS files will already be included and this question probably does not apply to you.<br />
<br />
To install npm and nodejs on Debian, you'll need sudo access:<br />
<pre><br />
echo "deb https://deb.nodesource.com/node_0.12 wheezy main" > /etc/apt/sources.list.d/nodesource.list<br />
curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add -<br />
apt-get install apt-transport-https<br />
apt-get update; apt-get install nodejs; npm install -g gulp<br />
</pre><br />
<br />
===I am confused by all of this, where do I go to get help now?===<br />
<br />
To the [http://mahara.org/interaction/forum/view.php?id=2 Mahara Support forums], or #mahara on freenode.</div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Release_Instructions/Release_Candidate&diff=12904Developer Area/Release Instructions/Release Candidate2022-04-12T05:53:06Z<p>Robertl: /* 3. Package the release */</p>
<hr />
<div>=1. Create the new dev branch=<br />
Note: You only need to do this for the '''first' release candidate for each major version. If you need to do subsequent release candidates, put them on the same branch.'''<br />
<br />
Create a new <code>_DEV</code> branch based off of main.<br />
<br />
*<code>git checkout main</code><br />
<br />
*<code>git checkout -b 1.10_DEV</code><br />
<br />
*<code>git push gerrit 1.10_DEV</code><br />
<br />
If Gerrit won't let you push your new branch, you can instead create it through Gerrit.<br />
<br />
*Go to [https://reviews.mahara.org/ reviews.mahara.org]<br />
*Click on 'Projects', the 'mahara' project, and then on the 'Branches' subtab.<br />
<br />
Then do the following<br />
<br />
*In the '''<code>Makefile</code>''' of the new '''<code>_DEV</code>''' branch, replace <code>main</code> with the name of the branch. Commit and make push.<br />
*Create an empty 'ChangeLog' file. Commit and make push. Note: the file needs a capital C and L in the name.<br />
*Update the release in <code>htdocs/lib/version.php</code> to be <code>[whatever]rc1.</code> Commit and make push.<br />
<br />
=2. Bump the version on main=<br />
<br />
*Go to the main branch and bump the version to <code>1.5.0dev</code> (if you just created the <code>1.4_DEV</code> branch)<br />
*In <code>htdocs/lib/version.php</code> (update series, release and version - version should be today's date)<br />
*README<br />
*Commit and make push<br />
<br />
=3. Package the release=<br />
<br />
Now, on the new _DEV branch, follow the usual [[Developer Area/Release Instructions|release instructions]] '''[[Developer_Area/Release_Instructions#Sign_and_upload_the_tarballs|up to and including this step]]'''.<br />
<br />
=4. Creating the new language packs branch=<br />
<br />
You need to set up launchpad translations for the new branch. See the separate instructions on [[Developer_Area/Language_Packs/Launchpad_Branching|setting up a new translations branch]].<br />
<br />
=5. Changelog and release notes=<br />
<br />
Do not paste the full changelog on Launchpad (that's for the actual release) and only put something like "First release candidate for 1.4" in the bullet point section of the release notes on Launchpad.<br />
<br />
=6. Update master.dev.mahara.org=<br />
<br />
Updating master.dev.mahara.org however is useful for users who do not have somewhere to set up a test instance but would like to check out the changes.<br />
<br />
=7. Do not update the bug tracker=<br />
<br />
The bug tracker does not need to be updated because no bugs should ever have an RC release as its milestone.<br />
<br />
Furthermore, these bugs are not fixed until the release has happened, so they should be left as "Fix committed".<br />
<br />
=8. Do not update the demo site=<br />
<br />
The demo site should always be the last '''stable''' release. The RC is not a release yet.<br />
<br />
=9. Announcements=<br />
<br />
The main purpose of an RC is to get people to test the release for any major bugs. Therefore, we do not consider the RC as a release and only announce it through:<br />
<br />
*Twitter<br />
*IRC<br />
*The mahara.org news forum<br />
<br />
(Note that Freshmeat is missing.)<br />
<br />
===Sample news forum post for first release candidate===<br />
<br />
Subject: First release candidate for Mahara 1.10 available<br />
<br />
We have just published the first release candidate for Mahara 1.10.<br />
<br />
This is a call for testing. If you want to make sure that Mahar 1.10 works well on your site, please help us out by testing this first release candidate:<br />
<br />
*https://launchpad.net/mahara/+milestone/1.0rc1<br />
<br />
New features for the release candidate are listed on Launchpad with the "nominatedfeature" tag.<br />
<br />
*https://bugs.launchpad.net/mahara/+bugs?field.milestone%3Alist=64606&field.tag=nominatedfeature<br />
<br />
We've also done lots of bug fixing is this release cycle. The full list of changes that have been made for 1.10 can be found by clicking here.<br />
<br />
*https://bugs.launchpad.net/mahara/+bugs?field.status%3Alist=FIXCOMMITTED&field.status%3Alist=FIXRELEASED&field.milestone%3Alist=64606<br />
<br />
If any of the targeted bugs affect your users, this is an opportunity for you to make sure they are fixed properly.<br />
<br />
If you find any bugs, please report them on Launchpad so they can be fixed before the 1.10.0 release:<br />
<br />
*https://bugs.launchpad.net/mahara/+filebug<br />
<br />
If important bugs are found within the next week we may produce a second release candidate. Otherwise this release candidate will become the final 1.10.0 release.<br />
<br />
Cheers,<br />
<br />
The 1.10 Release Managers<br />
<br />
===Sample forum post for second and/or final release candidate===<br />
<br />
Subject: Second release candidate for Mahara 1.4 available<br />
<br />
Based on the feedback we have received so far, this will most likely be the last release candidate before the final 1.4 release:<br />
<br />
*https://launchpad.net/mahara/1.4/1.4rc2<br />
<br />
New Features for the Release Candidate are listed on Launchpad with the newfeature tag:<br />
<br />
*https://bugs.launchpad.net/mahara/+bugs?field.milestone%3Alist=64606&field.tag=nominatedfeature<br />
<br />
We've also done lots of bug fixing is this release cycle. The full list of changes that have been made for 1.4 can be found by clicking here.<br />
<br />
*https://bugs.launchpad.net/mahara/+bugs?field.status%3Alist=FIXCOMMITTED&field.status%3Alist=FIXRELEASED&field.milestone%3Alist=64606<br />
<br />
If you haven't had a chance to test it out yet, please do so now and report any bugs on the tracker:<br />
<br />
*https://bugs.launchpad.net/mahara/+filebug<br />
<br />
This is your last chance to make sure your upgrade to 1.4 will be smooth. If nothing major is reported in the next few days, we will be cutting the 1.4.0 release in about a week.<br />
<br />
Cheers,<br />
<br />
The 1.4 Release Managers</div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Release_Instructions/Release_Candidate&diff=12899Developer Area/Release Instructions/Release Candidate2022-04-12T04:45:40Z<p>Robertl: /* 1. Create the new dev branch */</p>
<hr />
<div>=1. Create the new dev branch=<br />
Note: You only need to do this for the '''first' release candidate for each major version. If you need to do subsequent release candidates, put them on the same branch.'''<br />
<br />
Create a new <code>_DEV</code> branch based off of main.<br />
<br />
*<code>git checkout main</code><br />
<br />
*<code>git checkout -b 1.10_DEV</code><br />
<br />
*<code>git push gerrit 1.10_DEV</code><br />
<br />
If Gerrit won't let you push your new branch, you can instead create it through Gerrit.<br />
<br />
*Go to [https://reviews.mahara.org/ reviews.mahara.org]<br />
*Click on 'Projects', the 'mahara' project, and then on the 'Branches' subtab.<br />
<br />
Then do the following<br />
<br />
*In the '''<code>Makefile</code>''' of the new '''<code>_DEV</code>''' branch, replace <code>main</code> with the name of the branch. Commit and make push.<br />
*Create an empty 'ChangeLog' file. Commit and make push. Note: the file needs a capital C and L in the name.<br />
*Update the release in <code>htdocs/lib/version.php</code> to be <code>[whatever]rc1.</code> Commit and make push.<br />
<br />
=2. Bump the version on main=<br />
<br />
*Go to the main branch and bump the version to <code>1.5.0dev</code> (if you just created the <code>1.4_DEV</code> branch)<br />
*In <code>htdocs/lib/version.php</code> (update series, release and version - version should be today's date)<br />
*README<br />
*Commit and make push<br />
<br />
=3. Package the release=<br />
<br />
Now, on the new _DEV branch, follow the usual [[Developer Area/Release Instructions|release instructions]] '''[[Developer_Area/Release_Instructions#Sign_and_upload_the_tarballs|up to andreviews.mahara.org including this step]]'''.<br />
<br />
=4. Creating the new language packs branch=<br />
<br />
You need to set up launchpad translations for the new branch. See the separate instructions on [[Developer_Area/Language_Packs/Launchpad_Branching|setting up a new translations branch]].<br />
<br />
=5. Changelog and release notes=<br />
<br />
Do not paste the full changelog on Launchpad (that's for the actual release) and only put something like "First release candidate for 1.4" in the bullet point section of the release notes on Launchpad.<br />
<br />
=6. Update master.dev.mahara.org=<br />
<br />
Updating master.dev.mahara.org however is useful for users who do not have somewhere to set up a test instance but would like to check out the changes.<br />
<br />
=7. Do not update the bug tracker=<br />
<br />
The bug tracker does not need to be updated because no bugs should ever have an RC release as its milestone.<br />
<br />
Furthermore, these bugs are not fixed until the release has happened, so they should be left as "Fix committed".<br />
<br />
=8. Do not update the demo site=<br />
<br />
The demo site should always be the last '''stable''' release. The RC is not a release yet.<br />
<br />
=9. Announcements=<br />
<br />
The main purpose of an RC is to get people to test the release for any major bugs. Therefore, we do not consider the RC as a release and only announce it through:<br />
<br />
*Twitter<br />
*IRC<br />
*The mahara.org news forum<br />
<br />
(Note that Freshmeat is missing.)<br />
<br />
===Sample news forum post for first release candidate===<br />
<br />
Subject: First release candidate for Mahara 1.10 available<br />
<br />
We have just published the first release candidate for Mahara 1.10.<br />
<br />
This is a call for testing. If you want to make sure that Mahar 1.10 works well on your site, please help us out by testing this first release candidate:<br />
<br />
*https://launchpad.net/mahara/+milestone/1.0rc1<br />
<br />
New features for the release candidate are listed on Launchpad with the "nominatedfeature" tag.<br />
<br />
*https://bugs.launchpad.net/mahara/+bugs?field.milestone%3Alist=64606&field.tag=nominatedfeature<br />
<br />
We've also done lots of bug fixing is this release cycle. The full list of changes that have been made for 1.10 can be found by clicking here.<br />
<br />
*https://bugs.launchpad.net/mahara/+bugs?field.status%3Alist=FIXCOMMITTED&field.status%3Alist=FIXRELEASED&field.milestone%3Alist=64606<br />
<br />
If any of the targeted bugs affect your users, this is an opportunity for you to make sure they are fixed properly.<br />
<br />
If you find any bugs, please report them on Launchpad so they can be fixed before the 1.10.0 release:<br />
<br />
*https://bugs.launchpad.net/mahara/+filebug<br />
<br />
If important bugs are found within the next week we may produce a second release candidate. Otherwise this release candidate will become the final 1.10.0 release.<br />
<br />
Cheers,<br />
<br />
The 1.10 Release Managers<br />
<br />
===Sample forum post for second and/or final release candidate===<br />
<br />
Subject: Second release candidate for Mahara 1.4 available<br />
<br />
Based on the feedback we have received so far, this will most likely be the last release candidate before the final 1.4 release:<br />
<br />
*https://launchpad.net/mahara/1.4/1.4rc2<br />
<br />
New Features for the Release Candidate are listed on Launchpad with the newfeature tag:<br />
<br />
*https://bugs.launchpad.net/mahara/+bugs?field.milestone%3Alist=64606&field.tag=nominatedfeature<br />
<br />
We've also done lots of bug fixing is this release cycle. The full list of changes that have been made for 1.4 can be found by clicking here.<br />
<br />
*https://bugs.launchpad.net/mahara/+bugs?field.status%3Alist=FIXCOMMITTED&field.status%3Alist=FIXRELEASED&field.milestone%3Alist=64606<br />
<br />
If you haven't had a chance to test it out yet, please do so now and report any bugs on the tracker:<br />
<br />
*https://bugs.launchpad.net/mahara/+filebug<br />
<br />
This is your last chance to make sure your upgrade to 1.4 will be smooth. If nothing major is reported in the next few days, we will be cutting the 1.4.0 release in about a week.<br />
<br />
Cheers,<br />
<br />
The 1.4 Release Managers</div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Release_Instructions/Release_Candidate&diff=12896Developer Area/Release Instructions/Release Candidate2022-04-12T04:30:49Z<p>Robertl: /* 2. Bump the version on master */</p>
<hr />
<div>=1. Create the new dev branch=<br />
Note: You only need to do this for the '''first' release candidate for each major version. If you need to do subsequent release candidates, put them on the same branch.'''<br />
<br />
Create a new <code>_DEV</code> branch based off of main.<br />
<br />
*<code>git checkout main</code><br />
<br />
*<code>git checkout -b 1.10_DEV</code><br />
<br />
*<code>git push gerrit 1.10_DEV</code><br />
<br />
If Gerrit won't let you push your new branch, you can instead create it through Gerrit.<br />
<br />
*Go to [https://reviews.mahara.org/ reviews.mahara.org]<br />
*Click on 'Projects', the 'mahara' project, and then on the 'Branches' subtab.<br />
<br />
*In the '''<code>Makefile</code>''' of the new '''<code>_DEV</code>''' branch, replace <code>main</code> with the name of the branch. Commit and make push.<br />
*Create an empty 'Changelog' file. Commit and make push.<br />
*Update the release in <code>htdocs/lib/version.php</code> to be <code>[whatever]rc1.</code> Commit and make push.<br />
<br />
=2. Bump the version on main=<br />
<br />
*Go to the main branch and bump the version to <code>1.5.0dev</code> (if you just created the <code>1.4_DEV</code> branch)<br />
*In <code>htdocs/lib/version.php</code> (update series, release and version - version should be today's date)<br />
*README<br />
*Commit and make push<br />
<br />
=3. Package the release=<br />
<br />
Now, on the new _DEV branch, follow the usual [[Developer Area/Release Instructions|release instructions]] '''[[Developer_Area/Release_Instructions#Sign_and_upload_the_tarballs|up to andreviews.mahara.org including this step]]'''.<br />
<br />
=4. Creating the new language packs branch=<br />
<br />
You need to set up launchpad translations for the new branch. See the separate instructions on [[Developer_Area/Language_Packs/Launchpad_Branching|setting up a new translations branch]].<br />
<br />
=5. Changelog and release notes=<br />
<br />
Do not paste the full changelog on Launchpad (that's for the actual release) and only put something like "First release candidate for 1.4" in the bullet point section of the release notes on Launchpad.<br />
<br />
=6. Update master.dev.mahara.org=<br />
<br />
Updating master.dev.mahara.org however is useful for users who do not have somewhere to set up a test instance but would like to check out the changes.<br />
<br />
=7. Do not update the bug tracker=<br />
<br />
The bug tracker does not need to be updated because no bugs should ever have an RC release as its milestone.<br />
<br />
Furthermore, these bugs are not fixed until the release has happened, so they should be left as "Fix committed".<br />
<br />
=8. Do not update the demo site=<br />
<br />
The demo site should always be the last '''stable''' release. The RC is not a release yet.<br />
<br />
=9. Announcements=<br />
<br />
The main purpose of an RC is to get people to test the release for any major bugs. Therefore, we do not consider the RC as a release and only announce it through:<br />
<br />
*Twitter<br />
*IRC<br />
*The mahara.org news forum<br />
<br />
(Note that Freshmeat is missing.)<br />
<br />
===Sample news forum post for first release candidate===<br />
<br />
Subject: First release candidate for Mahara 1.10 available<br />
<br />
We have just published the first release candidate for Mahara 1.10.<br />
<br />
This is a call for testing. If you want to make sure that Mahar 1.10 works well on your site, please help us out by testing this first release candidate:<br />
<br />
*https://launchpad.net/mahara/+milestone/1.0rc1<br />
<br />
New features for the release candidate are listed on Launchpad with the "nominatedfeature" tag.<br />
<br />
*https://bugs.launchpad.net/mahara/+bugs?field.milestone%3Alist=64606&field.tag=nominatedfeature<br />
<br />
We've also done lots of bug fixing is this release cycle. The full list of changes that have been made for 1.10 can be found by clicking here.<br />
<br />
*https://bugs.launchpad.net/mahara/+bugs?field.status%3Alist=FIXCOMMITTED&field.status%3Alist=FIXRELEASED&field.milestone%3Alist=64606<br />
<br />
If any of the targeted bugs affect your users, this is an opportunity for you to make sure they are fixed properly.<br />
<br />
If you find any bugs, please report them on Launchpad so they can be fixed before the 1.10.0 release:<br />
<br />
*https://bugs.launchpad.net/mahara/+filebug<br />
<br />
If important bugs are found within the next week we may produce a second release candidate. Otherwise this release candidate will become the final 1.10.0 release.<br />
<br />
Cheers,<br />
<br />
The 1.10 Release Managers<br />
<br />
===Sample forum post for second and/or final release candidate===<br />
<br />
Subject: Second release candidate for Mahara 1.4 available<br />
<br />
Based on the feedback we have received so far, this will most likely be the last release candidate before the final 1.4 release:<br />
<br />
*https://launchpad.net/mahara/1.4/1.4rc2<br />
<br />
New Features for the Release Candidate are listed on Launchpad with the newfeature tag:<br />
<br />
*https://bugs.launchpad.net/mahara/+bugs?field.milestone%3Alist=64606&field.tag=nominatedfeature<br />
<br />
We've also done lots of bug fixing is this release cycle. The full list of changes that have been made for 1.4 can be found by clicking here.<br />
<br />
*https://bugs.launchpad.net/mahara/+bugs?field.status%3Alist=FIXCOMMITTED&field.status%3Alist=FIXRELEASED&field.milestone%3Alist=64606<br />
<br />
If you haven't had a chance to test it out yet, please do so now and report any bugs on the tracker:<br />
<br />
*https://bugs.launchpad.net/mahara/+filebug<br />
<br />
This is your last chance to make sure your upgrade to 1.4 will be smooth. If nothing major is reported in the next few days, we will be cutting the 1.4.0 release in about a week.<br />
<br />
Cheers,<br />
<br />
The 1.4 Release Managers</div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Contributing_Code&diff=12887Developer Area/Contributing Code2022-03-30T02:06:59Z<p>Robertl: /* Preferred method */</p>
<hr />
<div>==If all else fails...==<br />
<br />
Admittedly, it can be a little intimidating for a new developer to go through the process described on this page to submit patches to Mahara. If you can't get this working, or don't want to, feel free to simply attach your patch file directly to a [https://bugs.launchpad.net/mahara/+filebug bug report in Launchpad]. (It's helpful if you can specify the exact version of Mahara your patch applies against.) Or link to a commit on github. Or even paste code directly into the bug report. We welcome all contributions. :)<br />
<br />
From there, another member of the Mahara community can push your contribution into Gerrit, using <tt>git commit --author="Your Name <youremail@example.com>"</tt> to credit you as the author of the change.<br />
<br />
But if you plan on being a regular contributor to Mahara, it's preferable if you can follow the process described below. If you have difficulties, feel free to ask for help on #mahara-dev on irc.freenode.net, or in the [https://mahara.org/interaction/forum/view.php?id=48 Mahara developer forums].<br />
<br />
==Getting ready for using Gerrit==<br />
<br />
The [https://reviews.mahara.org/ Mahara code review system] uses [http://code.google.com/p/gerrit Gerrit], a web-based collaborative tool for code revision. This allows anyone who wish to contribute to submit code and get it added to Mahara core. You do not need commit permission on the main Mahara repository, or to be part of the "Mahara Reviewers" group to send your patchsets through the Gerrit system. Essentially, Gerrit is an intermediate step on the way of the patch between your local workspace and the main Mahara repository. For your local git clone of Mahara, Gerrit is just another remote branch which one can push changes to that will be shown on the Gerrit web interface.<br />
<br />
====Initial setup====<br />
<br />
First you'll need to create accounts on Launchpad and reviews.mahara.org, and install some local software. You'll find instructions for that here:<br />
<br />
*[[Developer Area/Developer Tools]].<br />
<br />
====Get a copy of the Mahara source code from git====<br />
<br />
Grab a read-only copy of the [https://github.com/MaharaProject/mahara Mahara repo] from Github:<br />
<br />
cd /path/to/your/web/directory<br />
git clone git@github.com:MaharaProject/mahara.git<br />
<br />
This will create a copy of the Mahara source code at '''/path/to/your/web/directory/mahara'''. For testing purposes, you'll probably want to configure this code so that it actually runs as a copy of Mahara on your local machine. If you need instructions on how to do that, check out [[Developer_Area/Developer_Environment | Setting up your developer environment]].<br />
<br />
====Setting up Gerrit in your local Mahara repository====<br />
<br />
Add the gerrit site as a new remote in your local git repository. (Replace '''username''' with your username on reviews.mahara.org). '''The username is case-sensitive''', which is why we recommend using a lowercase one.<br />
<br />
cd /path/to/your/web/directory/mahara<br />
git remote add gerrit ssh://'''username'''@reviews.mahara.org:29418/mahara<br />
<br />
If you cannot use SSH, do:<br />
<br />
git remote add gerrit https://reviews.mahara.org/mahara<br />
<br />
To test whether this has worked correctly, try this command:<br />
<br />
git fetch gerrit<br />
<br />
You should see git fetch a list of branches. If you don't see that, or you see an error message, check out the [[Developer Area/Contributing Code/Troubleshooting your Gerrit connection|troubleshooting your Gerrit connection]] page.<br />
<br />
If that doesn't work and you get a message mentioning diffie-hellman, add the following lines to your ssh config file in your home directory. We need those due to an older version of SSH still being used for the moment:<br />
<br />
<pre><br />
Host reviews.mahara.org<br />
Hostname 202.78.242.17<br />
Port 29418<br />
KexAlgorithms +diffie-hellman-group1-sha1<br />
</pre><br />
<br />
Next, you will need to add a commit hook to your local git repo, to generate a <tt>Change-Id:</tt> line in your commit messages as required for proper gerrit functioning:<br />
<br />
scp -p -P 29418 '''username'''@reviews.mahara.org:hooks/commit-msg .git/hooks/<br />
<br />
Make this file executable:<br />
<br />
chmod u+x /path/to/your/web/directory/mahara/.git/hooks/commit-msg<br />
<br />
If you wish to have your instance of Mahara to be able to compile the css (version 15.10+) on the checkout of a patchset from Gerrit then you can, from your Mahara base directory, do the following:<br />
<br />
touch .git/hooks/post-checkout && chmod 764 .git/hooks/post-checkout<br />
<br />
Edit the file and add the following, making sure the #!/bin/bash is the first line of the file:<br />
<code><pre><br />
#!/bin/bash<br />
<br />
set -e<br />
<br />
# The three values we get from post-checkout hook<br />
prevHEAD=$1<br />
newHEAD=$2<br />
checkoutType=$3<br />
<br />
[[ $checkoutType == 1 ]] && checkoutType='branch' || checkoutType='file' ;<br />
<br />
newHEADcheck=$(git name-rev --name-only $newHEAD)<br />
branch=$newHEADcheck<br />
if [ $newHEADcheck = 'undefined' ]; then<br />
# see if we can find out what the branch we will be merging the patch to <br />
maharaBranch=$(curl -s https://reviews.mahara.org/changes/?q=$newHEAD | grep branch)<br />
<br />
regex=': "(.*?)"'<br />
if [[ $maharaBranch =~ $regex ]]; then<br />
branch=${BASH_REMATCH[1]}<br />
fi<br />
<br />
if [ "$branch" = "main" ]; then<br />
# get git root directory<br />
gitRoot=$(git rev-parse --show-toplevel)<br />
cd $gitRoot<br />
printf '\npost-checkout hook\n'<br />
make clean-css<br />
make css<br />
fi<br />
fi<br />
</pre></code><br />
So now when you checkout a gerrit patch that is on main branch it should compile the css.<br />
<br />
==Preparing / organising your changes==<br />
<br />
Some basic guidelines:<br />
<br />
*'''One patchset per logical change'''<br />
**If you've fixed three or four bugs in entirely different parts of the system, sending them together as one patchset makes it harder to review, manage, and merge them. For instance, if it turns out that one of the three fixes is incorrect, while the other two are ready to merge, or if only one fix needs to be back-ported to previous versions of Mahara.<br />
*'''Include technical details with each change'''<br />
**You should briefly describe what the change intends to do. The ''worst'' possible description you could use is "fixed bug", or possibly "rawr". What we want to see is enough detail about what was wrong, and if not obvious from the patch, why you fixed the problem the way you did. If your description starts getting too long (more than a paragraph), it's probably a sign that you should split up your patches.<br />
*'''Group related patches together into topics'''<br />
**If you are developing a larger feature as a series of related patches, group them together into a topic (see the section below on how to do this in gerrit). A topic is especially important if the first few patches in the series don't really achieve anything on their own. A reviewer will be able to make sense of an earlier patch by looking forward to later ones within the same topic. The commit message of the earlier patch should explain the plan, and the whole series of patches should be submitted at the same time.<br />
*'''Apply new patch on top of clean checked-out branch'''<br />
**Every new patch should be applied on top of the clean checked-out branch to avoid adding dependencies in error.<br />
*'''Consider the reviewer'''<br />
**Following the guidelines above should help to make your patches easier for the reviewer to read and understand. But also try to remember that the person reviewing your code would probably rather be doing something else, like writing their own code. They don't want to have to review your patch twice, so don't submit patches until they're well-tested, and until you're absolutely sure the code is correct.<br />
*'''Make sure your changes "blend in" with the surrounding code'''<br />
**By that, we mean make sure you're using four spaces for indentation, the same bracing style the surrounding code uses for if {} etc. Make sure your changes are internationalised using our translation system, and that you throw exceptions the same way the existing code does when errors occur. If your code isn't too much different, we'll probably help you out by fixing it up. But if you're using tabs, weird bracing styles and your own functions for database access, your code is sure to be rejected.<br />
*'''Make sure that the new code follows our [[Developer Area/Coding guidelines|coding guidelines]]'''<br />
<br />
Here are some additional articles you might be interested in reading:<br />
<br />
*[http://feeding.cloud.geek.nz/2009/06/writing-perfect-patch.html Writing good patches]<br />
*[http://feeding.cloud.geek.nz/2009/07/3-ways-to-improve-your-source-control.html Keeping source code history clean]<br />
*[http://wiki.postgresql.org/wiki/Creating_Clean_Patches Creating Clean Patches]<br />
<br />
==Submitting commits for review==<br />
<br />
===Preferred method===<br />
<br />
This is the '''preferred method''' of pushing things to Gerrit, but you should understand what it does by reading the [[Developer_Area/Contributing_Code#Manual_method|manual method]] as well. <br />
<br />
Note: To use this, you will need to install '''xmllint'''. On debian/ubuntu based systems, this is in '''libxml2-utils'''. <br />
<br />
To push your change, simply type this in the root directory of your feature/bugfix branch, eg the parent directory of the htdocs/ directory:<br />
<br />
make push<br />
<br />
or if you want to add a Gerrit tag:<br />
<br />
make push TAG=topic_for_this_change<br />
<br />
Note: You only need to do the topic tag once.<br />
<br />
If what you are working on is not finished but you want to save / show your workings to others you can push the patch as 'Work in progress' via:<br />
<br />
make wip<br />
<br />
or<br />
<br />
make wip TAG=topic_for_this_change<br />
<br />
This will run a few initial sanity checks and either push your changes to Gerrit or will return warnings about coding problems that you will need to fix ([https://wiki.mahara.org/index.php/Developer_Area/Contributing_Code#Making_changes_in_existing_commits see below]).<br />
<br />
'''Note:''' Setting the topic is encouraged for patches that contain new functionality so that they can be spotted more easily as someone from the core team needs to do the front-end verification. A tester's OK would not be enough as they may only test that it works, but not review the implementation itself. The topic tag should include "(feature)".<br />
<br />
'''Note:''' To set a topic with a spaces in it you will need to do place it in double quotes and put a backslash before the space, eg: TAG="My\ new\ patch"<br />
<br />
Once a patch is pushed to Gerrit it is run through a host of automated tests and (after a short while) will update the Gerrit review with a pass or fail in the automated Tests (AT) column.<br />
<br />
If your patch fails the automated tests you can follow the link provided in the comments section to find out why your patch failed to help debug and fix the issues ([https://wiki.mahara.org/index.php/Developer_Area/Contributing_Code#Making_changes_in_existing_commits see below]).<br />
<br />
====Apple Mac Computers====<br />
Apple Mac Devices may have an extra requirement to update the libraries in use. This is especially important if encountering these error messages when running "make push":<br />
<br />
xargs: illegal option -- -<br />
<br />
sed: illegal option -- r <br />
<br />
On an Apple Mac device, the version of "xargs" and "sed" is different and you may see the above errors even if these libraries are already installed.<br />
To resolve these issues, install gnu-sed and findutils using the "--with-default-names" option to line them up to the expected Linux counterparts.<br />
<br />
Install Homebrew<br />
<br />
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"<br />
<br />
Install required libraries of xmllint, sed, and xargs<br />
<br />
brew install xmlstarlet --with-default-names<br />
<br />
brew install gnu-sed --with-default-names<br />
<br />
brew install findutils --with-default-names<br />
<br />
Tips:<br />
<br />
Update Git to use the correct email address associated with Gerrit Before making any changes by using the command below with the Gerrit email in use:<br />
<br />
git config user.email "email@example.com"<br />
<br />
Be careful if using "sudo" (superuser do) for commands when pushing to Gerrit on an Apple Mac device. The SSH keys are user based, and the sudo command may end up using a different set of SSH keys, resulting in the push being rejected.<br />
<br />
===Manual method===<br />
<br />
In order to push your changes for review, just push into the project's magical <tt>refs/publish/'''remote_branchname'''</tt> ref. If you are pushing to the remote main branch and your current local branch is ''bug123456'', your command will be:<br />
<br />
git push gerrit HEAD:refs/for/'''main'''<br />
<br />
Once you pushed, your change will be available for review on the [https://reviews.mahara.org/ Mahara code review system]. The single change will be created on review system for each commit you pushed. If you push several commits, gerrit will add dependencies between changes based on the git parent ref.<br />
<br />
You may also push a single commit, simply use its hash:<br />
<br />
git push gerrit '''38f4f96df''':refs/for/main<br />
<br />
If you like, you may specify the topic tag that will be shown in your change details on review system. This tag may be associated with a group of changes if you use it for several commits. To do that, simply append it to the destination ref, e.g.<br />
<br />
git push gerrit HEAD:refs/for/main/'''topic_for_this_change'''<br />
<br />
'''Note:''' Setting the topic is encouraged for patches that contain new functionality so that they can be spotted more easily as someone from the core team needs to do the front-end verification. A tester's OK would not be enough as they may only test that it works, but not review the implementation itself. The topic tag should include "(feature)".<br />
<br />
==Security patches==<br />
<br />
For patches for security issues, use:<br />
<br />
make security<br />
<br />
or<br />
<br />
make security TAG=topic_for_this_change<br />
<br />
This will submit your patch into gerrit as a "Private" submission, which will be only visible to you and to people in gerrit's "Security" group. The downside to this is that the code review system doesn't work automatically for Draft submissions, so verifications and review have to be made as freetext comments, rather than +/-.<br />
<br />
==Git for Newbs==<br />
<br />
If you're new to git, here is a cheat sheet of some of the operations you'll likely need to do.<br />
<br />
===Creating a new branch for your change===<br />
<br />
We strongly recommend you create one git branch per change you want to submit. First, make sure you have checked out the "main" branch, and that it is up to date and clean of any changes:<br />
<br />
git checkout main -f<br />
git reset --hard origin/main<br />
git pull<br />
<br />
Then create the new branch. It is useful to give it a meaningful name like a Launchpad bug number.<br />
<br />
git checkout -b bug123456<br />
<br />
Make the changes you want. When you're done, you'll need to group them into a git commit and push that commit to gerrit. First, check what changes you have in your local workspace:<br />
<br />
git status<br />
<br />
Next, add any new files that you have added which are not yet tracked by git. You will need to add them by name, for example:<br />
<br />
git add htdocs/view/my_new_view_file.php<br />
<br />
Then, you can commit the modified/deleted files with:<br />
<br />
git commit -a<br />
<br />
Or if you want to choose interactively which bits of code to add:<br />
<br />
git add -p<br />
git commit<br />
<br />
And finally, use this branch when you push to the code review system ([https://wiki.mahara.org/index.php/Developer_Area/Contributing_Code#Submitting_commits_for_review see below]).<br />
<br />
===Making changes in existing commits===<br />
<br />
It's best to check out the commit from Gerrit itself. There will be a link under the download section with "checkout" highlighted - to copy/paste, eg:<br />
<br />
git fetch https://reviews.mahara.org/mahara refs/changes/57/1234/1 && git checkout FETCH_HEAD<br />
<br />
Make the changes that you need and add them ready for committing<br />
<br />
git add -p<br />
<br />
Then commit these new changes to the same commit message as before:<br />
<br />
git commit --amend<br />
<br />
Another option is commit squashing, below.<br />
<br />
When your commit has been reviewed, you may require to make some changes before it will be accepted. The changes you will be doing should be [http://book.git-scm.com/4_interactive_rebasing.html squashed] into the same commit you originally pushed for review. You must ensure that the <tt>Change-Id:</tt> line is preserved the same as in the original commit. This will make Gerrit matching this commit to the original one and appending your changes as a new patchset. The simplest workflow would be:<br />
<br />
#Checkout the branch where your original changes are (see above)<br />
#Make the required changes<br />
#Commit the changes<br />
#*The commit message does not matter as it will be removed when the commit is squashed, so random text here is fine.<br />
#Use [http://book.git-scm.com/4_interactive_rebasing.html interactive rebasing] to squash the latest commit into the previous commit.<br />
#*An example command for this would be: <tt>git rebase -i HEAD~2</tt><br />
#*Find the latest commit in the list (it should be the bottom-most commit) and replace the word 'pick' with 'f'. This is short for 'fixup', which will squash the commit into the one before it, and discard the commit message. (This is what we want.) You may also use 's' in which case you will be offered to amend the commit message before squashing (ensure that you leave <tt>Change-Id:</tt> of the commit you are squashing onto).<br />
<br />
Now you may push the amended commit to review system the most convenient way:<br />
<br />
git push gerrit HEAD:refs/publish/main<br />
<br />
or<br />
<br />
make push<br />
<br />
In the Gerrit interface it will appear under the same change as a separate patchset ready for another review.<br />
<br />
===Ordering commits===<br />
<br />
If you have pushed some commits to Gerrit but then discover that one of your commits is dependent on another you can adjust the hierarchy of your commits like this.<br />
<br />
Checkout the commit that you want to come first/be the parent by getting the checkout code from the review, eg: <br />
<br />
git fetch https://reviews.mahara.org/mahara refs/changes/49/1234/1 && git checkout FETCH_HEAD<br />
<br />
Then cherry-pick the second/child commit by selecting 'cherry-pick' before copying the link, eg:<br />
<br />
git fetch https://reviews.mahara.org/mahara refs/changes/50/2345/1 && git cherry-pick FETCH_HEAD<br />
<br />
If the child commit merge throws an error, ie you should see lines like: <br />
hint: after resolving the conflicts, mark the corrected paths<br />
hint: with 'git add <paths>' or 'git rm <paths>'<br />
hint: and commit the result with 'git commit'<br />
<br />
you will need to fix up the merge conflicts - first go:<br />
<br />
git status<br />
<br />
to see which files are causing the merge problems. you should see something like 'Changes to be committed:' listing the files that will merge fine, and 'Unmerged paths:' listing files that will need to be fixed.<br />
<br />
Edit the files that need to be fixed and you should see in them some new lines added beginning with <<<<<<< HEAD then some code (part 1), then ======= then some other code (part 2), then >>>>>>> followed by commit id and commit title<br />
<br />
What you need to do is to work out which bits of code to keep from part 1 and edit part 2 to suit (or visa versa) delete the <<<<<<<, =======, >>>>>>> lines and any code not needd once you are done.<br />
<br />
Save the file and then add the resolved file to the commit by adding the full file directly, eg:<br />
<br />
git add /name/of/file.php<br />
<br />
once all the Unmerged paths files are fixed and added then go:<br />
<br />
git commit<br />
make push<br />
<br />
If the child commit has merged cleanly onto the parent one you can then push it back to Gerrit<br />
<br />
make push<br />
<br />
And now in Gerrit you will see under the dependencies section that the child patch has a new patchset and that patchset depends on the parent patch/commit.<br />
<br />
===Committing in some easy condensed steps===<br />
<br />
====First commit====<br />
<br />
1. Make sure you are on the latest main.<br />
<br />
git checkout main<br />
git pull<br />
<br />
2. Make changes to the file(s) that you want to fix in your favorite editor.<br />
<br />
3. Check which files you have changed.<br />
<br />
git status<br />
<br />
4. Review your changes by comparing them to the original content of the file.<br />
<br />
git diff<br />
<br />
5. Double-check on which branch you are. You should be on "main".<br />
<br />
git branch<br />
<br />
6. Create a new branch which contains the changed files. You can give the branch any name you like as long as you remember what you changed on it. Using the bug number in the branch name is easy to identify it.<br />
<br />
git checkout -b bug[bug number]<br />
<br />
7. Double-check that you are now on that new branch and that you still see the changed files.<br />
<br />
git branch<br />
git status<br />
<br />
8. Commit your changes to git. Please read [http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html how to write good commit messages]. Ideally, the Launchpad bug number appears in the first line of the commit so that it appears in the changelog. If the first line would get too long, put the bug number in the second or last line. It will then be linked back to Launchpad and your patch will be associated to the bug correctly. The "-a" means that all files that have changed will be taken into consideration.<br />
<br />
git commit -a<br />
<br />
9. Check your local git log that you committed your change and that the commit message doesn't contain any errors. You can make changes to your commit message if necessary with "git --amend".<br />
git log<br />
<br />
10. Push your changes to the review system. Make a note of the URL under which your patch is available for review. You will also see it appear on your Gerrit dashboard.<br />
<br />
make push<br />
<br />
====Re-submit a patch====<br />
<br />
You may have to make changes to a patch that you submitted based on feedback you receive from the reviewers.<br />
<br />
1. Make sure that you are on the branch in which you fixed the bug. If necessary, switch to it with git checkout.<br />
<br />
git branch<br />
git checkout bug[bugnumber]<br />
<br />
2. Make the necessary changes.<br />
<br />
3. Check which files you have changed.<br />
<br />
git status<br />
<br />
4. Review your changes by comparing them to the original content of the file.<br />
<br />
git diff<br />
<br />
5. Add the file(s) to the commit.<br />
<br />
git add [filename] OR<br />
git add . (adds all files that have changed)<br />
<br />
6. Open the commit message and make changes if necessary. Then save the file. The command given here is for vim.<br />
<br />
git commit --amend<br />
[in vim] :wq<br />
<br />
7. Review that your changes to the commit message made it into the log.<br />
<br />
git log<br />
<br />
8. Push your changes to the review system<br />
<br />
make push<br />
<br />
==Useful links==<br />
<br />
*[https://reviews.mahara.org/Documentation/index.html Gerrit official documentation]<br />
*[http://www.itk.org/Wiki/ITK/Gerrit/ReviewPrimer Gerrit Review Primer] - useful for getting familiar with review interface.<br />
<br />
==FAQ==<br />
<br />
Or rather: Questions a couple of people asked that many others might have. :-)<br />
<br />
1.<br />
<br />
'''Q:''' If I was creating a feature request (not a bug), should I still create a launchpad bug?<br />
<br />
'''A:''' Yes. Launchpad does not distinguish between bugs and feature requests. We identify features by the status "Wishlist".<br />
<br />
<br />
2. <br />
<br />
'''Q:''' How do I link my launchpad bug with the Gerrit change?<br />
<br />
'''A:''' When you put the bug number in your commit message with "Bug 1234567" or "Bug #1234567" then that will be translated into a link to that bug on Launchpad and also automatically update Launchpad to include a link to the review.<br />
<br />
It is recommended to start your commit message with the bug number like so: <br />
<br />
Bug 1234567: Your short commit message here<br />
<br />
Second line of the commit message with more detail<br />
If you have a lot to say, break your commit message<br />
at about 50 characters so nobody needs to scroll<br />
horizontally in order to read your commit message. ;-)<br />
<br />
<br />
3. <br />
<br />
'''Q:''' Do I need to add some tags to launchpad so people will notice it?<br />
<br />
'''A:''' No. That is not necessary. Tags will be added during the triage process. It is enough for you to report the issue. The core team will assign the appropriate status and priority amongst other things.<br />
<br />
<br />
4. <br />
<br />
'''Q:''' How can I request that a "bug" be backported to an older release?<br />
<br />
'''A:''' We decide that for Mahara core. Generally, we only backport high importance bugs. Once a bug fix has passed review (and is merged), you can backport it for your older version of Mahara yourself.<br />
<br />
If you disagree with not backporting a bug fix, you can provide a reason for actually doing so on the Launchpad item.<br />
<br />
<br />
5. <br />
<br />
'''Q:''' What is the typical process for creating a patch?<br />
<br />
'''A:''' <br />
<br />
#. Create the Launchpad bug.<br />
#. Add the patch to Gerrit so you can link it to the bug number.<br />
#. Wait for reply and comment.<br />
#. Fix things up if needed in the code review system.<br />
#. It gets merged.<br />
<br />
6.<br />
<br />
'''Q:''' I'm having trouble with make css. How do I avoid SyntaxError: Use of const in strict mode?<br />
<br />
'''A:''' You need to update your nodejs version.<br />
This can be achieved via<br />
a) Clear NPM's cache:<br />
<br />
sudo npm cache clean -f<br />
<br />
b) Install a little helper called 'n'<br />
<br />
sudo npm install -g n<br />
<br />
c) Install latest stable NodeJS version<br />
<br />
sudo n stable<br />
<br />
[[Category:Developer Area]]</div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Contributing_Code&diff=12886Developer Area/Contributing Code2022-03-29T21:23:17Z<p>Robertl: /* Security patches */</p>
<hr />
<div>==If all else fails...==<br />
<br />
Admittedly, it can be a little intimidating for a new developer to go through the process described on this page to submit patches to Mahara. If you can't get this working, or don't want to, feel free to simply attach your patch file directly to a [https://bugs.launchpad.net/mahara/+filebug bug report in Launchpad]. (It's helpful if you can specify the exact version of Mahara your patch applies against.) Or link to a commit on github. Or even paste code directly into the bug report. We welcome all contributions. :)<br />
<br />
From there, another member of the Mahara community can push your contribution into Gerrit, using <tt>git commit --author="Your Name <youremail@example.com>"</tt> to credit you as the author of the change.<br />
<br />
But if you plan on being a regular contributor to Mahara, it's preferable if you can follow the process described below. If you have difficulties, feel free to ask for help on #mahara-dev on irc.freenode.net, or in the [https://mahara.org/interaction/forum/view.php?id=48 Mahara developer forums].<br />
<br />
==Getting ready for using Gerrit==<br />
<br />
The [https://reviews.mahara.org/ Mahara code review system] uses [http://code.google.com/p/gerrit Gerrit], a web-based collaborative tool for code revision. This allows anyone who wish to contribute to submit code and get it added to Mahara core. You do not need commit permission on the main Mahara repository, or to be part of the "Mahara Reviewers" group to send your patchsets through the Gerrit system. Essentially, Gerrit is an intermediate step on the way of the patch between your local workspace and the main Mahara repository. For your local git clone of Mahara, Gerrit is just another remote branch which one can push changes to that will be shown on the Gerrit web interface.<br />
<br />
==== Initial setup ====<br />
<br />
First you'll need to create accounts on Launchpad and reviews.mahara.org, and install some local software. You'll find instructions for that here:<br />
<br />
* [[Developer Area/Developer Tools]].<br />
<br />
====Get a copy of the Mahara source code from git====<br />
<br />
Grab a read-only copy of the [https://github.com/MaharaProject/mahara Mahara repo] from Github:<br />
<br />
cd /path/to/your/web/directory<br />
git clone git@github.com:MaharaProject/mahara.git<br />
<br />
This will create a copy of the Mahara source code at '''/path/to/your/web/directory/mahara'''. For testing purposes, you'll probably want to configure this code so that it actually runs as a copy of Mahara on your local machine. If you need instructions on how to do that, check out [[Developer_Area/Developer_Environment | Setting up your developer environment]].<br />
<br />
====Setting up Gerrit in your local Mahara repository====<br />
<br />
Add the gerrit site as a new remote in your local git repository. (Replace '''username''' with your username on reviews.mahara.org). '''The username is case-sensitive''', which is why we recommend using a lowercase one.<br />
<br />
cd /path/to/your/web/directory/mahara<br />
git remote add gerrit ssh://'''username'''@reviews.mahara.org:29418/mahara<br />
<br />
If you cannot use SSH, do:<br />
<br />
git remote add gerrit https://reviews.mahara.org/mahara<br />
<br />
To test whether this has worked correctly, try this command:<br />
<br />
git fetch gerrit<br />
<br />
You should see git fetch a list of branches. If you don't see that, or you see an error message, check out the [[Developer Area/Contributing Code/Troubleshooting your Gerrit connection|troubleshooting your Gerrit connection]] page.<br />
<br />
If that doesn't work and you get a message mentioning diffie-hellman, add the following lines to your ssh config file in your home directory. We need those due to an older version of SSH still being used for the moment:<br />
<br />
<pre><br />
Host reviews.mahara.org<br />
Hostname 202.78.242.17<br />
Port 29418<br />
KexAlgorithms +diffie-hellman-group1-sha1<br />
</pre><br />
<br />
Next, you will need to add a commit hook to your local git repo, to generate a <tt>Change-Id:</tt> line in your commit messages as required for proper gerrit functioning:<br />
<br />
scp -p -P 29418 '''username'''@reviews.mahara.org:hooks/commit-msg .git/hooks/<br />
<br />
Make this file executable:<br />
<br />
chmod u+x /path/to/your/web/directory/mahara/.git/hooks/commit-msg<br />
<br />
If you wish to have your instance of Mahara to be able to compile the css (version 15.10+) on the checkout of a patchset from Gerrit then you can, from your Mahara base directory, do the following:<br />
<br />
touch .git/hooks/post-checkout && chmod 764 .git/hooks/post-checkout<br />
<br />
Edit the file and add the following, making sure the #!/bin/bash is the first line of the file:<br />
<code><pre><br />
#!/bin/bash<br />
<br />
set -e<br />
<br />
# The three values we get from post-checkout hook<br />
prevHEAD=$1<br />
newHEAD=$2<br />
checkoutType=$3<br />
<br />
[[ $checkoutType == 1 ]] && checkoutType='branch' || checkoutType='file' ;<br />
<br />
newHEADcheck=$(git name-rev --name-only $newHEAD)<br />
branch=$newHEADcheck<br />
if [ $newHEADcheck = 'undefined' ]; then<br />
# see if we can find out what the branch we will be merging the patch to <br />
maharaBranch=$(curl -s https://reviews.mahara.org/changes/?q=$newHEAD | grep branch)<br />
<br />
regex=': "(.*?)"'<br />
if [[ $maharaBranch =~ $regex ]]; then<br />
branch=${BASH_REMATCH[1]}<br />
fi<br />
<br />
if [ "$branch" = "main" ]; then<br />
# get git root directory<br />
gitRoot=$(git rev-parse --show-toplevel)<br />
cd $gitRoot<br />
printf '\npost-checkout hook\n'<br />
make clean-css<br />
make css<br />
fi<br />
fi<br />
</pre></code><br />
So now when you checkout a gerrit patch that is on main branch it should compile the css.<br />
<br />
== Preparing / organising your changes ==<br />
<br />
Some basic guidelines:<br />
<br />
* '''One patchset per logical change'''<br />
** If you've fixed three or four bugs in entirely different parts of the system, sending them together as one patchset makes it harder to review, manage, and merge them. For instance, if it turns out that one of the three fixes is incorrect, while the other two are ready to merge, or if only one fix needs to be back-ported to previous versions of Mahara.<br />
* '''Include technical details with each change'''<br />
** You should briefly describe what the change intends to do. The ''worst'' possible description you could use is "fixed bug", or possibly "rawr". What we want to see is enough detail about what was wrong, and if not obvious from the patch, why you fixed the problem the way you did. If your description starts getting too long (more than a paragraph), it's probably a sign that you should split up your patches.<br />
* '''Group related patches together into topics'''<br />
** If you are developing a larger feature as a series of related patches, group them together into a topic (see the section below on how to do this in gerrit). A topic is especially important if the first few patches in the series don't really achieve anything on their own. A reviewer will be able to make sense of an earlier patch by looking forward to later ones within the same topic. The commit message of the earlier patch should explain the plan, and the whole series of patches should be submitted at the same time.<br />
* '''Apply new patch on top of clean checked-out branch'''<br />
** Every new patch should be applied on top of the clean checked-out branch to avoid adding dependencies in error.<br />
* '''Consider the reviewer'''<br />
** Following the guidelines above should help to make your patches easier for the reviewer to read and understand. But also try to remember that the person reviewing your code would probably rather be doing something else, like writing their own code. They don't want to have to review your patch twice, so don't submit patches until they're well-tested, and until you're absolutely sure the code is correct.<br />
* '''Make sure your changes "blend in" with the surrounding code'''<br />
** By that, we mean make sure you're using four spaces for indentation, the same bracing style the surrounding code uses for if {} etc. Make sure your changes are internationalised using our translation system, and that you throw exceptions the same way the existing code does when errors occur. If your code isn't too much different, we'll probably help you out by fixing it up. But if you're using tabs, weird bracing styles and your own functions for database access, your code is sure to be rejected.<br />
* '''Make sure that the new code follows our [[Developer Area/Coding guidelines|coding guidelines]]'''<br />
<br />
Here are some additional articles you might be interested in reading:<br />
<br />
* [http://feeding.cloud.geek.nz/2009/06/writing-perfect-patch.html Writing good patches]<br />
* [http://feeding.cloud.geek.nz/2009/07/3-ways-to-improve-your-source-control.html Keeping source code history clean]<br />
* [http://wiki.postgresql.org/wiki/Creating_Clean_Patches Creating Clean Patches]<br />
<br />
== Submitting commits for review ==<br />
<br />
=== Preferred method ===<br />
<br />
This is the '''preferred method''' of pushing things to Gerrit, but you should understand what it does by reading the [[Developer_Area/Contributing_Code#Manual_method|manual method]] as well. <br />
<br />
Note: To use this, you will need to install '''xmllint'''. On debian/ubuntu based systems, this is in '''libxml2-utils'''. <br />
<br />
To push your change, simply type this in the root directory of your feature/bugfix branch, eg the parent directory of the htdocs/ directory:<br />
<br />
make push<br />
<br />
or if you want to add a Gerrit tag:<br />
<br />
make push TAG=topic_for_this_change<br />
<br />
Note: You only need to do the topic tag once.<br />
<br />
If what you are working on is not finished but you want to save / show your workings to others you can push the patch as 'Work in progress' via:<br />
<br />
make wip<br />
<br />
or<br />
<br />
make wip TAG=topic_for_this_change<br />
<br />
This will run a few initial sanity checks and either push your changes to Gerrit or will return warnings about coding problems that you will need to fix ([https://wiki.mahara.org/index.php/Developer_Area/Contributing_Code#Making_changes_in_existing_commits see below]).<br />
<br />
'''Note:''' Setting the topic is encouraged for patches that contain new functionality so that they can be spotted more easily as someone from the core team needs to do the front-end verification. A tester's OK would not be enough as they may only test that it works, but not review the implementation itself. The topic tag should include "(feature)".<br />
<br />
Once a patch is pushed to Gerrit it is run through a host of automated tests and (after a short while) will update the Gerrit review with a pass or fail in the automated Tests (AT) column.<br />
<br />
If your patch fails the automated tests you can follow the link provided in the comments section to find out why your patch failed to help debug and fix the issues ([https://wiki.mahara.org/index.php/Developer_Area/Contributing_Code#Making_changes_in_existing_commits see below]).<br />
<br />
====Apple Mac Computers====<br />
Apple Mac Devices may have an extra requirement to update the libraries in use. This is especially important if encountering these error messages when running "make push":<br />
<br />
xargs: illegal option -- -<br />
<br />
sed: illegal option -- r <br />
<br />
On an Apple Mac device, the version of "xargs" and "sed" is different and you may see the above errors even if these libraries are already installed.<br />
To resolve these issues, install gnu-sed and findutils using the "--with-default-names" option to line them up to the expected Linux counterparts.<br />
<br />
Install Homebrew<br />
<br />
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"<br />
<br />
Install required libraries of xmllint, sed, and xargs<br />
<br />
brew install xmlstarlet --with-default-names<br />
<br />
brew install gnu-sed --with-default-names<br />
<br />
brew install findutils --with-default-names<br />
<br />
Tips:<br />
<br />
Update Git to use the correct email address associated with Gerrit Before making any changes by using the command below with the Gerrit email in use:<br />
<br />
git config user.email "email@example.com"<br />
<br />
Be careful if using "sudo" (superuser do) for commands when pushing to Gerrit on an Apple Mac device. The SSH keys are user based, and the sudo command may end up using a different set of SSH keys, resulting in the push being rejected.<br />
<br />
=== Manual method ===<br />
<br />
In order to push your changes for review, just push into the project's magical <tt>refs/publish/'''remote_branchname'''</tt> ref. If you are pushing to the remote main branch and your current local branch is ''bug123456'', your command will be:<br />
<br />
git push gerrit HEAD:refs/for/'''main'''<br />
<br />
Once you pushed, your change will be available for review on the [https://reviews.mahara.org/ Mahara code review system]. The single change will be created on review system for each commit you pushed. If you push several commits, gerrit will add dependencies between changes based on the git parent ref.<br />
<br />
You may also push a single commit, simply use its hash:<br />
<br />
git push gerrit '''38f4f96df''':refs/for/main<br />
<br />
If you like, you may specify the topic tag that will be shown in your change details on review system. This tag may be associated with a group of changes if you use it for several commits. To do that, simply append it to the destination ref, e.g.<br />
<br />
git push gerrit HEAD:refs/for/main/'''topic_for_this_change'''<br />
<br />
'''Note:''' Setting the topic is encouraged for patches that contain new functionality so that they can be spotted more easily as someone from the core team needs to do the front-end verification. A tester's OK would not be enough as they may only test that it works, but not review the implementation itself. The topic tag should include "(feature)".<br />
<br />
== Security patches ==<br />
<br />
For patches for security issues, use:<br />
<br />
make security<br />
<br />
or<br />
<br />
make security TAG=topic_for_this_change<br />
<br />
This will submit your patch into gerrit as a "Private" submission, which will be only visible to you and to people in gerrit's "Security" group. The downside to this is that the code review system doesn't work automatically for Draft submissions, so verifications and review have to be made as freetext comments, rather than +/-.<br />
<br />
== Git for Newbs ==<br />
<br />
If you're new to git, here is a cheat sheet of some of the operations you'll likely need to do.<br />
<br />
=== Creating a new branch for your change ===<br />
<br />
We strongly recommend you create one git branch per change you want to submit. First, make sure you have checked out the "main" branch, and that it is up to date and clean of any changes:<br />
<br />
git checkout main -f<br />
git reset --hard origin/main<br />
git pull<br />
<br />
Then create the new branch. It is useful to give it a meaningful name like a Launchpad bug number.<br />
<br />
git checkout -b bug123456<br />
<br />
Make the changes you want. When you're done, you'll need to group them into a git commit and push that commit to gerrit. First, check what changes you have in your local workspace:<br />
<br />
git status<br />
<br />
Next, add any new files that you have added which are not yet tracked by git. You will need to add them by name, for example:<br />
<br />
git add htdocs/view/my_new_view_file.php<br />
<br />
Then, you can commit the modified/deleted files with:<br />
<br />
git commit -a<br />
<br />
Or if you want to choose interactively which bits of code to add:<br />
<br />
git add -p<br />
git commit<br />
<br />
And finally, use this branch when you push to the code review system ([https://wiki.mahara.org/index.php/Developer_Area/Contributing_Code#Submitting_commits_for_review see below]).<br />
<br />
=== Making changes in existing commits ===<br />
<br />
It's best to check out the commit from Gerrit itself. There will be a link under the download section with "checkout" highlighted - to copy/paste, eg:<br />
<br />
git fetch https://reviews.mahara.org/mahara refs/changes/57/1234/1 && git checkout FETCH_HEAD<br />
<br />
Make the changes that you need and add them ready for committing<br />
<br />
git add -p<br />
<br />
Then commit these new changes to the same commit message as before:<br />
<br />
git commit --amend<br />
<br />
Another option is commit squashing, below.<br />
<br />
When your commit has been reviewed, you may require to make some changes before it will be accepted. The changes you will be doing should be [http://book.git-scm.com/4_interactive_rebasing.html squashed] into the same commit you originally pushed for review. You must ensure that the <tt>Change-Id:</tt> line is preserved the same as in the original commit. This will make Gerrit matching this commit to the original one and appending your changes as a new patchset. The simplest workflow would be:<br />
# Checkout the branch where your original changes are (see above)<br />
# Make the required changes<br />
# Commit the changes<br />
#* The commit message does not matter as it will be removed when the commit is squashed, so random text here is fine.<br />
# Use [http://book.git-scm.com/4_interactive_rebasing.html interactive rebasing] to squash the latest commit into the previous commit.<br />
#* An example command for this would be: <tt>git rebase -i HEAD~2</tt><br />
#* Find the latest commit in the list (it should be the bottom-most commit) and replace the word 'pick' with 'f'. This is short for 'fixup', which will squash the commit into the one before it, and discard the commit message. (This is what we want.) You may also use 's' in which case you will be offered to amend the commit message before squashing (ensure that you leave <tt>Change-Id:</tt> of the commit you are squashing onto).<br />
Now you may push the amended commit to review system the most convenient way:<br />
<br />
git push gerrit HEAD:refs/publish/main<br />
<br />
or<br />
<br />
make push<br />
<br />
In the Gerrit interface it will appear under the same change as a separate patchset ready for another review.<br />
<br />
=== Ordering commits ===<br />
<br />
If you have pushed some commits to Gerrit but then discover that one of your commits is dependent on another you can adjust the hierarchy of your commits like this.<br />
<br />
Checkout the commit that you want to come first/be the parent by getting the checkout code from the review, eg: <br />
<br />
git fetch https://reviews.mahara.org/mahara refs/changes/49/1234/1 && git checkout FETCH_HEAD<br />
<br />
Then cherry-pick the second/child commit by selecting 'cherry-pick' before copying the link, eg:<br />
<br />
git fetch https://reviews.mahara.org/mahara refs/changes/50/2345/1 && git cherry-pick FETCH_HEAD<br />
<br />
If the child commit merge throws an error, ie you should see lines like: <br />
hint: after resolving the conflicts, mark the corrected paths<br />
hint: with 'git add <paths>' or 'git rm <paths>'<br />
hint: and commit the result with 'git commit'<br />
<br />
you will need to fix up the merge conflicts - first go:<br />
<br />
git status<br />
<br />
to see which files are causing the merge problems. you should see something like 'Changes to be committed:' listing the files that will merge fine, and 'Unmerged paths:' listing files that will need to be fixed.<br />
<br />
Edit the files that need to be fixed and you should see in them some new lines added beginning with <<<<<<< HEAD then some code (part 1), then ======= then some other code (part 2), then >>>>>>> followed by commit id and commit title<br />
<br />
What you need to do is to work out which bits of code to keep from part 1 and edit part 2 to suit (or visa versa) delete the <<<<<<<, =======, >>>>>>> lines and any code not needd once you are done.<br />
<br />
Save the file and then add the resolved file to the commit by adding the full file directly, eg:<br />
<br />
git add /name/of/file.php<br />
<br />
once all the Unmerged paths files are fixed and added then go:<br />
<br />
git commit<br />
make push<br />
<br />
If the child commit has merged cleanly onto the parent one you can then push it back to Gerrit<br />
<br />
make push<br />
<br />
And now in Gerrit you will see under the dependencies section that the child patch has a new patchset and that patchset depends on the parent patch/commit.<br />
<br />
=== Committing in some easy condensed steps ===<br />
<br />
==== First commit ====<br />
<br />
1. Make sure you are on the latest main.<br />
<br />
git checkout main<br />
git pull<br />
<br />
2. Make changes to the file(s) that you want to fix in your favorite editor.<br />
<br />
3. Check which files you have changed.<br />
<br />
git status<br />
<br />
4. Review your changes by comparing them to the original content of the file.<br />
<br />
git diff<br />
<br />
5. Double-check on which branch you are. You should be on "main".<br />
<br />
git branch<br />
<br />
6. Create a new branch which contains the changed files. You can give the branch any name you like as long as you remember what you changed on it. Using the bug number in the branch name is easy to identify it.<br />
<br />
git checkout -b bug[bug number]<br />
<br />
7. Double-check that you are now on that new branch and that you still see the changed files.<br />
<br />
git branch<br />
git status<br />
<br />
8. Commit your changes to git. Please read [http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html how to write good commit messages]. Ideally, the Launchpad bug number appears in the first line of the commit so that it appears in the changelog. If the first line would get too long, put the bug number in the second or last line. It will then be linked back to Launchpad and your patch will be associated to the bug correctly. The "-a" means that all files that have changed will be taken into consideration.<br />
<br />
git commit -a<br />
<br />
9. Check your local git log that you committed your change and that the commit message doesn't contain any errors. You can make changes to your commit message if necessary with "git --amend".<br />
git log<br />
<br />
10. Push your changes to the review system. Make a note of the URL under which your patch is available for review. You will also see it appear on your Gerrit dashboard.<br />
<br />
make push<br />
<br />
==== Re-submit a patch ====<br />
<br />
You may have to make changes to a patch that you submitted based on feedback you receive from the reviewers.<br />
<br />
1. Make sure that you are on the branch in which you fixed the bug. If necessary, switch to it with git checkout.<br />
<br />
git branch<br />
git checkout bug[bugnumber]<br />
<br />
2. Make the necessary changes.<br />
<br />
3. Check which files you have changed.<br />
<br />
git status<br />
<br />
4. Review your changes by comparing them to the original content of the file.<br />
<br />
git diff<br />
<br />
5. Add the file(s) to the commit.<br />
<br />
git add [filename] OR<br />
git add . (adds all files that have changed)<br />
<br />
6. Open the commit message and make changes if necessary. Then save the file. The command given here is for vim.<br />
<br />
git commit --amend<br />
[in vim] :wq<br />
<br />
7. Review that your changes to the commit message made it into the log.<br />
<br />
git log<br />
<br />
8. Push your changes to the review system<br />
<br />
make push<br />
<br />
== Useful links ==<br />
<br />
* [https://reviews.mahara.org/Documentation/index.html Gerrit official documentation] <br />
* [http://www.itk.org/Wiki/ITK/Gerrit/ReviewPrimer Gerrit Review Primer] - useful for getting familiar with review interface.<br />
<br />
== FAQ ==<br />
<br />
Or rather: Questions a couple of people asked that many others might have. :-)<br />
<br />
1.<br />
<br />
'''Q:''' If I was creating a feature request (not a bug), should I still create a launchpad bug?<br />
<br />
'''A:''' Yes. Launchpad does not distinguish between bugs and feature requests. We identify features by the status "Wishlist".<br />
<br />
<br />
2. <br />
<br />
'''Q:''' How do I link my launchpad bug with the Gerrit change?<br />
<br />
'''A:''' When you put the bug number in your commit message with "Bug 1234567" or "Bug #1234567" then that will be translated into a link to that bug on Launchpad and also automatically update Launchpad to include a link to the review.<br />
<br />
It is recommended to start your commit message with the bug number like so: <br />
<br />
Bug 1234567: Your short commit message here<br />
<br />
Second line of the commit message with more detail<br />
If you have a lot to say, break your commit message<br />
at about 50 characters so nobody needs to scroll<br />
horizontally in order to read your commit message. ;-)<br />
<br />
<br />
3. <br />
<br />
'''Q:''' Do I need to add some tags to launchpad so people will notice it?<br />
<br />
'''A:''' No. That is not necessary. Tags will be added during the triage process. It is enough for you to report the issue. The core team will assign the appropriate status and priority amongst other things.<br />
<br />
<br />
4. <br />
<br />
'''Q:''' How can I request that a "bug" be backported to an older release?<br />
<br />
'''A:''' We decide that for Mahara core. Generally, we only backport high importance bugs. Once a bug fix has passed review (and is merged), you can backport it for your older version of Mahara yourself.<br />
<br />
If you disagree with not backporting a bug fix, you can provide a reason for actually doing so on the Launchpad item.<br />
<br />
<br />
5. <br />
<br />
'''Q:''' What is the typical process for creating a patch?<br />
<br />
'''A:''' <br />
<br />
#. Create the Launchpad bug.<br />
#. Add the patch to Gerrit so you can link it to the bug number.<br />
#. Wait for reply and comment.<br />
#. Fix things up if needed in the code review system.<br />
#. It gets merged.<br />
<br />
6.<br />
<br />
'''Q:''' I'm having trouble with make css. How do I avoid SyntaxError: Use of const in strict mode?<br />
<br />
'''A:''' You need to update your nodejs version.<br />
This can be achieved via<br />
a) Clear NPM's cache:<br />
<br />
sudo npm cache clean -f<br />
<br />
b) Install a little helper called 'n'<br />
<br />
sudo npm install -g n<br />
<br />
c) Install latest stable NodeJS version<br />
<br />
sudo n stable<br />
<br />
<br />
[[Category:Developer Area]]</div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Contributing_Code&diff=12885Developer Area/Contributing Code2022-03-29T21:22:34Z<p>Robertl: /* Manual method */</p>
<hr />
<div>==If all else fails...==<br />
<br />
Admittedly, it can be a little intimidating for a new developer to go through the process described on this page to submit patches to Mahara. If you can't get this working, or don't want to, feel free to simply attach your patch file directly to a [https://bugs.launchpad.net/mahara/+filebug bug report in Launchpad]. (It's helpful if you can specify the exact version of Mahara your patch applies against.) Or link to a commit on github. Or even paste code directly into the bug report. We welcome all contributions. :)<br />
<br />
From there, another member of the Mahara community can push your contribution into Gerrit, using <tt>git commit --author="Your Name <youremail@example.com>"</tt> to credit you as the author of the change.<br />
<br />
But if you plan on being a regular contributor to Mahara, it's preferable if you can follow the process described below. If you have difficulties, feel free to ask for help on #mahara-dev on irc.freenode.net, or in the [https://mahara.org/interaction/forum/view.php?id=48 Mahara developer forums].<br />
<br />
==Getting ready for using Gerrit==<br />
<br />
The [https://reviews.mahara.org/ Mahara code review system] uses [http://code.google.com/p/gerrit Gerrit], a web-based collaborative tool for code revision. This allows anyone who wish to contribute to submit code and get it added to Mahara core. You do not need commit permission on the main Mahara repository, or to be part of the "Mahara Reviewers" group to send your patchsets through the Gerrit system. Essentially, Gerrit is an intermediate step on the way of the patch between your local workspace and the main Mahara repository. For your local git clone of Mahara, Gerrit is just another remote branch which one can push changes to that will be shown on the Gerrit web interface.<br />
<br />
==== Initial setup ====<br />
<br />
First you'll need to create accounts on Launchpad and reviews.mahara.org, and install some local software. You'll find instructions for that here:<br />
<br />
* [[Developer Area/Developer Tools]].<br />
<br />
====Get a copy of the Mahara source code from git====<br />
<br />
Grab a read-only copy of the [https://github.com/MaharaProject/mahara Mahara repo] from Github:<br />
<br />
cd /path/to/your/web/directory<br />
git clone git@github.com:MaharaProject/mahara.git<br />
<br />
This will create a copy of the Mahara source code at '''/path/to/your/web/directory/mahara'''. For testing purposes, you'll probably want to configure this code so that it actually runs as a copy of Mahara on your local machine. If you need instructions on how to do that, check out [[Developer_Area/Developer_Environment | Setting up your developer environment]].<br />
<br />
====Setting up Gerrit in your local Mahara repository====<br />
<br />
Add the gerrit site as a new remote in your local git repository. (Replace '''username''' with your username on reviews.mahara.org). '''The username is case-sensitive''', which is why we recommend using a lowercase one.<br />
<br />
cd /path/to/your/web/directory/mahara<br />
git remote add gerrit ssh://'''username'''@reviews.mahara.org:29418/mahara<br />
<br />
If you cannot use SSH, do:<br />
<br />
git remote add gerrit https://reviews.mahara.org/mahara<br />
<br />
To test whether this has worked correctly, try this command:<br />
<br />
git fetch gerrit<br />
<br />
You should see git fetch a list of branches. If you don't see that, or you see an error message, check out the [[Developer Area/Contributing Code/Troubleshooting your Gerrit connection|troubleshooting your Gerrit connection]] page.<br />
<br />
If that doesn't work and you get a message mentioning diffie-hellman, add the following lines to your ssh config file in your home directory. We need those due to an older version of SSH still being used for the moment:<br />
<br />
<pre><br />
Host reviews.mahara.org<br />
Hostname 202.78.242.17<br />
Port 29418<br />
KexAlgorithms +diffie-hellman-group1-sha1<br />
</pre><br />
<br />
Next, you will need to add a commit hook to your local git repo, to generate a <tt>Change-Id:</tt> line in your commit messages as required for proper gerrit functioning:<br />
<br />
scp -p -P 29418 '''username'''@reviews.mahara.org:hooks/commit-msg .git/hooks/<br />
<br />
Make this file executable:<br />
<br />
chmod u+x /path/to/your/web/directory/mahara/.git/hooks/commit-msg<br />
<br />
If you wish to have your instance of Mahara to be able to compile the css (version 15.10+) on the checkout of a patchset from Gerrit then you can, from your Mahara base directory, do the following:<br />
<br />
touch .git/hooks/post-checkout && chmod 764 .git/hooks/post-checkout<br />
<br />
Edit the file and add the following, making sure the #!/bin/bash is the first line of the file:<br />
<code><pre><br />
#!/bin/bash<br />
<br />
set -e<br />
<br />
# The three values we get from post-checkout hook<br />
prevHEAD=$1<br />
newHEAD=$2<br />
checkoutType=$3<br />
<br />
[[ $checkoutType == 1 ]] && checkoutType='branch' || checkoutType='file' ;<br />
<br />
newHEADcheck=$(git name-rev --name-only $newHEAD)<br />
branch=$newHEADcheck<br />
if [ $newHEADcheck = 'undefined' ]; then<br />
# see if we can find out what the branch we will be merging the patch to <br />
maharaBranch=$(curl -s https://reviews.mahara.org/changes/?q=$newHEAD | grep branch)<br />
<br />
regex=': "(.*?)"'<br />
if [[ $maharaBranch =~ $regex ]]; then<br />
branch=${BASH_REMATCH[1]}<br />
fi<br />
<br />
if [ "$branch" = "main" ]; then<br />
# get git root directory<br />
gitRoot=$(git rev-parse --show-toplevel)<br />
cd $gitRoot<br />
printf '\npost-checkout hook\n'<br />
make clean-css<br />
make css<br />
fi<br />
fi<br />
</pre></code><br />
So now when you checkout a gerrit patch that is on main branch it should compile the css.<br />
<br />
== Preparing / organising your changes ==<br />
<br />
Some basic guidelines:<br />
<br />
* '''One patchset per logical change'''<br />
** If you've fixed three or four bugs in entirely different parts of the system, sending them together as one patchset makes it harder to review, manage, and merge them. For instance, if it turns out that one of the three fixes is incorrect, while the other two are ready to merge, or if only one fix needs to be back-ported to previous versions of Mahara.<br />
* '''Include technical details with each change'''<br />
** You should briefly describe what the change intends to do. The ''worst'' possible description you could use is "fixed bug", or possibly "rawr". What we want to see is enough detail about what was wrong, and if not obvious from the patch, why you fixed the problem the way you did. If your description starts getting too long (more than a paragraph), it's probably a sign that you should split up your patches.<br />
* '''Group related patches together into topics'''<br />
** If you are developing a larger feature as a series of related patches, group them together into a topic (see the section below on how to do this in gerrit). A topic is especially important if the first few patches in the series don't really achieve anything on their own. A reviewer will be able to make sense of an earlier patch by looking forward to later ones within the same topic. The commit message of the earlier patch should explain the plan, and the whole series of patches should be submitted at the same time.<br />
* '''Apply new patch on top of clean checked-out branch'''<br />
** Every new patch should be applied on top of the clean checked-out branch to avoid adding dependencies in error.<br />
* '''Consider the reviewer'''<br />
** Following the guidelines above should help to make your patches easier for the reviewer to read and understand. But also try to remember that the person reviewing your code would probably rather be doing something else, like writing their own code. They don't want to have to review your patch twice, so don't submit patches until they're well-tested, and until you're absolutely sure the code is correct.<br />
* '''Make sure your changes "blend in" with the surrounding code'''<br />
** By that, we mean make sure you're using four spaces for indentation, the same bracing style the surrounding code uses for if {} etc. Make sure your changes are internationalised using our translation system, and that you throw exceptions the same way the existing code does when errors occur. If your code isn't too much different, we'll probably help you out by fixing it up. But if you're using tabs, weird bracing styles and your own functions for database access, your code is sure to be rejected.<br />
* '''Make sure that the new code follows our [[Developer Area/Coding guidelines|coding guidelines]]'''<br />
<br />
Here are some additional articles you might be interested in reading:<br />
<br />
* [http://feeding.cloud.geek.nz/2009/06/writing-perfect-patch.html Writing good patches]<br />
* [http://feeding.cloud.geek.nz/2009/07/3-ways-to-improve-your-source-control.html Keeping source code history clean]<br />
* [http://wiki.postgresql.org/wiki/Creating_Clean_Patches Creating Clean Patches]<br />
<br />
== Submitting commits for review ==<br />
<br />
=== Preferred method ===<br />
<br />
This is the '''preferred method''' of pushing things to Gerrit, but you should understand what it does by reading the [[Developer_Area/Contributing_Code#Manual_method|manual method]] as well. <br />
<br />
Note: To use this, you will need to install '''xmllint'''. On debian/ubuntu based systems, this is in '''libxml2-utils'''. <br />
<br />
To push your change, simply type this in the root directory of your feature/bugfix branch, eg the parent directory of the htdocs/ directory:<br />
<br />
make push<br />
<br />
or if you want to add a Gerrit tag:<br />
<br />
make push TAG=topic_for_this_change<br />
<br />
Note: You only need to do the topic tag once.<br />
<br />
If what you are working on is not finished but you want to save / show your workings to others you can push the patch as 'Work in progress' via:<br />
<br />
make wip<br />
<br />
or<br />
<br />
make wip TAG=topic_for_this_change<br />
<br />
This will run a few initial sanity checks and either push your changes to Gerrit or will return warnings about coding problems that you will need to fix ([https://wiki.mahara.org/index.php/Developer_Area/Contributing_Code#Making_changes_in_existing_commits see below]).<br />
<br />
'''Note:''' Setting the topic is encouraged for patches that contain new functionality so that they can be spotted more easily as someone from the core team needs to do the front-end verification. A tester's OK would not be enough as they may only test that it works, but not review the implementation itself. The topic tag should include "(feature)".<br />
<br />
Once a patch is pushed to Gerrit it is run through a host of automated tests and (after a short while) will update the Gerrit review with a pass or fail in the automated Tests (AT) column.<br />
<br />
If your patch fails the automated tests you can follow the link provided in the comments section to find out why your patch failed to help debug and fix the issues ([https://wiki.mahara.org/index.php/Developer_Area/Contributing_Code#Making_changes_in_existing_commits see below]).<br />
<br />
====Apple Mac Computers====<br />
Apple Mac Devices may have an extra requirement to update the libraries in use. This is especially important if encountering these error messages when running "make push":<br />
<br />
xargs: illegal option -- -<br />
<br />
sed: illegal option -- r <br />
<br />
On an Apple Mac device, the version of "xargs" and "sed" is different and you may see the above errors even if these libraries are already installed.<br />
To resolve these issues, install gnu-sed and findutils using the "--with-default-names" option to line them up to the expected Linux counterparts.<br />
<br />
Install Homebrew<br />
<br />
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"<br />
<br />
Install required libraries of xmllint, sed, and xargs<br />
<br />
brew install xmlstarlet --with-default-names<br />
<br />
brew install gnu-sed --with-default-names<br />
<br />
brew install findutils --with-default-names<br />
<br />
Tips:<br />
<br />
Update Git to use the correct email address associated with Gerrit Before making any changes by using the command below with the Gerrit email in use:<br />
<br />
git config user.email "email@example.com"<br />
<br />
Be careful if using "sudo" (superuser do) for commands when pushing to Gerrit on an Apple Mac device. The SSH keys are user based, and the sudo command may end up using a different set of SSH keys, resulting in the push being rejected.<br />
<br />
=== Manual method ===<br />
<br />
In order to push your changes for review, just push into the project's magical <tt>refs/publish/'''remote_branchname'''</tt> ref. If you are pushing to the remote main branch and your current local branch is ''bug123456'', your command will be:<br />
<br />
git push gerrit HEAD:refs/for/'''main'''<br />
<br />
Once you pushed, your change will be available for review on the [https://reviews.mahara.org/ Mahara code review system]. The single change will be created on review system for each commit you pushed. If you push several commits, gerrit will add dependencies between changes based on the git parent ref.<br />
<br />
You may also push a single commit, simply use its hash:<br />
<br />
git push gerrit '''38f4f96df''':refs/for/main<br />
<br />
If you like, you may specify the topic tag that will be shown in your change details on review system. This tag may be associated with a group of changes if you use it for several commits. To do that, simply append it to the destination ref, e.g.<br />
<br />
git push gerrit HEAD:refs/for/main/'''topic_for_this_change'''<br />
<br />
'''Note:''' Setting the topic is encouraged for patches that contain new functionality so that they can be spotted more easily as someone from the core team needs to do the front-end verification. A tester's OK would not be enough as they may only test that it works, but not review the implementation itself. The topic tag should include "(feature)".<br />
<br />
== Security patches ==<br />
<br />
For patches for security issues, use:<br />
<br />
make security<br />
<br />
This will submit your patch into gerrit as a "Draft" submission, which will be only visible to you and to people in gerrit's "Security" group. The downside to this is that the code review system doesn't work automatically for Draft submissions, so verifications and review have to be made as freetext comments, rather than +/-.<br />
<br />
== Git for Newbs ==<br />
<br />
If you're new to git, here is a cheat sheet of some of the operations you'll likely need to do.<br />
<br />
=== Creating a new branch for your change ===<br />
<br />
We strongly recommend you create one git branch per change you want to submit. First, make sure you have checked out the "main" branch, and that it is up to date and clean of any changes:<br />
<br />
git checkout main -f<br />
git reset --hard origin/main<br />
git pull<br />
<br />
Then create the new branch. It is useful to give it a meaningful name like a Launchpad bug number.<br />
<br />
git checkout -b bug123456<br />
<br />
Make the changes you want. When you're done, you'll need to group them into a git commit and push that commit to gerrit. First, check what changes you have in your local workspace:<br />
<br />
git status<br />
<br />
Next, add any new files that you have added which are not yet tracked by git. You will need to add them by name, for example:<br />
<br />
git add htdocs/view/my_new_view_file.php<br />
<br />
Then, you can commit the modified/deleted files with:<br />
<br />
git commit -a<br />
<br />
Or if you want to choose interactively which bits of code to add:<br />
<br />
git add -p<br />
git commit<br />
<br />
And finally, use this branch when you push to the code review system ([https://wiki.mahara.org/index.php/Developer_Area/Contributing_Code#Submitting_commits_for_review see below]).<br />
<br />
=== Making changes in existing commits ===<br />
<br />
It's best to check out the commit from Gerrit itself. There will be a link under the download section with "checkout" highlighted - to copy/paste, eg:<br />
<br />
git fetch https://reviews.mahara.org/mahara refs/changes/57/1234/1 && git checkout FETCH_HEAD<br />
<br />
Make the changes that you need and add them ready for committing<br />
<br />
git add -p<br />
<br />
Then commit these new changes to the same commit message as before:<br />
<br />
git commit --amend<br />
<br />
Another option is commit squashing, below.<br />
<br />
When your commit has been reviewed, you may require to make some changes before it will be accepted. The changes you will be doing should be [http://book.git-scm.com/4_interactive_rebasing.html squashed] into the same commit you originally pushed for review. You must ensure that the <tt>Change-Id:</tt> line is preserved the same as in the original commit. This will make Gerrit matching this commit to the original one and appending your changes as a new patchset. The simplest workflow would be:<br />
# Checkout the branch where your original changes are (see above)<br />
# Make the required changes<br />
# Commit the changes<br />
#* The commit message does not matter as it will be removed when the commit is squashed, so random text here is fine.<br />
# Use [http://book.git-scm.com/4_interactive_rebasing.html interactive rebasing] to squash the latest commit into the previous commit.<br />
#* An example command for this would be: <tt>git rebase -i HEAD~2</tt><br />
#* Find the latest commit in the list (it should be the bottom-most commit) and replace the word 'pick' with 'f'. This is short for 'fixup', which will squash the commit into the one before it, and discard the commit message. (This is what we want.) You may also use 's' in which case you will be offered to amend the commit message before squashing (ensure that you leave <tt>Change-Id:</tt> of the commit you are squashing onto).<br />
Now you may push the amended commit to review system the most convenient way:<br />
<br />
git push gerrit HEAD:refs/publish/main<br />
<br />
or<br />
<br />
make push<br />
<br />
In the Gerrit interface it will appear under the same change as a separate patchset ready for another review.<br />
<br />
=== Ordering commits ===<br />
<br />
If you have pushed some commits to Gerrit but then discover that one of your commits is dependent on another you can adjust the hierarchy of your commits like this.<br />
<br />
Checkout the commit that you want to come first/be the parent by getting the checkout code from the review, eg: <br />
<br />
git fetch https://reviews.mahara.org/mahara refs/changes/49/1234/1 && git checkout FETCH_HEAD<br />
<br />
Then cherry-pick the second/child commit by selecting 'cherry-pick' before copying the link, eg:<br />
<br />
git fetch https://reviews.mahara.org/mahara refs/changes/50/2345/1 && git cherry-pick FETCH_HEAD<br />
<br />
If the child commit merge throws an error, ie you should see lines like: <br />
hint: after resolving the conflicts, mark the corrected paths<br />
hint: with 'git add <paths>' or 'git rm <paths>'<br />
hint: and commit the result with 'git commit'<br />
<br />
you will need to fix up the merge conflicts - first go:<br />
<br />
git status<br />
<br />
to see which files are causing the merge problems. you should see something like 'Changes to be committed:' listing the files that will merge fine, and 'Unmerged paths:' listing files that will need to be fixed.<br />
<br />
Edit the files that need to be fixed and you should see in them some new lines added beginning with <<<<<<< HEAD then some code (part 1), then ======= then some other code (part 2), then >>>>>>> followed by commit id and commit title<br />
<br />
What you need to do is to work out which bits of code to keep from part 1 and edit part 2 to suit (or visa versa) delete the <<<<<<<, =======, >>>>>>> lines and any code not needd once you are done.<br />
<br />
Save the file and then add the resolved file to the commit by adding the full file directly, eg:<br />
<br />
git add /name/of/file.php<br />
<br />
once all the Unmerged paths files are fixed and added then go:<br />
<br />
git commit<br />
make push<br />
<br />
If the child commit has merged cleanly onto the parent one you can then push it back to Gerrit<br />
<br />
make push<br />
<br />
And now in Gerrit you will see under the dependencies section that the child patch has a new patchset and that patchset depends on the parent patch/commit.<br />
<br />
=== Committing in some easy condensed steps ===<br />
<br />
==== First commit ====<br />
<br />
1. Make sure you are on the latest main.<br />
<br />
git checkout main<br />
git pull<br />
<br />
2. Make changes to the file(s) that you want to fix in your favorite editor.<br />
<br />
3. Check which files you have changed.<br />
<br />
git status<br />
<br />
4. Review your changes by comparing them to the original content of the file.<br />
<br />
git diff<br />
<br />
5. Double-check on which branch you are. You should be on "main".<br />
<br />
git branch<br />
<br />
6. Create a new branch which contains the changed files. You can give the branch any name you like as long as you remember what you changed on it. Using the bug number in the branch name is easy to identify it.<br />
<br />
git checkout -b bug[bug number]<br />
<br />
7. Double-check that you are now on that new branch and that you still see the changed files.<br />
<br />
git branch<br />
git status<br />
<br />
8. Commit your changes to git. Please read [http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html how to write good commit messages]. Ideally, the Launchpad bug number appears in the first line of the commit so that it appears in the changelog. If the first line would get too long, put the bug number in the second or last line. It will then be linked back to Launchpad and your patch will be associated to the bug correctly. The "-a" means that all files that have changed will be taken into consideration.<br />
<br />
git commit -a<br />
<br />
9. Check your local git log that you committed your change and that the commit message doesn't contain any errors. You can make changes to your commit message if necessary with "git --amend".<br />
git log<br />
<br />
10. Push your changes to the review system. Make a note of the URL under which your patch is available for review. You will also see it appear on your Gerrit dashboard.<br />
<br />
make push<br />
<br />
==== Re-submit a patch ====<br />
<br />
You may have to make changes to a patch that you submitted based on feedback you receive from the reviewers.<br />
<br />
1. Make sure that you are on the branch in which you fixed the bug. If necessary, switch to it with git checkout.<br />
<br />
git branch<br />
git checkout bug[bugnumber]<br />
<br />
2. Make the necessary changes.<br />
<br />
3. Check which files you have changed.<br />
<br />
git status<br />
<br />
4. Review your changes by comparing them to the original content of the file.<br />
<br />
git diff<br />
<br />
5. Add the file(s) to the commit.<br />
<br />
git add [filename] OR<br />
git add . (adds all files that have changed)<br />
<br />
6. Open the commit message and make changes if necessary. Then save the file. The command given here is for vim.<br />
<br />
git commit --amend<br />
[in vim] :wq<br />
<br />
7. Review that your changes to the commit message made it into the log.<br />
<br />
git log<br />
<br />
8. Push your changes to the review system<br />
<br />
make push<br />
<br />
== Useful links ==<br />
<br />
* [https://reviews.mahara.org/Documentation/index.html Gerrit official documentation] <br />
* [http://www.itk.org/Wiki/ITK/Gerrit/ReviewPrimer Gerrit Review Primer] - useful for getting familiar with review interface.<br />
<br />
== FAQ ==<br />
<br />
Or rather: Questions a couple of people asked that many others might have. :-)<br />
<br />
1.<br />
<br />
'''Q:''' If I was creating a feature request (not a bug), should I still create a launchpad bug?<br />
<br />
'''A:''' Yes. Launchpad does not distinguish between bugs and feature requests. We identify features by the status "Wishlist".<br />
<br />
<br />
2. <br />
<br />
'''Q:''' How do I link my launchpad bug with the Gerrit change?<br />
<br />
'''A:''' When you put the bug number in your commit message with "Bug 1234567" or "Bug #1234567" then that will be translated into a link to that bug on Launchpad and also automatically update Launchpad to include a link to the review.<br />
<br />
It is recommended to start your commit message with the bug number like so: <br />
<br />
Bug 1234567: Your short commit message here<br />
<br />
Second line of the commit message with more detail<br />
If you have a lot to say, break your commit message<br />
at about 50 characters so nobody needs to scroll<br />
horizontally in order to read your commit message. ;-)<br />
<br />
<br />
3. <br />
<br />
'''Q:''' Do I need to add some tags to launchpad so people will notice it?<br />
<br />
'''A:''' No. That is not necessary. Tags will be added during the triage process. It is enough for you to report the issue. The core team will assign the appropriate status and priority amongst other things.<br />
<br />
<br />
4. <br />
<br />
'''Q:''' How can I request that a "bug" be backported to an older release?<br />
<br />
'''A:''' We decide that for Mahara core. Generally, we only backport high importance bugs. Once a bug fix has passed review (and is merged), you can backport it for your older version of Mahara yourself.<br />
<br />
If you disagree with not backporting a bug fix, you can provide a reason for actually doing so on the Launchpad item.<br />
<br />
<br />
5. <br />
<br />
'''Q:''' What is the typical process for creating a patch?<br />
<br />
'''A:''' <br />
<br />
#. Create the Launchpad bug.<br />
#. Add the patch to Gerrit so you can link it to the bug number.<br />
#. Wait for reply and comment.<br />
#. Fix things up if needed in the code review system.<br />
#. It gets merged.<br />
<br />
6.<br />
<br />
'''Q:''' I'm having trouble with make css. How do I avoid SyntaxError: Use of const in strict mode?<br />
<br />
'''A:''' You need to update your nodejs version.<br />
This can be achieved via<br />
a) Clear NPM's cache:<br />
<br />
sudo npm cache clean -f<br />
<br />
b) Install a little helper called 'n'<br />
<br />
sudo npm install -g n<br />
<br />
c) Install latest stable NodeJS version<br />
<br />
sudo n stable<br />
<br />
<br />
[[Category:Developer Area]]</div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Contributing_Code&diff=12884Developer Area/Contributing Code2022-03-29T21:21:44Z<p>Robertl: /* Preferred method */</p>
<hr />
<div>==If all else fails...==<br />
<br />
Admittedly, it can be a little intimidating for a new developer to go through the process described on this page to submit patches to Mahara. If you can't get this working, or don't want to, feel free to simply attach your patch file directly to a [https://bugs.launchpad.net/mahara/+filebug bug report in Launchpad]. (It's helpful if you can specify the exact version of Mahara your patch applies against.) Or link to a commit on github. Or even paste code directly into the bug report. We welcome all contributions. :)<br />
<br />
From there, another member of the Mahara community can push your contribution into Gerrit, using <tt>git commit --author="Your Name <youremail@example.com>"</tt> to credit you as the author of the change.<br />
<br />
But if you plan on being a regular contributor to Mahara, it's preferable if you can follow the process described below. If you have difficulties, feel free to ask for help on #mahara-dev on irc.freenode.net, or in the [https://mahara.org/interaction/forum/view.php?id=48 Mahara developer forums].<br />
<br />
==Getting ready for using Gerrit==<br />
<br />
The [https://reviews.mahara.org/ Mahara code review system] uses [http://code.google.com/p/gerrit Gerrit], a web-based collaborative tool for code revision. This allows anyone who wish to contribute to submit code and get it added to Mahara core. You do not need commit permission on the main Mahara repository, or to be part of the "Mahara Reviewers" group to send your patchsets through the Gerrit system. Essentially, Gerrit is an intermediate step on the way of the patch between your local workspace and the main Mahara repository. For your local git clone of Mahara, Gerrit is just another remote branch which one can push changes to that will be shown on the Gerrit web interface.<br />
<br />
==== Initial setup ====<br />
<br />
First you'll need to create accounts on Launchpad and reviews.mahara.org, and install some local software. You'll find instructions for that here:<br />
<br />
* [[Developer Area/Developer Tools]].<br />
<br />
====Get a copy of the Mahara source code from git====<br />
<br />
Grab a read-only copy of the [https://github.com/MaharaProject/mahara Mahara repo] from Github:<br />
<br />
cd /path/to/your/web/directory<br />
git clone git@github.com:MaharaProject/mahara.git<br />
<br />
This will create a copy of the Mahara source code at '''/path/to/your/web/directory/mahara'''. For testing purposes, you'll probably want to configure this code so that it actually runs as a copy of Mahara on your local machine. If you need instructions on how to do that, check out [[Developer_Area/Developer_Environment | Setting up your developer environment]].<br />
<br />
====Setting up Gerrit in your local Mahara repository====<br />
<br />
Add the gerrit site as a new remote in your local git repository. (Replace '''username''' with your username on reviews.mahara.org). '''The username is case-sensitive''', which is why we recommend using a lowercase one.<br />
<br />
cd /path/to/your/web/directory/mahara<br />
git remote add gerrit ssh://'''username'''@reviews.mahara.org:29418/mahara<br />
<br />
If you cannot use SSH, do:<br />
<br />
git remote add gerrit https://reviews.mahara.org/mahara<br />
<br />
To test whether this has worked correctly, try this command:<br />
<br />
git fetch gerrit<br />
<br />
You should see git fetch a list of branches. If you don't see that, or you see an error message, check out the [[Developer Area/Contributing Code/Troubleshooting your Gerrit connection|troubleshooting your Gerrit connection]] page.<br />
<br />
If that doesn't work and you get a message mentioning diffie-hellman, add the following lines to your ssh config file in your home directory. We need those due to an older version of SSH still being used for the moment:<br />
<br />
<pre><br />
Host reviews.mahara.org<br />
Hostname 202.78.242.17<br />
Port 29418<br />
KexAlgorithms +diffie-hellman-group1-sha1<br />
</pre><br />
<br />
Next, you will need to add a commit hook to your local git repo, to generate a <tt>Change-Id:</tt> line in your commit messages as required for proper gerrit functioning:<br />
<br />
scp -p -P 29418 '''username'''@reviews.mahara.org:hooks/commit-msg .git/hooks/<br />
<br />
Make this file executable:<br />
<br />
chmod u+x /path/to/your/web/directory/mahara/.git/hooks/commit-msg<br />
<br />
If you wish to have your instance of Mahara to be able to compile the css (version 15.10+) on the checkout of a patchset from Gerrit then you can, from your Mahara base directory, do the following:<br />
<br />
touch .git/hooks/post-checkout && chmod 764 .git/hooks/post-checkout<br />
<br />
Edit the file and add the following, making sure the #!/bin/bash is the first line of the file:<br />
<code><pre><br />
#!/bin/bash<br />
<br />
set -e<br />
<br />
# The three values we get from post-checkout hook<br />
prevHEAD=$1<br />
newHEAD=$2<br />
checkoutType=$3<br />
<br />
[[ $checkoutType == 1 ]] && checkoutType='branch' || checkoutType='file' ;<br />
<br />
newHEADcheck=$(git name-rev --name-only $newHEAD)<br />
branch=$newHEADcheck<br />
if [ $newHEADcheck = 'undefined' ]; then<br />
# see if we can find out what the branch we will be merging the patch to <br />
maharaBranch=$(curl -s https://reviews.mahara.org/changes/?q=$newHEAD | grep branch)<br />
<br />
regex=': "(.*?)"'<br />
if [[ $maharaBranch =~ $regex ]]; then<br />
branch=${BASH_REMATCH[1]}<br />
fi<br />
<br />
if [ "$branch" = "main" ]; then<br />
# get git root directory<br />
gitRoot=$(git rev-parse --show-toplevel)<br />
cd $gitRoot<br />
printf '\npost-checkout hook\n'<br />
make clean-css<br />
make css<br />
fi<br />
fi<br />
</pre></code><br />
So now when you checkout a gerrit patch that is on main branch it should compile the css.<br />
<br />
== Preparing / organising your changes ==<br />
<br />
Some basic guidelines:<br />
<br />
* '''One patchset per logical change'''<br />
** If you've fixed three or four bugs in entirely different parts of the system, sending them together as one patchset makes it harder to review, manage, and merge them. For instance, if it turns out that one of the three fixes is incorrect, while the other two are ready to merge, or if only one fix needs to be back-ported to previous versions of Mahara.<br />
* '''Include technical details with each change'''<br />
** You should briefly describe what the change intends to do. The ''worst'' possible description you could use is "fixed bug", or possibly "rawr". What we want to see is enough detail about what was wrong, and if not obvious from the patch, why you fixed the problem the way you did. If your description starts getting too long (more than a paragraph), it's probably a sign that you should split up your patches.<br />
* '''Group related patches together into topics'''<br />
** If you are developing a larger feature as a series of related patches, group them together into a topic (see the section below on how to do this in gerrit). A topic is especially important if the first few patches in the series don't really achieve anything on their own. A reviewer will be able to make sense of an earlier patch by looking forward to later ones within the same topic. The commit message of the earlier patch should explain the plan, and the whole series of patches should be submitted at the same time.<br />
* '''Apply new patch on top of clean checked-out branch'''<br />
** Every new patch should be applied on top of the clean checked-out branch to avoid adding dependencies in error.<br />
* '''Consider the reviewer'''<br />
** Following the guidelines above should help to make your patches easier for the reviewer to read and understand. But also try to remember that the person reviewing your code would probably rather be doing something else, like writing their own code. They don't want to have to review your patch twice, so don't submit patches until they're well-tested, and until you're absolutely sure the code is correct.<br />
* '''Make sure your changes "blend in" with the surrounding code'''<br />
** By that, we mean make sure you're using four spaces for indentation, the same bracing style the surrounding code uses for if {} etc. Make sure your changes are internationalised using our translation system, and that you throw exceptions the same way the existing code does when errors occur. If your code isn't too much different, we'll probably help you out by fixing it up. But if you're using tabs, weird bracing styles and your own functions for database access, your code is sure to be rejected.<br />
* '''Make sure that the new code follows our [[Developer Area/Coding guidelines|coding guidelines]]'''<br />
<br />
Here are some additional articles you might be interested in reading:<br />
<br />
* [http://feeding.cloud.geek.nz/2009/06/writing-perfect-patch.html Writing good patches]<br />
* [http://feeding.cloud.geek.nz/2009/07/3-ways-to-improve-your-source-control.html Keeping source code history clean]<br />
* [http://wiki.postgresql.org/wiki/Creating_Clean_Patches Creating Clean Patches]<br />
<br />
== Submitting commits for review ==<br />
<br />
=== Preferred method ===<br />
<br />
This is the '''preferred method''' of pushing things to Gerrit, but you should understand what it does by reading the [[Developer_Area/Contributing_Code#Manual_method|manual method]] as well. <br />
<br />
Note: To use this, you will need to install '''xmllint'''. On debian/ubuntu based systems, this is in '''libxml2-utils'''. <br />
<br />
To push your change, simply type this in the root directory of your feature/bugfix branch, eg the parent directory of the htdocs/ directory:<br />
<br />
make push<br />
<br />
or if you want to add a Gerrit tag:<br />
<br />
make push TAG=topic_for_this_change<br />
<br />
Note: You only need to do the topic tag once.<br />
<br />
If what you are working on is not finished but you want to save / show your workings to others you can push the patch as 'Work in progress' via:<br />
<br />
make wip<br />
<br />
or<br />
<br />
make wip TAG=topic_for_this_change<br />
<br />
This will run a few initial sanity checks and either push your changes to Gerrit or will return warnings about coding problems that you will need to fix ([https://wiki.mahara.org/index.php/Developer_Area/Contributing_Code#Making_changes_in_existing_commits see below]).<br />
<br />
'''Note:''' Setting the topic is encouraged for patches that contain new functionality so that they can be spotted more easily as someone from the core team needs to do the front-end verification. A tester's OK would not be enough as they may only test that it works, but not review the implementation itself. The topic tag should include "(feature)".<br />
<br />
Once a patch is pushed to Gerrit it is run through a host of automated tests and (after a short while) will update the Gerrit review with a pass or fail in the automated Tests (AT) column.<br />
<br />
If your patch fails the automated tests you can follow the link provided in the comments section to find out why your patch failed to help debug and fix the issues ([https://wiki.mahara.org/index.php/Developer_Area/Contributing_Code#Making_changes_in_existing_commits see below]).<br />
<br />
====Apple Mac Computers====<br />
Apple Mac Devices may have an extra requirement to update the libraries in use. This is especially important if encountering these error messages when running "make push":<br />
<br />
xargs: illegal option -- -<br />
<br />
sed: illegal option -- r <br />
<br />
On an Apple Mac device, the version of "xargs" and "sed" is different and you may see the above errors even if these libraries are already installed.<br />
To resolve these issues, install gnu-sed and findutils using the "--with-default-names" option to line them up to the expected Linux counterparts.<br />
<br />
Install Homebrew<br />
<br />
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"<br />
<br />
Install required libraries of xmllint, sed, and xargs<br />
<br />
brew install xmlstarlet --with-default-names<br />
<br />
brew install gnu-sed --with-default-names<br />
<br />
brew install findutils --with-default-names<br />
<br />
Tips:<br />
<br />
Update Git to use the correct email address associated with Gerrit Before making any changes by using the command below with the Gerrit email in use:<br />
<br />
git config user.email "email@example.com"<br />
<br />
Be careful if using "sudo" (superuser do) for commands when pushing to Gerrit on an Apple Mac device. The SSH keys are user based, and the sudo command may end up using a different set of SSH keys, resulting in the push being rejected.<br />
<br />
=== Manual method ===<br />
<br />
In order to push your changes for review, just push into the project's magical <tt>refs/publish/'''remote_branchname'''</tt> ref. If you are pushing to the remote main branch and your current local branch is ''bug123456'', your command will be:<br />
<br />
git push gerrit HEAD:refs/publish/'''main'''<br />
<br />
Once you pushed, your change will be available for review on the [https://reviews.mahara.org/ Mahara code review system]. The single change will be created on review system for each commit you pushed. If you push several commits, gerrit will add dependencies between changes based on the git parent ref.<br />
<br />
You may also push a single commit, simply use its hash:<br />
<br />
git push gerrit '''38f4f96df''':refs/publish/main<br />
<br />
If you like, you may specify the topic tag that will be shown in your change details on review system. This tag may be associated with a group of changes if you use it for several commits. To do that, simply append it to the destination ref, e.g.<br />
<br />
git push gerrit HEAD:refs/publish/main/'''topic_for_this_change'''<br />
<br />
'''Note:''' Setting the topic is encouraged for patches that contain new functionality so that they can be spotted more easily as someone from the core team needs to do the front-end verification. A tester's OK would not be enough as they may only test that it works, but not review the implementation itself. The topic tag should include "(feature)".<br />
<br />
== Security patches ==<br />
<br />
For patches for security issues, use:<br />
<br />
make security<br />
<br />
This will submit your patch into gerrit as a "Draft" submission, which will be only visible to you and to people in gerrit's "Security" group. The downside to this is that the code review system doesn't work automatically for Draft submissions, so verifications and review have to be made as freetext comments, rather than +/-.<br />
<br />
== Git for Newbs ==<br />
<br />
If you're new to git, here is a cheat sheet of some of the operations you'll likely need to do.<br />
<br />
=== Creating a new branch for your change ===<br />
<br />
We strongly recommend you create one git branch per change you want to submit. First, make sure you have checked out the "main" branch, and that it is up to date and clean of any changes:<br />
<br />
git checkout main -f<br />
git reset --hard origin/main<br />
git pull<br />
<br />
Then create the new branch. It is useful to give it a meaningful name like a Launchpad bug number.<br />
<br />
git checkout -b bug123456<br />
<br />
Make the changes you want. When you're done, you'll need to group them into a git commit and push that commit to gerrit. First, check what changes you have in your local workspace:<br />
<br />
git status<br />
<br />
Next, add any new files that you have added which are not yet tracked by git. You will need to add them by name, for example:<br />
<br />
git add htdocs/view/my_new_view_file.php<br />
<br />
Then, you can commit the modified/deleted files with:<br />
<br />
git commit -a<br />
<br />
Or if you want to choose interactively which bits of code to add:<br />
<br />
git add -p<br />
git commit<br />
<br />
And finally, use this branch when you push to the code review system ([https://wiki.mahara.org/index.php/Developer_Area/Contributing_Code#Submitting_commits_for_review see below]).<br />
<br />
=== Making changes in existing commits ===<br />
<br />
It's best to check out the commit from Gerrit itself. There will be a link under the download section with "checkout" highlighted - to copy/paste, eg:<br />
<br />
git fetch https://reviews.mahara.org/mahara refs/changes/57/1234/1 && git checkout FETCH_HEAD<br />
<br />
Make the changes that you need and add them ready for committing<br />
<br />
git add -p<br />
<br />
Then commit these new changes to the same commit message as before:<br />
<br />
git commit --amend<br />
<br />
Another option is commit squashing, below.<br />
<br />
When your commit has been reviewed, you may require to make some changes before it will be accepted. The changes you will be doing should be [http://book.git-scm.com/4_interactive_rebasing.html squashed] into the same commit you originally pushed for review. You must ensure that the <tt>Change-Id:</tt> line is preserved the same as in the original commit. This will make Gerrit matching this commit to the original one and appending your changes as a new patchset. The simplest workflow would be:<br />
# Checkout the branch where your original changes are (see above)<br />
# Make the required changes<br />
# Commit the changes<br />
#* The commit message does not matter as it will be removed when the commit is squashed, so random text here is fine.<br />
# Use [http://book.git-scm.com/4_interactive_rebasing.html interactive rebasing] to squash the latest commit into the previous commit.<br />
#* An example command for this would be: <tt>git rebase -i HEAD~2</tt><br />
#* Find the latest commit in the list (it should be the bottom-most commit) and replace the word 'pick' with 'f'. This is short for 'fixup', which will squash the commit into the one before it, and discard the commit message. (This is what we want.) You may also use 's' in which case you will be offered to amend the commit message before squashing (ensure that you leave <tt>Change-Id:</tt> of the commit you are squashing onto).<br />
Now you may push the amended commit to review system the most convenient way:<br />
<br />
git push gerrit HEAD:refs/publish/main<br />
<br />
or<br />
<br />
make push<br />
<br />
In the Gerrit interface it will appear under the same change as a separate patchset ready for another review.<br />
<br />
=== Ordering commits ===<br />
<br />
If you have pushed some commits to Gerrit but then discover that one of your commits is dependent on another you can adjust the hierarchy of your commits like this.<br />
<br />
Checkout the commit that you want to come first/be the parent by getting the checkout code from the review, eg: <br />
<br />
git fetch https://reviews.mahara.org/mahara refs/changes/49/1234/1 && git checkout FETCH_HEAD<br />
<br />
Then cherry-pick the second/child commit by selecting 'cherry-pick' before copying the link, eg:<br />
<br />
git fetch https://reviews.mahara.org/mahara refs/changes/50/2345/1 && git cherry-pick FETCH_HEAD<br />
<br />
If the child commit merge throws an error, ie you should see lines like: <br />
hint: after resolving the conflicts, mark the corrected paths<br />
hint: with 'git add <paths>' or 'git rm <paths>'<br />
hint: and commit the result with 'git commit'<br />
<br />
you will need to fix up the merge conflicts - first go:<br />
<br />
git status<br />
<br />
to see which files are causing the merge problems. you should see something like 'Changes to be committed:' listing the files that will merge fine, and 'Unmerged paths:' listing files that will need to be fixed.<br />
<br />
Edit the files that need to be fixed and you should see in them some new lines added beginning with <<<<<<< HEAD then some code (part 1), then ======= then some other code (part 2), then >>>>>>> followed by commit id and commit title<br />
<br />
What you need to do is to work out which bits of code to keep from part 1 and edit part 2 to suit (or visa versa) delete the <<<<<<<, =======, >>>>>>> lines and any code not needd once you are done.<br />
<br />
Save the file and then add the resolved file to the commit by adding the full file directly, eg:<br />
<br />
git add /name/of/file.php<br />
<br />
once all the Unmerged paths files are fixed and added then go:<br />
<br />
git commit<br />
make push<br />
<br />
If the child commit has merged cleanly onto the parent one you can then push it back to Gerrit<br />
<br />
make push<br />
<br />
And now in Gerrit you will see under the dependencies section that the child patch has a new patchset and that patchset depends on the parent patch/commit.<br />
<br />
=== Committing in some easy condensed steps ===<br />
<br />
==== First commit ====<br />
<br />
1. Make sure you are on the latest main.<br />
<br />
git checkout main<br />
git pull<br />
<br />
2. Make changes to the file(s) that you want to fix in your favorite editor.<br />
<br />
3. Check which files you have changed.<br />
<br />
git status<br />
<br />
4. Review your changes by comparing them to the original content of the file.<br />
<br />
git diff<br />
<br />
5. Double-check on which branch you are. You should be on "main".<br />
<br />
git branch<br />
<br />
6. Create a new branch which contains the changed files. You can give the branch any name you like as long as you remember what you changed on it. Using the bug number in the branch name is easy to identify it.<br />
<br />
git checkout -b bug[bug number]<br />
<br />
7. Double-check that you are now on that new branch and that you still see the changed files.<br />
<br />
git branch<br />
git status<br />
<br />
8. Commit your changes to git. Please read [http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html how to write good commit messages]. Ideally, the Launchpad bug number appears in the first line of the commit so that it appears in the changelog. If the first line would get too long, put the bug number in the second or last line. It will then be linked back to Launchpad and your patch will be associated to the bug correctly. The "-a" means that all files that have changed will be taken into consideration.<br />
<br />
git commit -a<br />
<br />
9. Check your local git log that you committed your change and that the commit message doesn't contain any errors. You can make changes to your commit message if necessary with "git --amend".<br />
git log<br />
<br />
10. Push your changes to the review system. Make a note of the URL under which your patch is available for review. You will also see it appear on your Gerrit dashboard.<br />
<br />
make push<br />
<br />
==== Re-submit a patch ====<br />
<br />
You may have to make changes to a patch that you submitted based on feedback you receive from the reviewers.<br />
<br />
1. Make sure that you are on the branch in which you fixed the bug. If necessary, switch to it with git checkout.<br />
<br />
git branch<br />
git checkout bug[bugnumber]<br />
<br />
2. Make the necessary changes.<br />
<br />
3. Check which files you have changed.<br />
<br />
git status<br />
<br />
4. Review your changes by comparing them to the original content of the file.<br />
<br />
git diff<br />
<br />
5. Add the file(s) to the commit.<br />
<br />
git add [filename] OR<br />
git add . (adds all files that have changed)<br />
<br />
6. Open the commit message and make changes if necessary. Then save the file. The command given here is for vim.<br />
<br />
git commit --amend<br />
[in vim] :wq<br />
<br />
7. Review that your changes to the commit message made it into the log.<br />
<br />
git log<br />
<br />
8. Push your changes to the review system<br />
<br />
make push<br />
<br />
== Useful links ==<br />
<br />
* [https://reviews.mahara.org/Documentation/index.html Gerrit official documentation] <br />
* [http://www.itk.org/Wiki/ITK/Gerrit/ReviewPrimer Gerrit Review Primer] - useful for getting familiar with review interface.<br />
<br />
== FAQ ==<br />
<br />
Or rather: Questions a couple of people asked that many others might have. :-)<br />
<br />
1.<br />
<br />
'''Q:''' If I was creating a feature request (not a bug), should I still create a launchpad bug?<br />
<br />
'''A:''' Yes. Launchpad does not distinguish between bugs and feature requests. We identify features by the status "Wishlist".<br />
<br />
<br />
2. <br />
<br />
'''Q:''' How do I link my launchpad bug with the Gerrit change?<br />
<br />
'''A:''' When you put the bug number in your commit message with "Bug 1234567" or "Bug #1234567" then that will be translated into a link to that bug on Launchpad and also automatically update Launchpad to include a link to the review.<br />
<br />
It is recommended to start your commit message with the bug number like so: <br />
<br />
Bug 1234567: Your short commit message here<br />
<br />
Second line of the commit message with more detail<br />
If you have a lot to say, break your commit message<br />
at about 50 characters so nobody needs to scroll<br />
horizontally in order to read your commit message. ;-)<br />
<br />
<br />
3. <br />
<br />
'''Q:''' Do I need to add some tags to launchpad so people will notice it?<br />
<br />
'''A:''' No. That is not necessary. Tags will be added during the triage process. It is enough for you to report the issue. The core team will assign the appropriate status and priority amongst other things.<br />
<br />
<br />
4. <br />
<br />
'''Q:''' How can I request that a "bug" be backported to an older release?<br />
<br />
'''A:''' We decide that for Mahara core. Generally, we only backport high importance bugs. Once a bug fix has passed review (and is merged), you can backport it for your older version of Mahara yourself.<br />
<br />
If you disagree with not backporting a bug fix, you can provide a reason for actually doing so on the Launchpad item.<br />
<br />
<br />
5. <br />
<br />
'''Q:''' What is the typical process for creating a patch?<br />
<br />
'''A:''' <br />
<br />
#. Create the Launchpad bug.<br />
#. Add the patch to Gerrit so you can link it to the bug number.<br />
#. Wait for reply and comment.<br />
#. Fix things up if needed in the code review system.<br />
#. It gets merged.<br />
<br />
6.<br />
<br />
'''Q:''' I'm having trouble with make css. How do I avoid SyntaxError: Use of const in strict mode?<br />
<br />
'''A:''' You need to update your nodejs version.<br />
This can be achieved via<br />
a) Clear NPM's cache:<br />
<br />
sudo npm cache clean -f<br />
<br />
b) Install a little helper called 'n'<br />
<br />
sudo npm install -g n<br />
<br />
c) Install latest stable NodeJS version<br />
<br />
sudo n stable<br />
<br />
<br />
[[Category:Developer Area]]</div>Robertlhttps://wiki.mahara.org/index.php?title=Developer_Area/Plugins/Third_party&diff=12814Developer Area/Plugins/Third party2022-03-09T21:32:20Z<p>Robertl: </p>
<hr />
<div>A list of the third party plugins within Mahara.<br />
<br />
A helpful way to update this list is to go:<br />
find ./htdocs -type f -iname "README.Mahara" -exec grep 'Version' -B1 {} \; -print<br />
on the current codebase.<br />
<br />
Note: another thing to keep in sync is the country names we use for 'Country' dropdowns. To check what the current state of play is<br />
perl -MLocale::Country -le 'print join("\n", sort map { country2code($_) . " => " . country2code($_, LOCALE_CODE_ALPHA_3) . ", // " . $_ } all_country_names())'<br />
and check the results against htdocs/lib/country.php and htdocs/lang/en.utf8/mahara.php files<br />
For any confusion you can also check against https://www.iso.org<br />
<br />
====Legend====<br />
<br />
*'''PHP8''' = is the latest version of this plugin compatible with PHP8?<br />
*'''Upgrades''' = what upgrades are available for this plugin?<br />
*'''Security''' = is there a new security patch available?<br />
*'''22.04''' column: Yes = will need to be updated for this version<br />
*[https://nodejs.dev/learn/semantic-versioning-using-npm SemVer Info] - explaining the symbols in the Mahara version column<br />
*Inactive: Maintained but not actively making releases<br />
*Deprecated: All maintainers have left and site may not exist in extreme cases.<br />
*🚧: In progress/there is a working patch in gerrit<br />
<br />
{| class="wikitable sortable" style="vertical-align:middle;"<br />
|- style="font-weight:bold; text-align:center;"<br />
!'''Name'''<br />
!'''Mahara <br />version'''<br />
!'''Latest<br />version<br />'''<br />
!'''22.04'''<br />
!'''PHP8'''<br />
!'''Upgrades'''<br />
!'''Support'''<br />
!'''Security'''<br />
!'''Notes'''<br />
!'''README.Mahara <br />(./htdocs/...)'''<br />
!'''URL'''<br />
!'''License'''<br />
|-<br />
| style="font-weight:bold;" |ADODB<br />
|5.22.0<br />
|5.22.0<br />
|Done✅<br />
|Yes 8.1<br />
| style="color:#333;" |Security - 5.21.4<br />- pgsql: authentication bypass in connect <br />functions (CVE-2021-3850)<br />
|End 5.20.20<br />
|Yes<br />
|News: https://twitter.com/ADOdb_announce first.<br />Wishlist: [https://bugs.launchpad.net/mahara/+bug/1945264 extract our $SESSION]<br />php 8.0 ready.<br />
|.../lib/adodb/<br />
| - https://adodb.org/dokuwiki/doku.php<br />- https://github.com/ADOdb/ADOdb<br />
|BSD 3-Clause<br />LGPL<br />
|-<br />
| style="font-weight:bold;" |Bootstrap<br />
|~4.6.0<br />
|5.1.3<br />
|<br />
|n/a<br />
|Major e.g. 5.1.2 Updated JS Sanitizer to add <br />sms in the SAFE_URL_PATTERN<br />
|Ends 4.x (LTS) <br />- 01 Nov 2022<br />
|<br />
|<br />
|.../lib/bootstrap/assets/javascripts/<br /><br />
| - https://getbootstrap.com/<br />- https://github.com/twbs/release<br />
|MIT License<br />
|-<br />
| style="font-weight:bold;" |Bootstrap <br />Datetimepicker<br />
|=4.17.47<br />
|4.17.49<br /><br /><br />
|<br />
|n/a<br />
|Has pivoted to no longer require Bootstrap<br />v6.0.0-beta2https://github.com/Eonasdan/tempus-dominus<br /><br />
|v4 not maintained<br />v5/6 active<br /><br />
|<br />
|v4 runs using bootstrap and moment.js<br />
|.../js/bootstrap-datetimepicker/<br />
|https://getdatepicker.com/<br />https://github.com/tempusdominus/<br />bootstrap-4<br />
|MIT License<br />
|-<br />
| style="font-weight:bold;" |Chart.js<br />
|3.7.1<br />
|3.7.1<br />
|Done✅<br />
|n/a<br />
|<br />
|<br />
|<br />
|<br />
|.../js/chartjs/<br />
|http://www.chartjs.org<br />
|MIT License<br />
|-<br />
| style="font-weight:bold;" |Clipboard js<br />
|^2.0.8<br />
|2.0.10<br />
|Yes 🚧<br />
|n/a<br />
|Patch fix<br />
|Active<br />
|<br />
|<br />
|.../js/clipboard/<br />
|https://clipboardjs.com/<br />
|MIT License<br />
|-<br />
| style="font-weight:bold;" |Cookie <br />consent<br />
|=3.1.1<br />
|4.0<br />
|<br />
|n/a<br />
|None<br />
|New updates are<br />proprietary.<br />
|<br />
|Site talks about versions 2021.6 and 2021.2.3 <br />which are not available on GitHub.<br />💡Check if we should keep using this - licences.<br />
|.../js/cookieconsent/<br />
| - https://www.osano.com/cookieconsent<br />- https://github.com/osano/cookieconsent<br /><br />
|MIT License<br />
|-<br />
| style="font-weight:bold;" |CSS Tidy<br />
|~1.7.3<br />
|2.0.1<br />
|Yes 🚧<br />
|Yes<br />
|2.0.1 released 22 Feb 2022<br />PHP8 compatible<br />
|<br />
|<br />
|<br />
|.../lib/csstidy/<br />
|https://github.com/Cerdic/CSSTidy<br />
|LGPL<br />
|-<br />
| style="font-weight:bold;" |Dragon-drop<br />
|^3.2.1<br />
|3.2.1<br />
|<br />
|n/a<br />
|None<br />Pre-release minor <br />changelog not available.<br />
|Active<br />
|<br />
|3.6.1 in the making but in pre-release stages.<br />
|..../js/dragondrop/<br />
|https://github.com/schne324/dragon-drop<br />
|MIT License<br />
|-<br />
| style="font-weight:bold;" |Datatables<br />
|^1.10.20<br />
|1.11.4<br />
|Yes 🚧<br />
|n/a<br />
|Patch fix<br />
|Active<br /><br />
|<br />
|<br />
|.../js/DataTables/<br />
|https://datatables.net/<br />https://datatables.net/download/index<br /><br />
|MIT License<br />
|-<br />
| style="font-weight:bold;" |Dropzone<br />
|^5.7.6<br />
|5.9.3<br />
|Yes 🚧<br />
|n/a<br />
|Minor<br />
|Active<br />
|<br />
|6.0.0 in beta<br />
|.../js/dropzone/<br />
|https://github.com/dropzone/dropzone/releases<br />
|MIT License<br />
|-<br />
| style="font-weight:bold;" |Dwoo<br />
|=1.3.7<br />
|1.3.7<br />
|<br />
|No<br />
|Replace<br />
|Deprecated<br /><br />
|<br />
|<br />
|.../lib/dwoo/<br />
|http://dwoo.org/<br />https://github.com/dwoo-project/dwoo<br />
|LGPL<br />
|-<br />
| style="font-weight:bold;" |Elastic Search<br />
| style="color:#333;" |>6.1.0<br />
|7.17.0<br />
|<br />
|No<br />
|WIP - Gold<br />
|Active<br /><br />
|<br />
|PHP 8 has a [https://github.com/elastic/elasticsearch-php/milestone/6 milestone].<br />
|.../lib/elasticsearch/<br />
|https://github.com/elastic/elasticsearch-php<br />
|Apache v2.0 <br />LGPL v2.1<br />
|-<br />
| style="font-weight:bold;" |fancybox3<br />
|3.5.7<br />
|4.0.26<br />
|<br />
|n/a<br />
|Removed from Mahara 11/2021<br />
|Inactive<br />- v3 deprecated<br />- v4 in beta stage<br />
|<br />
|Only exists in branch versions 20.10, 21.04, 21.10<br />Only backport security fixes<br />
|.../js/fancybox/<br />
|https://github.com/fancyapps/ui - in BETA stage<br />https://fancyapps.com/docs/ui/installation<br />https://fancyapps.com/next/<br />Notifications: https://twitter.com/thefancyapps<br />
|CC BY-SA 4.0<br />
|-<br />
| style="font-weight:bold;" |gridstack<br />
|>0.6.4<br />
|5.0.0<br />
|<br />
|n/a<br />
|WIP - Robert<br /><br />
|Active<br />
|<br />
|https://gridstackjs.com<br />
|.../js/gridstack/<br />
|https://github.com/gridstack/gridstack.js<br />
|MIT License<br />
|-<br />
| style="font-weight:bold;" |HTML Purifier<br />
|=4.13.0<br />
|4.14.0<br />
|Yes🚧<br />
|Yes<br />
|None<br />
|<br />
|4.14 includes PHP8 support<br />
|https://github.com/ezyang/htmlpurifier/<br />
|.../lib/htmlpurifier/<br />
|http://www.htmlpurifier.org/<br />
|LGPL v2.1+<br />
|-<br />
| style="font-weight:bold;" |Javascript <br />templates<br />
|=3.19.0<br />
|3.20.0<br />
|Yes 🚧<br />
|n/a<br />
|None<br />
|Inactive, 2020<br />
|<br />
|<br />
|.../js/javascript-templates/<br />
|https://github.com/blueimp/<br />[https://github.com/blueimp/JavaScript-Templates JavaScript-Templates]<br />
|MIT License<br />
|-<br />
| style="font-weight:bold;" |jQuery<br />
|^3.6.0<br />
|3.6.0<br />
|<br />
|n/a<br />
|Minor<br />
|Active<br />
|<br />
|https://blog.jquery.com/2021/03/02/<br />jquery-3-6-0-released/<br />News: - QA: https://forum.jquery.com/<br />Twitter: https://twitter.com/jquery<br />
|.../js/jquery/<br />
|http://jquery.com/<br />https://github.com/jquery/jquery<br />
|MIT License<br />
|-<br />
| style="font-weight:bold;" |jQuery mobile<br />
|=1.5.0-alpha.1<br />
|1.5.0-rc1<br />
|<br />
|n/a<br />
|None<br />
|Inactive, 2017<br />
|<br />
|https://blog.jquerymobile.com <br />- lack of resources but wish to maintain.<br />❗Find out if we are still using this.<br />
|.../js/jquery/jquery-mobile/<br />
|http://jquerymobile.com<br />
|MIT License<br />
|-<br />
| style="font-weight:bold;" |jQuery UI<br />
|1.13.1<br />
|1.13.1<br />
|Done✅<br />
|n/a<br />
|In maintenance state<br />Only security and compatibility fixes<br />
|<br />
|<br />
|https://blog.jqueryui.com/2022/01/jquery-ui-1-13-1-released/<br />
|.../js/jquery/jquery-ui/<br />
|http://jqueryui.com/<br />
|MIT License<br />
|-<br />
| style="font-weight:bold;" |jQuery UI plugin <br />touch-punch<br />
|=0.2.3<br />
|0.2.3<br />
|<br />
|n/a<br />
|None<br />
|Deprecated<br />
|<br />
|❗Do we still need it - is it merged into jquery<br />
|.../js/jquery/jquery-ui/<br />jquery-ui-touch-punch.min.js<br />
|http://touchpunch.furf.com/<br />https://github.com/furf/jquery-ui-touch-punch<br />
|MIT or GPL <br />Version 2 licenses<br />
|-<br />
| style="font-weight:bold;" |JS Color<br />
|2.4.7<br />
|2.4.7<br />
|Done✅<br />
|n/a<br />
|None<br />
|Active<br />
|<br />
|<br />
|.../js/jscolor/<br />
|http://jscolor.com/<br />
|GPL 3<br />
|-<br />
| style="font-weight:bold;" |Json editor<br />
|>=1.3.5<br />
|2.6.1<br />
|Yes 🚧<br />
|n/a<br />
|Major 2.x<br />
|Active<br />
|<br />
|Leave for for 22.04<br />
|.../js/jsoneditor/<br />
|https://github.com/json-editor/json-editor<br />
|MIT License<br />
|-<br />
| style="font-weight:bold;" |jTLine<br />
|=1.0<br />
|1.0<br />
|<br />
|n/a<br />
|None<br />
|Inactive, 2018<br />
|<br />
|https://twitter.com/naadydev<br />
|.../js/jTLine/<br />
|https://naadydev.github.io/jTLine/<br />
|MIT License<br />
|-<br />
| style="font-weight:bold;" |Lodash<br />
| style="color:#333;" |^4.17.15<br />
|4.17.21<br />
|<br />
|n/a<br />
|Patch fix<br />
|Active<br />
|<br />
| - Lodash was brought in with gridstack v0.5.0 <br />- Will be removed when gridstack 4+ gets merged.<br />
|.../js/lodash/<br />
|https://github.com/lodash/lodash<br />
|MIT License<br />
|-<br />
| style="font-weight:bold;" |Marked<br />
|^2.1.3<br />
|4.0.12<br />
|Yes 🚧<br />
|n/a<br />
|Minor - v2.1.1, v2.1.2, v2.1.3<br />Major 3.x - breaking changes<br />4.0.0 Major security fixes<br />
|Active<br />
|Yes<br />
|<br />
|.../js/marked/<br />
|https://github.com/markedjs/marked<br />
|MIT License<br />
|-<br />
| style="font-weight:bold;" |Masonry<br />
|=4.2.2<br />
|4.2.2<br />
|<br />
|n/a<br />
|None<br />
|Inactive, 2018<br />
|<br />
|<br />
|.../js/masonry/<br />
|https://masonry.desandro.com/<br />https://github.com/desandro/masonry<br />
|MIT License<br />
|-<br />
| style="font-weight:bold;" |TinyMCE<br />Mathslate<br />
|1.1<br />
|1.1<br />
|Done✅<br />
|n/a<br />
|None<br />
|Forked version, 2015<br />
|<br />
|Our version is now forked to keep <br />make it work with Tinymce 5<br />
|.../js/tinymce/plugins/mathslate/<br />
|https://github.com/dthies/tinymce4-mathslate<br />
|GPL 3<br />
|-<br />
| style="font-weight:bold;" |Moment.js<br />
|^2.29.1<br />
|2.29.1<br />
|<br />
|n/a<br />
|None<br />
|Inactive, 2020<br />
|<br />
|Connected with jquery date-picker<br />
|.../js/momentjs/<br />
|http://momentjs.com/<br />
|MIT License<br />
|-<br />
| style="font-weight:bold;" |Oauth PHP<br />
|=175<br />
|175<br />
|<br />
|No<br />
|Replace<br />
|Archived, 2010<br />
|<br />
|We should replace with an oauth2 php library <br />https://oauth.net/code/php<br />checkout what Moodle does (old comment)<br />
|.../webservice/libs/oauth-php/<br />
|https://code.google.com/archive/p/oauth-php/<br />
|MIT License<br />
|-<br />
| style="font-weight:bold;" |PDFjs<br />
|^2.9.359<br />
|2.12.313<br /><br />
|Yes 🚧<br />
|n/a<br />
|Minor<br />
|Active<br />
|<br />
|<br />
|.../artefact/file/blocktype/pdf/js/pdfjs/<br />
|http://mozilla.github.io/pdf.js/<br />getting_started/#download<br />https://github.com/mozilla/pdf.js<br />
|Apache License 2<br />
|-<br />
| style="font-weight:bold;" |PHPMailer<br />
|^6.5.1<br />
|6.5.4<br />
|Yes<br />
|Yes<br />
|Minor 6.5.0 - security release<br />Minor 6.5.1 - maintenance release<br />PHP8 support<br />
|Active<br /><br />
|Yes<br />
|<br />
|.../lib/phpmailer/<br />
|https://github.com/PHPMailer/PHPMailer<br />
|LGPL<br />
|-<br />
| style="font-weight:bold;" |Popper<br />
|^1.16.1 LTS<br />
|2.11.2<br />
|Yes<br />
|n/a<br />
|(Bootstrap 5 supports v2.x)<br />Major 2.x - breaking 2020 - 2.9.3<br />(bootstrap4) - Minor 1.16.1, Mar 2020 <br />Popper is now floating-ui, built ontop of popper, <br />different releases for core/react-native/react-dom<br />
|Active v2<br />LTS 1.16.1 <br />w/o warnings<br />
|<br />
|https://dev.to/fezvrasta/smarter-tooltips-and<br />-popovers-with-popper-2-44bh<br /><br />
|.../lib/popper/<br />
|https://popper.js.org/<br />
|MIT License<br />
|-<br />
| style="font-weight:bold;" |ReCaptcha<br />
|^1.2.4<br />
|1.2.4<br />
|<br />
|In progress<br />
|Patch<br />
|Active<br />
|<br />
|This client supports both v2 and v3.<br />https://github.com/google/recaptcha/tree/php8-support<br />
|.../lib/recaptcha/<br />
|https://github.com/google/recaptcha<br />
|BSD-3<br />
|-<br />
| style="font-weight:bold;" |simplesamlphp<br />
|^1.18.7<br />
|1.19.5<br />
|Yes<br />
|Yes 8.1<br />
|<br />
|Active<br />
|<br />
|/htdocs/auth/saml/extlib/ <br />- Make a README.Mahara file<br />PHP 8 coming in v2.x. [https://github.com/simplesamlphp/simplesamlphp/issues/1521#issuecomment-917600539 Sounds like it should work on 1.19.1 though].<br />
|../auth/saml/extlib/simplesamlphp/<br />
|https://github.com/simplesamlphp/<br />[https://github.com/simplesamlphp/simplesamlphp simplesamlphp]<br />
|GPL 2.1<br />
|-<br />
| style="font-weight:bold;" |Select2<br />
|^4.0.13<br />
|4.0.13<br />
|<br />
|n/a<br />
|Patch<br />
|Active<br />
|<br />
|<br />
|.../js/select2/<br />
|https://select2.org/<br />
|MIT License<br />
|-<br />
| style="font-weight:bold;" |Aurulent Sans <br />(font)<br />
|^2007.05.04<br />
|2007.05.04<br />
|<br />
|n/a<br />
|None<br />
|Unknown<br />
|<br />
|<br />
|.../lib/fonts/<br />
|http://www.fontsquirrel.com/fonts/<br />Aurulent-Sans<br />
|SIL OFL v1.10<br />
|-<br />
| style="font-weight:bold;" |Deja Vu Sans <br />(font)<br />
|^2.37<br />
|2.37<br />
|<br />
|n/a<br />
|Patch<br />
|Unknown<br />
|<br />
|<br />
|.../lib/fonts/<br />
|http://www.fontsquirrel.com/fonts/<br />DejaVu-Sans<br />
|DejaVu Fonts <br />License v1.00<br />
|-<br />
| style="font-weight:bold;" |Open Sans <br />(font)<br />
|^1.10<br />
|1.10<br />
|<br />
|n/a<br />
|None<br />
|Unknown<br />
|<br />
|<br />
|.../theme/raw/fonts/<br />
|https://www.google.com/fonts/<br />specimen/Open+Sans<br />
|Apache License <br />version 2.0<br />
|-<br />
| style="font-weight:bold;" |Roboto Slab <br />(font)<br />
|^1.9<br />
|1.100263<br />
|<br />
|n/a<br />
|Minor<br />
|Unknown<br />
|<br />
|<br />
|.../theme/raw/fonts/<br />
|https://www.google.com/fonts/<br />specimen/Roboto+Slab<br />
|MIT License<br />
|-<br />
| style="font-weight:bold;" |Fontawesome<br />
|^5.8.1<br />
|6.0.0<br />
|Yes 🚧<br />
|n/a<br />
|Minor<br />
|Active<br />
|<br />
|https://fontawesome.com/docs/web/setup/upgrade/<br />
|.../theme/raw/sass/lib/font-awesome/<br />
|http://fontawesome.io<br />https://github.com/FortAwesome/Font-Awesome<br />
|SIL OFL 1.1<br />
|-<br />
| style="font-weight:bold;" |Ghostscript <br />fonts<br />
|^8.11<br />
|9.54.0<br />
|<br />
|n/a<br />
|Major<br />
|Active<br />
|<br />
|❗What do we use it for?<br />
|.../theme/raw/fonts/<br />
| - http://sourceforge.net/projects/gs-fonts/<br />- https://www.ghostscript.com/releases.html<br />
|AGPL<br />
|-<br />
| style="font-weight:bold;" |Charis SIL <br />(fonts)<br />
|^5.000<br />
|6.001<br />
|<br />
|n/a<br />
|Major<br />
|Active<br />
|<br />
|<br />
|.././lib/fonts/<br />
| - http://scripts.sil.org/cms/scripts/page.php<br />?item_id=CharisSIL<br />- https://software.sil.org/charis/download/<br />
|SIL OFL<br />
|-<br />
| style="font-weight:bold;" |TinyMCE<br />
|5.10.2<br />
|5.10.2<br />
|Done✅<br />
|n/a<br />
|Major security patch - XSS<br />
|Active<br />
|Yes<br />
|https://www.tiny.cloud/docs/changelog/<br />📲 Test on mobile when updating<br />https://www.tiny.cloud/blog/category/<br />news-and-updates/<br />
|.../js/tinymce/<br />
|https://www.tiny.cloud/<br />https://www.tiny.cloud/get-tiny/self-hosted<br />
|LGPL 2.1<br />
|-<br />
| style="font-weight:bold;" |Video.js<br />
|7.17.0<br />
|7.17.0<br />
|Done✅<br />
|n/a<br />
|<br />
|Active<br />
|<br />
|Pre-released 7.18.1 Feb 2022<br />
|.../artefact/file/blocktype/<br />internalmedia/videojs/<br />
|http://videojs.com/<br />https://github.com/videojs/video.js<br />
|Apache License 2.0<br />
|-<br />
| style="font-weight:bold;" |zxcvbn<br />
|=4.4.2<br />
|4.4.2<br />
|<br />
|n/a<br />
|None<br />
|Inactive, 2017<br />
|<br />
|<br />
|.../js/zxcvbn/<br />
|https://github.com/dropbox/zxcvbn<br />
|MIT License<br />
|-<br />
| style="font-weight:bold;" |composer.json<br />dependencies<br /><br />
|<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|<br />
|https://git.mahara.org<br />/mahara/mahara/-/blob/<br />master/external/composer.json<br />
|Check for updates in the .json file.<br />
|<br />
|}</div>Robertl