Deployment Steps - 2025_APR_03
Deployment
Potential Issues
- If the deployment admin does not have access to Storage Accounts, the Storage Account deployment part will fail. There are no changes to the storage accounts in this release, so this can be ignored
- The Custom Functions Function App (npobp_common) tends to have trouble with deployment and may need to be manually deployed
- The Seed Data step may not work if APIM is secured within a vnet. In that instance, the #Manual Steps below will allow the same changes to be added manually
Prerequisites
We will follow the deployment instructions from: Hosted Model Deployment Guide Please read and understand the additional prerequisites below before continuing:
- Ensure the logged in user has access to the following storage accounts. If the storage account is part of a VNet, the user's IP address needs to be explicitly added:
- Do the same for the following, for both the Main site and Advanced Tools site:
- In your existing customerconfig.json file, ensure the following settings are correct:
- prerequisutes.validateEnabled
- otherSettings.downloadAdditionalScripts
- otherSettings.downloadArtifacts
- The Custom Functions Function App (npobp_common) function app tends to fail when run manually through the script, so it may need to be manually redeployed
$resourceGroupName = 'NAME_OF_YOUR_RESOURCE_GROUP' $functionAppName = 'NAME_OF_YOUR_COMMON_FUCNTION_APP' $deployZipPath = 'PATH_TO_THE_ARTIFACTS_ZIP_FILE_IN_ARTIFACT_FOLDER_34' az account set --subscription "" az functionapp deployment source config-zip ` --resource-group $resourceGroupName ` --name $functionAppName ` --src $deployZipPath
Manual Steps:
TechStack
Confirm that "BaseExternalFormsUrl" setting exists and if it doesn't create with the same value as "BaseTestHarnessUrl". Do this for each TechStack record
NPOSettings
- Open the Data Store - Master (npobp_mast) storage account and open the NPOSettings table
- Add/Edit the following:
- Name: FlattenedSettingsTemplate
- Value: [{"SettingType":"MasterSettings","Key":"LogLevel","DataType":"String","GroupTier1":"Master Customer Settings","GroupTier2":"Logging","GroupTier3":"Logging","CanRead":true,"CanWrite":true,"Name":"Log Level","Description":"Level of Logging. Lower level logging will have a performance and storage impact. Recommended level 'Error'. Valid values: 'Trace', 'Debug', 'Information', 'Warning', 'Error', 'Critical', 'None'.","IsActive":true},{"SettingType":"ExecutionSettings","Key":"LogLevel","DataType":"String","GroupTier1":"Execution Settings","GroupTier2":"Logging","GroupTier3":"Logging","CanRead":true,"CanWrite":true,"Name":"Log Level","Description":"Level of Logging. Lower level logging will have a performance and storage impact. Recommended level 'Error'. Valid values: 'Trace', 'Debug', 'Information', 'Warning', 'Error', 'Critical', 'None'.","IsActive":true},{"SettingType":"ExecutionSettings","Key":"DaysToKeepRequestLogs","DataType":"Int","GroupTier1":"Execution Settings","GroupTier2":"Retention","GroupTier3":"Request Logs","CanRead":true,"CanWrite":true,"Name":"Days To Keep Request Logs","Description":"Days to keep raw Request Logs before deleting them.","IsActive":true},{"SettingType":"ExecutionSettings","Key":"DaysToKeepQuotaLogs","DataType":"Int","GroupTier1":"Execution Settings","GroupTier2":"Retention","GroupTier3":"Quota Logs","CanRead":true,"CanWrite":true,"Name":"Days To Keep Quota Logs","Description":"Days to keep raw Quota Logs before deleting them. These logs will be rolled up into aggregate time periods prior to deletion.","IsActive":true},{"SettingType":"ExecutionSettings","Key":"HoursToReprocessQuotaLogs","DataType":"Int","GroupTier1":"Execution Settings","GroupTier2":"Retention","GroupTier3":"Quota Logs","CanRead":true,"CanWrite":true,"Name":"Hours To Reprocess Quota Logs","Description":"How many hours in the past to re-process rollups. Used to capture lagging log updates.","IsActive":true},{"SettingType":"ExecutionSettings","Key":"LastRollupQuotaLogs5m","DataType":"Date","GroupTier1":"Execution Settings","GroupTier2":"Retention","GroupTier3":"Quota Logs","CanRead":true,"CanWrite":true,"Name":"Last Rollup Quota Logs 5m","Description":"Date/Time that the quota logs were last rolled up to a 5 minute interval. This setting can be adjusted to an earlier date to re-run the rollup historic quota logs. This should not be set to a date prior to when the quota log table last had the quota logs purged.","IsActive":true},{"SettingType":"ExecutionSettings","Key":"LastRollupQuotaLogs1h","DataType":"Date","GroupTier1":"Execution Settings","GroupTier2":"Retention","GroupTier3":"Quota Logs","CanRead":true,"CanWrite":false,"Name":"Last Rollup Quota Logs 1h","Description":"Date/Time that the quota logs were last rolled up to a 1 hour interval.","IsActive":true},{"SettingType":"ExecutionSettings","Key":"LastRollupQuotaLogs1d","DataType":"Date","GroupTier1":"Execution Settings","GroupTier2":"Retention","GroupTier3":"Quota Logs","CanRead":true,"CanWrite":false,"Name":"Last Rollup Quota Logs 1d","Description":"Date/Time that the quota logs were last rolled up to a 1 day interval.","IsActive":true},{"SettingType":"ExecutionSettings","Key":"DaysToKeepExecutionQueueItems","DataType":"Int","GroupTier1":"Execution Settings","GroupTier2":"Retention","GroupTier3":"Execution Items","CanRead":true,"CanWrite":true,"Name":"Days To Keep Execution Queue Items","Description":"Days to keep Execution Queue Item Logs before deleting them.","IsActive":true},{"SettingType":"ExecutionSettings","Key":"HoursToReprocessExecutionQueueItemLogs","DataType":"Int","GroupTier1":"Execution Settings","GroupTier2":"Retention","GroupTier3":"Execution Items","CanRead":true,"CanWrite":true,"Name":"Hours To Reprocess Execution Queue Item Logs","Description":"How many hours in the past to re-process rollups. Used to capture lagging log updates.","IsActive":true},{"SettingType":"ExecutionSettings","Key":"DaysToKeepExecutionQueueItemRetry","DataType":"Int","GroupTier1":"Execution Settings","GroupTier2":"Retention","GroupTier3":"Execution Items","CanRead":true,"CanWrite":true,"Name":"Days To Keep Execution Queue Item Retry","Description":"Days to keep Execution Queue Item Retry Logs before deleting them. These logs store how many times an action was retried before stopping. An action that succeeded first time will not end up in this log.","IsActive":true},{"SettingType":"ExecutionSettings","Key":"LastRollupQuotaLogs5m","DataType":"Date","GroupTier1":"Execution Settings","GroupTier2":"Retention","GroupTier3":"Quota Logs","CanRead":true,"CanWrite":true,"Name":"Last Rollup Execution Queue Item Logs 5m","Description":"Date/Time that the quota logs were last rolled up to a 5 minute interval. This setting can be adjusted to an earlier date to re-run the rollup historic quota logs. This should not be set to a date prior to when the quota log table last had the quota logs purged.","IsActive":true},{"SettingType":"ExecutionSettings","Key":"LastRollupQuotaLogs1h","DataType":"Date","GroupTier1":"Execution Settings","GroupTier2":"Retention","GroupTier3":"Quota Logs","CanRead":true,"CanWrite":false,"Name":"Last Rollup Execution Queue Item Logs 1h","Description":"Date/Time that the quota logs were last rolled up to a 1 hour interval.","IsActive":true},{"SettingType":"ExecutionSettings","Key":"LastRollupQuotaLogs1d","DataType":"Date","GroupTier1":"Execution Settings","GroupTier2":"Retention","GroupTier3":"Quota Logs","CanRead":true,"CanWrite":false,"Name":"Last Rollup Execution Queue Item Logs 1d","Description":"Date/Time that the quota logs were last rolled up to a 1 day interval.","IsActive":true},{"SettingType":"ExecutionSettings","Key":"DaysToKeepExecutionInstanceContext","DataType":"Int","GroupTier1":"Execution Settings","GroupTier2":"Retention","GroupTier3":"Execution Items","CanRead":true,"CanWrite":true,"Name":"Days To Keep Execution Instance Context","Description":"Days to keep context related to a specific process execution. These logs context items contain information such as records created, updated and deleted at each stage.","IsActive":true},{"SettingType":"ConfigurationSettings","Key":"LogLevel","DataType":"String","GroupTier1":"Configuration Settings","GroupTier2":"Logging","GroupTier3":"Logging","CanRead":true,"CanWrite":true,"Name":"Log Level","Description":"Level of Logging. Lower level logging will have a performance and storage impact. Recommended level 'Error'. Valid values: 'Trace', 'Debug', 'Information', 'Warning', 'Error', 'Critical', 'None'.","IsActive":true},{"SettingType":"ConfigurationSettings","Key":"TableExcludeEntities","DataType":"String","GroupTier1":"Configuration Settings","GroupTier2":"Logging","GroupTier3":"Logging","CanRead":true,"CanWrite":true,"Name":"Table Blacklist Entities","Description":"Tables to exclude when syncing table metadata from the target CRM system. Comma separated. Excludes all tables that 'starts with' the values in this list.","IsActive":true},{"SettingType":"ConfigurationSettings","Key":"TableIncludeEntities","DataType":"String","GroupTier1":"Configuration Settings","GroupTier2":"Logging","GroupTier3":"Logging","CanRead":true,"CanWrite":true,"Name":"Table Whitelist Entities","Description":"Tables to include when syncing table metadata from the target CRM system. Comma separated. Table will be included even if in blacklist as well.","IsActive":true},{"SettingType":"ConfigurationSettings","Key":"DefaultAttributePrefix","DataType":"String","GroupTier1":"Configuration Settings","GroupTier2":"Business Objects","GroupTier3":"Business Objects","CanRead":true,"CanWrite":true,"Name":"Default Attribute Prefix","Description":"A Prefix that is appended to the schema/database name of a new attribute/field.","IsActive":true},{"SettingType":"ConfigurationSettings","Key":"DefaultTablePrefix","DataType":"String","GroupTier1":"Configuration Settings","GroupTier2":"Business Objects","GroupTier3":"Business Objects","CanRead":true,"CanWrite":true,"Name":"Default Table Prefix","Description":"A Prefix that is appended to the schema/database name of all new business objects/tables.","IsActive":true},{"SettingType":"IntegrationSettings","Key":"LogLevel","DataType":"String","GroupTier1":"Integration Settings","GroupTier2":"Logging","GroupTier3":"Logging","CanRead":true,"CanWrite":true,"Name":"Log Level","Description":"Level of Logging. Lower level logging will have a performance and storage impact. Recommended level 'Error'. Valid values: 'Trace', 'Debug', 'Information', 'Warning', 'Error', 'Critical', 'None'.","IsActive":true},{"SettingType":"DEMSettings","Key":"LogLevel","DataType":"String","GroupTier1":"Form Settings","GroupTier2":"Logging","GroupTier3":"Logging","CanRead":true,"CanWrite":true,"Name":"Log Level","Description":"Level of Logging. Lower level logging will have a performance and storage impact. Recommended level 'Error'. Valid values: 'Trace', 'Debug', 'Information', 'Warning', 'Error', 'Critical', 'None'.","IsActive":true},{"SettingType":"DEMSettings","Key":"FormsPortalAuthIssuerKey","DataType":"String","GroupTier1":"Form Settings","GroupTier2":"Security","GroupTier3":"Authentication","CanRead":true,"CanWrite":true,"Name":"Forms Portal Auth Issuer Key","Description":"The public key of the certificate used to sign the authentication issuer. Used to verify the JWT token passed to NPO from the customer portal. This key will begin with '-----BEGIN PUBLIC KEY-----' and end with '-----END PUBLIC KEY-----' and will have the key on the lines between these. Make sure to include the -----BEGIN PUBLIC KEY----- and -----END PUBLIC KEY----- parts.","IsActive":true},{"SettingType":"DEMSettings","Key":"FormsPortalAuthValidateIssuerKey","DataType":"Bool","GroupTier1":"Form Settings","GroupTier2":"Security","GroupTier3":"Authentication","CanRead":true,"CanWrite":true,"Name":"Enable Forms Portal Auth Issuer Key Validation","Description":"Enable or disable the Portal Auth Issuer Key Validation","IsActive":true},{"SettingType":"DEMSettings","Key":"FormsPortalAuthIssuer","DataType":"String","GroupTier1":"Form Settings","GroupTier2":"Security","GroupTier3":"Authentication","CanRead":true,"CanWrite":true,"Name":"Forms Portal Auth Issuer","Description":"The issuer of the JWT Token (iis within the JWT)","IsActive":true},{"SettingType":"DEMSettings","Key":"FormsPortalAuthValidateIssuer","DataType":"Bool","GroupTier1":"Form Settings","GroupTier2":"Security","GroupTier3":"Authentication","CanRead":true,"CanWrite":true,"Name":"Enable Forms Portal Auth Issuer Validation","Description":"Enable or disable the Portal Auth Issuer Validation","IsActive":true},{"SettingType":"DEMSettings","Key":"FormsPortalAuthAudience","DataType":"String","GroupTier1":"Form Settings","GroupTier2":"Security","GroupTier3":"Authentication","CanRead":true,"CanWrite":true,"Name":"Forms Portal Auth Audience","Description":"Audience as defined by the issuer","IsActive":true},{"SettingType":"DEMSettings","Key":"FormsPortalAuthValidateAudience","DataType":"Bool","GroupTier1":"Form Settings","GroupTier2":"Security","GroupTier3":"Authentication","CanRead":true,"CanWrite":true,"Name":"Enable Forms Portal Auth Audience Validation","Description":"Enable or disable the Portal Auth Audience Validation","IsActive":true},{"SettingType":"DEMSettings","Key":"FormsPortalAuthAlgorithm","DataType":"String","GroupTier1":"Form Settings","GroupTier2":"Security","GroupTier3":"Authentication","CanRead":true,"CanWrite":true,"Name":"Portal Token Algorithm ","Description":"Algorithm to use when validating JWT (current supported values: RS256; HS256)","IsActive":true}]
- Name: DefaultConfigurationSettings
- Value: [{"TableExcludeEntities":"aaduser,activityfileattachment,activitymonitor,activitypointer,adx_,ai,app,archive,asyncoperation,attribute,available,backgroundoperation,book,bot,bot,bulk,business,camp,canvasappextendedmetadata,card,card,catalog,catalog,category,certificate,channel,charac,comment,comp,connection,connector,contract,conversationtranscript,convertrule,copilot,credential,customapi,customeropportunityrole,customerrelationship,data,delegated,deploy,desktop,discount,documenttemplate,dv,elastic,email,enable,entitlement,entity,environment,equipment,event,expiredprocess,export,external,fabric,featurecontrolsetting,federated,feedback,fieldsecurityprofile,flow,fx,git,goal,governance,importjob,internalcatalogassignment,invoice,kbarticle,keyvaultreference,knowledge,leadtoopportunity,list,mail,mainfewshot,maker,managedidentity,marketing,mask,metadataforarchival,metric,mobileo,msfp,msdyn,mspcat,mspp,newprocess,nlsq,organizationdatasyncfnostate,opportunitysalesprocess,organization,package,personaldocumenttemplate,phonetocaseprocess,pricelevel,plugin,position,post,power,privilege,process,product,provisionlanguageforuser,publisher,queue,rating,recentlyused,recon,recordfilter,recurringappointmentmaster,recycle,report,retaineddataexcel,retention,resource,role,routing,salesliterature,save,sdk,search,sensiti,service,settingdefinition,shared,sharepoint,sideload,signal,site,sla,social,solution,source,stage,supportusertable,synapse,syncerror,systemusera,tdsmetadata,team,teammobileofflineprofilemembership,template,territory,text,theme,tracelog,trait,transactioncurrency,translationprocess,uomschedule,usermobileofflineprofilemembership,userrating,view,virtual,workflow,workqueue","LogLevel":4,"DefaultTablePrefix":"new_","DefaultAttributePrefix":"new_","ETag":{},"Id":"d365ce","IsActive":true},{"TableExcludeEntities":"","LogLevel":4,"DefaultTablePrefix":"","DefaultAttributePrefix":"","ETag":{},"Id":"mssql","IsActive":true},{"TableExcludeEntities":"","LogLevel":4,"DefaultTablePrefix":"","DefaultAttributePrefix":"","ETag":{},"Id":"postgres","IsActive":true},{"TableExcludeEntities":"","LogLevel":4,"DefaultTablePrefix":"","DefaultAttributePrefix":"","ETag":{},"Id":"sfdc","IsActive":true}]
- Name: FlattenedSettingsTemplate
Smoke Tests
- From project settings, can see Blacklist and Whitelist options