Ticket external synchronization¶
Versio.io tickets can be mirrored into an external issue or service management system. A ticket that is synchronized keeps a counterpart in the external system: Versio.io creates it on the first synchronization and updates it on every following change.
Synchronization is one-way. Versio.io is the leading system. Changes made in the external system are never read back and are overwritten with the next update.
How synchronization works¶
Every change to a ticket — a field edit, a comment, a task, a state transition — writes an activity entry and raises a ticket sync event. The ticketing service picks the event up and processes each external system the ticket's type is bound to.
sequenceDiagram
participant U as User
participant T as Versio.io ticketing
participant S as ticketSync state
participant E as External system
U->>T: Change ticket
T->>T: Read ticket, tasks, comments, reporter
T->>S: Read sync state for external system
alt No counterpart yet
T->>E: Create ticket (title)
E-->>T: External id and link
end
T->>E: Update ticket (fields and description)
T->>S: Store last sync date, external reference, error
Figure: Synchronization of a ticket into an external system
For every ticket and every bound external system, Versio.io stores one synchronization state: the last synchronization date, the last successful synchronization date, the error text of the last failure, and the reference of the external ticket. This state feeds the External sync tile on the ticket details page.
A failed synchronization does not block the ticket. The error is stored and shown on the ticket, and the next ticket change triggers a new attempt.
Configuration¶
Synchronization is configured in two places. An external system describes how to reach the other side. A binding on a ticket type decides which types are pushed into that system.
External systems¶
Environment settings → Ticketing → External systems. Each entry describes one connection.
| Field | Required | Description |
|---|---|---|
| Name | yes | Display name of the connection, shown on the ticket and in the ticket type binding. |
| Type | yes | The kind of external system. The type selects the adapter Versio.io uses to talk to it, see Supported external systems. |
| Base URL | yes | The host the adapter connects to. The meaning depends on the type, see the table below. |
| Project | yes | The container a ticket is created in. The label and the meaning depend on the type, see the table below. |
| Credential | yes | A credential from the credential vault holding the API token of the external system. |
| Icon / Color | no | Override the icon and color of the type in the ticket's External sync tile. |
| Enabled | yes | Off keeps the system configured but stops every ticket type from synchronizing with it. |
Table: Configuration of an external system
Base URL and project differ per type:
| Type | Base URL | Project | Example project |
|---|---|---|---|
| GitLab | Instance URL, e.g. https://gitlab.com |
Namespace path of the project | group/subgroup/project |
| Jira | Site URL, e.g. https://your-company.atlassian.net |
Project key | OPS |
| GitHub | API URL, e.g. https://api.github.com |
Owner and repository | owner/repository |
| ServiceNow | Instance URL, e.g. https://your-company.service-now.com |
Channel | |
| TOPdesk | Instance URL, e.g. https://your-company.topdesk.net |
||
| Versio.io | Instance URL of the target, e.g. https://your-company.versio.io |
Environment the ticket is created in | production |
Table: Meaning of base URL and project per external system type
Credential¶
The credential MUST be created in the credential vault under Environment settings → Access management → Credential vault before it can be selected.
Every shipped adapter reads its token from the password field of the credential. The user name is not used. GitLab and Jira send the token as a bearer token, Versio.io as an apiToken authorization.
| Type | Token to store in the password field |
|---|---|
| GitLab | A personal, group or project access token with the api scope. It MUST be allowed to create and update work items in the configured namespace. |
| Jira | An Atlassian API token of an account with permission to create and edit issues in the configured project. |
| Versio.io | An API token of the target instance. Its user MUST be allowed to create and update tickets in the configured environment; the activity there is written in that user's name. |
Table: Credential per external system type
Binding a ticket type¶
Environment settings → Ticketing → ticket type → External sync. Add one of the configured external systems to bind the type to it.
| Option | Default | Description |
|---|---|---|
| Enabled | on | Off keeps the binding but stops synchronizing tickets of this type. |
| Manual sync | on | Offers the sync button on the ticket. |
| Automatic sync | off | Synchronizes on ticket changes without asking. |
Table: Options of a ticket type binding
A ticket is only synchronized when the external system and the binding are enabled. If either side is switched off, the system stays listed on the ticket with the status Disabled, so it remains visible that a target is configured but not synchronizing.
Note: Manual synchronization is not available yet. Tickets of an enabled binding are currently always synchronized on change, and the sync button on the ticket is inactive. See Current limitations.
Supported external systems¶
The type of an external system selects the adapter. Only the types below with the status available ship an adapter. The remaining types can already be selected in the configuration, but a ticket bound to them fails with No adapter found for external system type.
| Type | Status | Interface | Authentication | Created object |
|---|---|---|---|---|
| GitLab | available | GraphQL API (/api/graphql) |
Bearer access token | Work item of type issue |
| Jira | available | REST API v3 (Jira Cloud) | Bearer API token | Issue of type Incident |
| GitHub | planned | |||
| ServiceNow | planned | |||
| TOPdesk | planned | |||
| Versio.io | available | Ticketing REST API (/api-versio.ticketing/1.0) |
API token | Ticket of type Incident in state New |
Table: External system types and their support status
Field support matrix¶
Not every Versio.io ticket field has a counterpart in every external system. A field that has no native counterpart is written into the description of the external ticket instead, so no information is lost.
| Symbol | Meaning |
|---|---|
| ● | Synchronized into a native field of the external system. |
| ◐ | Written into the generated description text, not into a native field. |
| — | Not synchronized. |
Table: Legend of the field support matrix
| Ticket field | GitLab | Jira | Versio.io | Remark |
|---|---|---|---|---|
| Title | ● | ● | ● | GitLab work item title, Jira issue summary, Versio.io ticket title. |
| Description | ● | ● | ● | Extended with a generated header, see Description content. |
| Ticket type | — | — | — | The created object type is fixed per adapter, see Supported external systems. |
| Workflow state | ◐ | ◐ | ◐ | No state transition is executed in the external system. |
| Severity | ◐ | ◐ | ● | Written as the numeric value of the Versio.io 10-step severity scale. |
| Assigned user | ◐ | ◐ | ● | Written as e-mail address; no external user is assigned. |
| Due date | ● | ● | ● | GitLab start and due date widget, Jira duedate. Versio.io keeps it in the description. |
| Estimated work | ● | — | — | GitLab time tracking estimate. |
| Creation date | ◐ | ◐ | ◐ | |
| Creation user | ◐ | ◐ | ◐ | |
| Reporter | ◐ | ◐ | ● | Name, e-mail, phone and note. |
| Tasks | ◐ | ◐ | ◐ | Written as a nested Markdown checklist, including their done state. |
| Comments | ◐ | ◐ | ◐ | Written with author and date; internal comments are not excluded. |
| Tags | — | — | — | |
| Watchers | — | — | — | |
| Work times | — | — | — | Only the estimate is synchronized, not the booked times. |
| Affected instances | — | — | — | |
| Documents | — | — | — | Attachments are not transferred. |
Table: Support of Versio.io ticket fields per external system
Description content¶
The description of the external ticket is generated on every synchronization and overwrites what is there. It is assembled in this order:
- A header table with state, severity, assignee, due date, creation date and creator. Fields that the system stores natively are left out — GitLab therefore has no due date column.
- The Markdown description of the Versio.io ticket.
- A Reporter section, if any reporter field is filled.
- A Tasks section as a nested checklist, if the ticket has tasks.
- A Comments section with author, date and the quoted comment text.
Note: The header renders the workflow state as its configured state id (e.g.
v1000), not as its display name.
Synchronization status on the ticket¶
The External sync tile on the ticket details page lists every external system the ticket's type is bound to, with the reference of the external ticket and the status reached for this ticket.
| Status | Meaning |
|---|---|
| In sync | The last synchronization succeeded and the ticket has not changed since. |
| Out of sync | The ticket changed after the last successful synchronization. |
| Sync failed | The last synchronization ran into an error. Hover the status for the error text. |
| Not linked | The ticket has never reached this system; no counterpart exists yet. |
| Disabled | The external system or the binding is switched off. Hover the status to see which side. |
Table: Synchronization status of a ticket
Current limitations¶
- Synchronization is one-way. Changes in the external system are overwritten, and deleting a Versio.io ticket does not delete its counterpart.
- Manual synchronization is not implemented. The sync button on the ticket is inactive, and an enabled binding always synchronizes on change regardless of the Automatic sync option.
- Versio.io: the counterpart is always created as the delivered Incident type in its New state, so a target environment without them rejects the creation. Due date, severity, assignee and workflow state are only written into the description, not into the fields the target ticket has for them.
- Jira: the issue type is fixed to Incident, the description is transferred as plain text so its Markdown is not rendered, the work estimate is not transferred, and comments and state transitions are not written as native Jira comments or transitions.