Pipeline plugin
You can use the Pipeline Plugin (formerly workflow-plugin
).
It comes with many examples, and you can follow this tutorial.
e.g.
// build
stage 'build'
...
// deploy
stage 'deploy'
...
// run tests in parallel
stage 'test'
parallel 'functional': {
...
}, 'performance': {
...
}
// promote artifacts
stage 'promote'
...
Build flow plugin
You can also use the Build Flow Plugin. It is simply awesome - but it is deprecated (development frozen).
Setting up the jobs
Create jobs for:
- build
- deploy
- performance tests
- functional tests
- promotion
Setting up the upstream
in the upstream (here build
) create a unique artifact, e.g.:
echo ${BUILD_TAG} > build.tag
archive the build.tag
artifact.
- record fingerprints to track file usage; if any job copies the same
build.tag
file and records fingerprints, you will be able to track the parent.
- Configure to get promoted when
promotion
job is successful.
Setting up the downstream jobs
- I use 2 parameters
PARENT_JOB_NAME
and PARENT_BUILD_NUMBER
Copy the artifacts from upstream build
job using the Copy Artifact Plugin
- Project name =
${PARENT_JOB_NAME}
- Which build =
${PARENT_BUILD_NUMBER}
- Artifacts to copy =
build.tag
Record fingerprints; that's crucial.
Setting up the downstream promotion job
Do the same as the above, to establish upstream-downstream relationship.
It does not need any build step. You can perform additional post-build actions like "hey QA, it's your turn".
Create a build flow job
// start with the build
parent = build("build")
parent_job_name = parent.environment["JOB_NAME"]
parent_build_number = parent.environment["BUILD_NUMBER"]
// then deploy
build("deploy")
// then your qualifying tests
parallel (
{ build("functional tests",
PARENT_BUILD_NUMBER: parent_build_number,
PARENT_JOB_NAME: parent_job_name) },
{ build("performance tests",
PARENT_BUILD_NUMBER: parent_build_number,
PARENT_JOB_NAME: parent_job_name) }
)
// if nothing failed till now...
build("promotion",
PARENT_BUILD_NUMBER: parent_build_number,
PARENT_JOB_NAME: parent_job_name)
// knock yourself out...
build("more expensive QA tests",
PARENT_BUILD_NUMBER: parent_build_number,
PARENT_JOB_NAME: parent_job_name)
good luck.