YouTrack - everything in one place. Track tasks, manage projects, maintain a knowledge base, support your customers, collaborate, and deliver great products.
Available triggers
Triggers are the events that trigger the automation, All triggers run in real time, i,e, data is transferred in the moment the event occurs
- Issue created
- Issue updated
Available actions
Actions are what Albato performs when your automation is running, Actions also allow you to transfer data to other apps and systems
- New issue
- Update issue
- Find an issue
Before setting up integrations with YouTrack, connect the tool to Albato.
To do this, go to the Apps section and click the Add a connection button.
Select the app and click the Add a connection button.
Come up with a name for your connection.
Enter your Domain and API key.
Click the Continue button.
How to get API key
Go to your YouTrack account.
Either copy the ID from the browser address bar or enter the name of the workspace you used to create the account. Go to the list of system users, select the user who will access the integration, and open the Account Security tab.
Next, create a new token and copy its value.
Paste the token into the Albato connection field.
The first part of the connection is finished. To receive tickets from YouTrack, we need to create two more workflows in YouTrack, write our JS code there and insert the webhook from the connection into them.
Go to the Workflows tab.
Create a new Workflow.
Set a name for your Workflow
and select the rule:
Paste the following code:
const albatoHook = '{{albatoHook}}';
const entities = require('@jetbrains/youtrack-scripting-api/entities');
const http = require('@jetbrains/youtrack-scripting-api/http');
const workflow = require('@jetbrains/youtrack-scripting-api/workflow');
function periodToHours(period) {
return period ? (
period.getMinutes() / 60 +
(
period.getHours() +
period.getDays() * 8 +
period.getWeeks() * 40
)
) : 0;
}
function formatValue(value) {
if (typeof value === 'object' && value !== null) {
switch (value.$$type) {
case 'User':
value = value.fullName;
break;
default:
if ('getPeriodType' in value) {
value = periodToHours(value);
} else if (value.constructor.name === 'ImmutableIterableWW') {
const array = value;
value = [];
array.forEach(item => value.push(item.name));
} else {
value = value.name;
}
}
}
return value === undefined ? null : value;
}
exports.rule = entities.Issue.onChange({
title: workflow.i18n('Send webhook to Albato'),
guard: function(ctx) {
return ctx.issue.becomesReported && ctx.issue.isReported;
},
action: function(ctx) {
const issue = ctx.issue;
const fields = {};
for (let field in issue.fields) {
fields[field] = formatValue(issue.fields[field]);
}
const tags = [];
issue.tags.forEach(nameTag => tags.push(nameTag.name));
const payload = {
'event': 'newTicket',
'ticketUrl': issue.url,
'tags': tags,
'id': issue.id,
'summary': issue.summary,
'description': issue.description,
'projectId': issue.project.key,
'project': issue.project.name,
'dateCreate': issue.created,
'dateUpdate': issue.updated,
'fields': fields,
};
console.log(issue.tags);
const connection = new http.Connection(albatoHook, null, 2000);
connection.addHeader('content-type', 'application/json');
const response = connection.postSync('', null, payload);
if (!response.isSuccess) {
console.warn('Failed to post webhook to Albato. Details: ' + response.toString());
}
},
});
This code catches only the creation of tasks, and the following code catches changes to tasks. You can work in one rule, or you can create an additional rule and add the following code to it:
const albatoHook = '{{albatoHook}}';
const entities = require('@jetbrains/youtrack-scripting-api/entities');
const http = require('@jetbrains/youtrack-scripting-api/http');
const workflow = require('@jetbrains/youtrack-scripting-api/workflow');
function periodToHours(period) {
return period ? (
period.getMinutes() / 60 +
(
period.getHours() +
period.getDays() * 8 +
period.getWeeks() * 40
)
) : 0;
}
function formatValue(value) {
if (typeof value === 'object' && value !== null) {
switch (value.$$type) {
case 'User':
value = value.fullName;
break;
default:
if ('getPeriodType' in value) {
value = periodToHours(value);
} else if (value.constructor.name === 'ImmutableIterableWW') {
const array = value;
value = [];
array.forEach(item => value.push(item.name));
} else {
value = value.name;
}
}
}
return value === undefined ? null : value;
}
exports.rule = entities.Issue.onChange({
title: workflow.i18n('Send webhook to Albato'),
guard: function(ctx) {
return !ctx.issue.becomesReported && ctx.issue.isReported;
},
action: function(ctx) {
const issue = ctx.issue;
const fields = {};
for (let field in issue.fields) {
fields[field] = formatValue(issue.fields[field]);
}
const tags = [];
issue.tags.forEach(nameTag => tags.push(nameTag.name));
const payload = {
'event': 'changedTicket',
'ticketUrl': issue.url,
'tags': tags,
'id': issue.id,
'summary': issue.summary,
'description': issue.description,
'projectId': issue.project.key,
'project': issue.project.name,
'dateCreate': issue.created,
'dateUpdate': issue.updated,
'fields': fields,
};
console.log(issue.tags);
const connection = new http.Connection(albatoHook, null, 2000);
connection.addHeader('content-type', 'application/json');
const response = connection.postSync('', null, payload);
if (!response.isSuccess) {
console.warn('Failed to post webhook to Albato. Details: ' + response.toString());
}
},
});
Important!
Now you have to replace in each rule where you inserted the code, in the very first constant "const albatoHook = '{{albatoHook}}';", the value {{albatoHook}}, with the actual webhook from the previously created connection. Copy the webhook from the connection you created to Albato.
Insert a webhook into each process you create:
Next, you need to link your Workflow to the project you need. To do this, go back to your Workflow list, select the Workflow you created and link it to the projects:
Done! Now you can use the YouTrack in your integrations.