Comparison of GitHub Actions with competitors
Deep dive into workflow syntax, triggers, and job configuration
Explore matrices, reusable workflows, and composite actions
•Runner Types and Execution Environments
•Persisting Build Outputs with Artifacts
•Controlling GitHub Permissions
•Authenticating to Third-Party Systems
•Matrix Strategies, Conditionals, and Concurrency Controls
Discover and integrate community actions from the GitHub Marketplace
Build custom JavaScript and Docker actions from scratch
•JavaScript and TypeScript Actions
Optimize logs, secrets, environments, and permissions for teams
•Developer Experience (Actions)
Harden workflows with security, reliability, and cost-saving techniques
•Maintainable Workflow Patterns
Apply course concepts by automating a real-world deployment pipeline
Advanced scheduling features help you orchestrate complex automation without duplicating YAML.
if:
expressions) control whether a step or job should run for a particular matrix combination or based on data from previous steps.concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
matrix-job:
runs-on: ubuntu-24.04
strategy:
fail-fast: true
matrix:
number: [1, 2]
letter: [a, b, c]
exclude:
- number: 1
letter: c
timeout-minutes: 5
steps:
# Step 1 – always runs
- name: Echo number and letter
run: |
echo "Number: ${{ matrix.number }}"
echo "Letter: ${{ matrix.letter }}"
# Step 2 – run for every combo EXCEPT number=2 ∧ letter=c
- name: Run everywhere except 2c
if: ${{ ! (matrix.number == 2 && matrix.letter == 'c') }}
run: echo "✔ This step runs for ${{ matrix.number }}${{ matrix.letter }}"
sleep-job:
runs-on: ubuntu-24.04
steps:
- name: Sleep (to give time to be cancelled)
run: sleep 100
timeout-minutes: 2
If we trigger the workflow twice in quick succession and the first run will be automatically canceled when the second one starts because they share the same concurrency group.
Combine these techniques to create expressive pipelines that only do the work that's needed.