I am going for your option B "one job for each project?"
My current plan is to add "build other project" "post build tasks" to jobs that are depended upon. If I understand correctly, by doing this I can "Block build when upstream project is building", and "Block build when downstream project is building". Since I want immediate feedback, regardless of what is happening elsewhere, I'm NOT going to use these. Maybe you want to...
I will also use the Copy artifacts plugin for projects that have dependencies to use the last successfull build from the upstream project.
Below is a sample setup with some possible problems.
Job A (triggered by a code checkin to repo somerepo/A,with with post build task to to run Job B)
Job B (triggered by a code checkin to repo someotherrepo/B AND has a dependency on Job A)
Problem 1
Scenario A
Two different developers check in changes simultanuously to the two different repo's.
Since the changes do not depend on one another, both jobs should be allowed to run simultanuously (job B can use the last successful build of job A's artefacts). When Job A is done, the post build task will run Job B a second time.
Scenario B
A single developer checks in changes to both repos at the same time - the changes depend on each other.
The jobs will be run as described in Scenario A - which causes Job B to fail. The second run of Job B should fix this.
I think scenario B will not happen often - and I can accept a failed build in this case.
Is this the type of "handling" you are asking about?
To get around this I have to ensure that a slave can only run one job at a time. I think this is the number of executors of a slave.
I don't think this is a big problem, slaves are pret