Depot CI compatibility with GitHub Actions

Depot

5 min read Original article ↗

Depot CI executes GitHub Actions YAML workflows. The following tables list GitHub Actions syntax, triggers, and configuration and whether they're supported in Depot CI.

Workflow-level configuration

FieldPurposeSupported
nameWorkflow display name✅
run-nameDynamic run title✅
onWorkflow triggers✅
on.workflow_callReusable workflow definition✅
on.workflow_call.inputsReusable workflow inputs✅
permissionsToken scopes✅
envWorkflow environment variables✅
defaultsDefault settings (shell, working-directory)✅
concurrencyConcurrency control✅
jobsJobs definition✅

Triggers (on.*)

FieldEvent typeSupported
on.<event_name>Event triggers✅
on.<event_name>.typesEvent trigger types✅
on.merge_groupMerge queue triggers✅
on.push.branchesPush branch filters✅
on.push.tagsPush tag filters✅
on.pull_requestPull request triggers✅
on.pull_request.branchesPR branch filters✅
on.pull_request_targetPull request triggers from the base branch context✅
on.pull_request_reviewPull request review triggers✅
on.deployment_statusDeployment status triggers✅
on.*.pathsPath filters✅
on.scheduleCron schedule triggers✅
on.workflow_call.inputs.*Reusable workflow inputs (type, default, required)✅
on.workflow_call.outputsReusable workflow outputs✅
on.workflow_call.secretsReusable workflow secrets definition✅
on.workflow_runWorkflow run triggers✅
on.workflow_dispatchManual dispatch triggers✅
on.workflow_dispatch.inputsManual dispatch inputs✅
on.repository_dispatchCustom events sent through the GitHub API✅
on.repository_dispatch.typesCustom event type filters✅

Native GitHub stacked pull requests

Depot CI supports native GitHub stacked pull requests for pull_request workflows. Depot CI evaluates a stack's branches filter against its ultimate base branch, then runs the matching workflow for each pull request in the stack using that pull request's own merge ref.

For pull requests in a stack, github.event.pull_request.stack exposes the stack's number, size, position, base.ref, and base.sha. The value is null for a pull request that is not in a stack.

For ordinary pull requests without stack metadata, Depot CI continues to match pull_request.branches against the pull request's direct base branch.

Repository dispatch events

repository_dispatch lets you trigger Depot CI workflows from outside GitHub by sending a custom event to the GitHub API — useful for kicking off a run from another system (for example, a deployment provider) without polling or running your own relay.

Subscribe to every dispatch, or filter by event type with types:

on:
  repository_dispatch:
    types: [deploy-succeeded]

GitHub only delivers repository_dispatch events against your repository's default branch, so the workflow that runs is the one on the default branch. The custom event type and any client_payload you send are available through the github.event context (github.event.action and github.event.client_payload), matching GitHub Actions.

Job-level configuration (jobs.<job_id>.*)

FieldPurposeSupportedNotes
jobs.<job_id>Job definition✅
jobs.<job_id>.nameJob display name✅
jobs.<job_id>.needsJob dependencies / DAG✅
jobs.<job_id>.ifConditional job execution✅
jobs.<job_id>.runs-onRunner selection❌We respect Depot runner labels and treat non-Depot labels as depot-ubuntu-latest.
jobs.<job_id>.permissionsJob-scoped permissions✅
jobs.<job_id>.environmentDeployment environments❌
jobs.<job_id>.concurrencyJob-level concurrency✅
jobs.<job_id>.outputsJob outputs / cross-job data✅
jobs.<job_id>.envJob environment variables✅
jobs.<job_id>.defaultsJob default settings✅
jobs.<job_id>.timeout-minutesJob timeout✅
jobs.<job_id>.strategyMatrix strategy✅
jobs.<job_id>.[strategy.fail]Matrix fail-fast✅
jobs.<job_id>.strategy.max-parallelMatrix parallel limit✅
jobs.<job_id>.continue-on-errorAllow job failure✅
jobs.<job_id>.containerJob container✅
jobs.<job_id>.servicesService containers✅
jobs.<job_id>.usesReusable workflow call✅
jobs.<job_id>.withReusable workflow inputs✅
jobs.<job_id>.secretsReusable workflow secrets✅
jobs.<job_id>.secrets.inheritInherit all secrets✅
jobs.<job_id>.stepsStep definitions✅
jobs.<job_id>.snapshotCustom images from sandbox snapshots✅See Build and use custom images with Depot CI

Step-level configuration

