UNPKG

@gitlab/semantic-release-merge-request-analyzer

Version:

Semantic release plugin to determine version based on GitLab merge request labels

75 lines (62 loc) 2.5 kB
import { releaseTypePrecedence } from './config.js'; /** * Fetches the merge request associated with a commit. * * @param {Object} gitlab GitLab API client. * @param {string} projectId GitLab project ID. * @param {string} commitSha Commit SHA. * @param {Object} logger Logger instance. * @returns {Promise<Object>} The merge request data or null if not found. */ export async function getMergeRequestForCommit(gitlab, projectId, commitSha, logger) { try { logger.log(`Fetching merge request for commit ${commitSha}`); const mergeRequests = await gitlab.Commits.mergeRequests(projectId, commitSha); // Return the first merge request if there is one if (mergeRequests && mergeRequests.length > 0) { logger.log(`Found merge request #${mergeRequests[0].iid} for commit ${commitSha}`); return mergeRequests[0]; } logger.log(`No merge request found for commit ${commitSha}`); } catch (error) { logger.error(`Error fetching merge request for commit ${commitSha}: ${error.message}`); } return null; } /** * Determines the type of release based on the merge request labels. * * @param {Object} mergeRequest The merge request data. * @param {Object} labelConfig The label configuration. * @param {Object} logger Logger instance. * @returns {string|null} The release type ('major', 'minor', 'patch', etc.) or null for no release. */ export function getReleaseType(mergeRequest, labelConfig, logger) { if (!mergeRequest || !mergeRequest.labels || !Array.isArray(mergeRequest.labels)) { logger.log('No valid merge request or labels found'); return null; } const labels = mergeRequest.labels; logger.log(`Analyzing labels for merge request #${mergeRequest.iid}: ${labels.join(', ')}`); // Check each release type in order of precedence for (const releaseType of releaseTypePrecedence) { const configuredLabels = labelConfig[releaseType] || []; for (const configLabel of configuredLabels) { if (labels.includes(configLabel)) { logger.log(`Found label "${configLabel}" for release type "${releaseType}"`); return releaseType; } } } // Special handling for maintenance type if (labels.includes('type::maintenance')) { logger.log('Found maintenance label - no release will be triggered'); return null; // Do not trigger a new release } logger.log('No matching release label found'); return null; } export default { getMergeRequestForCommit, getReleaseType };