Sounds like you manage this manually.
Why not have a CI server (travis, jenkins, w/e) build each microservice seperately (e.g. after a push to master) and then attempt an app release with all microservices?
You can also do parametric jobs in jenkins which could allow combining arbitrary microservices versions
Or just version your APIs and declare explicitly what microservice uses what version of the API to communicate with the other service.
This sounds like a constraint satisfaction problem. If you want to go all hardcore on this (and willing to pay the complexity price), then you can devise a system that can, on every new build of every new service, try to find the optimal combination of service versions that "work together nicely".
Here are some data points that you'd need to implement this:
- What other services each service depends on
- What previously released versions of services worked with what versions of dependecies
- Ability to automatically test new versions of each service against its dependencies
Then you plug all that in to a solver that runs on every build, and voila, you have your Microservice Dependency Constraint Satisfaction Manager Machine™. If you do go this route, it would make for a great open-source project.
You can also do parametric jobs in jenkins which could allow combining arbitrary microservices versions
Or just version your APIs and declare explicitly what microservice uses what version of the API to communicate with the other service.