Last year we wrote a blogpost about our setup we use for Oh Dear! with Gitlab, and how we use their pipelines for running our CI tests. Since then, we’ve moved back to Github since they introduced their free private repositories.
In this post I’ll describe how we re-configured our CI environment using Github Actions.
If you have a Laravel application or package, you should find copy/paste-able examples here to get it up and running for yourself. This will only require small adaptations for Symfony, Zend, …
It’s all PHP, after all.
A custom Docker container with PHP 7.3 and extensions
I built a custom Docker container with PHP 7.3 and my necessary extensions. You’re free to use it yourself, too: mattiasgeniar/php73.
I’m still pretty new to Docker, so if you spot any obvious errors, I’d love to improve the container. Here’s the Dockerfile as is. It’s up on Github too, so you’re free to fork/modify as you see fit to create your own containers.
FROM php:7.3-cli
LABEL maintainer="Mattias Geniar <m@ttias.be>"
# Install package dependencies
RUN apt update && apt install -y libmagickwand-dev git libzip-dev unzip
# Enable default PHP extensions
RUN docker-php-ext-install mysqli pdo_mysql pcntl bcmath zip soap intl gd exif
# Add imagick from pecl
RUN pecl install imagick && echo 'extension=imagick.so' >> /usr/local/etc/php/php.ini
# Install nodejs & yarn
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - \
&& DEBIAN_FRONTEND=noninteractive apt-get install nodejs -yqq \
&& npm i -g npm \
&& curl -o- -L https://yarnpkg.com/install.sh | bash \
&& npm cache clean --force
# Install composer
ENV COMPOSER_HOME=/composer
ENV PATH=./vendor/bin:/composer/vendor/bin:/root/.yarn/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ENV COMPOSER_ALLOW_SUPERUSER=1
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
WORKDIR /var/www
In short: this takes the official base image of PHP 7.3 and adds some custom extensions, the node & yarn binaries, together with composer.
It’s a rather large container in total, because of the dependency of ImageMagick. By needing the source-files, it pulls in more than 100MB of dependencies. Oh well …
Using this container in your Github Action
You can now use Github Actions to automatically run a set of commands, every time you push code. You can do so by creating a file called .github/workflows/ci.yml . In that file, you’ll determine what actions need to run in a container.
Here’s our current CI config for Oh Dear.
on: push
name: Run phpunit testsuite
jobs:
phpunit:
runs-on: ubuntu-latest
container:
image: mattiasgeniar/php73
steps:
- uses: actions/checkout@v1
with:
fetch-depth: 1
- name: Install composer dependencies
run: |
composer install --prefer-dist --no-scripts -q -o;
- name: Prepare Laravel Application
run: |
cp .env.example .env
php artisan key:generate
- name: Compile assets
run: |
yarn install --pure-lockfile
yarn run production --progress false
- name: Set custom php.ini settings
run: echo 'short_open_tag=off' >> /usr/local/etc/php/php.ini
- name: Run Testsuite
run: vendor/bin/phpunit tests/
You can find a simplified example in my Docker example repo. The one above also takes care of the javascript & CSS compilation using yarn/webpack. We need this in our unit tests, but you might be able to remove those run lines.
Setting this up in your own repository
Here’s what was needed to get this up-and-running.
- Sign up for the “beta” program of Github Actions. You’ll get immediate access, but it’s opt-in for now.
- Create a file called
.github/workflows/ci.ymlin your repository, take the content from the example above git pushupstream to Github, the action should kick in after a few seconds
You can find an example Action here: mattiasgeniar/docker-examples/actions.

After that, you should see the Actions tab pick up your jobs.