Automatisches Testen ist für mich nicht neu, jedoch versuche ich meine private IT-Landschaft möglichst klein zu halten (mittlerweile zumindest). Also ging es mir nun beispielsweise darum die Installation von einem Jenkins oder einem ähnlichen Produkt zu vermeiden. Da von Beginn an die Idee da war, meine privaten Ansible Rollen auch zu veröffentlichen, habe die Git-Repositories dazu gleich bei GitHub erstellt (siehe https://github.com/bubebyte) und konnte somit auf die komfortable Funktion der GitHub Actions zurück greifen. Mit GitHub Actions kann man im Handumdrehen Funktionalitäten einrichten wie in meinem Fall das durch den Push getriggerte Testen einer Ansible Rolle. Den Molecule Test muss man natürlich noch selbst schreiben, aber die Build-Pipline samt dem Spawnen von den nötigen Containern, übernimmt die GitHub Action.
Es gibt vorgefertigte GitHub Actions in der Community. Für die Ansible Rolle remi_php74 habe ich die Action von Robert de Bock namens molecule-action genutzt. Bei den Containern, die zum Testen verwendet werden, habe ich auf die Container von Jeff Geerling gesetzt. Die Definition der GitHub Action sah dann initial wie folgt aus und sollte im Git Repo unter .github/workflows abgelegt werden:
---
name: Role testing with Molecule
on:
- push
- pull_request
jobs:
test:
runs-on: ubuntu-20.04
steps:
- name: checkout
uses: actions/checkout@v2
with:
path: "${{ github.repository }}"
- name: molecule
uses: robertdebock/molecule-action@2.6.8
with:
namespace: geerlingguy
image: docker-centos8-ansible
tag: latest
Mit dieser GitHub Action war ich zu Beginn sehr glücklich, da ich für meinen Einsatzzweck nur den Test für CentOS 8 benötigte. Fügt man bei diesem Konstrukt nun einfach weitere Tests für andere Betriebssysteme unten an, würden diese seriell nacheinander abgearbeitet, was die Testdauer natürlich entsprechend verlängert.
Viel besser wäre es, wenn die Tests auf den verschiedenen Betriebssystemen parallel laufen würde. Dies ist auch kein Problem, da man die verschiedenen Betriebssysteme bzw. die verschiedenen Docker Images für die Tests in einer Matrix eintragen kann. Matrix könnte mit meinen Beispiel etwas verwirrend sein, aber es ist auch möglich in dieser Matrix beispielsweise weitere Testszenarien zu defenieren. So würde jedes OS dann mit jedem Testszenario gebaut werden. Aber bleiben wir bei dem Beispiel, mit dem wir den gleichen Test / das gleiche Testszenario auf mehreren Betriebssystemen testen wollen. Die GitHub Action würde dann wie folgt aussehen:
---
name: Role testing with Molecule
on:
- push
- pull_request
jobs:
test:
runs-on: ubuntu-20.04
strategy:
matrix:
image:
- docker-centos7-ansible
- docker-centos8-ansible
steps:
- name: checkout
uses: actions/checkout@v2
with:
path: "${{ github.repository }}"
- name: molecule
uses: robertdebock/molecule-action@2.6.8
with:
namespace: geerlingguy
image: "${{ matrix.image }}"
options: parallel
tag: latest
Diese Action würde zunächst genau das machen, was wir uns gewünscht haben. Das Testszenario würde auf einem CentOS 7 und einem CentOS 8 Container gleichzeitig ausgeführt werden. Um nun jedoch zu vermeiden, dass uns das Linting gleichzeitig zwei Mal erzählt, dass wir zu viele Leerzeichen am Zeilenende haben, bietet es sich an erstmal das Linting auf einem System durchzuführen und erst wenn dieses keine Fehler erzeugt hat, die Tests parallel laufen zu lassen. Die Definition würde dann wie folgt aussehen:
---
name: Role testing with Molecule
on:
- push
- pull_request
jobs:
lint:
runs-on: ubuntu-20.04
steps:
- name: checkout
uses: actions/checkout@v2
with:
path: "${{ github.repository }}"
- name: molecule
uses: robertdebock/molecule-action@2.6.8
with:
command: lint
test:
needs:
- lint
runs-on: ubuntu-20.04
strategy:
matrix:
image:
- docker-centos7-ansible
- docker-centos8-ansible
steps:
- name: checkout
uses: actions/checkout@v2
with:
path: "${{ github.repository }}"
- name: molecule
uses: robertdebock/molecule-action@2.6.8
with:
namespace: geerlingguy
image: "${{ matrix.image }}"
options: parallel
tag: latest
Wer einen funktionellen Molecule Test mit einem default Szenario implementiert hat, sollte mit dieser Definition direkt das gewüschte Ergebnis erzielen können. Viel Spaß damit!