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 runningdomo 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:- Make code changes
- Commit and push
- Manually run
domo login - Run
domo publish - Wait and monitor
- Repeat for each environment
- Make code changes
- Push to GitHub
- Everything else happens automatically
Quick setup
- Get your Domo credentials: Admin → Authentication → Personal Access Tokens
- Add to GitHub Secrets: Store the token as
DOMO_ACCESS_TOKENin your repository - Create workflow file: Add to
.github/workflows/deploy.yml - Push and relax: Your app deploys automatically on merge
Inputs
Outputs
Usage examples
React / Vite app (recommended pattern)
Source at the repo root, Vite emits to./build:
./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 usesda apply-manifestin its build (prestart/prebuild/build:devetc.), add@domoinc/dato yourdevDependencies. 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 withsh: 1: da: not found. Pinning it as a devDependency puts the binary innode_modules/.binwhere npm scripts can find it.
ProCode / flat app (no build)
Whenmanifest.json, index.html, etc. live at the repo root and there’s no build step:
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:
With per-environment manifest overrides
Domo Apps templates ship withda 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: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 thepnpm binary available on the runner:
You don’t need a separatenpm install/yarn install/pnpm installstep — 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 neednode_modules.
Migrating from v2
v3 reframesworking-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.).
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, wherepublic/manifest.jsontypically has noid). Result: a brand-new app on every run, even though your build output had the rightid. v3 chdirs intopublish-dirfirst and runs plaindomo publish, so ryuu reads the manifest your build actually emitted. Tools likeda apply-manifestthat write the resolved id into the build output Just Work now. ./build/buildresolution bug (the v2working-directory+--build-dirinteraction) is gone.
Troubleshooting
Debug logs
Enable verbose logs by setting these as GitHub Actions secrets on your repo:ACTIONS_STEP_DEBUG=trueACTIONS_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:
WhyExample for GitLab CI:cdinstead of--build-dir: ryuu readsmanifest.jsonbefore applying its own--build-dirchdir, so it would resolve the manifest against the caller’s CWD (oftenpublic/manifest.jsonwith noid) — 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.