I attended Devconf.cz again this year – I’ll try and post a full blog post on that soon. One of the most interesting talks, though, was CI/CD for Fedora packaging with Zuul, where Fabien Boucher and Matthieu Huin introduced the work they’ve done to integrate a specific Zuul instance (part of the Software Factory effort) with the Pagure instance Fedora uses for packages and also with Pagure.io, the general-purpose Pagure instance that many Fedora groups use to host projects, including us in QA.
They’ve done a lot of work to make it as simple as possible to hook up a project in either Pagure instance to run CI via Zuul, and it looked pretty cool, so I thought I’d try it on one of our projects and see how it compares to other options, like the Jenkins-based Pagure CI.
I wound up more or less following the instructions on this Wiki page, but it does not give you an example of a minimal framework in the project repository itself to actually run some checks. However, after I submitted the pull request for fedora-project-config as explained on the wiki page, Tristan Cacqueray was kind enough to send me this as a pull request for my project repository.
So, all that was needed to get a kind of ‘hello world’ process running was:
- Add the appropriate web hook in the project options
- Add the ‘zuul’ user as a committer on the project in the project options
- Get a pull request merged to fedora-project-config to add the desired project
- Add a basic Zuul config which runs a single job
After that, the next step was to have it run useful checks. I set the project up such that all the appropriate checks could be run just by calling
tox (which is a great test runner for Python projects) – see the tox configuration. Then, with a bit more help from Tristan, I was able to tweak the Zuul config to run it successfully. This mainly required a couple of things:
nodeset: fedora-31-vmto the Zuul config – this makes the CI job run on a Fedora 31 VM rather than the default CentOS 7 VM (CentOS 7’s tox is too old for a modern Python 3 project)
- Modifying the job configuration to ensure tox is installed (there’s a canned role for this, called
ensure-tox) and also all available Python interpreters (using the
This was all pretty small and easy stuff, and we had the whole thing up and running in a few hours. Now it all works great, so whenever a pull request is submitted for the project, the tests are automatically run and the results shown on the pull request.
You can set up more complex workflows where Zuul takes over merging of pull requests entirely – an admin posts a comment indicating a PR is ready to merge, whereupon Zuul will retest it and then merge it automatically if the test succeeds. This can also be used to merge series of PRs together, with proper testing. But for my small project, this simple integration is enough so far.
It’s been a positive experience working with the system so far, and I’d encourage others to try it for their packages and Pagure projects!