@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
JavaScript
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
};