There is no way to inhibit a subsequent instance of a build pipeline from starting while another is in progress.
I've created a Test job that takes the workspace of the upstream job as a parameter so that it can be equally applied to Gerrit check ins, master updates, and release builds. It's fine to have different pipelines running because they operate in separate workspaces. But when a second instance of a particular pipeline begins before the first has finished, it may remove files that the test relies upon. As a result, I see frequent failures of downstream jobs.
As a workaround, I've reduced the number of executors to one, and set the priority of downstream jobs to be higher than upstream jobs, but this is still not a guarantee. And it's definitely not ideal because some upstream jobs take a long time and having more executors allows faster jobs to complete.