Just build and deploy everything on every merge. Compute is fairly cheap, and if running in parallel, it doesn't have to take long.
You can also take it a step further and have "mono" binaries/container images, where you specify the service to execute as the first argument.
I've been doing this for about 5 years now, having a single output artifact for each language being used. It works great.
If you're careful about your optimisations, you can go from hitting the merge button to having 100+ services deployed on production in about 60 seconds
Arguably it's a bit of an extremist approach, but if you have a situation where technically you're deploying thousands of times a day, you get pretty good at making the process reliable and robust