DryDock. An open-source internal installer for iOS
· by Chris Maddern
What is DryDock?
DryDock is an open-source internal installer for iOS that enables rapid-deployment of experimental builds to the team and allows (permitted) users to install internal product releases on demand while remaining on a supported internal update track! Huzzah.
You can check it out on GitHub here
At Venmo, we try to experiment as broadly and continually as we can. As we've gotten better (and faster) at this, we've also had to get better at getting builds in to teammates, users and stakeholders' hands quickly & efficiently.
On average, we're typically working on 4-5 new features at any given time and engineers & stakeholders don't want to wait for the next internal 'release' to get a functional prototype in their hands. (This could be for user testing or just general 'touch-testing'.)
Plug their device in to Xcode and build to it. Simple, but it has a few downsides:
• Any device you directly build to is then on an 'unsupported' build without updates. Team members would come to us with issues because they were still stuck on an Xcode-built version of 4.4.0a2 (or something similar) which had a half-baked version of Nearby, for example.
• We then have to manage 'UDIDs' in the developer portal as builds aren't release signed.
An internal installer to rapidly share builds with the team on, be able to easily re-install them if anything goes wrong and where we can get people back on to supported builds. As we built the first version of DryDock, we also realized that this could solve a problem for our support team; being able to install any past version of the app to reproduce issues.
DryDock works with VENVersionTracker to make sure that users don't get crossed-over between individual experimental builds, but that they get upgraded to later versions of the main internal releases. We do this with a build versioning system..
Assuming a two week sprint which targets a minor-version release, builds will be versioned as follows:
Week 1 Development & Experimental builds: 4.x.0ax
Week 1 Internal releases : 4.x.0a(1-9)
i.e. any internal development and 'experimental builds' of Venmo are bucketed to the 4.x.0ax version, meaning they're isolated from releases on Crashlytics & tracking tools. Meanwhile, any release that's broadly distributed has clear usage & crash reporting.
Week 2 Development & Experimental builds: 4.x.0bx
Week 2 Internal releases : 4.x.0b(1-9)
--- Cut release branch here ---
End of Week 2: 4.x.0rc(1-9) // Bugfixes only at this point
VENVersionTracker will upgrade any 4.x.0ax build to 4.x.0bx or 4.x.0b(1-9) when it becomes available, so we effectively stop orphaned builds from development branches. This gives experimental one-offs a life-span of 'until the next internal release', which is fine.. they should be in that release if they're intended to be long-lived experiments.
We've been using DryDock for a few weeks internally now & love it so we thought we'd open source it so that anybody can easily create an internal installer app.
Built on Parse
DryDock is our first internal tool supported by the Parse backend.
Why Parse? It was the simplest way to get the backend up and running and was an easy way to ensure that whatever we made would easily be able to be used by others. The simplicity of building on Parse is impressive & their client SDK is intuitive to use. They also have SDKs / libraries for a broad array of languages & platforms, so extending this to work on Android or to be updated from a build tool to push from CI would not be too difficult.
Try it out & feel free to extend it
We're sharing this pretty early & have lots of improvements that we want to make; things ranging from automatic updates from build scripts to test-status for each app on a details screen, not to mention access controls to have different groups of users.
If you think of something that you'd like it to do for your team, feel free to fork & extend DryDock and if it's something that seems useful generally we'll merge it and everybody can benefit!
Let us know what you think!