Есть два варианта развития событий: вы распределяете последовательность выполнения по стейжам или рисуете свой граф выполнения
В первом случае последовательность стейжей важна - джобы параллелятся в рамках одного стейжа и следующий стейж не запустится пока не выполнятся все джобы предыдущего.
.pre всегда запускается перед пользовательскими стейжами,
Во втором - вы можете запланировать свой граф выполнения с помощью
needs
Я не нашел в документации, что .pre все еще будет выполняться первой, если ее джобы участвуют в вашем собственном графе, так что возможно это решение. В случае использования needs (и gitlab 14.2+ или gitlab.com 14.1) можно вообще не прописывать стейжи. В случае gitlab <=14.0 стейжи все еще нужны, потому что needs не будет работать с джобами одного стейжа.
Внимательно прочитайте требования к needs
https://docs.gitlab.com/ee/ci/yaml/#requirements-a... соответственно вашей версии gitlab