diff --git a/extract-docker-images.js b/extract-docker-images.js new file mode 100644 index 00000000..d37e01db --- /dev/null +++ b/extract-docker-images.js @@ -0,0 +1,41 @@ +const fs = require('fs'); +const yaml = require('js-yaml'); + +module.exports = function extractDockerImages(fileContent) { + const result = []; + + try { + const doc = yaml.load(fileContent, { schema: yaml.DEFAULT_SCHEMA }); + + if (!doc.services) return []; + + for (const [serviceName, serviceDef] of Object.entries(doc.services)) { + let image = serviceDef.image; + + // Resolve anchors/merges if image is not directly present + if (!image && serviceDef['<<']) { + const merge = serviceDef['<<']; + if (Array.isArray(merge)) { + merge.forEach(m => { + if (m.image) image = m.image; + }); + } else if (merge.image) { + image = merge.image; + } + } + + if (image) { + const [depName, currentValue] = image.split(':'); + result.push({ + depName: depName, + currentValue: currentValue || 'latest', + service: serviceName // <- added for Renovate PR title + }); + } + } + } catch (err) { + console.error('Failed parsing docker-compose.yml:', err); + } + + return result; +}; diff --git a/renovate.json b/renovate.json new file mode 100644 index 00000000..cf4777b9 --- /dev/null +++ b/renovate.json @@ -0,0 +1,57 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": ["config:recommended"], + "prHourlyLimit": 2, + "prConcurrentLimit": 5, + "dependencyDashboard": true, + "labels": ["dependencies", "renovate"], + "schedule": ["before 6am on monday"], + + "docker": { + "enabled": true + }, + + "packageRules": [ + { + "matchDatasources": ["docker"], + "matchPackageNames": ["clickhouse/clickhouse-server"], + "enabled": false + }, + { + "matchDatasources": ["docker"], + "matchPackagePatterns": [".*-alpine$"], + "allowedVersions": "/.*-alpine$/" + }, + { + "matchDatasources": ["docker"], + "matchPackagePatterns": ["^.*:latest$"], + "enabled": false + }, + { + "matchDatasources": ["docker"], + "description": "Docker image used by service {{service}} ({{depName}})" + } + ], + + "regexManagers": [], + + "packageFiles": [ + { + "fileMatch": ["docker-compose\\.ya?ml$"], + "manager": "regex", + "extractVersion": "custom", + "datasourceTemplate": "docker", + "depNameTemplate": "{{service}}/{{depName}}", + "versioningTemplate": "docker", + "extractor": "file:extract-docker-images.js" + } + ], + + "branchNameStrict": true, + "branchPrefix": "renovate/", + "branchName": "{{service}}/{{depName}}-{{newVersion}}", + + "commitMessageAction": "Update", + "commitMessageTopic": "{{service}}/{{depName}}", + "commitMessageExtra": "{{currentValue}} → {{newVersion}}" +}