Let's say that there are two products, product A and product B.
- Product A is a desktop product that customers download and install locally on their machine. This product follows a typical versioning process where quarterly releases are sent out to customers to install at their own discretion. For example, 2023.05 would be the version sent out to customers in May of 2023. Customers can choose to download and install this new version or they can remain on their current version.
- Product B is a cloud product done as a simple cloud API. The versioning for this product lives in two environments: development and production. If a developer needs to add functionality, they will make the changes locally on their machine and make a pull request into the git branch representing the development environment. After testing has a go at the changes in the development environment, a pull request is made into the master branch which represents the production environment.
Now for the wrench. Product A depends on product B. When in-house testers are testing a development build of product A, product A will ping the development version of product B. Any releases of product A ping the production version of product B.
My question is this: Is this best approach to versioning in product B? What is the industry standard on this? How could this be improved?
This versioning for product B has been okay for us for the most part. We just need to make sure we don't make any breaking changes to product B when we do updates to it. As for a better versioning system, I have a few ideas.
- Implement a versioning system identical to product A in product B. Each quarterly release of product A would use the URL corresponding to the same quarterly release of product B. The only issue I see with this approach is that each quarterly release of product B would require a new set of cloud resources to host said release. In essence, we'd bloat our cloud resources. Bear in mind that performing a routine cleanup of cloud resources based on whether any of our customers are using a certain version of product A is trivial.
- Use the same versioning mentioned above but instead of creating new cloud resources for each quarterly release, we'd require that product A send in its own version to product B. Then product B would change its behavior based on this version that it received. This approach avoids cloud resource bloat. Instead, it bloats the code as each change made to product B needs to appear as a new file/function in the code as to not change any code already used by previous versions of product A.
- Force our customers to upgrade their version of product A once a new release is available.
What do you all think?