Problems with infrastructure
Jan Kundrát
jkt at kde.org
Sun Dec 21 13:01:45 GMT 2014
On Friday, 19 December 2014 22:16:36 CEST, Scarlett Clark wrote:
> Jenkins is compatible
> and works with Gerrit, so I don't understand why another CI is being
> considered.
Because when I started this effort this spring, build.kde.org appeared to
be on life support. I also wanted to expand the number of tools I
understand, and make sure that I can evaluate various CI tools without a
baggage of having to stick with a particular CI solution "just because
we've always done it that way". That's why I started looking at various
tools, and the whole stack which the OpenStack infrastructure team have
built [1] looked extremely compelling (note: they still use Jenkins).
The killer feature for me was their support for testing everything, where
each and every commit that is going to land in a repository is checked to
make sure it doesn't introduce any regressions. Not on a per-push basis,
but on a per-commit basis. This is something which has bitten me in the
past where I occasionally introduced commit series which contained
occasional breakage in the middle, only to be corrected in a subsequent
commit. That was bad because it breaks `git bisect` when one starts looking
for errors discovered in future, by unrelated testing.
At the same time, doing per-commit tests means that these tests have to run
in parallel, and that there must be $something which controls this
execution. This is well-described at [2], so I would encourage you to read
this so that you understand what the extra functionality is. To the best of
my knowledge, Jenkins cannot do that. Based on your level of experience
with Jenkins, do you think it's possible with it alone? Would that also
possible on a cross-repository manner?
Now that we've established a necessity to use something extra to control
this logic of job executions, we still have some use for Jenkins of course.
Something has to serve as an RPC tool for actually scheduling the build
jobs on various servers/VMs/workers/chroots/dockers/whatever. The question
is whether it still makes sense to use Jenkins at that point given that the
nice features, such as being able to track the history of the number of
failing tests, having pretty dashboard pointing to faulty commits etc etc
on one hand and having to create a ton of XML files with build job
definitions on the other hand. Does Jenkins still provide a net positive
gain?
The system which I was building had no need for drawing graphs of compiler
warnings per project throughout past two months. What I wanted to have was
an efficient system which will report back to the rest of the CI
infrastructure the result of a build of a proposed change to help keep a
project's quality up to a defined level. The only use of Jenkins in that
system would be for remotely triggering build jobs, and somehow pushing the
results back. I do not think that going through all of the Jenkins
complexity is worth the effort in that particular use case.
BTW, the way in which KDE uses Jenkins right now does not really make use
of many Jenkins functions. The script which prepares the git tree is
custom. The management of build artifacts is reimplemented by hand as well.
In fact, most of the complexity is within the Python scripts which control
the installation of dependencies, mapping of config options into cmake
arguments etc. These are totally Jenkins-agnostic, and would work just as
well if run by hand. That's why I'm using them in the CI setup I deployed.
Thanks for keeping these scripts alive.
So in the end, I had a choice of either using Jenkins only to act as a dumb
transport of commands like "build KIO's master branch" and responses such
as "build is OK", or bypassing Jenkins entirely and using $other_system. If
the configuration of the $other_system is easier than Jenkins', then it
seemed to be a good idea to try it out. Because I was already using Zuul
(see the requirement for doing "trunk gating" and speculative execution of
the dependant jobs as described in [2]), and Zuul uses Gearman for its
RPC/IPC/messagebus needs, something which just plugs into Gearman made a
lot of sense. And it turned out that there is such a project, the
Turbo-Hipster thing. I gave it a try. I had to fix a couple of bugs and add
some features (SCPing the build logs, for one), and I'm quite happy with
the result.
But please keep in mind that this is just about how to launch the build
jobs. TH's involvement with the way how an actual build is performed is
limited to a trivial shell script [3]. And by the way, the OpenStack's CI
which inspired me to do this is still using Jenkins for most of its build
execution needs.
Anyway, as I'm following these discussions, I think you don't really have
many reasons to start being afraid that even that part of your work which
is 100% Jenkins-specific would come to no use. There appears to be a huge
inertia for sticking with whatever we're using right now Just Because™,
even if all technical problems are/were solved. This effort started ages
ago with an "I would like to have multiplatform, early CI for Trojita", and
now we're discussing "replacing the project management tool within KDE".
I'm being told requirements such as "it would be cool to have a single tool
doing everything" or "the CI has to support Mercurial and SVN". Other
people feel threatened by my work, and yet other people believe that having
alternatives is a bad thing.
See, I'm happy that I can now finally use tools which make my work on my
pet project reasonably efficient. I also think that it's cool to offer
these tools to other people within KDE. Based on face-to-face discussion
during Akademy, people who were present appeared to be interested, so I did
the work on this. I fully integrated this stack with the rest of the KDE's
infrastructure, and make sure that all KDE projects can use these tools if
they want to. The technical solution is now ready, and it's up to the
project maintainers to decide whether they want it or not. If they want to
stick with what they have, more power to them. If they want to wait an
unspecified amount of time until a general decision is reached, more power
to them, too. If they want to switch now, more power to them as well.
It would be great to have alignment and for all of us to use the same tool.
However, I seriously doubt that an alignment can be reached without either
inducing emotional stress on a subset of our community or compromising
efficiency of another subset. Is either of that a price that we want to
pay? I suppose we might know after a long discussion.
The system which is now made available through Gerrit is suitable for
projects that want to make sure the quality of their code is and remains
excellent, who consider a failing test a serious problem which must be
fixed, whose approach to compilers telling them "hey, there's a problem
with your code" is either "doh, you're right, let's fix it" or "nah, you're
wrong, let's silence this warning forever, so that we can cut the noise
down", and who are happy to let a CI system veto their commits if they
introduce detectable breakage. It might not be a good fit for people who
*insist* that the only way of working is to
push-to-master-as-you-go-without-even-a-build-test-because-you-dont-make-mistakes,
and that no flaky tests can be fixed and are a neccessity of SW
development. Maybe it will need some reasonably well-contained additions to
support their use cases. Also, not every project which subscribes to these
quality values must use Gerrit, of course.
That system is ready to be used now. I promised I won't be pushing this to
people who don't care, and I intend to keep that promise. If you're a
project maintainer and you would like your project in Gerrit, you have my
support. If, however, you would like to revamp the review/CI/... platform
used throughout KDE as a whole, well, more power to you as well. I'll be
happy to help, but at this point I cannot imagine myself being a driving
force behind this. I expect my role to be limited to correcting factual
mistakes in Gerrit/Zuul descriptions from now on and helping iron out
possible problems with this setup. I, too, put quite long hours into making
KDE's CI better and I've so far felt substantial hostility by daring to
propose an alternative to How Stuff Has Always Been Done.
With kind regards,
Jan
[1] http://ci.openstack.org/
[2] http://ci.openstack.org/zuul/gating.html
[3]
http://quickgit.kde.org/?p=sysadmin%2Fgerrit-project-config.git&a=blob&f=scripts%2Fbuild-kf5qt5.sh
--
Trojitá, a fast Qt IMAP e-mail client -- http://trojita.flaska.net/
More information about the kde-core-devel
mailing list