Skip to content

Commit 8c11228

Browse files
committed
update dependency upgrade script to use github releases
1 parent 6ffee3a commit 8c11228

File tree

2 files changed

+239
-19
lines changed

2 files changed

+239
-19
lines changed

scripts/generate-licenses.js

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
#!/usr/bin/env node
2+
3+
const checker = require('license-checker-rseidelsohn');
4+
const fs = require('fs');
5+
const path = require('path');
6+
7+
const workspaceDir = path.join(__dirname, '..', 'aws-distro-opentelemetry-node-autoinstrumentation');
8+
9+
checker.init({
10+
start: workspaceDir,
11+
production: true,
12+
excludePrivatePackages: true,
13+
// Include packages from both local and hoisted node_modules
14+
includePackages: '',
15+
customFormat: {
16+
name: '',
17+
version: '',
18+
repository: '',
19+
licenseText: ''
20+
}
21+
}, (err, packages) => {
22+
if (err) {
23+
console.error('Error:', err);
24+
process.exit(1);
25+
}
26+
27+
let output = '';
28+
const processedPackages = [];
29+
30+
Object.keys(packages).forEach(packageKey => {
31+
const pkg = packages[packageKey];
32+
33+
// Parse package name and version correctly for scoped packages
34+
let name, version;
35+
if (packageKey.startsWith('@')) {
36+
const lastAtIndex = packageKey.lastIndexOf('@');
37+
name = packageKey.substring(0, lastAtIndex);
38+
version = packageKey.substring(lastAtIndex + 1);
39+
} else {
40+
const atIndex = packageKey.indexOf('@');
41+
name = packageKey.substring(0, atIndex);
42+
version = packageKey.substring(atIndex + 1);
43+
}
44+
45+
// Skip our own package
46+
if (name === '@aws/aws-distro-opentelemetry-node-autoinstrumentation') {
47+
return;
48+
}
49+
50+
processedPackages.push({ name, version, pkg });
51+
});
52+
53+
// Sort by package name for consistent output
54+
processedPackages.sort((a, b) => a.name.localeCompare(b.name));
55+
56+
processedPackages.forEach(({ name, version, pkg }) => {
57+
output += `** ${name}; version ${version}`;
58+
if (pkg.repository) {
59+
output += ` -- ${pkg.repository}`;
60+
}
61+
output += '\n';
62+
63+
if (pkg.licenseText) {
64+
output += pkg.licenseText + '\n\n';
65+
} else {
66+
output += 'License text not available\n\n';
67+
}
68+
});
69+
70+
const outputPath = path.join(__dirname, '..', 'THIRD-PARTY-LICENSES');
71+
fs.writeFileSync(outputPath, output);
72+
console.log(`Generated THIRD-PARTY-LICENSES with ${processedPackages.length} packages`);
73+
74+
// Also show what direct dependencies might be missing
75+
const workspacePackageJson = JSON.parse(
76+
fs.readFileSync(path.join(workspaceDir, 'package.json'))
77+
);
78+
const directDeps = Object.keys(workspacePackageJson.dependencies || {});
79+
const foundPackages = new Set(processedPackages.map(p => p.name));
80+
const missingDeps = directDeps.filter(dep => !foundPackages.has(dep));
81+
82+
if (missingDeps.length > 0) {
83+
console.log(`\nDirect dependencies without license files found: ${missingDeps.join(', ')}`);
84+
}
85+
});

scripts/update_dependencies.js

Lines changed: 154 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,65 +3,200 @@
33
const fs = require('fs');
44
const path = require('path');
55

