Import Bamboo plans / builds / distributions

Hi Jacques,

I did a bit deeper investigation and come up with a solution for data import from Bamboo.
As Bamboo projects, plans and other information aren’t tightly coupled with JIRA Projects and versions, the best would be to import it into a separate eazyBI account.
I divided import into two source applications - one for Plan and Build import, other for Deployment imports.
The following import definitions are tested on my test Bamboo instance with quite few build projects, builds and deployments. It could be that some information could be missing due to missing pagination options in REST API calls.
Additional information from REST API could be added by changing custom JavaScript code.

Plan and Build information import

Import definition
{
  "application_type": "rest_api",
  "application_params": {
    "source_params": {
      "url": "BAMBOO_HOME_URL/rest/api/latest/project?expand=projects.project.plans.plan",
      "skip_ssl_verification": "0",
      "pagination": "none",
      "authentication_type": "basic",
      "username": "admin",
      "password": null,
      "content_type": "json",
      "json_data_path": "$.projects.project",
      "custom_javascript_code": "return _.flatten(_.map(doc.plans.plan, function(plan) {\n  offset = 0;\n  builds = [];\n  while(true){\n    d = getDocument(\"/rest/api/latest/result/\" + plan.key + \"?expand=results.result,results.result.jiraIssues&start-index=\" + offset);\n    builds = builds.concat(d.results.result);\n    if (d.results.size == 25) {\n      offset = offset + 25;\n    } else {\n      break;\n    }\n  };\n  return _.map(builds, function(build) {\n    keys = '';\n    _.each(build.jiraIssues.issue, function(issue) {\n      keys = keys + issue.key + ','\n    });\n    return {\n      project_name: doc.name,\n      project_key: doc.key,\n      plan_name: plan.name,\n      plan_key: plan.key,\n      build_key: build.key,\n      build_state: build.state,\n      build_number: build.number,\n      build_duration: build.buildDurationInSeconds,\n      build_time: build.buildStartedTime,\n      build_started: build.buildStartedTime,\n      build_completed: build.buildCompletedTime,\n      build_issue_keys: keys,\n      finished_build_count: build.finished ? 1 : 0,\n      in_progress_build_count: build.finished ? 0 : 1\n    }\n  });\n}));"
    },
    "columns_options": {
      "default_names": false
    },
    "extra_options": {
      "regular_import_frequency": 0,
      "regular_import_at": "",
      "time_zone": ""
    }
  },
  "source_cube_name": "Builds",
  "columns": [
    {
      "name": "project_name",
      "data_type": "string",
      "dimension": "Project",
      "name_column": true,
      "dimension_level": "Project"
    },
    {
      "name": "project_key",
      "data_type": "string",
      "dimension": "Project",
      "key_column": true,
      "dimension_level": "Project"
    },
    {
      "name": "plan_name",
      "data_type": "string",
      "dimension": "Project",
      "dimension_level": "Plan",
      "name_column": true
    },
    {
      "name": "plan_key",
      "data_type": "string",
      "dimension": "Project",
      "dimension_level": "Plan",
      "key_column": true
    },
    {
      "name": "build_key",
      "data_type": "string",
      "dimension": "Build",
      "key_column": true
    },
    {
      "name": "build_state",
      "data_type": "string",
      "dimension": "Build status"
    },
    {
      "name": "build_number",
      "data_type": "integer",
      "dimension": "Build",
      "property": "Build number"
    },
    {
      "name": "build_duration",
      "data_type": "integer",
      "dimension": "Measures",
      "dimension_member": "Build duration"
    },
    {
      "name": "build_time",
      "data_type": "datetime",
      "dimension": "Time"
    },
    {
      "name": "build_started",
      "data_type": "datetime",
      "dimension": "Build",
      "property": "Build start time",
      "date_count_measure": "Builds started",
      "date_count_dimension": "Time"
    },
    {
      "name": "build_completed",
      "data_type": "datetime",
      "dimension": "Build",
      "property": "Build completed time",
      "date_count_measure": "Builds completed",
      "date_count_dimension": "Time"
    },
    {
      "name": "build_issue_keys",
      "data_type": "string",
      "dimension": "Build",
      "property": "Issues"
    },
    {
      "name": "finished_build_count",
      "data_type": "integer",
      "dimension": "Measures",
      "dimension_member": "Finished build count"
    },
    {
      "name": "in_progress_build_count",
      "data_type": "integer",
      "dimension": "Measures",
      "dimension_member": "In progress build count"
    }
  ]
}

Import uses the following API end points:

It will create the following dimensions:

  • Project with two levels - Project and Plan
  • Build
  • Build status

Deployment information import

