Skip to main content

What is it?

The Domo Publish Action is a GitHub Action that automatically deploys your Domo applications directly from your GitHub repository to your Domo instance. No manual steps, no command-line hassles — just push your code and let CI/CD handle the rest.

Why you want to use it

If you’re manually running domo publish every time you make changes, you’re wasting valuable development time. The Domo Publish Action eliminates repetitive deployment tasks by:
  • Automating the entire publish workflow when code is merged
  • Controlling access to production deployments without giving every developer publish permissions. Use a dedicated CI/CD service account with properly scoped grants, so only approved code that passes your review process gets deployed
  • Securing your credentials with GitHub Secrets instead of local tokens
  • Supporting multiple environments (dev, staging, production)
  • Providing instant feedback with detailed deployment status in your PR checks

How it accelerates development

Traditional workflow:
  1. Make code changes
  2. Commit and push
  3. Manually run domo login
  4. Run domo publish
  5. Wait and monitor
  6. Repeat for each environment
With Domo Publish Action:
  1. Make code changes
  2. Push to GitHub
  3. Everything else happens automatically

Quick setup

  1. Get your Domo credentials: Admin → Authentication → Personal Access Tokens
  2. Add to GitHub Secrets: Store the token as DOMO_ACCESS_TOKEN in your repository
  3. Create workflow file: Add to .github/workflows/deploy.yml
  4. Push and relax: Your app deploys automatically on merge
The result? More time building features, less time managing deployments, credentials, and permissions. Your Domo apps deploy consistently, securely, and automatically with every merge.

Inputs

Outputs

Usage examples

Source at the repo root, Vite emits to ./build:
Source in a subfolder (./app):
publish-dir is resolved relative to working-directory, so ./dist above means ./app/dist.

Create React App (CRA)

CRA + da apply-manifest — if your CRA template uses da apply-manifest in its build (prestart / prebuild / build:dev etc.), add @domoinc/da to your devDependencies. The CLI is typically installed globally on developer machines, so locally it works; in CI’s clean install it isn’t on PATH and the build fails with sh: 1: da: not found. Pinning it as a devDependency puts the binary in node_modules/.bin where npm scripts can find it.

ProCode / flat app (no build)

When manifest.json, index.html, etc. live at the repo root and there’s no build step:
Defaults handle this — working-directory: . and publish-dir falls back to working-directory.

With pre-build checks (lint, test, type-check)

build-command is a shell string — chain with && to gate the publish on quality checks:
Or split into a dedicated checks step before this one — failures block the deploy:

With per-environment manifest overrides

Domo Apps templates ship with da apply-manifest (from the @domoinc/da CLI) to swap dataset IDs / app IDs per environment. Add @domoinc/da to your devDependencies so it’s available in CI, then chain it into your build:

Multi-environment deploys (dev / qa / prod)

A single workflow keyed off the branch:
Stash three secrets (DOMO_TOKEN_DEV, DOMO_TOKEN_QA, DOMO_TOKEN_PROD) and three build scripts (build:dev, build:qa, build:prod).

Deploy only when app code changes

Skip a deploy when only docs or workflows change:

Using outputs (status checks, notifications)

pnpm and yarn

The action auto-detects your package manager from the lockfile and runs the install for you. For pnpm you still need to make the pnpm binary available on the runner:
You don’t need a separate npm install / yarn install / pnpm install step — the action does it for you using whichever package manager matches your lockfile. Add your own install step only if you have pre-build commands (lint, test, type-check) running in earlier steps that need node_modules.

Migrating from v2

v3 reframes working-directory to mean the source directory. The new publish-dir input names the build output. In v2, the action used working-directory for both — which meant if you set it to ./build, your build command tried to run from there (no package.json). If you left it at ., the publish step uploaded the entire repo (including docs/, node_modules/, etc.).
If you don’t run a build (flat ProCode app), no change is needed — defaults still publish from the repo root.

Also fixed in v3

  • Each deploy no longer creates a new design. v2 invoked domo publish --build-dir <dir>, which made ryuu read the manifest from the caller’s CWD (your repo root, where public/manifest.json typically has no id). Result: a brand-new app on every run, even though your build output had the right id. v3 chdirs into publish-dir first and runs plain domo publish, so ryuu reads the manifest your build actually emitted. Tools like da apply-manifest that write the resolved id into the build output Just Work now.
  • ./build/build resolution bug (the v2 working-directory + --build-dir interaction) is gone.

Troubleshooting

Debug logs

Enable verbose logs by setting these as GitHub Actions secrets on your repo:
  • ACTIONS_STEP_DEBUG = true
  • ACTIONS_RUNNER_DEBUG = true

Using with other CI/CD platforms

The Domo Publish Action uses the Domo CLI (ryuu npm package) under the hood, which means the same pattern works with any CI/CD platform that supports Node.js. Whether you’re using GitLab CI, Jenkins, CircleCI, Azure DevOps, or any other platform, you can adapt this workflow: Core pattern:
Why cd instead of --build-dir: ryuu reads manifest.json before applying its own --build-dir chdir, so it would resolve the manifest against the caller’s CWD (often public/manifest.json with no id) — causing a brand-new design to be created on every run. Chdir-ing yourself first lets ryuu’s manifest lookup land directly on the resolved file your build emitted.
Example for GitLab CI:
The same three-step pattern (install → authenticate → publish) works universally across any CI/CD platform with Node.js support.