GitHub Actions and Workflows
Workflow YAML structure, CI/CD, automation, and the Actions marketplace.
Listen
Transcript
Alex: Welcome back. Today we're talking about GitHub Actions, which is GitHub's built-in automation system for repositories.
Jamie: This is the thing that suddenly starts running when you open a pull request, right? Tests, checks, little status icons, sometimes a red X that makes everyone nervous.
Alex: Exactly. Actions are event-driven automation. Something happens in the repository, like a commit being pushed or a pull request being opened, and GitHub runs a workflow that the maintainers defined.
Jamie: So as a contributor, I may not be writing the automation, but I still need to understand what it is telling me.
Alex: Yes. Most contributors only need to read the results, follow the links when something fails, and make a focused fix. The written appendix is also a reference, so you can jump to the part you need later instead of memorizing every possible workflow feature today.
Jamie: Let's slow down on the vocabulary, because Actions has a lot of nested words. Workflow, job, step, action, runner... they all sound similar at first.
Alex: A workflow is the full automated process, and it is stored in a YAML file. YAML is a plain text format where indentation matters, so spaces at the start of a line change what belongs under what.
Jamie: And a job is inside the workflow?
Alex: Right. A job is a group of steps that run together, usually on one machine. A step might run a command, like npm test, or use a reusable action, like actions/checkout, which downloads the repository code into the runner.
Jamie: Runner is the machine doing the work?
Alex: Yes. GitHub-hosted runners are virtual machines such as ubuntu-latest, windows-latest, or macos-latest. The workflow says which runner to use with the key runs-on.
Jamie: Where do I find these workflow files if I'm browsing a repository?
Alex: They live in a required folder path: .github/workflows. The folder name starts with a dot, so a screen reader may announce it as "dot github." On GitHub.com, the file browser shows it, and you can press T to open Go to file and search for workflow YAML files, usually ending in .yml.
Jamie: What would I actually hear or read inside a simple workflow file?
Alex: A common file might be called .github/workflows/ci.yml. Near the top, name: CI gives the workflow its display name. Then on: defines the events that start it, jobs: lists the work to do, and steps: lists the individual commands or reusable actions.
Jamie: So if I hear on colon, then pull_request under it, that's saying this workflow runs when a pull request changes.
Alex: Exactly. Other common triggers are push, schedule, workflow_dispatch, release, issue_comment, pull_request_review, and merge_group. Schedule means a timer, workflow_dispatch means someone can start it manually from the Actions tab, and pull_request is the one contributors usually notice first.
Jamie: Because that is the one that runs checks on my PR.
Alex: Yes. On the pull request Conversation tab, near the merge area, GitHub shows status checks. A yellow or orange spinner means the check is still running, a green checkmark means it passed, a red X means something failed, and a gray slashed circle usually means the check was skipped by design.
Jamie: And required checks are the ones that can block merging.
Alex: Right. Non-required checks may still be useful, but required checks must pass before the pull request can be merged, if the repository has that rule enabled. Some projects also put status badges in the README so visitors can see whether the main branch is currently passing its workflow.
Jamie: If I'm using NVDA or JAWS, how do I get to the checks without wandering the whole page?
Alex: Open the pull request Conversation tab, then move by headings with H, or by heading level if that is easier, until you find the checks area. Each result is usually exposed as a link or button with a name and status, and you can press Enter on a failed one to open more detail.
Jamie: And with VoiceOver on macOS?
Alex: Use VO+U to open the Rotor, choose Headings, move to the checks area, then read through the results with VO+Arrow. When you find the failed check link, activate it with VO+Space.
Jamie: What if I want to look at the full workflow run instead of just the pull request summary?
Alex: Use the repository navigation and open the Actions tab. It is in the repo's top navigation, often near Projects and Security, with a play-button style icon. In the Actions tab, you can choose a workflow, then choose a run, then expand a job and read the step logs.
Jamie: Logs are where the real clue usually lives.
Alex: Yes. You are looking for the first failing step, the error message, and any file names or line numbers. Some workflows also upload artifacts, which are files produced by the run, like test reports, coverage reports, screenshots, build output, or accessibility scan results.
Jamie: What kinds of workflows should a new contributor expect to see in real projects?
Alex: Continuous integration, or CI, is the big one. It usually means running tests every time someone opens or updates a pull request, so maintainers can see whether the change broke existing behavior.
Jamie: Then there are style checks, right? The ones that complain about formatting.
Alex: Yes. Linting checks code style and common mistakes. Documentation projects may run spelling checks, link checks, Markdown checks, or build the docs site to make sure the pages still compile.
Jamie: Accessibility and security checks can show up too.
Alex: They can. Accessibility workflows might scan pages for detectable issues, while security workflows might check dependencies or scan for known vulnerabilities. Deployment workflows are another common pattern: a project may deploy to production when code is pushed to main, or create a preview build for each pull request.
Jamie: You mentioned reusable actions earlier. Where do maintainers find those?
Alex: Many reusable actions are shared through the GitHub Marketplace under the Actions category. A maintainer can search for an action that sets up Node, checks out code, uploads an artifact, deploys a site, or runs a specific tool.
Jamie: So an action is like a reusable automation component, not necessarily the whole workflow.
Alex: Exactly. The workflow is the full recipe. An action is one reusable ingredient that a step can call with uses: and often configure with with: options.
Jamie: What about matrix builds? I see that phrase in a lot of CI files.
Alex: A matrix build runs the same job across several combinations. For example, a project might test Node.js 18, 20, and 22, or test on ubuntu-latest, windows-latest, and macos-latest. That helps maintainers catch a problem that only appears in one version or one operating system.
Jamie: For low vision learners, this is where indentation and nesting can get hard to track.
Alex: Absolutely. Increase the editor font size, turn on visible whitespace in VS Code, and use YAML syntax highlighting if it helps. In workflow files, a line in the wrong indentation level can change the meaning or break the file entirely.
Alex: Now, the moment everyone meets eventually: a check fails.
Jamie: I appreciate naming that, because the first red X can feel like you broke the whole project.
Alex: Usually you did not. Start by opening the failed check, then open the workflow run, then expand the failed job. Inside that job, find the step marked as failed and read the log around the error.
Jamie: Should I read from the very top of the log?
Alex: Not usually. Start near the failed step and look for the first real error message, not every warning. A useful error often mentions a command, a file path, a missing dependency, a test name, or a line number.
Jamie: Then I fix the issue locally or in the web editor, commit, and push again?
Alex: Yes. Pushing another commit to the same branch usually reruns the pull request checks. If you are stuck, leave a clear comment on the pull request that says which check failed, what error you found, and what you already tried.
Jamie: That gives maintainers something concrete to respond to.
Alex: Security matters a lot in workflows because automation can access code, tokens, and deployment systems.
Jamie: Is that why GitHub sometimes asks maintainers to approve workflows from first-time contributors?
Alex: Yes. Some repositories require approval before running workflows on contributions from new or external contributors, especially when the workflow could use secrets or write permissions. That pause is a safety measure, not a personal rejection.
Jamie: Let's define secrets, because that word is easy to misunderstand.
Alex: A secret is an encrypted value stored in repository or organization settings, usually for API keys, tokens, passwords, or deployment credentials. Workflows can read secrets without printing the actual value, if they are configured correctly.
Jamie: And environment variables?
Alex: Environment variables are named values available to commands while the job runs. Some are harmless, like a version number or a build mode. Sensitive values should be stored as secrets, not typed directly into a YAML file, a log, an issue, or a pull request comment.
Jamie: Where does Dependabot fit into this?
Alex: Dependabot can open pull requests that update dependencies or security alerts. Those PRs may trigger workflows too, and maintainers still review the checks before merging.
Alex: Accessibility-focused workflows are helpful, but they are not magic.
Jamie: Meaning they can catch some barriers automatically, but not every barrier a person might experience.
Alex: Exactly. Tools such as GitHub's Accessibility Scanner Action, axe-based checks, pa11y, Lighthouse, or project-specific scripts can detect issues like missing labels, color contrast problems in some contexts, invalid HTML, and certain ARIA mistakes.
Jamie: But they cannot tell whether the whole experience makes sense with a screen reader.
Alex: Right. Automated scans do not replace keyboard testing, screen reader testing, magnification checks, plain language review, or feedback from disabled users. They are useful gates, but they are only part of accessibility practice.
Jamie: Some workflows need the app running before they can scan it, yes?
Alex: Yes. A workflow may need to install dependencies, build the project, start a local server, wait for the page to become available, and then point the scanner at that URL. On GitHub-hosted runners, the environment is temporary, so the workflow has to prepare everything it needs each time.
Jamie: What is a good hands-on activity for this appendix if I do not want to write a workflow from scratch?
Alex: Pick a repository you are allowed to inspect and open .github/workflows. Choose one YAML file and identify its name, its on: triggers, the jobs it defines, the runner it uses, and one step that runs a command.
Jamie: Then I would open the Actions tab and compare the file to a real run.
Alex: Yes. Find a recent run, open a job, read several step names, and notice whether any artifacts were uploaded. If there is a pull request with checks, compare the PR status summary with the workflow run details.
Jamie: And the reflection questions are practical: What started the workflow? Which check would block a merge? Where would I click or activate if it failed? What would I tell a maintainer if I needed help?
Alex: Exactly. GitHub Actions can look intimidating at first, but most contributor work comes down to reading the status, opening the failed run when needed, understanding the error, and making the next small fix.
Workshop Content
Companion Podcast and Transcript
Use audio and transcript companions to review concepts in a conversational format.
GitHub Actions and Workflows
Companion audio: this episode reinforces key ideas and may not be a word-for-word reading of this page.
Open audio file (external) Full transcript source (external)
Transcript preview
Alex: Welcome back. Today we're talking about GitHub Actions, which is GitHub's built-in automation system for repositories.
Jamie: This is the thing that suddenly starts running when you open a pull request, right? Tests, checks, little status icons, sometimes a red X that makes everyone nervous.
Alex: Exactly. Actions are event-driven automation. Something happens in the repository, like a commit being pushed or a pull request being opened, and GitHub runs a workflow that the maintainers defined.
Jamie: So as a contributor, I may not be writing the automation, but I still need to understand what it is telling me.
Appendix Q: GitHub Actions and Workflows
Listen to Episode 34: GitHub Actions and Workflows - a conversational audio overview of this chapter. Listen before reading to preview the concepts, or after to reinforce what you learned.
Reference companion to: Chapter 17: Issue Templates | Also relevant: Chapter 19
Authoritative source: GitHub Docs: Understanding Actions
Understanding Automation in Open Source Repositories
Why this matters for you: Every time you open a pull request on a real open source project, automated processes will run. Understanding what they are, what they mean, and what to do when they fail is essential to being a confident contributor.
Table of Contents
- What Is GitHub Actions?
- Key Vocabulary
- Where Workflows Live in a Repository
- The Anatomy of a Workflow File
- What Triggers a Workflow
- Understanding Status Checks on Pull Requests
- Reading the Actions Tab with a Screen Reader
- Common Workflows You Will Encounter
- What To Do When a Check Fails
- Workflow Permissions and Security
- Accessibility-Focused Workflows
- Hands-On Activity
- What We Are NOT Covering (And Where to Learn More)
1. What Is GitHub Actions?
GitHub Actions is GitHub's built-in automation system. It lets repository maintainers define automated tasks that run in response to things that happen in the repository - like someone opening a pull request, pushing a commit, or filing an issue.
Think of it as a robot assistant that every repository can optionally configure. That robot watches for specific events and then automatically runs jobs: testing code, checking spelling, scanning for accessibility issues, building documentation, deploying a website, and more.
As a contributor, you do not need to write workflows. But you will see their results on nearly every pull request you open, and you need to understand what those results mean.
Learning Cards: What Is GitHub Actions
Screen reader users
- Workflow files live in
.github/workflows/— use T (Go to file) on any repo page to search for.ymlfiles in that directory - The Actions tab is in the repository navigation landmark — press D (NVDA/JAWS) to jump between landmarks and find it
- You do not need to write YAML to contribute — your job is to read the status check results on your PR and fix any issues they flag
Low vision users
- The Actions tab icon (a play-button triangle) sits in the repo's top navigation bar — zoom in if the icon-only display is hard to read; the word "Actions" appears next to it
- Workflow YAML files use indentation-sensitive syntax — increase your editor font size and enable visible whitespace to distinguish nesting levels
- Status check results on your PR use small colored icons (green checkmark, red X, yellow spinner) — zoom to 150%+ to read the text labels beside them
Sighted users
- Find the Actions tab in the repository's top navigation bar between Projects and Security — a play-button icon marks it
- Workflow files are YAML files in
.github/workflows/— open any one in the Code tab to see the triggers (on:) and job steps - On your PR, scroll to the checks section near the merge box to see green checkmarks (passed), red X marks (failed), or yellow spinners (running)
2. Key Vocabulary
| Term | What It Means |
|---|---|
| Workflow | A complete automated process defined in a YAML file. A repo can have many workflows. |
| Job | A group of steps that run together, usually on the same machine. A workflow can have multiple jobs. |
| Step | A single task within a job - running a command, calling an action, etc. |
| Action | A reusable unit of automation. Like a plugin. Many are shared publicly on GitHub Marketplace. |
| Runner | The machine (virtual server) that executes a job. GitHub provides free runners. |
| Trigger / Event | The thing that causes a workflow to start - a push, a PR, a schedule, etc. |
| Status check | The pass/fail result of a workflow shown on a pull request. |
| Artifact | A file produced by a workflow (a build output, a test report, etc.) that can be downloaded. |
| Secret | An encrypted variable stored in a repo's settings - used in workflows without exposing sensitive values. |
| YAML | The file format used to write workflow files. Indentation matters. |
on: |
The YAML key that defines what triggers a workflow. |
runs-on: |
The YAML key that specifies the runner OS (ubuntu-latest, windows-latest, macos-latest). |
3. Where Workflows Live in a Repository
Workflow files live in a specific, mandatory location:
Description
Workflow files live at your-repository/.github/workflows/. Example files include: ci.yml (runs tests on every push or PR), lint.yml (checks code style), a11y-scan.yml (accessibility scanning), and deploy.yml (deploys the site when code merges to main).
The .github/ folder is hidden by convention (starts with a dot). To find it:
- On GitHub.com: The file browser shows it - use
T(go to file) or navigate the file table withCtrl+Alt+Arrowkeys - In VS Code: It appears in the Explorer panel - enable "Show Hidden Files" if needed
Screen reader tip: The
.githubfolder reads as "dot github." Theworkflowsfolder is inside it. File names ending in.ymlare YAML workflow files.
4. The Anatomy of a Workflow File
Here is a simple, real workflow file. You do not need to write this, but you should be able to read it:
# .github/workflows/ci.yml
name: CI # The display name shown in the Actions tab
on: # What triggers this workflow
push:
branches: [main] # Run when code is pushed to main
pull_request: # Run when a PR is opened or updated
branches: [main]
jobs:
test: # The job name (shown in status checks)
runs-on: ubuntu-latest # What operating system to use
steps:
- name: Check out code
uses: actions/checkout@v4 # A reusable action - downloads your repo code
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: npm install # A shell command
- name: Run tests
run: npm test # Another shell command
Reading this: The workflow named "CI" runs when code is pushed to main or a PR targets main. It creates one job called test that runs on Linux. That job checks out the code, installs Node.js, installs dependencies, and runs the test suite.
If npm test exits with an error, the job fails, and that failure shows up as a red on your pull request.
5. What Triggers a Workflow
The most common triggers you will encounter as a contributor:
| Trigger | What Causes It |
|---|---|
push |
Any commit pushed to a branch |
pull_request |
A PR is opened, updated, synchronized, or reopened |
pull_request_review |
A review is submitted on a PR |
issue_comment |
A comment is posted on an issue or PR |
schedule |
A recurring timer (like a cron job) - e.g., every Monday at 9am |
workflow_dispatch |
A manual trigger - someone activates a button in the Actions tab |
release |
When a new release is published |
merge_group |
When a PR enters a merge queue |
The most important one for you: pull_request - this is what triggers checks on your PR.
6. Understanding Status Checks on Pull Requests
When you open a pull request on a repo that uses GitHub Actions, you will see a section near the bottom of the Conversation tab called checks or status checks.
What the status indicators mean
| Symbol | Color | Meaning | What to do |
|---|---|---|---|
| Spinning circle | Yellow/Orange | Checks are running - wait | Wait for them to complete |
| Checkmark | Green | All required checks passed | Good - you may be able to merge |
| X (cross) | Red | One or more checks failed | Do not merge - read the failure |
| Slashed circle | Grey | Check was skipped | Usually fine - skipped by design |
| Yellow | Non-blocking warning | Review but may not block merge |
Navigating status checks with a screen reader
NVDA / JAWS (browse mode)
- Open the pull request Conversation tab
- Navigate to the section heading for "checks" using
Hor2 - Each check result is announced as a link or button with its name and status
- Press
Enteron a failed check to expand its details
VoiceOver (macOS, Safari)
- Use
VO+Uto open the Rotor - Select "Headings" and navigate to the checks section
- Use
VO+Arrowto read through check results - Activate a check link with
VO+Space
Required vs. non-required checks
- Required checks must pass before a PR can be merged. A maintainer configures which checks are required in Branch Protection Rules.
- Non-required checks are informational - a failure shown in grey/yellow usually won't block a merge.
- If you're not sure whether a check is required, look for the phrase "Required" next to the check name.
Learning Cards: Understanding Status Checks
Screen reader users
- Status checks live near the bottom of the PR Conversation tab — press H or 2 to jump to the checks section heading, then arrow down through each result
- Each check is announced with its name and status ("CI / test — passed" or "lint — failed") — press Enter on a failing check to open its details
- The word "Required" appears after required checks — listen for it to distinguish must-pass checks from informational ones
Low vision users
- Status icons use green (passed), red (failed), yellow (running), and grey (skipped) — each icon also has a text label, so color is not the only indicator
- At high zoom levels, the checks section may appear below the fold — scroll past the PR description and comments to find it above the merge button
- Click "Details" next to any check to open the full log — the log page uses monospace text, so increase font size for readability
Sighted users
- Look for the checks section between the last comment and the merge button on the PR page — it shows a vertical list of check names with colored status icons
- Green checkmark = passed, red X = failed, yellow spinner = running, grey slash = skipped — scan for red X items first
- "Required" checks have a label badge — these must all pass before the merge button turns green
7. Reading the Actions Tab with a Screen Reader
The Actions tab of a repository shows the history of all workflow runs. You can use it to see what ran, what failed, and why.
Getting to the Actions tab
- Open the repository
- Navigate to the "Repository navigation" landmark (
Don NVDA/JAWS) - Find the "Actions" tab link and activate it (
Enter)
Navigating workflow runs (NVDA/JAWS browse mode)
Key Action
H Jump between section headings
3 Jump between workflow run headings (they are h3)
Tab Move between interactive elements (links, buttons)
Enter Open a workflow run to see details
Navigating workflow runs (VoiceOver macOS)
Key Action
VO+U → Headings Open rotor and navigate by heading
VO+Right/Left Read next/previous item
VO+Space Activate a link or button
Reading a run's details
When you open a workflow run, you see:
- Job names listed on the left (or in a sidebar)
- Steps listed within each job
- Green checkmarks (passed) or red X marks (failed) next to each step
To find out why a step failed:
- Navigate to the failed step
- Activate it to expand the log output
- The log is a large text area - switch to focus mode to read it
- Look for lines containing
Error:,FAILED,exit code, orAssertionError
Tip: Log output can be very long. Use your screen reader's search (
NVDA+Ctrl+F,JAWS: Insert+F,VO+F) to search for "error" or "failed" to jump directly to the problem.
8. Common Workflows You Will Encounter
As you contribute to open source repositories, you will see these types of workflows regularly:
Continuous Integration (CI)
What it does: Runs the project's test suite automatically every time code changes.
What you see: A check called "CI", "Tests", "Build", or similar.
If it fails: Your code change may have broken one or more tests. Read the error message in the job log, or ask the maintainer if it is a pre-existing failure.
Linting / Code Style
What it does: Checks that code follows the project's formatting and style rules - things like indentation, line length, or consistent import ordering.
What you see: A check called "Lint", "ESLint", "Prettier", "Flake8", or similar.
If it fails: Usually means a formatting rule was violated. The log will tell you exactly which file and line. Many projects include a command to auto-fix this (e.g., npm run lint:fix).
Spelling / Documentation Checks
What it does: Checks documentation files for spelling errors, broken links, or formatting issues.
What you see: A check called "Spell Check", "markdownlint", "Link Check", or similar.
If it fails: There is a typo or formatting issue in a doc file. Very common on documentation-only contributions.
Accessibility Scanning
What it does: Runs automated accessibility checks against HTML output or component libraries to catch WCAG violations.
What you see: A check called "a11y", "Accessibility", "axe", "pa11y", or similar.
If it fails: An accessibility problem was introduced. The log will describe the failing rule (e.g., "Image missing alt text", "Color contrast insufficient"). This is extremely valuable information and exactly the kind of thing this community cares about.
Security Scanning
What it does: Scans for known vulnerabilities in dependencies or exposed secrets.
What you see: A check called "CodeQL", "Dependabot", "Snyk", or similar.
If it fails: A security issue was detected - inform the maintainer and do not merge.
Deployment / Preview Builds
What it does: Builds and deploys a preview version of a website or app from your PR branch.
What you see: A bot comment on your PR with a preview URL, and a check called "Deploy", "Netlify", "Vercel", "GitHub Pages", or similar.
What it gives you: A live preview of what the site will look like with your changes - very useful for visual review and for accessibility testing with your screen reader on the actual rendered output.
9. What To Do When a Check Fails
This happens to every contributor. It is normal. Here is your step-by-step process:
Step 1: Don't panic
A failing check is information, not a judgment. It is the system telling you something specific needs attention.
Step 2: Navigate to the failed check
From your PR's Conversation tab:
- Scroll down to the checks section (press
Dto reach the "Checks" region if using a screen reader) - Find the failing check (red X)
- Press
Enteron "Details" (or the check name itself) to open the workflow run
Step 3: Find the failing step
In the workflow run:
- Look for the step with the red X marker
- Press
EnterorSpaceto expand the log output
Step 4: Read the error message
Look for:
Error:- describes what went wrongFAILEDorFAIL- test failure summary- File name and line number - where exactly the problem is
exit code 1(or non-zero) - the command failed
Step 5: Fix the issue locally (or in the web editor)
Common fixes:
- Test failure: Understand what the test expects and whether your change broke something intentional
- Lint failure: Run the project's format/lint command, or manually fix the flagged lines
- Spell check failure: Fix the typo noted in the log
- Accessibility failure: Fix the specific a11y violation described (missing alt text, contrast issue, etc.)
Step 6: Commit and push the fix
- The workflow will automatically re-run when you push new commits to the branch
- No need to close and re-open the PR
Step 7: If you're stuck
It is completely acceptable to comment on your PR:
"The CI check is failing on [step name]. I've read the error log and I'm not sure how to fix [specific issue]. Could a maintainer point me in the right direction?"
Asking for help is not weakness. It is collaboration.
Learning Cards: What To Do When a Check Fails
Screen reader users
- From the failing check's Details link, the log page has a sidebar listing job steps — the failed step has focus or is announced as "failed"; expand it to read the error
- Use your screen reader's find command (NVDA+Ctrl+F, JAWS: Insert+F) to search the log for "Error:" or "FAILED" — this skips hundreds of passing log lines
- After pushing a fix, return to the PR page — checks re-run automatically and the status updates from red X to yellow spinner to green checkmark
Low vision users
- CI log pages can be very long with small monospace text — use Ctrl+F in your browser to search for "Error" or "FAIL" rather than scrolling through everything
- The failing step is marked with a red X icon in the left sidebar of the log page — zoom in to identify it, then click to expand only that step
- If you cannot read the log comfortably, copy the error text and paste it into your editor at a larger font size
Sighted users
- On the workflow run page, the left sidebar shows all job steps — the failing step has a red X icon; click it to jump directly to the error output
- Error messages are usually highlighted in red within the log output — scan for red text and the phrases "Error:", "FAILED", or "exit code 1"
- After pushing a fix, watch for the yellow spinner on the PR page to confirm that checks are re-running
10. Workflow Permissions and Security
Why some workflows need your approval
If you are contributing to a repository for the first time, GitHub may hold your workflow runs for approval. You will see a message like:
"Workflows aren't being run on this pull request. A maintainer must approve this."
This is a security feature - it prevents malicious code from running on the maintainer's infrastructure before they have reviewed it. Do not be alarmed. Simply add a comment like:
"Ready for review. Could a maintainer approve the workflow runs?"
What you should never do
- Never change workflow files to bypass checks (e.g., deleting tests to make them pass)
- Never add secrets or credentials to workflow files or code
- Never approve a workflow run on someone else's PR unless you have reviewed the code
Dependabot
Dependabot is an automated bot built into GitHub that creates pull requests to update outdated or vulnerable dependencies. You will see PRs in a repository from a user called dependabot[bot]. These are automated, not from a person. Maintainers typically review and merge these. As a contributor, you usually don't need to interact with them, but it is good to know they exist.
11. Accessibility-Focused Workflows
This is relevant to our event specifically. The open source accessibility community actively uses GitHub Actions to automatically catch accessibility regressions - meaning, to ensure that new code does not introduce new accessibility barriers.
GitHub's Accessibility Scanner Action
GitHub itself has open-sourced an AI-powered Accessibility Scanner that can be added to a repository. It uses AI to find, file, and help fix accessibility bugs using GitHub Copilot.
A basic workflow using it looks like this:
name: Accessibility Scan
on:
pull_request:
branches: [main]
jobs:
a11y:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Accessibility Scanner
uses: github/accessibility-scanner@v1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
Common tools used in a11y workflows
| Tool | What It Checks |
|---|---|
| axe-core | WCAG violations in HTML/rendered pages |
| pa11y | Automated accessibility testing against URLs |
| jest-axe | axe checks inside unit tests |
| Lighthouse CI | Accessibility + performance scoring |
| IBM Equal Access Checker | WCAG 2.1 / 2.2 compliance checking |
What these tools catch (and what they do not)
Automated tools catch approximately 30-40% of accessibility issues - things like missing alt attributes, insufficient color contrast ratios, or unlabeled form fields. The remaining issues require human testing, especially with actual assistive technology like your screen reader.
This is precisely why manual testing by people who use screen readers is so valuable and irreplaceable.
Preparing the Environment for GitHub-Hosted Agents
When custom agents run on GitHub.com - triggered by an issue assignment or a Copilot Chat task - they need any external tools pre-installed before they start working. GitHub recognizes a special setup workflow for this: a workflow file with a single job named copilot-setup-steps.
Location: .github/workflows/copilot-setup-steps.yml
name: Copilot Setup Steps
on: workflow_dispatch
jobs:
copilot-setup-steps:
runs-on: ubuntu-latest
steps:
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install accessibility testing tools
run: npm install -g @axe-core/cli markdownlint-cli2
What this does: Before a Copilot coding agent begins working, GitHub runs this job to prepare the environment. Without it, an agent that needs markdownlint-cli2 (for the Markdown Accessibility Assistant) or @axe-core/cli (for WCAG scanning) will fail because those tools are not present.
The job name copilot-setup-steps is required - GitHub won't recognize any other name for agent environment preparation.
Connection to Section 13 of the VS Code guide: This is the infrastructure that enables Scope 3 (cloud execution) of the three-layer Accessibility Agents model. The same agent you run in VS Code with @markdown-accessibility-assistant can run on GitHub.com automatically - but only if the environment is prepared with this workflow.
12. Hands-On Activity
Activity: Explore a Workflow in This Repository
Goal: Practice navigating the Actions tab and reading a workflow file using your screen reader.
Steps
- Navigate to your Learning Room repository on GitHub
- Go to the Actions tab (in the Repository navigation landmark)
- Use
3(NVDA/JAWS) or the Headings rotor (VoiceOver) to navigate the list of workflow runs - Open the most recent run
- Find any failed step and expand its log
- Navigate to the
.github/workflows/folder via the Code tab - Open a workflow
.ymlfile - Read through the file and identify:
- What event triggers it
- What OS it runs on
- How many steps it has
- What the last step does
Discussion questions
- What would happen if you opened a PR and the "Accessibility Scan" check failed?
- Where would you look to find out what accessibility violation was detected?
- If you disagreed with a failing lint check, what would be the appropriate way to raise that with a maintainer?
13. What We Are NOT Covering (And Where to Learn More)
GitHub Actions is a deep topic. This workshop covers what you need as a contributor. We are intentionally not diving into:
- Writing workflow files from scratch
- Setting up self-hosted runners
- Creating custom Actions
- Advanced workflow patterns (matrix builds, reusable workflows, environments)
- Secrets management and OIDC authentication
When you are ready to go deeper, these are the best places to start:
| Resource | Link |
|---|---|
| GitHub Actions Documentation | GitHub Actions docs |
| GitHub Skills: Hello GitHub Actions | Hello GitHub Actions course |
| GitHub Skills: Continuous Integration | Continuous Integration course |
| GitHub Marketplace (Actions) | GitHub Marketplace for Actions |
| GitHub Accessibility Scanner | Accessibility Scanner action |
| GitHub Actions Accessibility Conformance Report | Accessibility conformance report |
Summary
| Concept | Key Takeaway |
|---|---|
Workflows live in .github/workflows/ |
YAML files that define automation |
| Triggers fire workflows | push, pull_request, schedule are the most common |
| Status checks appear on your PR | Green checkmark, Red X, Yellow circle = pass, fail, running |
| Required checks must pass | Configured by maintainers - blocks merging if failing |
| Failing checks are normal | Read the log, fix the issue, push again |
| a11y workflows catch ~30-40% of issues | Human screen reader testing catches the rest |
| First-time contributors may need approval | A security feature - ask a maintainer politely |
Day 2 Bridge - From Actions to Agentic Workflows
Understand standard YAML workflow files before engaging with agentic workflows. GitHub Agentic Workflows are not a separate technology - they are the next layer on top of what you learned here. They share the same trigger model, the same permissions system, and the same
.github/workflows/directory. You cannot evaluate whether an agentic workflow is safe or correct unless you can already read a standard one.The three layers, in sequence - each builds on the one before it:
- Standard GitHub Actions - YAML files in
.github/workflows/; define triggers and structured shell steps; what you mastered in this guide- Accessibility Agents in VS Code -
.agent.mdfiles in.github/agents/; define behavior in plain English; GitHub Copilot Chat executes them on demand in your editor - same.github/folder, plain text, no YAML required- GitHub Agentic Workflows in the cloud -
.mdfiles in.github/workflows/; define intent in plain Markdown frontmatter; a coding agent (Copilot CLI, Claude Code, OpenAI Codex) executes them inside GitHub Actions on any trigger - no VS Code, no local setup requiredAll three live in
.github/. All three are plain text. All three run on your behalf. The only difference is where they run and how sophisticated their executor is.You cannot skip a layer. Each one only makes sense because you understand the one before it.
Next: Appendix R: Projects Deep Dive
Back: Appendix P: Security Features
Teaching chapter: Chapter 17: Issue Templates
Authoritative Sources
Use these official references when you need the current source of truth for facts in this chapter.
- GitHub Docs, home
- GitHub Changelog
- Workflow syntax for GitHub Actions
- Secure use reference for GitHub Actions
- GitHub Actions changelog
Section-Level Source Map
Use this map to verify facts for each major section in this file.
- Understanding Automation in Open Source Repositories: GitHub Docs, home, GitHub Changelog, Workflow syntax for GitHub Actions, Secure use reference for GitHub Actions, GitHub Actions changelog
- 1. What Is GitHub Actions?: GitHub Docs, home, GitHub Changelog, Workflow syntax for GitHub Actions, Secure use reference for GitHub Actions, GitHub Actions changelog
- 2. Key Vocabulary: GitHub Docs, home, GitHub Changelog, Workflow syntax for GitHub Actions, Secure use reference for GitHub Actions, GitHub Actions changelog
- 3. Where Workflows Live in a Repository: GitHub Docs, home, GitHub Changelog, Workflow syntax for GitHub Actions, Secure use reference for GitHub Actions, GitHub Actions changelog
- 4. The Anatomy of a Workflow File: GitHub Docs, home, GitHub Changelog, Workflow syntax for GitHub Actions, Secure use reference for GitHub Actions, GitHub Actions changelog
- 5. What Triggers a Workflow: GitHub Docs, home, GitHub Changelog, Workflow syntax for GitHub Actions, Secure use reference for GitHub Actions, GitHub Actions changelog
- 6. Understanding Status Checks on Pull Requests: GitHub Docs, home, GitHub Changelog, Workflow syntax for GitHub Actions, Secure use reference for GitHub Actions, GitHub Actions changelog
- 7. Reading the Actions Tab with a Screen Reader: GitHub Docs, home, GitHub Changelog, Workflow syntax for GitHub Actions, Secure use reference for GitHub Actions, GitHub Actions changelog
- 8. Common Workflows You Will Encounter: GitHub Docs, home, GitHub Changelog, Workflow syntax for GitHub Actions, Secure use reference for GitHub Actions, GitHub Actions changelog
- 9. What To Do When a Check Fails: GitHub Docs, home, GitHub Changelog, Workflow syntax for GitHub Actions, Secure use reference for GitHub Actions, GitHub Actions changelog
- 10. Workflow Permissions and Security: GitHub Docs, home, GitHub Changelog, Workflow syntax for GitHub Actions, Secure use reference for GitHub Actions, GitHub Actions changelog
- 11. Accessibility-Focused Workflows: GitHub Docs, home, GitHub Changelog, Workflow syntax for GitHub Actions, Secure use reference for GitHub Actions, GitHub Actions changelog
- 12. Hands-On Activity: GitHub Docs, home, GitHub Changelog, Workflow syntax for GitHub Actions, Secure use reference for GitHub Actions, GitHub Actions changelog
- 13. What We Are NOT Covering (And Where to Learn More): GitHub Docs, home, GitHub Changelog, Workflow syntax for GitHub Actions, Secure use reference for GitHub Actions, GitHub Actions changelog
- Summary: GitHub Docs, home, GitHub Changelog, Workflow syntax for GitHub Actions, Secure use reference for GitHub Actions, GitHub Actions changelog