You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ghost/.github/scripts/update-compose.js

74 lines
2.6 KiB

const fs = require('fs');
const path = require('path');
const assert = require('assert/strict');
const yaml = require('yaml');
// Read and parse the compose.yml file
const composePath = path.join(__dirname, '../../compose.yml');
const composeContent = fs.readFileSync(composePath, 'utf8');
// Use yaml.parseDocument to preserve comments
const composeDoc = yaml.parseDocument(composeContent);
const composeData = composeDoc.toJSON();
// Ensure the compose file has volumes section
assert.ok(composeData.volumes, 'compose.yml must have a volumes section');
// Get all workspace packages that need volumes
const packageJson = require('../../package.json');
assert.ok(packageJson.workspaces, 'package.json must have workspaces defined');
// Exclude:
// /ghost/extract-api-key
const packagesToExclude = [
'extract-api-key'
];
// Create volume names for each workspace
const volumes = packageJson.workspaces
.flatMap(pattern => {
// Remove glob patterns and get base paths
const basePath = pattern.replace(/\/\*$/, '');
try {
return fs.readdirSync(path.join(__dirname, '../../', basePath))
.filter(dir => !dir.startsWith('.'))
.filter(dir => !packagesToExclude.includes(dir))
.filter(dir => {
const fullPath = path.join(__dirname, '../../', basePath, dir);
return fs.statSync(fullPath).isDirectory();
})
.map(dir => {
return {
name: `node_modules_${basePath}_${dir}`.toLowerCase(),
path: `${basePath}/${dir}`
};
});
} catch (err) {
console.error(`Error reading directory ${basePath}:`, err);
return [];
}
});
// Add volumes to compose data if they don't exist
volumes.forEach(volume => {
if (!composeDoc.get('volumes').has(volume.name)) {
composeDoc.setIn(['volumes', volume.name], {});
}
});
// Add volume mounts to ghost service
assert.ok(composeDoc.getIn(['services', 'ghost', 'volumes']), 'compose.yml must have ghost service with volumes');
volumes.forEach(volume => {
const mountPath = `/home/ghost/${volume.path}`;
const volumeMount = `${volume.name}:${mountPath}/node_modules:delegated`;
const existingVolumes = composeDoc.getIn(['services', 'ghost', 'volumes']);
if (!existingVolumes.items.some(item => item.value === volumeMount)) {
existingVolumes.add(volumeMount);
}
});
// Write back to compose.yml, preserving comments
fs.writeFileSync(composePath, String(composeDoc));