Серверный скрипт для импорта задач из gitlab в SDLC SimpleOne
//Нужно создать запиcи с данными названиями в таблице sys_property, и поставить ваши value
let token = ss.getProperty('gitlab_token');//Корректный токен к проекту gitlab
let project_id = ss.getProperty('project_id');// Запись в таблице pda_project
let release_id = ss.getProperty('release_id');//Запись в таблице pda_release
let product_id = ss.getProperty('product_id');//Запись в таблице pda_product
let groupId = 'dev'; // Нужно название группы из gitlab
let currentPage = 1; // Начать парсить с первой страницы, можно поставить 10, 20 и тд, чтобы данных было меньше
let issues = [];
while (true) {
let request = sws.restRequestV1();
request.setRequestUrl(`https://example.com/api/v4/groups/${groupId}/issues?page=${currentPage}`);
request.setRequestMethod('GET');
request.setRequestHeader('Authorization', 'Bearer ' + token);
const response = request.execute();
let dataJson = JSON.parse(response.getBody());
if (dataJson.length === 0) {
// No more issues to fetch, exit the loop
break;
}
issues.push(...dataJson); // Append the fetched issues to the issues array
currentPage++; // Move to the next page
}
issues.forEach(issue => {
let issueFields = {
summary: issue.title || '',
assignee: (issue.assignees && issue.assignees.length > 0) ? issue.assignees[0].username : '',
status: issue.state || '',
description: issue.description || '',
creator: issue.author.username || '',
created: issue.created_at || '',
updated: issue.updated_at || '',
blocked: issue.blocked,
//blocked_by_assignee: (issue.assignee && issue.assignee.locked !== null) ? issue.assignee.locked : '',
//blocked_by_author: issue.author.locked || '',
issue_id: issue.id || '',
url: issue.web_url || '',
due_date: issue.due_date,
milestone: issue.milestone,
labels: issue.labels //(issue.labels && typeof issue.labels === 'object') ? Object.keys(issue.labels) : []
};
createTask(issue.iid, issueFields); // Passing issue number `iid` and issue details to createTask function
});
//Функция создания таски в таблице pda_task
function createTask(issueNumber, issueFields) {
const issue_table = new SimpleRecord("pda_task");
issue_table.subject = issueFields.summary;
issue_table.description = issueFields.description;
issue_table.assigned_user = getAssigneeByLogin(issueFields.assignee);
issue_table.caller = getCreatorByLogin(issueFields.creator);
issue_table.opened_at = formatDate(issueFields.updated);
issue_table.state = setState(issueFields.status,issueFields.labels);
issue_table.pda_project_id = project_id;
issue_table.pda_rank = 10;
issue_table.pda_release_id = release_id
issue_table.comments = issueFields.url;
issue_table.pda_product_id = product_id
if (issueFields.blocked === true) {
issue_table.pda_need_action = true;
} else {
issue_table.pda_need_action = false;
}
if (issueFields.due_date != null) {
issue_table.due_date = formatDate(issueFields.due_date);
issue_table.work_notes += `
Due Date:
\n${issueFields.due_date}\n`;
}
if (issueFields.milestone != null) {
// Assuming milestone has a title property, you can display the title
issue_table.work_notes += `
Milestone:
\n${issueFields.milestone.title || 'No milestone title'}\n`;
}
if (issueFields.labels != null) {
issue_table.work_notes += `
Labels:
\n${issueFields.labels}\n`;
}
issue_table.work_notes += `
URL:
\n${issueFields.url}\n
Issue ID:
\n${issueFields.issue_id}\n
Creator:
\n${issueFields.creator}\n
Created:
\n${issueFields.created}\n
Updated:
\n${issueFields.updated}\n`;
const insertedRecordId = issue_table.insert();
if (insertedRecordId == 0) {
ss.info(issue_table.getErrors());
}
}
//Функция поиска и вставки создателя таски
function getCreatorByLogin(login) {
const employee = new SimpleRecord('employee');
employee.addEncodedQuery(`(username=${login})`);
employee.setLimit(1);
employee.query();
if (employee.next()) {
return employee.sys_id;
}
else return ''; // Можно подставить другого пользователя например id админа
}
function getAssigneeByLogin(login) {
if (login === "") {
return ""
}
const employee = new SimpleRecord('employee');
employee.addEncodedQuery(`(username=${login})`);
employee.setLimit(10);
employee.query();
if (employee.next()) {
return employee.sys_id;
}
else return '';
}
function setState(status, labels) {
// Define the mapping of labels to states
const labelStateMap = {
'Backlog': 'new',
'Doing': 'development',
'InProgress': 'development',
'To Do': 'backlog',
'FreezeBox': 'new'
// Add more label-state mappings as needed
};
if (status === 'opened') {
for (let label of labels) {
if (label in labelStateMap) {
return labelStateMap[label]; // Return the corresponding state based on the label
}
}
return 'new'; // Default state if no matching label is found
} else if (status === 'closed') {
return 'released';
}
return 'new';
}
//Функция форматирования даты в формат симпла
function formatDate(inputDate) {
const date = new Date(inputDate);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
const formattedDate = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
return formattedDate;
}