Unverified Commit 0c0597d5 authored by anarcat's avatar anarcat 💥
Browse files

expand on the jenkins retirement proposal

parent 98624cb5
Loading
Loading
Loading
Loading
+87 −27
Original line number Diff line number Diff line
@@ -4,18 +4,22 @@ title: TPA-RFC-10: Jenkins retirement

Summary: Jenkins will be retired in 2021, replaced mostly by GitLab
CI, with special hooks to keep the static site mirror system
operational.
and Debian package builds operational.

# Background

[Jenkins][Jenkins CI] was a fine piece of software when it came out: builds! We
[Jenkins][] was a fine piece of software when it came out: builds! We
can easily do builds! On multiple machines too! And a nice web
interface with [weird blue balls](https://www.jenkins.io/blog/2012/03/13/why-does-jenkins-have-blue-balls/)! It was great. But then [Travis
CI](https://travis-ci.org/) came along, and then GitLab CI, and then GitHub actions, and it
interface with [weird blue balls][]! It was great. But then [Travis
CI][] came along, and then GitLab CI, and then GitHub actions, and it
turns out it's much, much easier and intuitive to delegate the build
configuration to the project as opposed to keeping it in the CI
system.

[Jenkins CI]: https://en.wikipedia.org/wiki/Jenkins_(software)
[Travis CI]: https://travis-ci.org/
[weird blue balls]: https://www.jenkins.io/blog/2012/03/13/why-does-jenkins-have-blue-balls/

The design of Jenkins, in other words, feels dated now. It imposes an
unnecessary burden on the service admins, which are responsible for
configuring and monitoring builds for their users. Introducing a job
@@ -32,13 +36,17 @@ In the short term, Jenkins can keep doing what it does, but in the
long term, we would greatly benefit from retiring yet another service,
since it basically duplicates what GitLab CI already does.

This section tries to establish alternatives to the venerable Jenkins.
Note that the [2020 user survey][] also had a few voices suggesting
that Jenkins be retired in favor of GitLab CI. Some users also
expressed "sadness" with the Jenkins service. Those results were the
main driver behind this proposal.

[Jenkins CI]: https://en.wikipedia.org/wiki/Jenkins_(software)
[2020 user survey]: roadmap/2021#survey-results

## Goals

The goal of this migration is to retire the Jenkins service and server
The goal of this migration is to retire the Jenkins service and
servers (`henryi` but also the multiple `build-$ARCH-$NN` servers)
with minimal disruption to its users.

### Must have
@@ -50,23 +58,74 @@ with minimal disruption to its users.

### Nice to have

 * full and transparent integration with GitLab
 * retire all the existing `build-$ARCH-$NN` machines in favor of the
   GitLab CI runners architecture

### Non-Goals

 * replacing the current static mirror system is out of scope
 * retiring the gitolite / gitweb infrastructure is out of scope, even
   though it is planned as part of the 2021 roadmap. therefore
   solutions here should not rely too much on gitolite-specific
   features or hooks
 * replacing the current static mirror system is out of scope, and is
   not planned in the 2021 roadmap at all, so solutions proposed must
   still be compatible with the static site mirror system

# Proposal

Replacing Jenkins should be done progressively. Some teams have
already started using GitLab CI to run some jobs, so it is the obvious
and most likely candidate. Some jobs will be harder to migrate than
others, so a piecemeal approach will be necessary. 
Replacing Jenkins will be done progressively, over the course of 2021,
by the different Jenkins users themselves. TPA will coordinate the
effort and progressively remove jobs from the Jenkins configuration
until none remain, at which point the server -- along with the build
boxes -- will be retired.

No archive of the service will be kept.

## GitLab Ci as main option, and alternatives

GitLab will be suggested as an alternative for Jenkins users, but
users will be free to implement their own build system in other ways
if they do not feel GitLab CI is a good fit for their purpose.

In particular, GitLab has a powerful web hook system that can be used
to trigger builds on other infrastructure. Alternatively, external
build systems could periodically pull Git repositories for changes.

## Stakeholders and responsibilities

We know of the following teams currently using Jenkins and affected by
this:

 * **web team**: virtually all websites are built in Jenkins, and heavily
   depend on the static site mirror for proper performance
 * **network team**: the core tor project is also a heavy user of
   Jenkins, mostly to run tests and checks, but also producing some
   artefacts (Debian packages and documentation)
 * **TPA**: uses Jenkins to build the status website
 * **metrics team**: onionperf's documentation is built in Jenkins

When this proposal is adopted, a ticket will be created to track all
the jobs configured in Jenkins and each team will be responsible to
migrate their jobs before the deadline. It is *not* up to TPA to
rebuild those pipelines, as this would be too time-consuming and would
require too much domain-specific knowledge. Besides, it's important
that teams become familiar with the GitLab CI system so this is a good
opportunity to do so.

When a job has been migrated, it should be marked as such in this wiki
page (or a ticket?).
A more detailed analysis of the jobs currently configured in Jenkins
is available in [the Configured Jobs section of the Jenkins service
documentation][].

[the Configured Jobs section of the Jenkins service documentation]: service/jenkins#configured-jobs

## Specific job recommendations

With the above in mind, here are some recommendation on specific group
of jobs currently configured on the Jenkins server and how they could
be migrated to the GitLab CI infrastructure.

Some jobs will be harder to migrate than others, so a piecemeal
approach will be used. 

Here's a breakdown by job type, from easiest to hardest:

@@ -85,9 +144,11 @@ to GitLab CI. Hopefully this should be a fairly low-hanging fruit...
### Windows CI tests

GitLab CI will eventually gain Windows (and Mac!) based runners (see
[issue 40095](https://gitlab.torproject.org/tpo/tpa/team/-/issues/40095)) which *should* be able to replace the Windows CI
[issue 40095][]) which *should* be able to replace the Windows CI
jobs from Jenkins.

[issue 40095]: https://gitlab.torproject.org/tpo/tpa/team/-/issues/40095

### Critical website builds

Critical websites should be built by GitLab CI just like non-critical
@@ -118,19 +179,14 @@ There are two possible solutions:

TODO: pick a solution for Debian package builds. @weasel may have ideas.

## Scope

## ...

# Examples

Examples:

 * ...

Counter examples:

 * ...
 * the network team is migrating their CI jobs to GitLab CI
 * the research.torproject.org site would end up as a GitLab pages site
 * the www.torproject.org site would stay in the static mirror system,
   but would be built in GitLab CI

# Deadline

@@ -155,6 +211,10 @@ This proposal is currently in the `draft` state.

# References

See the [GitLab](howto/gitlab), [GitLab CI](service/ci), and [Jenkins
service documentation](service/jenkins) for more background on how
See the [GitLab][], [GitLab CI][], and [Jenkins
service documentation][] for more background on how
Jenkins and GitLab CI work.

[Jenkins service documentation]: service/jenkins
[GitLab CI]: service/ci
[GitLab]: howto/gitlab