@redpanda-data/docs-extensions-and-macros
Version:
Antora extensions and macros developed for Redpanda documentation.
111 lines (100 loc) • 4.13 kB
JavaScript
/**
* Fetches the latest Helm chart version from the redpanda-operator repository
* by converting docker tag format v<major>.<minor>.<patch> to release/v<major>.<minor>.x
* and checking the Chart.yaml file in that branch.
*
* @param {object} github - The GitHub API client.
* @param {string} owner - The repository owner.
* @param {string} repo - The repository name (redpanda-operator).
* @param {string} stableDockerTag - The stable docker tag in format v<major>.<minor>.<patch>.
* @param {string} betaDockerTag - Optional beta docker tag in format v<major>.<minor>.<patch>-beta.
* @param {Object} logger - Optional Antora logger instance for logging
* @returns {Promise<{ latestStableRelease: string|null, latestBetaRelease: string|null }>}
*/
module.exports = async (github, owner, repo, stableDockerTag, betaDockerTag, logger = null) => {
const yaml = require('js-yaml');
const path = 'charts/redpanda/chart/Chart.yaml';
/**
* Helper function to fetch chart version from a branch derived from a docker tag
* @param {string} dockerTag - The docker tag to derive branch from
* @returns {Promise<string|null>} - The chart version or null if not found
*/
const getChartVersionFromTag = async (dockerTag) => {
if (!dockerTag) return null;
try {
// Parse the docker tag to extract major and minor versions
// Support both v2.4.2 format and v25.1.3 format
const versionMatch = dockerTag.match(/^v(\d+)\.(\d+)(?:\.(\d+))?(?:-beta.*)?$/);
if (!versionMatch) {
if (logger) {
logger.error(`Invalid docker tag format: ${dockerTag}`);
} else {
console.error(`Invalid docker tag format: ${dockerTag}`);
}
return null;
}
const major = versionMatch[1];
const minor = versionMatch[2];
// Convert to release/v<major>.<minor>.x format
const branchName = `release/v${major}.${minor}.x`;
try {
// Fetch Chart.yaml from the specified branch
const contentResponse = await github.repos.getContent({
owner,
repo,
path,
ref: branchName,
});
const contentBase64 = contentResponse.data.content;
const contentDecoded = Buffer.from(contentBase64, 'base64').toString('utf8');
const chartYaml = yaml.load(contentDecoded);
const version = chartYaml.version || null;
return version;
} catch (error) {
if (error.status === 404) {
// Branch doesn't exist yet - this is expected for unreleased versions
if (logger) {
logger.warn(`Fetched operator ${dockerTag} from Docker Hub but branch ${branchName} not found in GitHub (source may not be released yet)`);
} else {
console.warn(`Fetched operator ${dockerTag} from Docker Hub but branch ${branchName} not found in GitHub (source may not be released yet)`);
}
} else {
if (logger) {
logger.error(`Failed to fetch Chart.yaml for branch ${branchName}:`, error.message);
} else {
console.error(`Failed to fetch Chart.yaml for branch ${branchName}:`, error.message);
}
}
return null;
}
} catch (error) {
if (logger) {
logger.error(`Error processing docker tag ${dockerTag}:`, error.message);
} else {
console.error(`Error processing docker tag ${dockerTag}:`, error.message);
}
return null;
}
};
try {
// Get chart versions for both stable and beta tags in parallel
const [stableChartVersion, betaChartVersion] = await Promise.all([
getChartVersionFromTag(stableDockerTag),
getChartVersionFromTag(betaDockerTag)
]);
return {
latestStableRelease: stableChartVersion,
latestBetaRelease: betaChartVersion
};
} catch (error) {
if (logger) {
logger.error('Failed to fetch chart versions:', error.message);
} else {
console.error('Failed to fetch chart versions:', error.message);
}
return {
latestStableRelease: null,
latestBetaRelease: null
};
}
};