How to automate export and load of project configurations
This section explains how to drive Project Configurator from the command line, so that you can create scripts that export or load configurations. The method is based on interacting with the JIRA server by issuing http requests to concrete URLs. You need a tool that lets you issue http requests from the command line, as wget or curl. If you are not familiar with wget or curl, it is recommended you have a look first at the manual for these products.
Some examples are provided. They assume there is a system administrator in that JIRA instance with name "admin" and password "admin". Remember that the export and load operations require a user with system administrator permission.
These examples use curl and run on a MSDOS shell on a Windows 7 machine. You will have to introduce slight adaptations to run them on Linux, Unix or Mac OS X.
Exporting configurations
Changed in versions 1.12-JX
The URL for export has changed in versions 1.12-JX of Project Configurator to:
http://my-server/jira/secure/project-config-export.jspa?...
See this page for examples for previous versions. If you are upgrading to version 1.12 of Project Configurator and you use automation scripts, remember to change the export URL in those scripts.
Supposing the base URL to your instance of JIRA is http://my-server/jira the URLs for exporting a project are:
http://my-server/jira/secure/project-config-export.jspa?project-key=XXX
where XXX is the key of the project you want to export.
If you want to export all projects in a single operation, leave the project key empty, as in:
http://my-server/jira/secure/project-config-export.jspa?project-key=
It is also possible to select some options regarding export of custom fields, users and groups, as explained in Advanced export options. This is achieved by adding additional parameters to the export URL:
Parameters | Possible values | Notes |
---|---|---|
filterUnusedCF | true | This parameter is deprecated. It is kept for backward compatibility with versions 1.3.0 and earlier of the plugin. It is equivalent to setting "filterCFMode=filterUnusedCFStrict". |
filterCFMode | exportAllCF | The default, if no value is supplied for this parameter. Export all custom fields. |
filterUnusedCFStrict | Filter custom fields unused by the exported projects, as explained here but without taking into account whether there are issues in the project with values for that custom field. This option is deprecated, it is kept only for backwards compatibility with plugin versions older than 1.5. | |
filterUnusedCFExtended | Filter custom fields unused by the exported projects, as explained here. | |
userExportMode, groupExportMode | fullExport | Export all (users or groups) |
ignoreInvalid | Export all but users or groups not found or not valid | |
doNotExport | No user or group will be exported. | |
jiraFilterExportMode | none | No filter will be exported (This is the default option, if nothing is specified) |
global | Export only filters shared with all users | |
projects | Export only filters shared with projects being exported | |
global-or-projects | Combines two previous options: export filters that are shared globally or with exported projects. | |
shared | Export only filters that the owner has shared with somebody else | |
all | All filters (either private or shared) will be exported | |
jiraDashboardExportMode | none | No dashboard will be exported (This is the default option, if nothing is specified) |
global | Export only dashboards shared with all users | |
projects | Export only dashboards shared with projects being exported | |
global-or-projects | Combines two previous options: export dashboards that are shared globally or with exported projects. | |
shared | Export only dashboards that the owner has shared with somebody else | |
all | All dashboards (either private or shared) will be exported | |
agileBoardsExportMode | none | No Scrum or Kanban board will be exported (This is the default option, if nothing is specified) |
projects | Export only Scrum or Kanban boards associated to the projects being exported. Boards associated to a project appear under the project name at the project navigation panel (see an example image here). | |
all | All Scrum or Kanban boards will be exported |
Remember that fullExport is the default mode, both for users and groups, if nothing is specified.
For example, if you want to prevent your export from failing due to invalid user names and do not want to export groups, you could launch this URL:
http://my-server/jira/secure/project-config-export.jspa?project-key=XXX&userExportMode=ignoreInvalid&groupExportMode=doNotExport
Examples
Exporting configuration for project with key PB, with all custom fields, saving the output to a file named my-project-config.xml:
C:\Users\OneUser>curl -o "my-project-config.xml" "http://my-server/jira/secure/project-config-export.jspa?project-key=PB&os_authType=basic" -u admin:admin
Exporting the same project, without users or groups and including authentication info in the URL:
C:\Users\OneUser>curl -o "my-project-config-filtered.xml" "http://my-server/jira/secure/project-config-export.jspa?project-key=PB&userExportMode=doNotExport&groupExportMode=doNotExport&os_username=admin&os_password=admin"
Exporting all projects, filtering unused custom fields (as explained in this page):
C:\Users\OneUser>curl -o "my-project-config-filtered.xml" "http://my-server/jira/secure/project-config-export.jspa?project-key=&filterCFMode=filterUnusedCFExtended" -u admin:admin
Exporting configuration for project with key PB, with all custom fields, and including shared dashboards and all filters in the export:
C:\Users\OneUser>curl -o "my-project-config.xml" "http://my-server/jira/secure/project-config-export.jspa?project-key=PB&os_authType=basic&jiraFilterExportMode=all&jiraDashboardExportMode=shared" -u admin:admin
Project configuration loading
Automating the load of project configurations is a bit more elaborate as you have to compose the fields in the load form.
These are the fields that make up the form:
Field name | Valid values | Mandatory | Defaults to |
---|---|---|---|
projectConfigFile | A file with a valid project configuration | Yes | |
applyChanges | true, false | No | false |
createExtraProjects | true, false | No | false |
smartCFContexts | true, false | No | false |
publishDrafts (new in v 1.13-JX) | true, false | No | false |
continueOnDashboardFilterErrors | true, false | No | false |
doNotLoadObjects | Any of the following strings: Versions Components Role members Users Groups Project roles Priorities Resolutions Issue link types Statuses Event types Category Issue types Issue type scheme Custom fields Field configurations Field configuration scheme Screens Screen schemes Issue type screen scheme Workflows Workflow scheme Permission scheme Notification scheme Issue security scheme Filters Dashboards | No | Empty. This means to load all object types |
If you want to ignore several object types, then you should specify several parameters doNotLoadObjects, each one with one of the names of the types to ignore.
The meaning of all the parameters in the upload form is explained in the page about How to import/load configuration files.
The URL for the load would be:
http://my-server/jira/secure/project-config-file-upload.jspa
This URL cannot be extended with authentication parameters (as we did when exporting), so the only option is to save previously a session cookie and reuse it for loading operations.
Examples
The first operation should be getting a session cookie and saving it to a file:
C:\Users\OneUser> curl -u admin:admin --cookie-jar cookies.txt "http://my-server/jira/secure/Dashboard.jspa?os_authType=basic" --head
The file cookies.txt with the session cookie will be used in the next load examples. The first example loads a configuration with all its object types:
C:\Users\OneUser>curl -b cookies.txt "http://my-server/jira/secure/project-config-file-upload.jspa" -F "projectConfigFile=@D:\whatever-path\experimental-project-config-dump.xml" -F "applyChanges=true" -F "createExtraProjects=true"
Note the @ before the filename. This tells curl to incude its content as part of the form data.
A real load, that will create default projects as needed for custom field contexts, ignoring versions and components from the config file:
C:\Users\OneUser>curl -b cookies.txt "http://my-server/jira/secure/project-config-file-upload.jspa" -F "projectConfigFile=@D:\some-path\project-to-move-config.xml" -F "applyChanges=true" -F "createExtraProjects=true" -F "doNotLoadObjects=Versions" -F "doNotLoadObjects=Components"
A simulated load (remember that applyChanges and createExtraProjects default to false):
C:\Users\OneUser>curl -b cookies.txt "http://my-server/jira/secure/project-config-file-upload.jspa" -F "projectConfigFile=@D:\some-path\project-config-dump.xml"
A real load that will not stop if an error is found in a filter or dashboard:
C:\Users\OneUser>curl -b cookies.txt "http://my-server/jira/secure/project-config-file-upload.jspa" -F "projectConfigFile=@D:\some-path\project-to-move-config.xml" -F "applyChanges=true" -F "continueOnDashboardFilterErrors=true"
How to find out if the operation ran successfully
If you are automating several export or load operations, very likely you will need some means to find out from the script if each of the operations was performed correctly or there was an error. This section suggests a solution for this need, based on the HTML status codes returned by the server. In this page you can see the list of returned status codes.
Export
This is a .bat file that launches export of a project configuration and checks the returned HTML status code, taking different actions in case of successful export or error.
@echo off set TEMPCOOKIESFILE=cookies-temp.txt set LOGINURL="http://my-server/jira/secure/Dashboard.jspa?os_authType=basic" curl -u %3 --cookie-jar %TEMPCOOKIESFILE% %LOGINURL% --head > nul curl -b %TEMPCOOKIESFILE% -s -o %1 -w "%%{response_code}" %2 > temp.txt set /p STATUSCODE=<temp.txt if %STATUSCODE% == 200 (echo "Export OK") else ( echo "Something went wrong" ren %1 %1.html)
Its first parameter is the name of the file where the exported XML will be saved, the second the URL for export, and the third a string like username:password
for authentication. So,it could be called like this:
C:\Users\OneUser>export-error-check output.xml "http://my-server/jira/secure/project-config-export.jspa?project-key=XXX" admin:admin
Loading
This is a similar .bat file that launches load of a configuration file and checks the result, echoing different messages on success or error:
@echo off set TEMPCOOKIESFILE=cookies-temp.txt set LOGINURL="http://my-server/jira/secure/Dashboard.jspa?os_authType=basic" set LOADURL="http://my-server/jira/secure/project-config-file-upload.jspa" curl -u %2 --cookie-jar %TEMPCOOKIESFILE% %LOGINURL% --head > nul curl -o "load-trace.html" -w "%%{response_code}" -b %TEMPCOOKIESFILE% -F "projectConfigFile=@%1" -F "applyChanges=true" -F "createExtraProjects=true" %LOADURL% > temp.txt set /p STATUSCODE=<temp.txt if %STATUSCODE% == 200 (echo "Load OK") else (echo "Something went wrong")
This script leaves the load trace in a file called load-trace.html. Its first parameter would be the configuration file to load, and the second one the authentication string with username:password.
It could be called this way:
C:\Users\OneUser>load-error-check new-project-config.xml admin:admin
Some comments on previous .bat files
- With the option
-w "%%{response_code}"
and the output redirection, curl writes the HTTP status code returned by the server to a temporary file. Its content is later fed into the variableSTATUSCODE
, whose value will be used to detect if the operation ended successfully or not. - The document returned by the server is always stored in the file specified by curl
-o
option. - In the case of an export, bear in mind that if successful the server returns a XML file with the configuration. In case of error it returns a HTML page with information about the error. So, when an error is detected the script renames the file appending a
.html
suffix. - It would be possible to use curl
-f
option to detect if the server returned a HTTP status code with error (400 or higher), as was suggested in previous versions of this page. While that works, it has a big drawback: with-f
curl does not store the document returned by the server. As in the case of error the returned document is a HTML page with information about what went wrong, it would be quite difficult to find out what failed and how to fix it.