Импорт issues из JIRA в SimpleOne

  1. Нужно получить токен организации в JIRA для доступа
  2. Далее нужно записать данный токен в property jira_token
  3. Также нужно получить url вашей организации в jira

Важно

Чтобы корректно создалась доска с тасками на проде нужно сделать ряд требований
1. Создать проект на dev, test, prod
2. Создать доску на dev, test, prod
3. Добавить мемберов на dev, test, prod

Только после этого переносить issues через данный серверный скрипт
на на dev, test, prod

Иначе доска не создастся из задач, а если создать ее руками
То новая доска не будет привязана к импортированным таскам

Перенос реализован через серверный скрипт
Можно просто скопировать код и вставить в sys_script, далее run
Скрипт можно дорабатывать в зависимости какие вам нужны статусы и какая информация
Прикладываю сам скрипт

let token = ss.getProperty('jira_token');// токен, записанный в property
let jiraUrl = 'jira.yourcompany.com'// Jira URL вашей компании
const baseUrl = `https://${jiraUrl}/rest/api/2`;

//Получение keys проекта на основе запроса JQL с определенными статусами
const projectKey = 'PROJ';// Пример key для issues
const statusQuery = 'status in ("To Do", "In Progress")';//Пример статусов

const groupQuery = `project = ${projectKey} AND ${statusQuery}`;
const encodedGroupQuery = encodeURIComponent(groupQuery);
const jqlQuery = `jql=${encodedGroupQuery}`;
const request = sws.restRequestV1();
request.setRequestUrl(`${baseUrl}/search?${jqlQuery}`);
request.setRequestMethod('GET');
request.setRequestHeader('Authorization', 'Bearer ' + token);


const response = request.execute();
let dataJson = JSON.parse(response.getBody());
let issueKeys = [];
dataJson.issues.forEach(issue => {//Получаем каждый issue.key
    issueKeys.push(issue.key);// Пушим в массив issueKeys
});

//ss.info(issueKeys);
fetchAndProcessIssues(issueKeys);

function fetchAndProcessIssues(issueKeys) {
    issueKeys.forEach(issueKey => {
        let issueUrl = `${baseUrl}/issue/${issueKey}`;//Делаем get запрос к каждому issueKey

        const request = sws.restRequestV1();
        request.setRequestUrl(issueUrl);
        request.setRequestMethod('GET');
        request.setRequestHeader('Authorization', 'Bearer ' + token);
        const response = request.execute();
        let dataJson = JSON.parse(response.getBody());
        let assigneeName = dataJson.fields.assignee ? dataJson.fields.assignee.name : 'Unassigned';
        let issueFields = {
            assignee: assigneeName,
            status: dataJson.fields.status ? dataJson.fields.status.name : '',
            description: dataJson.fields.description ? dataJson.fields.description : '',
            creator: dataJson.fields.creator ? dataJson.fields.creator.name : '',
            summary: dataJson.fields.summary ? dataJson.fields.summary : '',
            created: dataJson.fields.created,
            blocked_by: dataJson.fields.issuelinks ? dataJson.fields.issuelinks : [],
            comments: dataJson.fields.comment ? dataJson.fields.comment.comments : [],
            attachments: dataJson.fields.attachment ? dataJson.fields.attachment : []
        };

        createTask(issueKey, issueFields);
    });
}

function createTask(issueKey, issueFields) {
    const issue_table = new SimpleRecord("pda_task");
    issue_table.subject = issueFields.summary;
    issue_table.description = issueFields.description;
    issue_table.assigned_user = getUserByLogin(issueFields.assignee);
    issue_table.caller = getUserByLogin(issueFields.creator);
    issue_table.opened_at = formatDate(issueFields.created);
    issue_table.state = setState(issueFields.status);
    issue_table.pda_project_id = '171204712328541516'; // Нужен ID проекта 
    issue_table.pda_rank = 10;//Можно ставить любой, но поле обязательное
    issue_table.comments = `https://${jiraUrl}/browse/${issueKey}`;

    if (issueFields.blocked_by.length === 0) {
        issue_table.pda_need_action = false;
    } else {
        issue_table.pda_need_action = true;
    }

    const insertedRecordId = issue_table.insert();
    if (insertedRecordId == 0) {
        ss.info(issue_table.getErrors());
    }

    insertComments(issueFields.comments, issue_table, insertedRecordId);
    getAttachUrl(issueFields.attachments, issue_table, insertedRecordId);
}

//Функция вставки assigned user из таблицы employee
function getUserByLogin(login) {
    const employee = new SimpleRecord('employee');
    employee.addEncodedQuery(`(username=${login})`);
    employee.setLimit(1);
    employee.query();

    while (employee.next()) {
        return employee.sys_id;
    }

    return '100000000000000000'; // System User
}

// Функция маппинга для state
function setState(status) {
    const mapping = {
        "In Progress": "development",
        "To Do": "backlog"
    };

    return mapping[status] || "";
}
//Функция вставки дополнительной информации в комментарий
// В основном это поля, которые нельзя импортировать в SimpleOne, например created at
function insertComments(comments, issue_table, sys_id) {
    const reversedComments = comments.reverse();

    return reversedComments.map(comment => {
        const body = `
            Comment Author Email: ${comment.updateAuthor.emailAddress}
            Comment Created At: ${comment.updated}
            Comment Body:
            \n${comment.body}\n
        `;
        issue_table.get(sys_id);
        issue_table.work_notes = body;
        issue_table.update();
    }).join('\n');
}

//Функция получения url Jira для всех приложенных вложений в таску Jira
function getAttachUrl(attachments, issue_table, sys_id) {
    let stringUrl = '';
    attachments.forEach(attachment => {
        stringUrl += attachment.content + '\n';
    });
    issue_table.get(sys_id);
    issue_table.work_notes = stringUrl;
    issue_table.update();
    //ss.info(stringUrl);
}

//Функция форматирования даты в формат SimpleOne
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;
}





2 лайка