skills/admin/deployment-workflow/SKILL.md
Complete instance-to-instance deployment workflow including update set export, import, preview, conflict resolution, validation, and rollback procedures
npx skillsauth add happy-technologies-llc/happy-servicenow-skills deployment-workflowInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill provides a complete framework for deploying ServiceNow configurations between instances (Dev → Test → Prod). It covers the entire deployment lifecycle:
When to use: When promoting configuration changes through the SDLC pipeline or migrating customizations between ServiceNow instances.
Who should use this: Administrators, DevOps engineers, and developers responsible for ServiceNow deployments.
admin or update_set_admin on both source and target instancesadmin/update-set-management should be completed first┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ DEV │────►│ TEST │────►│ PROD │
│ (develop) │ │ (validate) │ │ (release) │
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
▼ ▼ ▼
Create Preview Preview
Update Set & Test & Commit
Complete Commit Validate
Export Validate
Before deployment, thoroughly review what will be deployed.
Using MCP:
Tool: SN-Inspect-Update-Set
Parameters:
update_set_sys_id: [your_update_set_sys_id]
instance: dev
Detailed Content Query:
Tool: SN-Query-Table
Parameters:
table_name: sys_update_xml
query: update_set=[update_set_sys_id]
fields: name,type,target_name,action,sys_created_on,sys_created_by
limit: 500
instance: dev
Expected Output Categories: | Type | Count | Description | |------|-------|-------------| | sys_script | 5 | Business Rules | | sys_ui_policy | 3 | UI Policies | | sys_script_include | 2 | Script Includes | | sys_ui_action | 1 | UI Actions |
Check for common deployment issues.
Script Validation:
Tool: SN-Execute-Background-Script
Parameters:
script: |
var updateSetId = '[update_set_sys_id]';
var issues = [];
// Check for hardcoded sys_ids (potential issue)
var gr = new GlideRecord('sys_update_xml');
gr.addQuery('update_set', updateSetId);
gr.addQuery('payload', 'CONTAINS', 'sys_id');
gr.query();
while (gr.next()) {
if (gr.payload.indexOf("'32") > -1 || gr.payload.indexOf('"32') > -1) {
issues.push('Potential hardcoded sys_id in: ' + gr.name);
}
}
// Check for instance-specific URLs
var gr2 = new GlideRecord('sys_update_xml');
gr2.addQuery('update_set', updateSetId);
gr2.addQuery('payload', 'CONTAINS', '.service-now.com');
gr2.query();
if (gr2.getRowCount() > 0) {
issues.push('WARNING: ' + gr2.getRowCount() + ' records contain instance-specific URLs');
}
gs.info('Validation Issues: ' + JSON.stringify(issues));
description: Pre-deployment validation check
instance: dev
Identify and document update set dependencies.
Check for Related Update Sets:
Tool: SN-Query-Table
Parameters:
table_name: sys_update_set
query: parent=[update_set_sys_id]^ORbase_update_set=[update_set_sys_id]
fields: name,sys_id,state,description
instance: dev
Dependency Documentation Template:
UPDATE SET: PROJ123-FEAT-CustomerPortal-v1
DEPENDS ON:
1. PROJ123-BASE-TableSchema-v1 (must be deployed first)
2. PROJ123-DATA-ReferenceData-v1 (required reference data)
CONFLICTS WITH:
- None identified
NOTES:
- Requires system property: com.glide.custom.portal.enabled=true
Ensure update set is marked complete before export.
Using MCP:
Tool: SN-Update-Record
Parameters:
table_name: sys_update_set
sys_id: [update_set_sys_id]
data:
state: complete
instance: dev
Create a backup clone before deployment.
Using MCP:
Tool: SN-Clone-Update-Set
Parameters:
source_update_set_sys_id: [update_set_sys_id]
new_name: "PROJ123-FEAT-CustomerPortal-v1-BACKUP-20260206"
instance: dev
Option A: XML Export (Manual)
Option B: Automated Remote Instance Retrieval If instances are connected:
Tool: SN-Execute-Background-Script
Parameters:
script: |
var source = new GlideRecord('sys_update_set_source');
source.get('name', 'Development Instance');
var updateSet = '[update_set_name]';
// Trigger retrieval via update set source
gs.info('Retrieval must be initiated from target instance UI');
description: Check update set source configuration
instance: test
Option A: XML Import (Manual)
Option B: Remote Retrieval (Connected Instances)
Check Retrieved Update Set:
Tool: SN-Query-Table
Parameters:
table_name: sys_remote_update_set
query: name=[update_set_name]
fields: name,state,remote_sys_id,description,collision_count
instance: test
States: | State | Meaning | |-------|---------| | Loaded | Ready for preview | | Previewing | Preview in progress | | Previewed | Ready for commit | | Committing | Commit in progress | | Committed | Successfully applied | | Error | Failed - check logs |
Preview identifies potential conflicts before committing.
Initiate Preview (Manual):
Check Preview Status:
Tool: SN-Query-Table
Parameters:
table_name: sys_remote_update_set
query: name=[update_set_name]
fields: name,state,collision_count,error_count
instance: test
Query Preview Problems:
Tool: SN-Query-Table
Parameters:
table_name: sys_update_preview_problem
query: remote_update_set=[remote_update_set_sys_id]
fields: description,type,status,disposition
limit: 100
instance: test
Conflict Types and Resolution:
| Type | Description | Resolution | |------|-------------|------------| | Collision | Same record modified in target | Choose which version to keep | | Missing Reference | Referenced record doesn't exist | Create dependency or skip | | Validation Error | Script/config validation failed | Fix source and re-export | | Permission Issue | Insufficient rights to modify | Grant necessary permissions |
For Collisions - Accept Remote (Source Wins):
Tool: SN-Update-Record
Parameters:
table_name: sys_update_preview_problem
sys_id: [problem_sys_id]
data:
disposition: Accept remote update
instance: test
For Collisions - Skip (Target Wins):
Tool: SN-Update-Record
Parameters:
table_name: sys_update_preview_problem
sys_id: [problem_sys_id]
data:
disposition: Skip remote update
instance: test
Bulk Resolution Script:
Tool: SN-Execute-Background-Script
Parameters:
script: |
var remoteSetId = '[remote_update_set_sys_id]';
// Accept all remote updates (source wins for all)
var gr = new GlideRecord('sys_update_preview_problem');
gr.addQuery('remote_update_set', remoteSetId);
gr.addQuery('disposition', ''); // Unresolved only
gr.query();
var count = 0;
while (gr.next()) {
gr.disposition = 'Accept remote update';
gr.update();
count++;
}
gs.info('Resolved ' + count + ' conflicts by accepting remote updates');
description: Bulk resolve conflicts - accept remote
instance: test
Before committing, verify all conflicts are resolved.
Check for Unresolved Problems:
Tool: SN-Query-Table
Parameters:
table_name: sys_update_preview_problem
query: remote_update_set=[remote_update_set_sys_id]^dispositionISEMPTY
fields: description,type
instance: test
If count > 0, resolve all problems before proceeding.
Commit (Manual):
Verify Commit Success:
Tool: SN-Query-Table
Parameters:
table_name: sys_remote_update_set
query: name=[update_set_name]
fields: name,state,committed_on,committed_by
instance: test
Expected state: "Committed"
Check Committed Changes:
Tool: SN-Query-Table
Parameters:
table_name: sys_update_version
query: source_update_set=[remote_update_set_sys_id]
fields: name,type,state,action
limit: 100
instance: test
Create Test Checklist:
Tool: SN-Create-Record
Parameters:
table_name: sys_user_task
data:
short_description: "Post-Deployment Testing: [update_set_name]"
description: |
Deployment Validation Checklist:
[ ] Business Rules execute correctly
[ ] UI Policies display/hide fields correctly
[ ] ACLs enforce proper access
[ ] Forms render without errors
[ ] Scripts run without errors
[ ] Integration points functional
[ ] No console errors in browser
assigned_to: [tester_sys_id]
priority: 2
instance: test
Check for Errors After Deployment:
Tool: SN-Query-Table
Parameters:
table_name: syslog
query: level=2^sys_created_on>javascript:gs.hoursAgo(1)
fields: message,source,sys_created_on
limit: 50
instance: test
Rollback Indicators:
Option A: Back Out Individual Records
Tool: SN-Execute-Background-Script
Parameters:
script: |
var remoteSetId = '[remote_update_set_sys_id]';
// Get all versions from this update set
var gr = new GlideRecord('sys_update_version');
gr.addQuery('source_update_set', remoteSetId);
gr.query();
gs.info('Found ' + gr.getRowCount() + ' records to potentially back out');
// List records for review
while (gr.next()) {
gs.info('Record: ' + gr.name + ' | Type: ' + gr.type + ' | Action: ' + gr.action);
}
description: List records from committed update set for rollback planning
instance: test
Option B: Revert to Previous Version
For individual records, use sys_update_version to restore:
Tool: SN-Execute-Background-Script
Parameters:
script: |
var recordSysId = '[record_to_revert_sys_id]';
var tableName = '[table_name]';
// Find previous version
var version = new GlideRecord('sys_update_version');
version.addQuery('name', tableName + '_' + recordSysId);
version.orderByDesc('sys_recorded_at');
version.setLimit(2); // Current and previous
version.query();
version.next(); // Skip current
if (version.next()) {
gs.info('Previous version found from: ' + version.sys_recorded_at);
// Restore would require loading the payload
} else {
gs.info('No previous version found');
}
description: Find previous version for rollback
instance: test
Option C: Full Rollback via Backup Clone
If you created a backup clone:
Tool: SN-Create-Record
Parameters:
table_name: sys_update_set
data:
name: "ROLLBACK-PROJ123-FEAT-CustomerPortal-v1-20260206"
description: |
ROLLBACK RECORD
Original Update Set: PROJ123-FEAT-CustomerPortal-v1
Deployed: 2026-02-06 14:00 UTC
Rolled Back: 2026-02-06 16:30 UTC
Reason: [Document the failure reason]
Records Affected:
- [List affected records]
Resolution:
- [Document fix approach]
state: complete
instance: test
| Operation | MCP Tool | Purpose | |-----------|----------|---------| | Inspect | SN-Inspect-Update-Set | Review update set contents | | Clone | SN-Clone-Update-Set | Create backup before deployment | | Move Records | SN-Move-Records-To-Update-Set | Fix records in wrong set | | Query | SN-Query-Table | Check states and conflicts | | Update | SN-Update-Record | Resolve conflicts, update states | | Script | SN-Execute-Background-Script | Complex validation and rollback |
Cause: Large update set or complex dependencies Solution:
Cause: Validation errors in scripts or missing dependencies Solution:
Cause: Referenced records not included in update set Solution:
Cause: Inefficient scripts or queries in deployed code Solution:
admin/update-set-management - Creating and managing update setsadmin/batch-operations - Bulk record operations for deploymentadmin/script-execution - Background script execution for validationitsm/change-management - Change process for production deploymentstesting
Manage supplier onboarding, qualification, performance monitoring, and offboarding with auditable lifecycle controls
tools
Identify emerging risks, prioritize intake signals, and route candidates into formal GRC risk assessment workflows
documentation
Screen inbound documents for completeness, policy risk, and routing readiness before extraction or case workflows
testing
Generate concise task summaries with status, timeline, blockers, SLA risk, and recommended next actions