Using jobs in a workflow¶
Use workflows to run multiple jobs.
Overview¶
A workflow run is made up of one or more jobs, which run in parallel by default.  To run jobs
sequentially, you can define dependencies on other jobs using the jobs.<job_id>.needs keyword.
Each job runs in an execution environment specified by runs-on.
You can run an unlimited number of jobs as long as you are within the workflow usage limits. For more information, see “Usage limits.”
Setting an ID for a job¶
Use jobs.<job_id> to give your job a unique identifier.  The key job_id is a string and its
value is a map of the job’s configuration data.  You must replace <job_id> with a string that
is unique to the jobs object.  The <job_id> must start with a letter or _ and contains only
alphanumeric characters, -, or _.
Example: Creating jobs
In this example, two have been created, and their job_id values are my_first_job and my_second_job.
jobs:
  my_first_job:
    name: My first job
  my_second_job:
    name: My second job
Setting a name for a job¶
Use jobs.<job_id>.name to set a name for the job, which is displayed in the UI.
Defining prerequisite jobs¶
Use jobs.<job_id>.needs to identify any jobs that must complete successfully before this job will
run.  It can be a string or an array of strings.  If a job fails or is skipped, all jobs that need
it are skipped unless the jobs use a conditional expression that causes the job to continue.  If a
run contains a series of jobs that need each other, a failure or skip applies to all jobs in the
dependency chain from the point of failure or skip onward.  If you would like a job to run even if
a job it is dependent on did not succeed, use the always() conditional expression in jobs.<job_id>.if.
Example: Requiring successful dependent jobs
jobs:
  job1:
  job2:
    needs: job1
  job3:
    needs: [job1, job2]
In this example, job1 must complete successfully before job2 begins, and job3 waits for both
job1 and job2 to complete.
The jobs in this example run sequentially:
- job1
- job2
- job3
Example: Not requiring successful dependent jobs
jobs:
  job1:
  job2:
    needs: job1
  job3:
    if: ${{ always() }}
    needs: [job1, job2]
In this example, job3 uses the always() conditional expression so that it always runs after
job1 and job2 have completed, regardless of whether they were successful.  For more information,
see “Expressions.”