Gitlab CI configuration, Ansible and Drupal
Yesterday I wrote about how I configured the Gitlab CI runner for my projects, now I’m gonna show you how I configured the testing environment for Ansible provision and a custom Drupal module I’m developing.
I have now two repositories with CI configuration, the one for deploy (using Ansible) and another for the custom Drupal module. The tests will be run in a VM with Drupal and Ansible installed, this can be different in your configuration.
You can enable Gitlab CI in your Gitlab repository adding a .gitlab-ci.yml
on the root directory.
Deploy repository
The deploy repository has an Ansible playbook and a private role specifically designed for the project, with no external role dependencies whatsoever (see my previous post to have an idea why).
My .gitlab-ci.yml
file, the file to configure how the CI will run the tests, for this repository looks like:
example:
script:
- echo localhost > inventory
# Check syntax
- ansible-playbook --syntax-check -i inventory ansible/test.yml
# First run
- ansible-playbook -i inventory ansible/test.yml --connection=local
# Idempotence
- >
ansible-playbook -i inventory ansible/test.yml --connection=local
| grep -q 'changed=0.*failed=0'
&& (echo 'Idempotence test: pass' && exit 0)
|| (echo 'Idempotence test: fail' && exit 1)
It sets localhost
as the host where tests will run, checks the syntax of the playbook and after It runs the playbook twice.
The ansible/test.yml
file has a playbook loading the role with default variables.
- hosts: all
tasks:
- include: roles/drupal/tasks/main.yml
vars_files:
- roles/drupal/defaults/main.yml
- test_vars.yml
In the first run we check if there are any errors, in the second we check if our rules are idempotent. Idempotence is critical because we need to control the results of our tasks on the server (if we modified a file, created a directory, etc), this second run shouldn’t modify anything because we haven’t changed the configuration.
Drupal repository
The second repository is the one for the custom Drupal module, this configuration is easy if you already have a VM box or Docker container configured to run Drupal (I have It with the configuration I wrote about before).
To run my drupal module tests I have this .gitlab-ci.yml
file.
stages:
- test
test:
script:
- cd /var/www/drupal/scripts
- php run-tests.sh --verbose my_module
It uses the run-tests.sh
script in your Drupal scripts
directory to run them in the command-line.