6-
async function getLatestVersion(packageName) {
6+
async function httpsGet(url) {
77
const https = require('https');
88

99
return new Promise((resolve, reject) => {
10-
const url = `https://registry.npmjs.org/${packageName}/latest`;
11-
const request = https.get(url, { timeout: 30000 }, (response) => {
10+
const options = {
11+
timeout: 30000,
12+
headers: {
13+
'User-Agent': 'Mozilla/5.0 (compatible; Node.js script)'
14+
}
15+
};
16+
17+
const request = https.get(url, options, (response) => {
1218
let data = '';
1319
response.on('data', (chunk) => data += chunk);
1420
response.on('end', () => {
1521
try {
1622
if (response.statusCode === 200) {
17-
const packageData = JSON.parse(data);
18-
resolve(packageData.version);
23+
resolve(JSON.parse(data));
1924
} else {
20-
console.warn(`Warning: Could not get latest version for ${packageName}: HTTP ${response.statusCode}`);
25+
console.warn(`Warning: HTTP ${response.statusCode} for ${url}`);
2126
resolve(null);
2227
}
2328
} catch (parseError) {
24-
console.warn(`Warning: Could not parse response for ${packageName}: ${parseError.message}`);
29+
console.warn(`Warning: Could not parse response for ${url}: ${parseError.message}`);
2530
resolve(null);
2631
}
2732
});
2833
});
2934

3035
request.on('error', (requestError) => {
31-
console.warn(`Warning: Could not get latest version for ${packageName}: ${requestError.message}`);
36+
console.warn(`Warning: Request failed for ${url}: ${requestError.message}`);
3237
resolve(null);
3338
});
3439

3540
request.on('timeout', () => {
3641
request.destroy();
37-
console.warn(`Warning: Timeout getting latest version for ${packageName}`);
42+
console.warn(`Warning: Timeout for ${url}`);
3843
resolve(null);
3944
});
4045
});
4146
}
4247

48+
async function getVersionsFromGitHubReleases() {
49+
try {
50+
// Get versions from opentelemetry-js releases
51+
const jsReleases = await httpsGet('https://api.github.com/repos/open-telemetry/opentelemetry-js/releases');
52+
const contribReleases = await httpsGet('https://api.github.com/repos/open-telemetry/opentelemetry-js-contrib/releases');
53+
54+
const versions = {};
55+
56+
// Process opentelemetry-js releases
57+
if (jsReleases) {
58+
for (const release of jsReleases) {
59+
const tagName = release.tag_name;
60+
61+
// Core packages: v2.0.0 -> 2.0.0
62+
if (/^v\d+\.\d+\.\d+$/.test(tagName) && !versions.core) {
63+
versions.core = tagName.substring(1);
64+
}
65+
// Experimental packages: experimental/v0.57.1 -> 0.57.1
66+
else if (tagName.startsWith('experimental/v') && !versions.experimental) {
67+
versions.experimental = tagName.substring('experimental/v'.length);
68+
}
69+
// API package: api/v1.9.0 -> 1.9.0
70+
else if (tagName.startsWith('api/v') && !versions.api) {
71+
versions.api = tagName.substring('api/v'.length);
72+
}
73+
// Semantic conventions: semconv/v1.28.0 -> 1.28.0
74+
else if (tagName.startsWith('semconv/v') && !versions.semconv) {
75+
versions.semconv = tagName.substring('semconv/v'.length);
76+
}
77+
}
78+
}
79+
80+
// Process opentelemetry-js-contrib releases
81+
if (contribReleases) {
82+
for (const release of contribReleases) {
83+
const tagName = release.tag_name;
84+
85+
// Extract component name and version from releases like "auto-instrumentations-node: v0.64.4"
86+
const match = tagName.match(/^([^:]+):\s*v(.+)$/);
87+
if (match) {
88+
const componentName = match[1];
89+
const version = match[2];
90+
versions[componentName] = version;
91+
}
92+
}
93+
}
94+
95+
console.log('Found GitHub release versions:', versions);
96+
return versions;
97+
98+
} catch (error) {
99+
console.warn(`Warning: Could not get GitHub releases: ${error.message}`);
100+
return {};
101+
}
102+
}
103+
104+
async function getLatestVersionFromNpm(packageName) {
105+
try {
106+
const data = await httpsGet(`https://registry.npmjs.org/${packageName}/latest`);
107+
return data ? data.version : null;
108+
} catch (error) {
109+
console.warn(`Warning: Could not get npm version for ${packageName}: ${error.message}`);
110+
return null;
111+
}
112+
}
113+
114+
// Package categorization based on their typical versioning patterns
115+
const PACKAGE_CATEGORIES = {
116+
api: ['@opentelemetry/api'],
117+
core: [
118+
'@opentelemetry/core',
119+
'@opentelemetry/exporter-zipkin',
120+
'@opentelemetry/resources',
121+
'@opentelemetry/sdk-metrics',
122+
'@opentelemetry/sdk-trace-base'
123+
],
124+
experimental: [
125+
'@opentelemetry/api-events',
126+
'@opentelemetry/exporter-metrics-otlp-grpc',
127+
'@opentelemetry/exporter-metrics-otlp-http',
128+
'@opentelemetry/exporter-trace-otlp-proto',
129+
'@opentelemetry/exporter-logs-otlp-grpc',
130+
'@opentelemetry/exporter-logs-otlp-http',
131+
'@opentelemetry/exporter-logs-otlp-proto',
132+
'@opentelemetry/instrumentation',
133+
'@opentelemetry/otlp-transformer',
134+
'@opentelemetry/sdk-events',
135+
'@opentelemetry/sdk-logs',
136+
'@opentelemetry/sdk-node'
137+
],
138+
semconv: ['@opentelemetry/semantic-conventions'],
139+
// These have individual releases in opentelemetry-js-contrib
140+
contrib: [
141+
'@opentelemetry/auto-configuration-propagators',
142+
'@opentelemetry/auto-instrumentations-node',
143+
'@opentelemetry/baggage-span-processor',
144+
'@opentelemetry/instrumentation-aws-sdk',
145+
'@opentelemetry/id-generator-aws-xray',
146+
'@opentelemetry/propagator-aws-xray',
147+
'@opentelemetry/resource-detector-aws'
148+
]
149+
};
150+
43151
async function main() {
44152
const packageJsonPath = path.join('aws-distro-opentelemetry-node-autoinstrumentation', 'package.json');
45153

46154
try {
47155
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
48156
let updated = false;
49157

158+
// Get versions from GitHub releases
159+
const githubVersions = await getVersionsFromGitHubReleases();
160+
161+
// Get all @opentelemetry packages from dependencies
50162
const dependencies = packageJson.dependencies || {};
51163
const otelPackages = Object.keys(dependencies).filter(pkg => pkg.startsWith('@opentelemetry/'));
52-
53-
for (const packageName of otelPackages) {
54-
const latestVersion = await getLatestVersion(packageName);
55-
if (latestVersion) {
56-
const currentVersion = dependencies[packageName];
57164

58-
if (currentVersion !== latestVersion) {
59-
packageJson.dependencies[packageName] = latestVersion;
60-
updated = true;
61-
console.log(`Updated ${packageName}: ${currentVersion}${latestVersion}`);
165+
// Update each package
166+
for (const packageName of otelPackages) {
167+
const currentVersion = dependencies[packageName];
168+
let newVersion = null;
169+
170+
// Try to get version from GitHub releases first
171+
if (PACKAGE_CATEGORIES.api.includes(packageName) && githubVersions.api) {
172+
newVersion = githubVersions.api;
173+
} else if (PACKAGE_CATEGORIES.core.includes(packageName) && githubVersions.core) {
174+
newVersion = githubVersions.core;
175+
} else if (PACKAGE_CATEGORIES.experimental.includes(packageName) && githubVersions.experimental) {
176+
newVersion = githubVersions.experimental;
177+
} else if (PACKAGE_CATEGORIES.semconv.includes(packageName) && githubVersions.semconv) {
178+
newVersion = githubVersions.semconv;
179+
} else if (PACKAGE_CATEGORIES.contrib.includes(packageName)) {
180+
// Try to get version from contrib releases by stripping @opentelemetry/ prefix
181+
const componentName = packageName.replace('@opentelemetry/', '');
182+
if (githubVersions[componentName]) {
183+
newVersion = githubVersions[componentName];
62184
} else {
63-
console.log(`${packageName} already at latest version: ${latestVersion}`);
185+
// Fall back to npm registry
186+
newVersion = await getLatestVersionFromNpm(packageName);
64187
}
188+
} else {
189+
// Fall back to npm registry for any uncategorized packages
190+
console.log(`Package ${packageName} not categorized, fetching version from npm`);
191+
newVersion = await getLatestVersionFromNpm(packageName);
192+
}
193+
194+
if (newVersion && currentVersion !== newVersion) {
195+
packageJson.dependencies[packageName] = newVersion;
196+
updated = true;
197+
console.log(`Updated ${packageName}: ${currentVersion}${newVersion}`);
198+
} else if (newVersion) {
199+
console.log(`${packageName} already at latest version: ${newVersion}`);
65200
}
66201
}
67202

0 commit comments

Comments
 (0)