Missing Advanced Roadmap custom fields
Platform notice: Server and Data Center only. This article only applies to Atlassian products on the Server and Data Center platforms.
Support for Server* products ended on February 15th 2024. If you are running a Server product, you can visit the Atlassian Server end of support announcement to review your migration options.
*Except Fisheye and Crucible
Summary
Advanced Roadmap fields are missing from Jira. This makes the functionalities of the Advanced Roadmap for Jira to break. This can happen during migration from Server to Data Center installations.
This article instructs on adding the missing Advanced Roadmap fields to Jira through the Database.
Diagnosis
- Run the below SQL query in Jira DB to identify the custom fields that are missing in the instance :
select * from customfield
where customfieldtypekey in
(
'com.atlassian.teams:rm-teams-custom-field-team',
'com.atlassian.jpo:jpo-custom-field-parent',
'com.atlassian.jpo:jpo-custom-field-baseline-start',
'com.atlassian.jpo:jpo-custom-field-baseline-end',
'com.atlassian.jpo:jpo-custom-field-original-story-points'
);
- Normally, the customfield table should contain the following 5 fields, but in this case, some or all should be missing:
CUSTOMFIELDTYPEKEY | CUSTOMFIELDSEARCHERKEY | CFNAME | DESCRIPTION |
---|---|---|---|
com.atlassian.teams:rm-teams-custom-field-team | com.atlassian.teams:rm-teams-custom-field-team-searcher | Team | |
com.atlassian.jpo:jpo-custom-field-parent | com.atlassian.jpo:jpo-custom-field-parent-searcher | Parent Link | |
com.atlassian.jpo:jpo-custom-field-baseline-start | com.atlassian.jpo:jpo-custom-field-baseline-start-searcher | Target start | The targeted start date. This custom field is created and required by Portfolio for Jira. |
com.atlassian.jpo:jpo-custom-field-baseline-end | com.atlassian.jpo:jpo-custom-field-baseline-end-searcher | Target end | The targeted end date. This custom field is created and required by Portfolio for Jira. |
com.atlassian.jpo:jpo-custom-field-original-story-points | com.atlassian.jpo:jpo-custom-field-original-story-points-searcher | Original story points |
Cause
This type of issue is observed when migrating from the Server to Data Center.
Solution
Please make a native database backup before modifying the database.
Step 1: Identify the missing fields from the customfield table
Run the below SQL query to identify the fields that are missing in the instance. The rest of the article will apply to the fields that are missing.
select * from customfield
where customfieldtypekey in
(
'com.atlassian.teams:rm-teams-custom-field-team',
'com.atlassian.jpo:jpo-custom-field-parent',
'com.atlassian.jpo:jpo-custom-field-baseline-start',
'com.atlassian.jpo:jpo-custom-field-baseline-end',
'com.atlassian.jpo:jpo-custom-field-original-story-points'
);
Step 2: Insert the missing fields into the customfield table
- Stop Jira
Execute the below query to add the fields to the CUSTOMFIELD table
Insert query for Team field
INSERT INTO CUSTOMFIELD (ID,CUSTOMFIELDTYPEKEY, CUSTOMFIELDSEARCHERKEY, CFNAME, DESCRIPTION) VALUES ((SELECT max(id)+1 FROM CUSTOMFIELD),'com.atlassian.teams:rm-teams-custom-field-team', 'com.atlassian.teams:rm-teams-custom-field-team-searcher', 'Team',null);
Insert query for Parent field.
INSERT INTO CUSTOMFIELD (ID,CUSTOMFIELDTYPEKEY, CUSTOMFIELDSEARCHERKEY, CFNAME, DESCRIPTION) VALUES ((SELECT max(id)+1 FROM CUSTOMFIELD),'com.atlassian.jpo:jpo-custom-field-parent', 'com.atlassian.jpo:jpo-custom-field-parent-searcher', 'Parent Link',null);
Insert query for Target start field
INSERT INTO CUSTOMFIELD (ID,CUSTOMFIELDTYPEKEY, CUSTOMFIELDSEARCHERKEY, CFNAME, DESCRIPTION) VALUES ((SELECT max(id)+1 FROM CUSTOMFIELD),'com.atlassian.jpo:jpo-custom-field-baseline-start', 'com.atlassian.jpo:jpo-custom-field-baseline-start-searcher', 'Target start','The targeted start date. This custom field is created and required by Portfolio for Jira.');
Insert query for Target end field
INSERT INTO CUSTOMFIELD (ID,CUSTOMFIELDTYPEKEY, CUSTOMFIELDSEARCHERKEY, CFNAME, DESCRIPTION) VALUES ((SELECT max(id)+1 FROM CUSTOMFIELD),'com.atlassian.jpo:jpo-custom-field-baseline-end', 'com.atlassian.jpo:jpo-custom-field-baseline-end-searcher', 'Target end','The targeted end date. This custom field is created and required by Portfolio for Jira.');
Insert query for Original story points field
INSERT INTO CUSTOMFIELD (ID,CUSTOMFIELDTYPEKEY, CUSTOMFIELDSEARCHERKEY, CFNAME, DESCRIPTION) VALUES ((SELECT max(id)+1 FROM CUSTOMFIELD),'com.atlassian.jpo:jpo-custom-field-original-story-points', 'com.atlassian.jpo:jpo-custom-field-original-story-points-searcher', 'Original story points',null);
- Alternatively, you can combine the queries in a single statement (remove the respective sub-queries for fields that are already present in Step 1)insert fields to table
INSERT INTO CUSTOMFIELD (ID,CUSTOMFIELDTYPEKEY, CUSTOMFIELDSEARCHERKEY, CFNAME, DESCRIPTION) VALUES ((SELECT max(id)+1 FROM CUSTOMFIELD),'com.atlassian.teams:rm-teams-custom-field-team', 'com.atlassian.teams:rm-teams-custom-field-team-searcher', 'Team',null), ((SELECT max(id)+2 FROM CUSTOMFIELD),'com.atlassian.jpo:jpo-custom-field-parent', 'com.atlassian.jpo:jpo-custom-field-parent-searcher', 'Parent Link',null), ((SELECT max(id)+3 FROM CUSTOMFIELD),'com.atlassian.jpo:jpo-custom-field-baseline-start', 'com.atlassian.jpo:jpo-custom-field-baseline-start-searcher', 'Target start','The targeted start date. This custom field is created and required by Portfolio for Jira.'), ((SELECT max(id)+4 FROM CUSTOMFIELD),'com.atlassian.jpo:jpo-custom-field-baseline-end', 'com.atlassian.jpo:jpo-custom-field-baseline-end-searcher', 'Target end','The targeted end date. This custom field is created and required by Portfolio for Jira.'), ((SELECT max(id)+5 FROM CUSTOMFIELD),'com.atlassian.jpo:jpo-custom-field-original-story-points', 'com.atlassian.jpo:jpo-custom-field-original-story-points-searcher', 'Original story points',null);
Step 3: Check if the fields are inserted properly
Run the select query from Step 1 again, now there should be one field for each type.
Step 4: Check the available contexts
Start Jira and navigate to the Custom Fields menu in administration (/jira/secure/admin/ViewCustomFields.jspa
). Look at the Available Contexts column for the new fields (Parent Link, Team, Target Start, Target End, Original story points). It likely says 0 contexts.
Step 5: Add custom fields to Global Contexts
Click the cog next to the issue type, and go to configure.
On the Configure Page, click on add new context.
On the Add Configuration Scheme context page, you need to provide a label. The labels for the built-in ARJ customfields follow this scheme: Default Configuration for (Custom Field Name).
Select Any Issue Type, and Global Context from the options below, and then click create.
Step 6: Test out the fields in Advanced Roadmaps
The custom fields should all be working now. Test out :
Assigning a parent to an Epic-level issue.
Assigning an Estimate from ARJ.
Assigning target start/end from ARJ.
Assigning a team in ARJ.
Committing all of those fields to Jira.
Step 7: Lock the Custom-fields
If everything is working, you should lock the custom-fields, to prevent you from changing the context anymore, as well as editing the field.
Locking of custom-fields is done in the MANAGEDCONFIRGURATIONITEM table. This can be verified by the below query:
SELECT * from MANAGEDCONFIGURATIONITEM
There should be no rows with ITEM_IDs that match the IDs of the customfields you just created.
What you want is the following rows, where the number in the ITEM_ID fields corresponds to the customfield IDs you just created.
ID | ITEM_ID | ITEM_TYPE | MANAGED | ACCESS_LEVEL | SOURCE | DESCRIPTION_KEY |
10014 | customfield_10008 | CUSTOM_FIELD | TRUE | LOCKED | com.atlassian.teams:field-locking-service | admin.managed.configuration.items.generic.description.locked |
10015 | customfield_10009 | CUSTOM_FIELD | TRUE | LOCKED | com.atlassian.jpo:field-locking-service | admin.managed.configuration.items.generic.description.locked |
10016 | customfield_10010 | CUSTOM_FIELD | TRUE | LOCKED | com.atlassian.jpo:field-locking-service | admin.managed.configuration.items.generic.description.locked |
10017 | customfield_10011 | CUSTOM_FIELD | TRUE | LOCKED | com.atlassian.jpo:field-locking-service | admin.managed.configuration.items.generic.description.locked |
10018 | customfield_10012 | CUSTOM_FIELD | TRUE | LOCKED | com.atlassian.jpo:field-locking-service | admin.managed.configuration.items.generic.description.locked |
To create locks, use the below query for each of the fields inserted. Replace $ID$ with the actual ID of the custom field from customfield table for that field.
INSERT INTO MANAGEDCONFIGURATIONITEM (ID,ITEM_ID, ITEM_TYPE, MANAGED, ACCESS_LEVEL, SOURCE, DESCRIPTION_KEY)
VALUES ((SELECT max(id)+1 FROM MANAGEDCONFIGURATIONITEM),'customfield_$ID$', 'CUSTOM_FIELD', 'true', 'LOCKED','com.atlassian.teams:field-locking-service','admin.managed.configuration.items.generic.description.locked');
Post this, the MANAGEDCONFIGURATIONITEM
should look correct.
Start Jira and validate that Advanced Roadmap is working as expected. For example:
- Try to configure hierarchy levels.
- Try to create/edit plans.