Say I have two kinds of jobs in my standard workflow, a job that builds something, and a job that tests the thing that was just built. The build job has a step that takes a parameter, which affects what it builds. But the test job takes no parameters, it just reads an ID from a file in the workspace (which was persisted at the end of the build job), and tests that build which is identified by that ID.
In my config.yml I might have something like this for the build:
build_someting_a: &buildsomething_a
run:
shell: /bin/bash +ex -uo pipefail
command: |-
bin/build_something.sh param-a
build_someting_b: &buildsomething_c
run:
shell: /bin/bash +ex -uo pipefail
command: |-
bin/build_something.sh param-c
tests:
- run:
shell: /bin/bash +ex -uo pipefail
command: |-
source BUILD_ID_FILE
bin/run-tests.sh
cleanup:
[...]
...
jobs:
build_a:
<<: *defaults
steps:
- checkout
- *build_something_a
- *persist
build_b:
<<: *defaults
steps:
- checkout
- *build_something_b
- *persist
tests:
<<: *defaults
steps:
- checkout
- *tests
...
workflows:
version: 2
build_things:
jobs:
- build_a:
<<: *filter
- build_b:
<<: *filter
What I’d like is for the workflow to run tests after each build, and then run a single cleanup after all of the tests jobs have completed. Something kind of like this, though this exactly as-is won’t work:
- tests: <<: *filter requires: - build_a - tests: <<: *filter requires: - build_b - cleanup: <<: *filter requires: - [all tests]
Is there a way to do this?
- Include the same job in different places in a workflow, with different dependencies, and have it read the persisted file from the job it depends on?
- Have one job require all of the above, even if they have the same name?
Yes, I realize that in this toy example, you might be tempted to suggest that the test not be a separate job, just another step in the build job. In this contrived example, yes, that’s the reasonable thing to do, but that’s not the question I’m asking; I just made this minimal example to illustrate my more general question.
What I have been doing is duplicating all of the job configs, so that instead of tests I have tests_a, tests_b, etc, all of them with identical bodies, just different names. But imagine this with a) more builds than just _a and _b, and b) a lot more steps in each job, not just a single script. It adds up to a lot of duplication, makes it harder to make small updates since every change has to be made in all the copies, and creates a possibility of mistakenly failing to keep them consistent with each other and not noticing. So I’d like to collapse all that duplication, and define a job just once, even if it’s going to be used in multiple places in a workflow.
Can I do something like that?