Import definition
{
  "application_type": "rest_api",
  "application_params": {
    "source_params": {
      "url": "http://localhost:8085/rest/api/latest/deploy/project/all",
      "skip_ssl_verification": "0",
      "pagination": "none",
      "authentication_type": "basic",
      "username": "admin",
      "password": null,
      "content_type": "json",
      "custom_javascript_code": "function timestampToDate(ts) {\n  var d = new Date(ts);\n  return d.toISOString();\n};\n\nreturn _.flatten(_.map(doc.environments, function(environment) {\n  offset = 0;\n  results = [];\n  while(true){\n    d = getDocument(\"/rest/api/latest/deploy/environment/\" + environment.id + \"/results?max-results=25&start-index=\" + offset);\n    results = results.concat(d.results);\n    if (d.size >= offset + 25) {\n      offset = offset + 25;\n    } else {\n      break;\n    }\n  };\n  return _.map(results, function(result) {\n    ret = {\n      deploy_project_name: doc.name,\n      project_id: doc.id,\n      environment_project_name: doc.name,\n      environment_id: environment.id,\n      environment_name: environment.name,\n      version_project_name: doc.name,\n      deploy_id: result.id,\n      deploy_start_time: timestampToDate(result.startedDate),\n      deploy_end_time: timestampToDate(result.finishedDate),\n      deployment_state: result.deploymentState,\n      lifecycle_state: result.lifeCycleState,\n      deploy_time: timestampToDate(result.startedDate),\n    };\n    \n    if (doc.planKey) {\n      ret.plan_key = doc.planKey.key;\n    } else {\n      ret.plan_key = '(none)';\n    }\n    version = result.deploymentVersion;\n    if (version) {\n      ret.version_id = version.id;\n      ret.version_name = version.name;\n      ret.version_date = timestampToDate(version.creationDate);\n      ret.version_creator_key = version.creatorUserName;\n      ret.version_creator_name = version.creatorDisplayName;\n      ret.version_branch = version.planBranchName;\n    } else {\n      ret.version_name = '(none)';\n      ret.version_id = -1;\n    }\n    return ret;\n  });\n}));"
    },
    "columns_options": {
      "default_names": false
    },
    "extra_options": {
      "regular_import_frequency": 0,
      "regular_import_at": "",
      "time_zone": "Helsinki"
    }
  },
  "source_cube_name": "Builds",
  "columns": [
    {
      "name": "deploy_project_name",
      "data_type": "string",
      "dimension": "Deploy Project",
      "dimension_level": "Deploy Project"
    },
    {
      "name": "project_id",
      "data_type": "integer",
      "dimension": "Deploy Project",
      "id_column": true,
      "dimension_level": "Deploy Project"
    },
    {
      "name": "environment_project_name",
      "data_type": "string",
      "dimension": "Environment",
      "dimension_level": "Deploy Project",
      "name_column": true
    },
    {
      "name": "environment_id",
      "data_type": "integer",
      "dimension": "Environment",
      "id_column": true,
      "dimension_level": "Environment"
    },
    {
      "name": "environment_name",
      "data_type": "string",
      "dimension": "Environment",
      "dimension_level": "Environment",
      "name_column": true
    },
    {
      "name": "version_project_name",
      "data_type": "string",
      "dimension": "Version",
      "dimension_level": "Deploy Project",
      "name_column": true
    },
    {
      "name": "deploy_id",
      "data_type": "integer",
      "dimension": "Deployment",
      "key_column": true
    },
    {
      "name": "deploy_start_time",
      "data_type": "datetime",
      "dimension": "Deployment",
      "property": "Start time",
      "date_count_measure": "Deployments started",
      "date_count_dimension": "Time"
    },
    {
      "name": "deploy_end_time",
      "data_type": "datetime",
      "dimension": "Deployment",
      "property": "End time",
      "date_count_measure": "Deployments ended",
      "date_count_dimension": "Time"
    },
    {
      "name": "deployment_state",
      "data_type": "string",
      "dimension": "Deployment Status"
    },
    {
      "name": "lifecycle_state",
      "data_type": "string",
      "dimension": "Lifecycle State"
    },
    {
      "name": "deploy_time",
      "data_type": "datetime",
      "dimension": "Time"
    },
    {
      "name": "plan_key",
      "data_type": "string",
      "dimension": "Project",
      "dimension_level": "Plan",
      "key_column": true
    },
    {
      "name": "version_id",
      "data_type": "integer",
      "dimension": "Version",
      "id_column": true,
      "dimension_level": "Version"
    },
    {
      "name": "version_name",
      "data_type": "string",
      "dimension": "Version",
      "dimension_level": "Version",
      "name_column": true
    },
    {
      "name": "version_date",
      "data_type": "datetime",
      "dimension": "Version",
      "dimension_level": "Version",
      "property": "Creation date"
    },
    {
      "name": "version_creator_key",
      "data_type": "string",
      "dimension": "Version Creator",
      "dimension_level": "Creator",
      "key_column": true
    },
    {
      "name": "version_creator_name",
      "data_type": "string",
      "dimension": "Version Creator",
      "dimension_level": "Creator",
      "name_column": true
    },
    {
      "name": "version_branch",
      "data_type": "string",
      "dimension": "Branch"
    }
  ]
}

Import uses the following API end points:

The following dimensions will be created:

  • Deploy Project
  • Environment. Two levels - Deploy Project and Environment
  • Version. Two levels - Deploy Project and Version
  • Version Creator
  • Branch
  • Deployment Status
  • Lifecycle State