Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Migrate Custom Fields Type from all issue (multi selects values)

If you migrate from Server → Cloud the data of plugin it should be available after migration.

...

There are two ways to migrate MLCs field values from server to cloud:

1. Using xml data importer

Go to server instance, Issues → Search for issues

...

On right side, Export → XML

Create the field if it does not exist.

 Open the XML file using your preferred editor, and replace all instances of the server's MLCs custom field ID (ex: customfield_13243) with the cloud MLCs custom field id

Image Added

Now you can go to Cloud version of plugin and Import Data (XML):

2. Using ScriptRunner Console

Configuration Steps

  1. Set Up Jira Cloud API Access:

    • Determine your Jira Cloud REST API Base URL. It typically follows the format https://[YourInstance].atlassian.net.

    • Create an API token from your Atlassian account. Follow Atlassian's guide for creating an API token.

    • Combine your email and API token in the format email:token and encode it in Base64. This will be used for basic authentication.

  2. Identify the Custom Field:

    • Find the name of the MLCS custom field in your Jira Server instance that you wish to migrate.

    • Obtain the ID of the corresponding custom field in your Jira Cloud instance.

  3. Update the Script:

    • Replace jiraCloudApiBaseUrl with your Jira Cloud instance's base URL.

    • Update encodedAuthString with your Base64-encoded email and API token.

    • Update customFieldName with the name of your MLCS custom field in the Jira Server instance.

    • Replace cloudCustomFieldId with the ID of the corresponding custom field in your Jira Cloud instance.

Code Block
languagegroovy
import com.atlassian.jira.issue.customfields.option.LazyLoadedOption
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.fields.CustomField
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.security.JiraAuthenticationContext
import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.issue.search.SearchException
import com.atlassian.jira.web.bean.PagerFilter
import groovy.json.JsonOutput
import groovyx.net.http.RESTClient
import groovyx.net.http.ContentType

// Jira Cloud REST API base URL
final String jiraCloudApiBaseUrl = "https://[YourInstance].atlassian.net"

// Basic Authentication Encoded String
def encodedAuthString = "your email:token".bytes.encodeBase64().toString()

// Get necessary components
def issueManager = ComponentAccessor.getIssueManager()
def customFieldManager = ComponentAccessor.getCustomFieldManager()
def authenticationContext = ComponentAccessor.getJiraAuthenticationContext()
def searchService = ComponentAccessor.getComponent(SearchService.class)

// Define and find the custom field
final String customFieldName = "mlcs employee"
final String cloudCustomFieldId = "customfield_10101"
def customField = customFieldManager.getCustomFieldObjectsByName(customFieldName)?.first()

if (customField == null) {
    log.error "Custom field not found: $customFieldName"
    return
}

// Fetch issues
def user = authenticationContext.getLoggedInUser()
def query = "\"${customFieldName}\" is not EMPTY"

// Parse the JQL query
def parseResult = searchService.parseQuery(user, query)

def transformElement(LazyLoadedOption element, int index) {
    String label = element.getValue() 
    return [label: label, value: index + 1]
}

if (!parseResult.isValid()) {
    log.error "Invalid JQL Query: ${query}"
    return
}

try {
    def results = searchService.search(user, parseResult.getQuery(), PagerFilter.getUnlimitedFilter())

    results.getResults().each { Issue issue ->
       List serverValue = issue.getCustomFieldValue(customField)
        if (serverValue) {

           def transformedArray = [:]

        // Populate the map
        serverValue.eachWithIndex { element, index ->
            transformedArray["lv$index"] = transformElement(element as LazyLoadedOption, index)
        }
           

            def payload = [
                fields: [
                    cloudCustomFieldId:  JsonOutput.toJson(transformedArray)
                ]
            ]

            def client = new RESTClient(jiraCloudApiBaseUrl)

            client.setHeaders([
                'Content-Type' : ContentType.JSON,
                'Authorization': "Basic $encodedAuthString"
            ])

            try {
                def response = client.put(
                    path: "/rest/api/3/issue/$issue.key",
                    contentType: ContentType.JSON,
                    body: payload
                )

                if (response.status != 204) {
                    log.error("Failed to update issue ${issue.key}: ${response.data}")
                } else {
                    log.info("Successfully updated issue ${issue.key}")
                }
            } catch(Exception e) {
                log.error("Error updating issue ${issue.key}: ${e.message}")
            }
        } 
    }
} catch (SearchException e) {
    log.error("Error executing search: ${e.message}")
}

Execution

  1. Run the Script:

    • Open the ScriptRunner Console in your Jira Server instance.

    • Paste the updated script into the console.

    • Execute the script.

Image Added

Troubleshooting

  • If issues fail to update, check the log for error messages.
  • Ensure that all instance URLs, field names, and IDs are correct.
  • Verify that your API token has appropriate permissions.