FieldPurposeSupported
steps[*].idStep identifier✅
steps[*].nameStep display name✅
steps[*].ifConditional step execution✅
steps[*].usesAction reference✅
steps[*].runShell command execution✅
steps[*].shellShell type (bash, pwsh, python)✅
steps[*].withAction inputs✅
steps[*].envStep environment variables✅
steps[*].working-directoryStep working directory✅
steps[*].continue-on-errorAllow step failure✅
steps[*].timeout-minutesStep timeout✅

Expressions

Contexts

ContextPurposeSupported
githubEvent payload, repo, actor✅
envEnvironment variables✅
varsRepository/org variables✅
secretsSecret values✅
needsDependent job outputs✅
strategyMatrix strategy info✅
matrixCurrent matrix values✅
stepsPrior step outputs✅
jobCurrent job info✅
runnerRunner info✅
inputsWorkflow inputs✅

Functions

FunctionPurposeSupported
always()Run regardless of status✅
success()Run if no failures✅
failure()Run if any failure✅
cancelled()Run if cancelled✅
case()Conditional value select✅
hashFiles()File hashing for caching✅
contains()String/array contains✅
startsWith()String prefix check✅
endsWith()String suffix check✅
format()String formatting✅
join()Array to string✅
toJSON()Object to JSON✅
fromJSON()JSON to object✅

Action types

TypeDescriptionSupported
JavaScriptNode 12/16/20/24 actions✅
CompositeComposite actions✅
DockerContainer actions✅

GitHub checks

Depot CI automatically reports GitHub checks for each job in a workflow run. For more information, see GitHub checks.

Limitations

GitHub-only event triggers

The following events are GitHub-specific concepts that aren't applicable to Depot CI workflows, such as Discussions, Pages, and issue events other than comments.

FieldEvent typeSupported
on.branch_protection_ruleGitHub specific event trigger❌
on.check_runGitHub specific event trigger❌
on.check_suiteGitHub specific event trigger❌
on.createGitHub specific event trigger❌
on.deleteGitHub specific event trigger❌
on.deploymentGitHub specific event trigger❌
on.discussionGitHub specific event trigger❌
on.discussion_commentGitHub specific event trigger❌
on.forkGitHub specific event trigger❌
on.gollumGitHub specific event trigger❌
on.image_versionGitHub specific event trigger❌
on.issuesGitHub specific event trigger❌
on.labelGitHub specific event trigger❌
on.milestoneGitHub specific event trigger❌
on.page_buildGitHub specific event trigger❌
on.publicGitHub specific event trigger❌
on.pull_request_commentGitHub specific event trigger❌
on.pull_request_review_commentGitHub specific event trigger❌
on.registry_packageGitHub specific event trigger❌
on.releaseGitHub specific event trigger❌
on.statusGitHub specific event trigger❌
on.watchGitHub specific event trigger❌

Reusable workflows from other repositories

The uses key for referencing workflows from other repositories is not supported. You can still use uses to reference actions from the GitHub Actions Marketplace (for example, uses: actions/checkout@v4).

Pull request workflows triggered from forks

GitHub allows pull_request and pull_request_target workflows to run when triggered from forked repositories. Support for this is planned.

Runner labels

Only Depot runs-on labels are supported. Nonstandard labels become depot-ubuntu-latest and expressions are preserved as-is. For Depot CI sandbox sizes and labels, see Depot CI sandboxes.

Permissions

The following permissions are supported: actions, checks, code-quality, contents, id-token, metadata, pull_requests, statuses, workflows.

The code-quality permission must be requested explicitly. It isn't included in read-all or write-all, which retain the existing permission set so older Depot Code Access GitHub App installations don't fail token creation before the new permission is approved.

GitHub Packages authentication

Pushing and pulling from GitHub Packages registries using secrets.GITHUB_TOKEN doesn't work in Depot CI. GitHub's package registry servers only accept personal access tokens for authentication, not GitHub App tokens. This is a known GitHub limitation (see discussions: Read GitHub Packages permission for GitHub App and Using GitHub Packages with GitHub Apps).

For container images, you can use another registry instead, such as Depot Registry. When using depot/build-push-action, replace the GHCR login and push steps with the save input:

- uses: depot/build-push-action@v1
  with:
    context: .
    project: <your-depot-project-id>
    save: true
    save-tags: |
      latest
      ${{ github.sha }}

See the Depot Registry quickstart for pulling images and other usage.

This limitation applies to all GitHub Packages registries, not just the container registry. If you need to keep using a GitHub Packages registry, you can authenticate with a GitHub personal access token with write:packages scope, stored as a Depot CI secret.

Note that a PAT is a long-lived credential scoped to a user account, so consider the security implications of storing and rotating it.