One day in March 1998 I released a little file transfer tool I called curl. The first ever curl release. That was good.
By the end of July the same year, I released the 10th curl release. I’ve always believed in release early release often as a service to users and developers alike.
In December 1998 I released the 20th curl release. I started to get a hang of this.
In January 2001, not even three years in, we shipped the 50th curl release (version 7.5.2). We were really cramming them out back then!
Next week. 23 years, two months and six days after the first release, we will ship the 200th curl release. We call it curl 7.77.0.
Yes, there are exactly 200 stickers used in the photo. But the visual comparison with 50 is also apt: it isn’t that big difference seen from a distance.
I’ve personally done every release to date, but there’s nothing in the curl release procedure that says it has to be me, as long as the uploader has access to put the new packages on the correct server.
The fact that 200 is an HTTP status code that is indicating success is an awesome combination.
In 2014 we formally switched to an eight week release cycle. It was more or less what we already used at the time, but from then on we’ve had it documented and we’ve tried harder to stick to it.
Assuming no alarmingly bad bugs are found, we let 56 days pass until we ship the next release. We occasionally slip up and fail on this goal, and then we usually do a patch release and cut the next cycle short. We never let the cycle go longer than those eight weeks. This makes us typically manage somewhere between 6 and 10 releases per year.
- Make a release checklist, and stick to that when making releases
- Update the checklist when needed
- Script as much as possible of the procedure
- Verify the release tarballs/builds too in CI
- People never test your code properly until you actually release
- No matter how hard you try, some releases will need quick follow-up patch releases
- There is always another release
- Time-based release scheduling beats feature-based