Skip to main content

Historical Onboarding

Populate your MemBrowse project with memory data from past commits. This is a one-time, optional step that gives you historical trends from day one instead of waiting for new commits to build up a baseline.

When to Use This

  • You're adding MemBrowse to an existing project and want to see historical memory trends immediately
  • You want to identify when a past memory regression was introduced

You only need to run this once. After that, your regular CI workflow will track every new commit automatically.

Create the Onboard Workflow

Create .github/workflows/membrowse-onboard.yml:

name: Onboard to MemBrowse
on:
workflow_dispatch:
inputs:
num_commits:
description: 'Number of commits to process'
required: true
default: '50'
type: string

jobs:
onboard:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
with:
fetch-depth: 0

# Add your build tool setup here (e.g., arm-none-eabi-gcc)

- name: Historical analysis
uses: membrowse/membrowse-action/onboard-action@v1
with:
num_commits: ${{ github.event.inputs.num_commits }}
build_script: make all # Your build command
elf: build/firmware.elf # Path to your ELF file
ld: linker.ld # Path to your linker script(s)
target_name: my-target # Must match your CI workflow
api_key: ${{ secrets.MEMBROWSE_API_KEY }}
# linker_vars: "__flash_size__=512K" # Optional: linker variable definitions
Start small

Each commit requires a full build, so processing many commits can take a while. Start with 10-20 commits to verify everything works, then run again with a larger number. GitHub Actions has a 6-hour job timeout.

Multiple targets

If you followed the Multiple Targets setup with membrowse-targets.json, use the matrix pattern instead:

jobs:
setup:
runs-on: ubuntu-latest
outputs:
targets: ${{ steps.read-targets.outputs.targets }}
steps:
- uses: actions/checkout@v5

- name: Read targets configuration
id: read-targets
run: echo "targets=$(jq -c '.targets' .github/membrowse-targets.json)" >> $GITHUB_OUTPUT

onboard:
needs: setup
runs-on: ubuntu-latest
strategy:
matrix:
target: ${{ fromJson(needs.setup.outputs.targets) }}
steps:
- uses: actions/checkout@v5
with:
fetch-depth: 0

# Add your build tool setup here (e.g., arm-none-eabi-gcc)

- name: Historical analysis for ${{ matrix.target.name }}
uses: membrowse/membrowse-action/onboard-action@v1
with:
num_commits: ${{ github.event.inputs.num_commits }}
build_script: ${{ matrix.target.build_script }}
elf: ${{ matrix.target.elf }}
ld: ${{ matrix.target.ld }}
target_name: ${{ matrix.target.name }}
api_key: ${{ secrets.MEMBROWSE_API_KEY }}
linker_vars: ${{ matrix.target.def }}

Action Reference

Inputs (membrowse/membrowse-action/onboard-action@v1)

InputRequiredDescription
num_commitsNoNumber of historical commits to process (required unless commits is provided)
commitsNoSpace-separated list of commit hashes and/or tags to process. Mutually exclusive with num_commits and initial_commit.
build_scriptYesShell command to build the firmware
elfYesPath to generated ELF file after build
ldNoPath to linker script(s), space-separated. If omitted, MemBrowse uses default Code/Data regions based on ELF section flags.
target_nameYesTarget platform name
api_keyYesMemBrowse API key
api_urlNoMemBrowse API base URL (default: https://api.membrowse.com)
linker_varsNoLinker script variable definitions, space-separated (e.g., __flash_size__=4096K __ram_size__=256K)
build_dirsNoSpace-separated directories that trigger rebuilds. Commits with no changes in these directories upload metadata-only reports. Mutually exclusive with binary_search.
initial_commitNoStart processing from this commit hash instead of HEAD~N. Only valid with num_commits.
initial_parentNoSet the parent of the first commit when using commits. Used to chain multiple onboard runs together. Only valid with commits.
binary_searchNoUse binary search to minimize builds — builds endpoints first, compares memory fingerprints, and only builds midpoints where changes are detected (default: false). Mutually exclusive with build_dirs.
verboseNoLogging level: WARNING, INFO, or DEBUG (default: WARNING)

Onboarding Specific Commits

Instead of processing the last N commits, you can pass a specific list of commit hashes or tags using the commits input. This is useful for onboarding release versions or specific milestones:

      - name: Historical analysis
uses: membrowse/membrowse-action/onboard-action@v1
with:
commits: "v1.0 v1.1 v2.0 v2.1 v3.0"
build_script: make all
elf: build/firmware.elf
ld: linker.ld
target_name: my-target
api_key: ${{ secrets.MEMBROWSE_API_KEY }}

Chaining multiple runs

Use initial_parent to chain runs together. This sets the parent of the first commit, so the commit chain in MemBrowse is continuous across separate onboard runs:

      - name: Onboard v2.x releases
uses: membrowse/membrowse-action/onboard-action@v1
with:
commits: "v2.0 v2.1 v2.2"
initial_parent: v1.9
build_script: make all
elf: build/firmware.elf
ld: linker.ld
target_name: my-target
api_key: ${{ secrets.MEMBROWSE_API_KEY }}

For large histories, use binary_search to reduce the number of builds. It builds the first and last commit, compares their memory fingerprints, and only builds midpoints where changes are detected:

      - name: Historical analysis (binary search)
uses: membrowse/membrowse-action/onboard-action@v1
with:
num_commits: 200
build_script: make all
elf: build/firmware.elf
ld: linker.ld
target_name: my-target
api_key: ${{ secrets.MEMBROWSE_API_KEY }}
binary_search: true

Running the Workflow

  1. Go to your repository on GitHub
  2. Click the Actions tab
  3. Select Onboard to MemBrowse from the left sidebar
  4. Click Run workflow
  5. Enter the number of commits to process (default: 50)
  6. Click Run workflow

The action checks out each historical commit, runs your build script, and uploads the memory report. Commits that fail to build are skipped automatically.

Troubleshooting

Build fails on older commits

The onboarding action checks out each historical commit and runs your build script. Ensure:

  • All build dependencies are installed in the workflow
  • The build script works for older commits (watch for renamed files, removed targets, etc.)
  • The action skips commits that fail to build, so partial results are still uploaded