Just under 11 years ago, Christophe Troestler opened ocaml/ocaml#307 and the OCaml project’s association with AppVeyor began.

Travis CI had been added by Anil in 2014 in ocaml/ocaml#47 (back then, review took place on GitHub for PRs, but if accepted they were actually committed manually to OCaml’s Subversion repository at Inria, which is why all these PRs look “closed”). Windows support, as so often, had lagged behind in the emerging field of Continuous Integration systems. Aside from the obvious cost of OS licenses not required for Linux-testing, the virtualisation story was harder. Inria’s CI systems, for example, were (indeed, still are) stateful; an unacceptable configuration for arbitrary incoming pull requests. Having spent a good chunk of my early computer years administering automated Windows rebuilds, I knew first-hand that reliably orchestrating clouds of Windows VMs to be created for 1 hour jobs and then simply be reaped was no mean feat.

That, however, is what we were given - up to 1 hour per pull request or branch push. On top of that, an incredibly useful feature of AppVeyor was that you could even hold on to what was left of that hour and connect to the worker to debug what had failed. On a series of evenings in 2019, I spent many hours submitting jobs to AppVeyor to get another 30 minutes’ debugging time on a system for which planets had aligned to reveal a GC bug in the Unix library! Travis CI had some planets-aligned discoveries too; ocaml/ocaml#1483 sprang out of memory layout happening to put OCaml processes straddling the correct address space boundary to trigger a pointer arithmetic error.

We switched away from Travis CI to GitHub Actions in ocaml/ocaml#10214 in 2021, and we started using Windows runners on GitHub Actions when we restored the MSVC port of OCaml in 2024 (ocaml/ocaml#12954). AppVeyor had been creaking at the seams for us for a few years, initially because although our number of contributors had increased, as an open source project we were still limited to just the one Windows runner, and the queue could really build up, but also because since OCaml 5, the size of the runners was becoming an issue, and we were having to limit testing (ocaml/ocaml#11389).

But we’re finally there! Nicolás bit the bullet in ocaml/ocaml#15209 and nerd-sniped me into doing some further work and so we’re now fully on GitHub Actions runners for Linux, macOS and Windows. GitHub’s open source support gives us a very generous number of runners. Looking back, the Git history for the three configuration files suggests I’ve spent an unhealthy amount of time in the last ten years working on this: a big thank you and acknowledgement to the team at AppVeyor for the support we’ve had over the years, and here’s to ever-continuing Windows support in OCaml!