This utilizes GitLab CI's parallel[1] field to divide the build into several jobs, each handling a subset of the built packages. The job count is a bit of a trade-off between build re-use and parallelism. I'm trying 5 for now.
parallel
[1] https://docs.gitlab.com/ee/ci/yaml/#parallel