I just ran into an issue that I'd known about but forgotten. There is an issue with the Invoke-Sqlcmd in that the documentation states that unless a specific query timeout is specified then the command does not timeout. In fact it uses the default of 30 seconds so remember to always include the -QueryTimeout option.

Did not cause the deployment to fail. Should I be doing something specific to capture errors? It is in a Try/Catch block so I'd have expected it to fail completely. It was only because I was checking the logs I picked it up.

The deployment actually would fail if you didn't have the call inside a try-catch block; any unhandled exception will cause a deployment failure. You're catching it in your PowerShell script, and therefore stopping the Deployment Manager runner seeing the exception at all.