Export Structure Views and Custom Fields to a File


Structure for Jira allows you to create structures to organise issues and projects. This script downloads a summary of the custom fields and structure views in the instance so that you can restore them in another.


As a Jira administrator, I want to create a new Jira instance with the same structure views (and custom fields) as my current instance. Using this script, I can backup the configuration of my current Jira instance (with structure views and custom fields) to a file so that I can replicate it on my new instance.

Good to Know

  • This script requires the Structure for Jira plugin.
  • Apart from being downloaded, the backup file is saved in the Jira export directory as well.


Jira Jira (7.7 - 8.6)

import com.atlassian.jira.component.ComponentAccessor
import com.onresolve.scriptrunner.runner.customisers.PluginModule
import com.onresolve.scriptrunner.runner.customisers.WithPlugin
import com.onresolve.scriptrunner.runner.rest.common.CustomEndpointDelegate
import com.atlassian.jira.config.util.JiraHome
import groovy.transform.BaseScript
import org.apache.log4j.Level
import com.almworks.jira.structure.api.StructureComponents
import com.almworks.jira.structure.api.util.StructureUtil
import org.apache.log4j.Logger

import javax.ws.rs.core.MediaType
import javax.ws.rs.core.MultivaluedMap
import javax.ws.rs.core.Response

@BaseScript CustomEndpointDelegate delegate

StructureComponents structureComponents

// Set log level to INFO (default for REST endpoints is WARN)
def log = Logger.getLogger(getClass())

def viewManager = structureComponents.viewManager
def jiraHome = ComponentAccessor.getComponent(JiraHome)

// The requesting user must be in one of these groups
final allowedGroups = ['jira-administrators']
getStructureViewsBackup(httpMethod: "GET", groups: allowedGroups) { MultivaluedMap queryParams, String body ->
    // Create the file to export in the Jira export directory
    def exportFile = new File(jiraHome.exportDirectory, 'structure_export.txt')
    exportFile.withPrintWriter { pw ->
        // Print custom fields id and name in a section
        pw.println('------- Custom Fields\n')
        def customFields = ComponentAccessor.customFieldManager.customFieldObjects
        customFields.each { field ->
            pw.println("id: ${field.id}, name: ${field.name}")

        // Print structure views id, owner and JSON specification
        pw.println('\n------- Structure Views\n')
        def views = viewManager.getViews(null)
        views.each { view ->
            def spec = StructureUtil.toJson(view.specification)
            pw.println("id: ${view.id}, owner: ${view.owner}, spec:\n${spec}\n")

    log.info("Export file generated at export directory, path: '${exportFile.absolutePath}'")
    Response.ok(exportFile, MediaType.APPLICATION_OCTET_STREAM_TYPE)
        .header('Content-Disposition', "attachment; filename=\"${exportFile.name}\"")
Discovered an issue? Report it here

Suggested for you