Introduction
This post is about situations where software components that are commonly imported in as part of assembling production systems can slip outside of the normal expected path for detecting the availability and applying version upgrades.
A couple of examples of systems that can be set up to detect when new versions of dependencies are available are:
Examples of dependency changes
When a base Docker image went distroless
When new versions stopped being released for the alpine distribution of the envoyproxy Docker image automation had nothing in place to detect that and raise it as a potential issue.
I came across this when a production issue came up in another team's core infrastructure service. Since my team was going to be blocked until the incident wsa resolved, I followed the online chat discussion, checked some logs, did some Googling and established that the error that was being seen should have been resolved by a version of envoy that had been available for several months.
It took an hour or so to join the dots and establish that the "latest" version that was being deployed was several versions behind envoy's releases because it had not been updated to align with a decision to stop support of a particular linux distribution in favor of going with a distroless approach.
Change of maven artifact name
For Java applications maven packaging has become a de facto standard for the management of libraries that need to be brought in to support functionalities within a service or application.
An example of an artifact that changed its name as part of a major version upgrade is apache commons-lang that moved over to commons-lang3.
I can't recall any particular problem arising from running with commons-lang, but I wouldn't like to see commons-lang as a dependency in my codebase - given that it's most recent release was back in 2011, more than 14 years ago.
So how can we stay up to date?
In my view, the best way to reduce dependendency management overhead is to minimise dependencies in the first place. Carefully weigh up the value that is being added when you bring in any dependency
- Does it bring along a bunch of transitivie dependencies? Is it worth it?
- Could the same be achieved with a couple of extra classes directly in our codebase?
As software bills of material and greater attention is focussed on the software supply chain, I believe it will become more common for organisations to have centralised tooling in place to surface up the use of out of date artifacts.