End-to-end SDLC guide for building, testing, and releasing ServiceNow apps using the ServiceNow SDK, Git, ReleaseOps, and CI/CD pipelines.
← → TO NAVIGATE · Ashwin Patti, Shelby Cohen
This presentation may contain "forward-looking" statements that are based on our beliefs and assumptions and on information currently available to us only as of the date of this presentation. Forward-looking statements involve known and unknown risks, uncertainties, and other factors that may cause actual results to differ materially from those expected or implied by the forward-looking statements. Further information on these and other factors that could cause or contribute to such differences include, but are not limited to, those discussed in the section titled "Risk Factors," set forth in our most recent Annual Report on Form 10-K and Quarterly Report on Form 10-Q and in our other Securities and Exchange Commission filings. We cannot guarantee that we will achieve the plans, intentions, or expectations disclosed in our forward-looking statements, and you should not place undue reliance on our forward-looking statements.
The information on new products, features, or functionality is intended to outline our general product direction and should not be relied upon in making a purchasing decision, is for informational purposes only, and shall not be incorporated into any contract, and is not a commitment, promise, or legal obligation to deliver any material, code, or functionality. The development, release, and timing of any features or functionality described for our products remains at our sole discretion. We undertake no obligation, and do not intend, to update the forward-looking statements.
👋 Welcome — 10:00 AM – 5:00 PM. By the end of today, you'll build, test, source-control, and release a real app end-to-end.
Global apps, non-global apps, and ITSM implementations built via "move and edit" — all under one model.
Customizing an out-of-the-box app you haven't taken "move" ownership of — that metadata has no persistent container of its own; it stays under ServiceNow's ownership, not yours.
One development model regardless of whether you're building net-new or customizing what's already there.
Build engine, compiles to deployable artifacts
IDE / prod code mode
Branch, PR, merge
Isolated dev instance
AI-assisted authoring
Automated test framework
Immutable artifact store
Assess, approve, release
XML, via forms and clicks — hard to read, hard to diff, hard to review.
The exact same XML — no compile step, no type checking, no diagnostics before install.
TypeScript — humans read, write, and reason about it, with compile-time type checking and diagnostics
Still what the platform executes underneath — you just don't touch that representation directly
That's shifting left in practice: mistakes get caught at build time, in your editor, before an install — not at runtime, after something's already broken.
A TypeScript DSL — .now.ts files define metadata with compile-time type checking and diagnostics, instead of clicking through forms.
export const MaintenanceRequest = Table({ label: 'Maintenance Request', fields: { equipment: Reference('equipment') } });
Business logic as typed @servicenow/glide imports; UI Pages built in React, Svelte, Vue, or Preact.
THE INNER LOOP
THEN INSTALL AND TEST
Branching, pull requests, line-by-line review, three-way conflict resolution, precise point-in-time rollback.
XML transport artifact only — not built for collaboration, branching, or human-readable diffs.
We'll go deeper on this contrast later in the Source Control module.
9:55 – 10:10 · Back for build-ready requirements
"As a facilities user, I want to request maintenance on equipment so it gets fixed."
Entities: Maintenance Request, Equipment
Roles: Requester (create/view own), Technician (view assigned, update status)
Given–When–Then: Given a Requester submits a request for active Equipment, When they submit, Then a Maintenance Request is created in "New" state and assigned per routing rule.
Shared, non-prod
Feature branch lives here
Separate from dev
Separate from test
Allocate a sandbox before you start, create your feature branch inside it, decommission it when you're done.
mainDescribe what you want in plain language; Build Agent proposes the entities, roles, and logic — no forms to click through.
It builds real Fluent metadata objects in your app's scope — not a disposable prototype you throw away later.
It generates the app and its ATF tests in the same session — which is what we'll build on next.
It reads your app's existing metadata, explains what a flow actually does in plain language, and proposes concrete fixes — grounded in your instance, not a generic answer.
OPTIONAL · FOR ARCHITECTS
// the Fluent code Build Agent writes under the hood export const MaintenanceRequest = Table({ label: 'Maintenance Request', fields: { equipment: Reference('equipment') } });
11:30 – 12:00
Back soon to re-anchor
Done
Done
PR, merge, publish
ReleaseOps, deploy
Your app is built and tested. Next: source control and release.
1:45 – 2:00
now-sdk build / now-sdk install work identically, on- or off-platform.Git does branching, review, and line-by-line conflict resolution. Update sets cannot.
3:00 – 3:15 · Back for ReleaseOps
Merged to main — many versions at once, across sandboxes
A Studio publish makes the app installable on every instance in your company
Auto-generated by the publish — the actual deployment payload
ReleaseOps doesn't connect to source control directly — it's this auto-generated Update Set that gets promoted into a Deployment Request next.
The payload container. Promote an Update Set into one, then mark it "Ready to Assess" — the assessment playbook (Instance Scan → Move to Test → Run ATF) runs against it.
The record that moves a cleared Deployment Request to production — On Demand (immediately) or Scheduled (batched at a datetime). Lives on the ReleaseOps controller environment, typically production.
Two paths get you here: promote an Update Set into a Deployment Request (this lab), or trigger it from Git via the CI/CD REST APIs with an approval gate (see choose-your-own-adventure).
Where you build, and where Instance Scan runs
The assessment target — a configurable label, not literally "test"
The separate, final destination
Assessment already moves the payload from dev to your test/staging target. If that's also your final destination, release has nowhere new to push — you need a separate instance for each stage.
The cutoff for reaching Ready for Deployment. Miss it, and the Deployment Request is marked deferred — not blocked, and it can still ride a later release.
When the batch push to production actually fires, for every non-deferred Deployment Request that's ready.
Static policy check, on the dev instance
Assessment begins
Functional coverage
Cleared for release
LAB: CREATE A DEPLOYMENT REQUEST, MARK "READY TO ASSESS," WATCH IT RUN
Rerun the assessment as-is.
Assessment is invalidated — the Deployment Request returns to Draft and needs a new payload.
Manual approval to proceed.
3:45 – 4:00
More metadata types, transform/sync from UI builders
Test Agent triage, Cloud Runner, regression suites
now-sdk cicd, Git-triggered pipelines, approval gates
Connect Figma/Miro via Connect Hub, build straight from the spec
Rules that change language/terminology in Build Agent output
Deployment Request, assessment playbook, Ready for Deploy
Explore whichever track interests you most — we're here for questions. Head to the exercise for ideas to get started.
QUESTIONS? PING Ashwin Patti, Shelby Cohen.
Authenticates against home base
Builds in an isolated runtime
Dev and prod at once
Full SDLC guide, reference, and troubleshooting:
servicenow.github.io/sdk/guides/sdlc-guide
Generate ATF tests for all the feature permutations on the app we built. Then: Execute all ATF tests.Admin configures the Figma/Miro app
Admin approves it
Enable MCP servers (MCP tab)
Reads specs directly from the tool
One-time admin setup (Connect Hub + AI Control Tower approval), then any developer turns it on for themselves in their own Build Agent settings.
BONUS SLIDE — PENDING/ROADMAP CONTENT PER LEGAL (SLIDE 2). PRESENTER TO FILL IN BEFORE SESSION.