Instead of writing shell scripts to install tools, you can reference GitHub Actions directly in your blueprint’sDocumentation Index
Fetch the complete documentation index at: https://docs.devin.ai/llms.txt
Use this file to discover all available pages before exploring further.
initialize or maintenance sections. Devin downloads and runs the action during the snapshot build, the same way GitHub’s CI runners execute action steps.
This is especially useful for language setup actions like setup-python, setup-node, and setup-go, which handle version management and PATH configuration automatically.
Syntax
Add auses step to any section of your blueprint:
| Field | Type | Description |
|---|---|---|
name | string (optional) | Human-readable label shown in build logs |
uses | string | GitHub Action reference (see format below) |
with | map (optional) | Input parameters passed to the action |
env | map (optional) | Extra environment variables for the step |
A step must specify either
run (a shell command) or uses (an action), not both.Action reference format
github.com/ prefix and @<ref> suffix are both required. The ref is typically a version tag like v5.
Examples:
| Reference | What it resolves to |
|---|---|
github.com/actions/setup-python@v5 | actions/setup-python at tag v5 |
github.com/actions/setup-node@v4 | actions/setup-node at tag v4 |
github.com/gradle/actions/setup-gradle@v4 | gradle/actions repo, setup-gradle subdirectory, tag v4 |
Passing inputs
Use thewith field to pass inputs to the action. All values are treated as strings, matching GitHub Actions behavior:
Setting environment variables
Use theenv field to set environment variables scoped to a single action step:
GITHUB_ENV or GITHUB_PATH) are automatically propagated to subsequent steps in the blueprint.
Examples
Python project with a specific version
Multi-language project
Mixing actions with shell commands
Actions and shell commands can be freely mixed in the same section:Java project with Gradle
Actions vs. shell scripts
You don’t have to use actions — plain shell commands work fine. Actions are a convenience when the equivalent shell script would be long or error-prone.- With GitHub Actions
- Equivalent shell script
How it works
When Devin encounters auses step during a snapshot build:
- Downloads the action repository (shallow clone at the pinned ref)
- Reads the action’s
action.ymlmetadata to determine the runtime and entry points - Builds the execution environment with
INPUT_*,GITHUB_*, andRUNNER_*variables - Runs the action’s
prestep (if defined) then themainentry point - Propagates side effects — any entries written to
GITHUB_PATHorGITHUB_ENVby the action are applied to subsequent blueprint steps
Actions run outside of a real GitHub workflow. Context variables like
github.repository are populated with stub values. Actions that require live GitHub API access (e.g., commenting on PRs, creating releases) will not work in blueprints.Limitations
- Node.js actions only — Only GitHub Actions that use a Node.js runtime (
node16,node20,node24) are supported. Docker-based and composite actions are not supported. - No
postlifecycle — Devin runspreandmainsteps but skipspostcleanup steps, since builds run in disposable VMs. - Stub GitHub context — Actions that rely on GitHub API calls, workflow event data, or repository context may not work correctly because these values are placeholders in the build environment.
- Pin your versions — Always reference a specific version tag (e.g.,
@v5) rather than a branch name for reproducible builds.
