gitstalk
Docs: GitHub Actions

GitHub Actions live

Gitstalk runs the .github/workflows/*.yml files you already have, unchanged, on Cloudflare Containers. A repository moved from GitHub keeps its CI and its deploys.

Quickstart

You do not configure anything. Add a workflow the way you would on GitHub, and Gitstalk starts it when your work reaches the stalk.

  1. Add a workflow

    Put a normal workflow file in the repository.

    .github/workflows/ci.yml
    name: ci
    on:
      push:
        branches: [main]
      workflow_dispatch:
    jobs:
      test:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v4
          - uses: actions/setup-node@v4
            with: { node-version: 24, cache: npm }
          - run: npm ci
          - run: npm test
  2. Push it as a bean

    Beans are branches named bean/<name>. The workflow file is part of the change like any other file.

    Terminal
    git push -o wait origin HEAD:refs/heads/bean/add-ci
  3. The bean lands, then the stalk moves

    The pre-land check passes and the bean lands on the sprout. When validation promotes the sprout, the stalk moves. On Gitstalk the stalk is your main.

  4. The run starts

    A stalk move is a push to main, so ci.yml starts. Open the repository's Automations tab and its Actions view to watch it, or press Run workflow to start it by hand.

acme / api private
ci.ymlsuccess main, moved by bean/add-ci, 1 min ago
deploy.ymlrunning main, moved by bean/fix-retry, 20 s ago
nightly.ymlfailed schedule, 6 h ago
The Automations tab has two views, Actions and Automations. The Actions view lists your workflows, each with the state of its last run. You can filter runs by workflow, status and line (stalk or sprout).
  1. testdone, 21 s
  2. buildrunning
  3. deploywaiting
buildrunning ubuntu-24.04
Set up job2s
Run actions/checkout3s
Run npm run build8s
[Run npm run build] > api@1.4.0 build
[Run npm run build] compiled 212 modules
[Run npm run build] uploading with token ***
The job graph follows needs. The log streams while the job runs, folds by step and shows secrets as ***.

What works today

Runs now live

Runs on a stalk move, Run workflow and schedules. Each job gets its own fresh Cloudflare Container, destroyed when the job ends. Logs stream to the run page. Secrets are masked. Jobs with id-token: write get OIDC tokens on the hosted service.

Not yet planned

pull_request and merge_group events, other caches and artifacts that outlive a job, and the GitHub REST API through GITHUB_TOKEN. Runners other than one Ubuntu container size (see Runners). Concurrency groups are not enforced.

A small Node job (checkout, setup-node, npm test) took about 20 s end to end on the hosted service with the dependency cache.

When workflows run

GitHub event On Gitstalk Status
push to main The stalk moved. main, stalk and your default branch name it, so branches: [main] keeps working. live
workflow_dispatch The Run workflow button or an MCP call, with typed inputs. live
schedule Cron in UTC, at least 5 minutes apart, read from the stalk. live
pull_request Parsed, reported as "not started yet". Planned: it will run on the bean squashed onto the sprout. planned
merge_group Parsed, not started. Planned: the sprout's validation. planned
push to tags, repository_dispatch, workflow_run, workflow_call Parsed and reported as "not started yet". planned

Compatibility report

Gitstalk reads each workflow file with GitHub's own parser and expression library. The workflow's page lists what will not run exactly as written, and the Actions view counts the workflows that have notes. Each note says it runs differently (with the difference) or never runs here (with the reason). Everything else runs.

deploy.ymlCompatibility: 3 notes on what runs differently here.
concurrency: groups are not enforced yet; the repository runs at most 4 jobs at once differs
jobs.deploy.environment: environments and their approvals are ignored differs
on: pull_request is parsed, but Gitstalk does not start runs for it yet later
Shape of the report. The exact wording comes from the file.

What runs

Feature Result
Jobs, needs, if, outputs, run steps, timeout-minutes, permissions, secrets, vars Runs
JavaScript and composite actions, unmodified actions/checkout Runs
Matrices Runs, up to 16 legs per job
actions/setup-node with cache:, and actions/cache of node_modules Runs differently: they become the dependency cache
Other caches and artifacts Runs differently: they last one job, not across jobs
timeout-minutes over the limit Runs differently: capped at 60 minutes
environment: and its approvals Runs differently: ignored, and the report says so
concurrency: Runs differently: groups are not enforced; the repository runs at most 4 jobs at once
Docker actions, container:, services: Runs differently: Docker runs inside the job container; see Docker inside a job. beta Not yet verified on the hosted service.
Reusable workflows (uses: on a job) planned Not run yet
runs-on ubuntu-latest, ubuntu-24.04 and ubuntu-22.04 run, all on one Ubuntu 24.04 image. Anything else never runs. See Runners.
Events for things Gitstalk does not have (issues, releases) Never runs

Job token and OIDC

Each job gets a short-lived token bound to its repository. It is revoked when the job ends and expires on its own shortly after the job's timeout. It can always read the repository.

  • permissions: contents: write lets the token push bean/* branches only. Pushes to the sprout, the stalk and main are refused for every credential, so code a job writes still goes through the pre-land check.
  • permissions: id-token: write gives the job a GitHub-shaped OIDC identity token from a Gitstalk issuer. Once you register the issuer, actions such as aws-actions/configure-aws-credentials and Google's and Azure's equivalents work. Only stalk, dispatch and schedule runs get one; automation runs never do. A self-hosted deployment gives jobs a token only once its owner has set the OIDC keys.

From an agent

An agent connected over MCP runs the same loop you do. The tools are in the beta tool surface, so check the names against your connected server.

  1. Push a bean

    It adds or changes .github/workflows/deploy.yml. When the bean reaches the stalk, the workflow runs.

  2. Wait for the run

    actions_wait_for_run with the bean holds until the runs the landing started finish. The default wait is 600 seconds and the most is 1,800. It answers each run's conclusion and, for a failure, the failing step and the last lines of its log.

  3. Read the log

    actions_job_log reads more: the newest lines, or only lines matching some text, with secrets already masked.

  4. Fix and repeat

    The agent fixes the cause in a new bean, pushes, and waits again.

Tool Needs
actions_workflow_list, actions_run_list, actions_run_get, actions_job_log, actions_wait_for_run, actions_config_list, automation_get Any agent session, with any role that reads the repository
actions_dispatch, actions_rerun (the whole run, same commit and inputs), actions_cancel, automation_run The write scope and the maintain role

Setting secrets from an agent is covered in Secrets and variables.

Related pages

Sources