Today we deployed an update of our Forge app that contained:
- no manifest changes
- no new or changed modules
- no permission/scope changes
- no egress changes
Just minor dependency bumps of our Custom UI npm modules, and a change to our resolver functions to check license.active instead of the deprecated license.isActive.
When deployed to our staging environment, it was correctly treated as a minor version
- 3.0.0 → 3.1.0
To our surprise, when deployed to production it was treated as a major version
- 3.0.0 → 4.0.0, and the CLI message indicated that permission or egress changes were detected (which there aren’t any).
When we run the command
forge version compare \
--environment1 production --version1 3 \
--environment2 production --version2 4
…we can see that the only “differences” are that the modules are returned in the opposite order (despite no changes to our manifest), and the icon property of our module has a different UUID in it (which appears to be generated at deploy time anyway, so not a change that we initiated).
That’s it. No mention of any differences to scopes, remotes, policies or egress.
Here’s a redacted summary version of the compare results, showing the order of the macro and confluence:globalSettings modules reversed, but no other changes:
Version 3.x [production]
[
{
"items": [
{
"key": "example",
"properties": {
"adfExport": {
"function": "export-example"
},
"categories": [
"...",
],
"config": {
"icon": "resource:example-resource;example-icon.png",
"openOnInsert": true,
"resource": "config-resource",
"title": "...",
"viewportSize": "xlarge"
},
"description": "...",
"icon": "https://icon.cdn.prod.atlassian-dev.net/{3 x UUID segments}/example-resource/example-icon.png",
"resolver": {
"function": "example-resolver"
},
"resource": "example-resource",
"title": "..."
},
"type": "xen:macro"
}
],
"type": "macro"
},
{
"items": [
{
"key": "example-settings",
"properties": {
"displayConditions": {
"appIsLicensed": true,
"isAdmin": true,
"isLoggedIn": true
},
"render": "native",
"resolver": {
"function": "settings-resolver"
},
"resource": "settings-resource",
"title": "..."
},
"type": "confluence:globalSettings"
}
],
"type": "confluence:globalSettings"
}
]
Version 4.x [production]
[
{
"items": [
{
"key": "example-settings",
"properties": {
"displayConditions": {
"appIsLicensed": true,
"isAdmin": true,
"isLoggedIn": true
},
"render": "native",
"resolver": {
"function": "settings-resolver"
},
"resource": "settings-resource",
"title": "..."
},
"type": "confluence:globalSettings"
}
],
"type": "confluence:globalSettings"
},
{
"items": [
{
"key": "example",
"properties": {
"adfExport": {
"function": "export-example"
},
"categories": [
"...",
],
"config": {
"icon": "resource:example-resource;example-icon.png",
"openOnInsert": true,
"resource": "config-resource",
"title": "...",
"viewportSize": "xlarge"
},
"description": "...",
"icon": "https://icon.cdn.prod.atlassian-dev.net/{3 x UUID segments}/example-resource/example-icon.png",
"resolver": {
"function": "example-resolver"
},
"resource": "example-resource",
"title": "..."
},
"type": "xen:macro"
}
],
"type": "macro"
}
]
Why does this happen?
Why are the items in a different order, and regardless, why would that constitute a new major version bump?
Does the order difference cause the major version bump, or was it due to some other unforeseen reason?
Look, I’m sure we can work around this with yet another forge version bulk-upgrade run, but the point is: we shouldn’t need to.
We didn’t change anything that would require extra consent from an admin. It should be a minor version that gets rolled out automatically.
We’re quickly losing faith in Forge here.