mirror of
https://github.com/renovatebot/renovate.git
synced 2025-01-28 15:36:27 +00:00
Merge branch 'main' into devbox-manager
This commit is contained in:
commit
4f66bc6795
23 changed files with 663 additions and 484 deletions
|
@ -1 +1 @@
|
||||||
FROM ghcr.io/containerbase/devcontainer:13.5.11
|
FROM ghcr.io/containerbase/devcontainer:13.6.0
|
||||||
|
|
6
.github/workflows/codeql-analysis.yml
vendored
6
.github/workflows/codeql-analysis.yml
vendored
|
@ -41,7 +41,7 @@ jobs:
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@b6a472f63d85b9c78a3ac5e89422239fc15e9b3c # v3.28.1
|
uses: github/codeql-action/init@d68b2d4edb4189fd2a5366ac14e72027bd4b37dd # v3.28.2
|
||||||
with:
|
with:
|
||||||
languages: javascript
|
languages: javascript
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ jobs:
|
||||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||||
# If this step fails, then you should remove it and run the build manually (see below)
|
# If this step fails, then you should remove it and run the build manually (see below)
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@b6a472f63d85b9c78a3ac5e89422239fc15e9b3c # v3.28.1
|
uses: github/codeql-action/autobuild@d68b2d4edb4189fd2a5366ac14e72027bd4b37dd # v3.28.2
|
||||||
|
|
||||||
# ℹ️ Command-line programs to run using the OS shell.
|
# ℹ️ Command-line programs to run using the OS shell.
|
||||||
# 📚 https://git.io/JvXDl
|
# 📚 https://git.io/JvXDl
|
||||||
|
@ -65,4 +65,4 @@ jobs:
|
||||||
# make release
|
# make release
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@b6a472f63d85b9c78a3ac5e89422239fc15e9b3c # v3.28.1
|
uses: github/codeql-action/analyze@d68b2d4edb4189fd2a5366ac14e72027bd4b37dd # v3.28.2
|
||||||
|
|
2
.github/workflows/scorecard.yml
vendored
2
.github/workflows/scorecard.yml
vendored
|
@ -51,6 +51,6 @@ jobs:
|
||||||
|
|
||||||
# Upload the results to GitHub's code scanning dashboard.
|
# Upload the results to GitHub's code scanning dashboard.
|
||||||
- name: 'Upload to code-scanning'
|
- name: 'Upload to code-scanning'
|
||||||
uses: github/codeql-action/upload-sarif@b6a472f63d85b9c78a3ac5e89422239fc15e9b3c # v3.28.1
|
uses: github/codeql-action/upload-sarif@d68b2d4edb4189fd2a5366ac14e72027bd4b37dd # v3.28.2
|
||||||
with:
|
with:
|
||||||
sarif_file: results.sarif
|
sarif_file: results.sarif
|
||||||
|
|
2
.github/workflows/trivy.yml
vendored
2
.github/workflows/trivy.yml
vendored
|
@ -31,7 +31,7 @@ jobs:
|
||||||
format: 'sarif'
|
format: 'sarif'
|
||||||
output: 'trivy-results.sarif'
|
output: 'trivy-results.sarif'
|
||||||
|
|
||||||
- uses: github/codeql-action/upload-sarif@b6a472f63d85b9c78a3ac5e89422239fc15e9b3c # v3.28.1
|
- uses: github/codeql-action/upload-sarif@d68b2d4edb4189fd2a5366ac14e72027bd4b37dd # v3.28.2
|
||||||
with:
|
with:
|
||||||
sarif_file: trivy-results.sarif
|
sarif_file: trivy-results.sarif
|
||||||
category: 'docker-image-${{ matrix.tag }}'
|
category: 'docker-image-${{ matrix.tag }}'
|
||||||
|
|
2
.nvmrc
2
.nvmrc
|
@ -1 +1 @@
|
||||||
22.13.0
|
22.13.1
|
||||||
|
|
|
@ -36,7 +36,7 @@ services:
|
||||||
otel-collector:
|
otel-collector:
|
||||||
# Using the Contrib version to access the spanmetrics connector.
|
# Using the Contrib version to access the spanmetrics connector.
|
||||||
# If you don't need the spanmetrics connector, you can use the standard version
|
# If you don't need the spanmetrics connector, you can use the standard version
|
||||||
image: otel/opentelemetry-collector-contrib:0.117.0
|
image: otel/opentelemetry-collector-contrib:0.118.0
|
||||||
volumes:
|
volumes:
|
||||||
- ./otel-collector-config.yml:/etc/otelcol-contrib/config.yaml
|
- ./otel-collector-config.yml:/etc/otelcol-contrib/config.yaml
|
||||||
ports:
|
ports:
|
||||||
|
|
|
@ -74,12 +74,12 @@ This change causes Renovate to create an Onboarding PR, even if Renovate does no
|
||||||
|
|
||||||
## Fork Processing
|
## Fork Processing
|
||||||
|
|
||||||
If an Organization installs Renovate with the "All repositories" option, then `forkProcessing` will remain set to its default value `false`.
|
If an Organization installs Renovate with the "All repositories" option, then `forkProcessing` will remain set to its default value `disabled`.
|
||||||
This means forked repositories are _not_ onboarded, Renovate ignores them.
|
This means forked repositories are _not_ onboarded, Renovate ignores them.
|
||||||
To change this behavior, push a `renovate.json` file to the repository with `"forkProcessing": true`.
|
To change this behavior, push a `renovate.json` file to the repository with `"forkProcessing": "enabled"`.
|
||||||
|
|
||||||
If an Organization installs Renovate with "Selected repositories", we assume the organization wants to onboard _all_ of the selected repositories, even forked repositories.
|
If an Organization installs Renovate with "Selected repositories", we assume the organization wants to onboard _all_ of the selected repositories, even forked repositories.
|
||||||
Therefore we set `forkProcessing` to `true`.
|
Therefore we set `forkProcessing` to "enabled".
|
||||||
|
|
||||||
## Inherited config
|
## Inherited config
|
||||||
|
|
||||||
|
|
|
@ -516,7 +516,7 @@ const options: RenovateOptions[] = [
|
||||||
description:
|
description:
|
||||||
'Change this value to override the default Renovate sidecar image.',
|
'Change this value to override the default Renovate sidecar image.',
|
||||||
type: 'string',
|
type: 'string',
|
||||||
default: 'ghcr.io/containerbase/sidecar:13.5.11',
|
default: 'ghcr.io/containerbase/sidecar:13.6.0',
|
||||||
globalOnly: true,
|
globalOnly: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -271,6 +271,7 @@ export interface RenovateConfig
|
||||||
packageFile?: string;
|
packageFile?: string;
|
||||||
packageRules?: PackageRule[];
|
packageRules?: PackageRule[];
|
||||||
postUpdateOptions?: string[];
|
postUpdateOptions?: string[];
|
||||||
|
branchConcurrentLimit?: number | null;
|
||||||
prConcurrentLimit?: number;
|
prConcurrentLimit?: number;
|
||||||
prHourlyLimit?: number;
|
prHourlyLimit?: number;
|
||||||
forkModeDisallowMaintainerEdits?: boolean;
|
forkModeDisallowMaintainerEdits?: boolean;
|
||||||
|
|
|
@ -679,71 +679,6 @@ describe('modules/manager/bundler/artifacts', () => {
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('handles failure of strict updating for version solving', async () => {
|
|
||||||
const execError = new ExecError('Exec error', {
|
|
||||||
cmd: '',
|
|
||||||
stdout: '',
|
|
||||||
stderr: 'version solving has failed',
|
|
||||||
options: { encoding: 'utf8' },
|
|
||||||
});
|
|
||||||
fs.readLocalFile.mockResolvedValue('Current Gemfile.lock');
|
|
||||||
const execSnapshots = mockExecSequence([
|
|
||||||
execError,
|
|
||||||
{ stdout: '', stderr: '' },
|
|
||||||
]);
|
|
||||||
git.getRepoStatus.mockResolvedValueOnce(
|
|
||||||
partial<StatusResult>({
|
|
||||||
modified: ['Gemfile.lock'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
const res = await updateArtifacts({
|
|
||||||
packageFileName: 'Gemfile',
|
|
||||||
updatedDeps: [{ depName: 'foo', updateType: 'minor' }],
|
|
||||||
newPackageFileContent: '{}',
|
|
||||||
config,
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(res).toMatchObject([{ file: { path: 'Gemfile.lock' } }]);
|
|
||||||
expect(execSnapshots).toMatchObject([
|
|
||||||
{ cmd: 'bundler lock --minor --strict --update foo' },
|
|
||||||
{ cmd: 'bundler lock --minor --conservative --update foo' },
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('handles failure of strict updating for missing gem', async () => {
|
|
||||||
// See https://github.com/rubygems/rubygems/issues/7369
|
|
||||||
const execError = new ExecError('Exec error', {
|
|
||||||
cmd: '',
|
|
||||||
stdout: '',
|
|
||||||
stderr: "Could not find gems matching 'foo ",
|
|
||||||
options: { encoding: 'utf8' },
|
|
||||||
});
|
|
||||||
fs.readLocalFile.mockResolvedValue('Current Gemfile.lock');
|
|
||||||
const execSnapshots = mockExecSequence([
|
|
||||||
execError,
|
|
||||||
{ stdout: '', stderr: '' },
|
|
||||||
]);
|
|
||||||
git.getRepoStatus.mockResolvedValueOnce(
|
|
||||||
partial<StatusResult>({
|
|
||||||
modified: ['Gemfile.lock'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
const res = await updateArtifacts({
|
|
||||||
packageFileName: 'Gemfile',
|
|
||||||
updatedDeps: [{ depName: 'foo', updateType: 'minor' }],
|
|
||||||
newPackageFileContent: '{}',
|
|
||||||
config,
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(res).toMatchObject([{ file: { path: 'Gemfile.lock' } }]);
|
|
||||||
expect(execSnapshots).toMatchObject([
|
|
||||||
{ cmd: 'bundler lock --minor --strict --update foo' },
|
|
||||||
{ cmd: 'bundler lock --minor --conservative --update foo' },
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('updates the Gemfile.lock when upgrading ruby', async () => {
|
it('updates the Gemfile.lock when upgrading ruby', async () => {
|
||||||
// See https://github.com/renovatebot/renovate/issues/15114
|
// See https://github.com/renovatebot/renovate/issues/15114
|
||||||
fs.readLocalFile.mockResolvedValue('Current Gemfile.lock');
|
fs.readLocalFile.mockResolvedValue('Current Gemfile.lock');
|
||||||
|
|
|
@ -105,8 +105,8 @@ export async function updateArtifacts(
|
||||||
}
|
}
|
||||||
|
|
||||||
const updateTypes = {
|
const updateTypes = {
|
||||||
patch: '--patch --strict ',
|
patch: '--patch ',
|
||||||
minor: '--minor --strict ',
|
minor: '--minor ',
|
||||||
major: '',
|
major: '',
|
||||||
};
|
};
|
||||||
for (const [updateType, updateArg] of Object.entries(updateTypes)) {
|
for (const [updateType, updateArg] of Object.entries(updateTypes)) {
|
||||||
|
@ -120,12 +120,9 @@ export async function updateArtifacts(
|
||||||
additionalArgs = '--conservative ';
|
additionalArgs = '--conservative ';
|
||||||
}
|
}
|
||||||
if (deps.length) {
|
if (deps.length) {
|
||||||
let cmd = `bundler lock ${updateArg}${additionalArgs}--update ${deps
|
const cmd = `bundler lock ${updateArg}${additionalArgs}--update ${deps
|
||||||
.map(quote)
|
.map(quote)
|
||||||
.join(' ')}`;
|
.join(' ')}`;
|
||||||
if (cmd.includes(' --conservative ')) {
|
|
||||||
cmd = cmd.replace(' --strict', '');
|
|
||||||
}
|
|
||||||
commands.push(cmd);
|
commands.push(cmd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -226,29 +223,6 @@ export async function updateArtifacts(
|
||||||
memCache.set('bundlerArtifactsError', BUNDLER_INVALID_CREDENTIALS);
|
memCache.set('bundlerArtifactsError', BUNDLER_INVALID_CREDENTIALS);
|
||||||
throw new Error(BUNDLER_INVALID_CREDENTIALS);
|
throw new Error(BUNDLER_INVALID_CREDENTIALS);
|
||||||
}
|
}
|
||||||
if (
|
|
||||||
recursionLimit > 0 &&
|
|
||||||
(output.includes('version solving has failed') ||
|
|
||||||
output.includes('Could not find gem'))
|
|
||||||
) {
|
|
||||||
logger.debug('Failed to lock strictly, retrying non-strict');
|
|
||||||
const newConfig = {
|
|
||||||
...config,
|
|
||||||
postUpdateOptions: [
|
|
||||||
...(config.postUpdateOptions ?? []),
|
|
||||||
'bundlerConservative',
|
|
||||||
],
|
|
||||||
};
|
|
||||||
return updateArtifacts(
|
|
||||||
{
|
|
||||||
packageFileName,
|
|
||||||
updatedDeps,
|
|
||||||
newPackageFileContent,
|
|
||||||
config: newConfig,
|
|
||||||
},
|
|
||||||
recursionLimit - 1,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
const resolveMatches: string[] = getResolvedPackages(output).filter(
|
const resolveMatches: string[] = getResolvedPackages(output).filter(
|
||||||
(depName) => !updatedDepNames.includes(depName),
|
(depName) => !updatedDepNames.includes(depName),
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,7 +1,13 @@
|
||||||
|
import { partial } from '../../../test/util';
|
||||||
|
import type { BranchConfig, BranchUpgradeConfig } from '../types';
|
||||||
import {
|
import {
|
||||||
|
calcLimit,
|
||||||
|
hasMultipleLimits,
|
||||||
|
incCountValue,
|
||||||
incLimitedValue,
|
incLimitedValue,
|
||||||
isLimitReached,
|
isLimitReached,
|
||||||
resetAllLimits,
|
resetAllLimits,
|
||||||
|
setCount,
|
||||||
setMaxLimit,
|
setMaxLimit,
|
||||||
} from './limits';
|
} from './limits';
|
||||||
|
|
||||||
|
@ -60,4 +66,242 @@ describe('workers/global/limits', () => {
|
||||||
setMaxLimit('Commits', -1000);
|
setMaxLimit('Commits', -1000);
|
||||||
expect(isLimitReached('Commits')).toBeTrue();
|
expect(isLimitReached('Commits')).toBeTrue();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('calcLimit', () => {
|
||||||
|
it('handles single upgrade', () => {
|
||||||
|
const upgrades = partial<BranchUpgradeConfig>([
|
||||||
|
{
|
||||||
|
prHourlyLimit: 10,
|
||||||
|
branchConcurrentLimit: 11,
|
||||||
|
prConcurrentLimit: 12,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
expect(calcLimit(upgrades, 'prHourlyLimit')).toBe(10);
|
||||||
|
expect(calcLimit(upgrades, 'branchConcurrentLimit')).toBe(11);
|
||||||
|
expect(calcLimit(upgrades, 'prConcurrentLimit')).toBe(12);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('inherits prConcurrentLimit if branchConcurrentLimit is null', () => {
|
||||||
|
const upgrades = partial<BranchUpgradeConfig>([
|
||||||
|
{
|
||||||
|
prHourlyLimit: 10,
|
||||||
|
branchConcurrentLimit: null,
|
||||||
|
prConcurrentLimit: 12,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
expect(calcLimit(upgrades, 'prHourlyLimit')).toBe(10);
|
||||||
|
expect(calcLimit(upgrades, 'branchConcurrentLimit')).toBe(12);
|
||||||
|
expect(calcLimit(upgrades, 'prConcurrentLimit')).toBe(12);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns 0 if atleast one upgrade has no limit in the branch', () => {
|
||||||
|
const upgrades = partial<BranchUpgradeConfig>([
|
||||||
|
{
|
||||||
|
prHourlyLimit: 10,
|
||||||
|
branchConcurrentLimit: 11,
|
||||||
|
prConcurrentLimit: 12,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prHourlyLimit: 0,
|
||||||
|
branchConcurrentLimit: 0,
|
||||||
|
prConcurrentLimit: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prHourlyLimit: 1,
|
||||||
|
branchConcurrentLimit: 1,
|
||||||
|
prConcurrentLimit: 1,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
expect(calcLimit(upgrades, 'prHourlyLimit')).toBe(0);
|
||||||
|
expect(calcLimit(upgrades, 'branchConcurrentLimit')).toBe(0);
|
||||||
|
expect(calcLimit(upgrades, 'prConcurrentLimit')).toBe(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('computes the lowest limit if multiple limits are present', () => {
|
||||||
|
const upgrades = partial<BranchUpgradeConfig>([
|
||||||
|
{
|
||||||
|
prHourlyLimit: 10,
|
||||||
|
branchConcurrentLimit: 11,
|
||||||
|
prConcurrentLimit: 12,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prHourlyLimit: 10,
|
||||||
|
branchConcurrentLimit: 11,
|
||||||
|
prConcurrentLimit: 12,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prHourlyLimit: 1,
|
||||||
|
branchConcurrentLimit: 1,
|
||||||
|
prConcurrentLimit: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prHourlyLimit: 5,
|
||||||
|
branchConcurrentLimit: 6,
|
||||||
|
prConcurrentLimit: 3,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prHourlyLimit: 5,
|
||||||
|
branchConcurrentLimit: null,
|
||||||
|
prConcurrentLimit: undefined,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prHourlyLimit: 5,
|
||||||
|
branchConcurrentLimit: 6,
|
||||||
|
prConcurrentLimit: 2,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
expect(calcLimit(upgrades, 'prHourlyLimit')).toBe(1);
|
||||||
|
expect(calcLimit(upgrades, 'branchConcurrentLimit')).toBe(1);
|
||||||
|
expect(calcLimit(upgrades, 'prConcurrentLimit')).toBe(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('hasMultipleLimits', () => {
|
||||||
|
it('handles single limit', () => {
|
||||||
|
const upgrades = partial<BranchUpgradeConfig>([
|
||||||
|
{
|
||||||
|
prHourlyLimit: 10,
|
||||||
|
branchConcurrentLimit: 11,
|
||||||
|
prConcurrentLimit: 12,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
expect(hasMultipleLimits(upgrades, 'prHourlyLimit')).toBe(false);
|
||||||
|
expect(hasMultipleLimits(upgrades, 'branchConcurrentLimit')).toBe(false);
|
||||||
|
expect(hasMultipleLimits(upgrades, 'prConcurrentLimit')).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns false if there are multiple limits with value', () => {
|
||||||
|
const upgrades = partial<BranchUpgradeConfig>([
|
||||||
|
{
|
||||||
|
prHourlyLimit: 10,
|
||||||
|
branchConcurrentLimit: 11,
|
||||||
|
prConcurrentLimit: 12,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prHourlyLimit: 10,
|
||||||
|
branchConcurrentLimit: 11,
|
||||||
|
prConcurrentLimit: 12,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
expect(hasMultipleLimits(upgrades, 'prHourlyLimit')).toBe(false);
|
||||||
|
expect(hasMultipleLimits(upgrades, 'branchConcurrentLimit')).toBe(false);
|
||||||
|
expect(hasMultipleLimits(upgrades, 'prConcurrentLimit')).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('handles multiple limits', () => {
|
||||||
|
const upgrades = partial<BranchUpgradeConfig>([
|
||||||
|
{
|
||||||
|
prHourlyLimit: 10,
|
||||||
|
branchConcurrentLimit: 11,
|
||||||
|
prConcurrentLimit: 12,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prHourlyLimit: 11,
|
||||||
|
branchConcurrentLimit: 12,
|
||||||
|
prConcurrentLimit: 13,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prHourlyLimit: 0,
|
||||||
|
branchConcurrentLimit: null,
|
||||||
|
prConcurrentLimit: 3,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
expect(hasMultipleLimits(upgrades, 'prHourlyLimit')).toBe(true);
|
||||||
|
expect(hasMultipleLimits(upgrades, 'branchConcurrentLimit')).toBe(true);
|
||||||
|
expect(hasMultipleLimits(upgrades, 'prConcurrentLimit')).toBe(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('isLimitReached', () => {
|
||||||
|
it('returns false based on concurrent limits', () => {
|
||||||
|
setCount('ConcurrentPRs', 1);
|
||||||
|
setCount('HourlyPRs', 1);
|
||||||
|
incCountValue('Branches'); // using incCountValue so it gets test coverage
|
||||||
|
const upgrades = partial<BranchUpgradeConfig>([
|
||||||
|
{
|
||||||
|
prHourlyLimit: 10,
|
||||||
|
branchConcurrentLimit: 11,
|
||||||
|
prConcurrentLimit: 12,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prHourlyLimit: 11,
|
||||||
|
branchConcurrentLimit: 12,
|
||||||
|
prConcurrentLimit: 13,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prHourlyLimit: 0,
|
||||||
|
branchConcurrentLimit: null,
|
||||||
|
prConcurrentLimit: 3,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
expect(
|
||||||
|
isLimitReached('Branches', partial<BranchConfig>({ upgrades })),
|
||||||
|
).toBe(false);
|
||||||
|
expect(
|
||||||
|
isLimitReached('ConcurrentPRs', partial<BranchConfig>({ upgrades })),
|
||||||
|
).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns true when hourly limit is reached', () => {
|
||||||
|
setCount('Branches', 2);
|
||||||
|
setCount('ConcurrentPRs', 2);
|
||||||
|
setCount('HourlyPRs', 2);
|
||||||
|
const upgrades = partial<BranchUpgradeConfig>([
|
||||||
|
{
|
||||||
|
prHourlyLimit: 10,
|
||||||
|
branchConcurrentLimit: 11,
|
||||||
|
prConcurrentLimit: 12,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prHourlyLimit: 11,
|
||||||
|
branchConcurrentLimit: 12,
|
||||||
|
prConcurrentLimit: 13,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prHourlyLimit: 2,
|
||||||
|
branchConcurrentLimit: null,
|
||||||
|
prConcurrentLimit: 3,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
expect(
|
||||||
|
isLimitReached('Branches', partial<BranchConfig>({ upgrades })),
|
||||||
|
).toBe(true);
|
||||||
|
expect(
|
||||||
|
isLimitReached('ConcurrentPRs', partial<BranchConfig>({ upgrades })),
|
||||||
|
).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns true when concurrent limit is reached', () => {
|
||||||
|
setCount('Branches', 3);
|
||||||
|
setCount('ConcurrentPRs', 3);
|
||||||
|
setCount('HourlyPRs', 4);
|
||||||
|
const upgrades = partial<BranchUpgradeConfig>([
|
||||||
|
{
|
||||||
|
prHourlyLimit: 10,
|
||||||
|
branchConcurrentLimit: 11,
|
||||||
|
prConcurrentLimit: 12,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prHourlyLimit: 11,
|
||||||
|
branchConcurrentLimit: 12,
|
||||||
|
prConcurrentLimit: 13,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prHourlyLimit: 5,
|
||||||
|
branchConcurrentLimit: null,
|
||||||
|
prConcurrentLimit: 3,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
expect(
|
||||||
|
isLimitReached('Branches', partial<BranchConfig>({ upgrades })),
|
||||||
|
).toBe(true);
|
||||||
|
expect(
|
||||||
|
isLimitReached('ConcurrentPRs', partial<BranchConfig>({ upgrades })),
|
||||||
|
).toBe(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
|
import is from '@sindresorhus/is';
|
||||||
import { logger } from '../../logger';
|
import { logger } from '../../logger';
|
||||||
|
import type { BranchConfig, BranchUpgradeConfig } from '../types';
|
||||||
|
|
||||||
export type Limit = 'Commits' | 'PullRequests' | 'Branches';
|
export type Limit = 'Commits';
|
||||||
|
|
||||||
interface LimitValue {
|
interface LimitValue {
|
||||||
max: number | null;
|
max: number | null;
|
||||||
current: number;
|
current: number;
|
||||||
|
@ -27,8 +28,8 @@ export function incLimitedValue(key: Limit, incBy = 1): void {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function isLimitReached(key: Limit): boolean {
|
function handleCommitsLimit(): boolean {
|
||||||
const limit = limits.get(key);
|
const limit = limits.get('Commits');
|
||||||
// TODO: fix me?
|
// TODO: fix me?
|
||||||
// eslint-disable-next-line @typescript-eslint/prefer-optional-chain
|
// eslint-disable-next-line @typescript-eslint/prefer-optional-chain
|
||||||
if (!limit || limit.max === null) {
|
if (!limit || limit.max === null) {
|
||||||
|
@ -37,3 +38,162 @@ export function isLimitReached(key: Limit): boolean {
|
||||||
const { max, current } = limit;
|
const { max, current } = limit;
|
||||||
return max - current <= 0;
|
return max - current <= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type CountName = 'ConcurrentPRs' | 'HourlyPRs' | 'Branches';
|
||||||
|
|
||||||
|
type BranchLimitName =
|
||||||
|
| 'branchConcurrentLimit'
|
||||||
|
| 'prConcurrentLimit'
|
||||||
|
| 'prHourlyLimit';
|
||||||
|
|
||||||
|
export const counts = new Map<CountName, number>();
|
||||||
|
|
||||||
|
export function getCount(key: CountName): number {
|
||||||
|
const count = counts.get(key);
|
||||||
|
// istanbul ignore if: should not happen
|
||||||
|
if (!is.integer(count)) {
|
||||||
|
logger.debug(`Could not compute the count of ${key}, returning zero.`);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function setCount(key: CountName, val: number): void {
|
||||||
|
counts.set(key, val);
|
||||||
|
logger.debug(`${key} count = ${val}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function incCountValue(key: CountName, incBy = 1): void {
|
||||||
|
const count = getCount(key);
|
||||||
|
counts.set(key, count + incBy);
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleConcurrentLimits(
|
||||||
|
key: Exclude<CountName, 'HourlyPRs'>,
|
||||||
|
config: BranchConfig,
|
||||||
|
): boolean {
|
||||||
|
const limitKey =
|
||||||
|
key === 'Branches' ? 'branchConcurrentLimit' : 'prConcurrentLimit';
|
||||||
|
|
||||||
|
// calculate the limits for this branch
|
||||||
|
const hourlyLimit = calcLimit(config.upgrades, 'prHourlyLimit');
|
||||||
|
const hourlyPrCount = getCount('HourlyPRs');
|
||||||
|
|
||||||
|
// if a limit is defined ( >0 ) and limit reached return true ie. limit has been reached
|
||||||
|
if (hourlyLimit && hourlyPrCount >= hourlyLimit) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const limitValue = calcLimit(config.upgrades, limitKey);
|
||||||
|
const currentCount = getCount(key);
|
||||||
|
|
||||||
|
if (limitValue && currentCount >= limitValue) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function calcLimit(
|
||||||
|
upgrades: BranchUpgradeConfig[],
|
||||||
|
limitName: BranchLimitName,
|
||||||
|
): number {
|
||||||
|
logger.debug(
|
||||||
|
{
|
||||||
|
limits: upgrades.map((upg) => {
|
||||||
|
return { depName: upg.depName, [limitName]: upg[limitName] };
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
`${limitName} of the upgrades present in this branch`,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (hasMultipleLimits(upgrades, limitName)) {
|
||||||
|
logger.once.debug(
|
||||||
|
`Branch has multiple ${limitName} limits. The lowest among these will be selected.`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
let lowestLimit = Number.MAX_SAFE_INTEGER;
|
||||||
|
for (const upgrade of upgrades) {
|
||||||
|
let limit = upgrade[limitName];
|
||||||
|
|
||||||
|
// inherit prConcurrentLimit value incase branchConcurrentLimit is null
|
||||||
|
if (!is.number(limit) && limitName === 'branchConcurrentLimit') {
|
||||||
|
limit = upgrade.prConcurrentLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// istanbul ignore if: should never happen as all limits get a default value
|
||||||
|
if (is.undefined(limit)) {
|
||||||
|
limit = Number.MAX_SAFE_INTEGER;
|
||||||
|
}
|
||||||
|
|
||||||
|
// no limit
|
||||||
|
if (limit === 0 || limit === null) {
|
||||||
|
logger.debug(
|
||||||
|
`${limitName} of this branch is unlimited, because atleast one of the upgrade has it's ${limitName} set to "No limit" ie. 0 or null`,
|
||||||
|
);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// limit is set
|
||||||
|
lowestLimit = limit < lowestLimit ? limit : lowestLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.debug(
|
||||||
|
`Calculated lowest ${limitName} among the upgrades present in this branch is ${lowestLimit}.`,
|
||||||
|
);
|
||||||
|
return lowestLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function hasMultipleLimits(
|
||||||
|
upgrades: BranchUpgradeConfig[],
|
||||||
|
limitName: BranchLimitName,
|
||||||
|
): boolean {
|
||||||
|
if (upgrades.length === 1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const distinctLimits = new Set<number>();
|
||||||
|
for (const upgrade of upgrades) {
|
||||||
|
let limitValue = upgrade[limitName];
|
||||||
|
|
||||||
|
// inherit prConcurrentLimit value incase branchConcurrentLimit is null
|
||||||
|
if (limitName === 'branchConcurrentLimit' && !is.number(limitValue)) {
|
||||||
|
limitValue = upgrade.prConcurrentLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// istanbul ignore if: should not happen as the limits are of type number
|
||||||
|
if (limitValue === null) {
|
||||||
|
limitValue = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is.undefined(limitValue) && !distinctLimits.has(limitValue)) {
|
||||||
|
distinctLimits.add(limitValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return distinctLimits.size > 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isLimitReached(limit: 'Commits'): boolean;
|
||||||
|
export function isLimitReached(
|
||||||
|
limit: 'Branches' | 'ConcurrentPRs',
|
||||||
|
config: BranchConfig,
|
||||||
|
): boolean;
|
||||||
|
export function isLimitReached(
|
||||||
|
limit: 'Commits' | 'Branches' | 'ConcurrentPRs',
|
||||||
|
config?: BranchConfig,
|
||||||
|
): boolean {
|
||||||
|
if (limit === 'Commits') {
|
||||||
|
return handleCommitsLimit();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config) {
|
||||||
|
return handleConcurrentLimits(limit, config);
|
||||||
|
}
|
||||||
|
|
||||||
|
// istanbul ignore next: should not happen
|
||||||
|
throw new Error(
|
||||||
|
'Config is required for computing limits for Branches and PullRequests',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
|
@ -18,8 +18,8 @@ beforeEach(() => {
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('workers/repository/process/limits', () => {
|
describe('workers/repository/process/limits', () => {
|
||||||
describe('getPrHourlyRemaining()', () => {
|
describe('getPrHourlyCount()', () => {
|
||||||
it('calculates hourly limit remaining', async () => {
|
it('calculates hourly pr count', async () => {
|
||||||
const time = DateTime.local();
|
const time = DateTime.local();
|
||||||
const createdAt = time.toISO();
|
const createdAt = time.toISO();
|
||||||
platform.getPrList.mockResolvedValueOnce([
|
platform.getPrList.mockResolvedValueOnce([
|
||||||
|
@ -33,30 +33,19 @@ describe('workers/repository/process/limits', () => {
|
||||||
{ createdAt, sourceBranch: 'bar/configure' },
|
{ createdAt, sourceBranch: 'bar/configure' },
|
||||||
{ createdAt, sourceBranch: 'baz/test' },
|
{ createdAt, sourceBranch: 'baz/test' },
|
||||||
] as never);
|
] as never);
|
||||||
const res = await limits.getPrHourlyRemaining({
|
const res = await limits.getPrHourlyCount(config);
|
||||||
...config,
|
expect(res).toBe(3);
|
||||||
prHourlyLimit: 10,
|
|
||||||
});
|
|
||||||
expect(res).toBe(7);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('returns prHourlyLimit if errored', async () => {
|
it('returns zero if errored', async () => {
|
||||||
config.prHourlyLimit = 5;
|
|
||||||
platform.getPrList.mockRejectedValue('Unknown error');
|
platform.getPrList.mockRejectedValue('Unknown error');
|
||||||
const res = await limits.getPrHourlyRemaining(config);
|
const res = await limits.getPrHourlyCount(config);
|
||||||
expect(res).toBe(5);
|
expect(res).toBe(0);
|
||||||
});
|
|
||||||
|
|
||||||
it('returns MAX_SAFE_INTEGER if no hourly limit', async () => {
|
|
||||||
config.prHourlyLimit = 0;
|
|
||||||
const res = await limits.getPrHourlyRemaining(config);
|
|
||||||
expect(res).toBe(Number.MAX_SAFE_INTEGER);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('getConcurrentPrsRemaining()', () => {
|
describe('getConcurrentPrsCount()', () => {
|
||||||
it('calculates concurrent limit remaining', async () => {
|
it('calculates concurrent prs present', async () => {
|
||||||
config.prConcurrentLimit = 20;
|
|
||||||
platform.getBranchPr.mockImplementation((branchName) =>
|
platform.getBranchPr.mockImplementation((branchName) =>
|
||||||
branchName
|
branchName
|
||||||
? Promise.resolve(
|
? Promise.resolve(
|
||||||
|
@ -71,100 +60,21 @@ describe('workers/repository/process/limits', () => {
|
||||||
{ branchName: 'test' },
|
{ branchName: 'test' },
|
||||||
{ branchName: null },
|
{ branchName: null },
|
||||||
] as never;
|
] as never;
|
||||||
const res = await limits.getConcurrentPrsRemaining(config, branches);
|
const res = await limits.getConcurrentPrsCount(config, branches);
|
||||||
expect(res).toBe(19);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('returns MAX_SAFE_INTEGER if no concurrent limit', async () => {
|
|
||||||
config.prConcurrentLimit = 0;
|
|
||||||
const res = await limits.getConcurrentPrsRemaining(config, []);
|
|
||||||
expect(res).toBe(Number.MAX_SAFE_INTEGER);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('getPrsRemaining()', () => {
|
|
||||||
it('returns hourly limit', async () => {
|
|
||||||
config.prHourlyLimit = 1;
|
|
||||||
platform.getPrList.mockResolvedValueOnce([]);
|
|
||||||
const res = await limits.getPrsRemaining(config, []);
|
|
||||||
expect(res).toBe(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('returns concurrent limit', async () => {
|
|
||||||
config.prConcurrentLimit = 1;
|
|
||||||
const res = await limits.getPrsRemaining(config, []);
|
|
||||||
expect(res).toBe(1);
|
expect(res).toBe(1);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('getConcurrentBranchesRemaining()', () => {
|
describe('getConcurrentBranchesCount()', () => {
|
||||||
it('calculates concurrent limit remaining', async () => {
|
it('calculates concurrent branches present', async () => {
|
||||||
config.branchConcurrentLimit = 20;
|
scm.branchExists.mockImplementation((branchName) =>
|
||||||
scm.branchExists.mockResolvedValueOnce(true);
|
branchName ? Promise.resolve(true) : Promise.resolve(false),
|
||||||
const res = await limits.getConcurrentBranchesRemaining(config, [
|
|
||||||
{ branchName: 'foo' },
|
|
||||||
] as never);
|
|
||||||
expect(res).toBe(19);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('defaults to prConcurrentLimit', async () => {
|
|
||||||
config.branchConcurrentLimit = null;
|
|
||||||
config.prConcurrentLimit = 20;
|
|
||||||
scm.branchExists.mockResolvedValueOnce(true);
|
|
||||||
const res = await limits.getConcurrentBranchesRemaining(config, [
|
|
||||||
{ branchName: 'foo' },
|
|
||||||
] as never);
|
|
||||||
expect(res).toBe(19);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('does not use prConcurrentLimit for explicit branchConcurrentLimit=0', async () => {
|
|
||||||
config.branchConcurrentLimit = 0;
|
|
||||||
config.prConcurrentLimit = 20;
|
|
||||||
const res = await limits.getConcurrentBranchesRemaining(config, []);
|
|
||||||
expect(res).toBe(Number.MAX_SAFE_INTEGER);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('returns 10 if no limits are set', async () => {
|
|
||||||
const res = await limits.getConcurrentBranchesRemaining(config, []);
|
|
||||||
expect(res).toBe(10);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('returns prConcurrentLimit if errored', async () => {
|
|
||||||
config.branchConcurrentLimit = 2;
|
|
||||||
// TODO: #22198
|
|
||||||
const res = await limits.getConcurrentBranchesRemaining(
|
|
||||||
config,
|
|
||||||
null as never,
|
|
||||||
);
|
);
|
||||||
expect(res).toBe(2);
|
const res = await limits.getConcurrentBranchesCount([
|
||||||
});
|
{ branchName: 'foo' },
|
||||||
});
|
{ branchName: null },
|
||||||
|
] as never);
|
||||||
describe('getBranchesRemaining()', () => {
|
expect(res).toBe(1);
|
||||||
it('returns minimal of both limits', async () => {
|
|
||||||
platform.getPrList.mockResolvedValue([]);
|
|
||||||
|
|
||||||
await expect(
|
|
||||||
limits.getBranchesRemaining(
|
|
||||||
{
|
|
||||||
...config,
|
|
||||||
prHourlyLimit: 3,
|
|
||||||
branchConcurrentLimit: 5,
|
|
||||||
},
|
|
||||||
[],
|
|
||||||
),
|
|
||||||
).resolves.toBe(3);
|
|
||||||
|
|
||||||
await expect(
|
|
||||||
limits.getBranchesRemaining(
|
|
||||||
{
|
|
||||||
...config,
|
|
||||||
prHourlyLimit: 11,
|
|
||||||
branchConcurrentLimit: 7,
|
|
||||||
},
|
|
||||||
[],
|
|
||||||
),
|
|
||||||
).resolves.toBe(7);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,141 +1,79 @@
|
||||||
import { DateTime } from 'luxon';
|
import { DateTime } from 'luxon';
|
||||||
import type { RenovateConfig } from '../../../config/types';
|
import type { RenovateConfig } from '../../../config/types';
|
||||||
import { logger } from '../../../logger';
|
import { logger } from '../../../logger';
|
||||||
import type { Pr } from '../../../modules/platform';
|
|
||||||
import { platform } from '../../../modules/platform';
|
import { platform } from '../../../modules/platform';
|
||||||
import { scm } from '../../../modules/platform/scm';
|
import { scm } from '../../../modules/platform/scm';
|
||||||
import { ExternalHostError } from '../../../types/errors/external-host-error';
|
import { ExternalHostError } from '../../../types/errors/external-host-error';
|
||||||
import type { BranchConfig } from '../../types';
|
import type { BranchConfig } from '../../types';
|
||||||
|
|
||||||
export async function getPrHourlyRemaining(
|
export async function getPrHourlyCount(
|
||||||
config: RenovateConfig,
|
config: RenovateConfig,
|
||||||
): Promise<number> {
|
): Promise<number> {
|
||||||
if (config.prHourlyLimit) {
|
try {
|
||||||
|
const prList = await platform.getPrList();
|
||||||
|
const currentHourStart = DateTime.local().setZone('utc').startOf('hour');
|
||||||
|
logger.debug(
|
||||||
|
`Calculating PRs created so far in this hour currentHourStart=${String(currentHourStart)}`,
|
||||||
|
);
|
||||||
|
const soFarThisHour = prList.filter(
|
||||||
|
(pr) =>
|
||||||
|
pr.sourceBranch !== config.onboardingBranch &&
|
||||||
|
pr.sourceBranch.startsWith(config.branchPrefix!) &&
|
||||||
|
DateTime.fromISO(pr.createdAt!) > currentHourStart,
|
||||||
|
);
|
||||||
|
logger.debug(
|
||||||
|
`${soFarThisHour.length} PRs have been created so far in this hour.`,
|
||||||
|
);
|
||||||
|
return soFarThisHour.length;
|
||||||
|
} catch (err) {
|
||||||
|
// istanbul ignore if
|
||||||
|
if (err instanceof ExternalHostError) {
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
logger.error({ err }, 'Error checking PRs created per hour');
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getConcurrentPrsCount(
|
||||||
|
config: RenovateConfig,
|
||||||
|
branches: BranchConfig[],
|
||||||
|
): Promise<number> {
|
||||||
|
let openPrCount = 0;
|
||||||
|
for (const { branchName } of branches) {
|
||||||
try {
|
try {
|
||||||
logger.debug('Calculating hourly PRs remaining');
|
const pr = await platform.getBranchPr(branchName, config.baseBranch);
|
||||||
const prList = await platform.getPrList();
|
if (
|
||||||
const currentHourStart = DateTime.local().startOf('hour');
|
pr &&
|
||||||
logger.debug(`currentHourStart=${String(currentHourStart)}`);
|
pr.sourceBranch !== config.onboardingBranch &&
|
||||||
const soFarThisHour = prList.filter(
|
pr.state === 'open'
|
||||||
(pr) =>
|
) {
|
||||||
pr.sourceBranch !== config.onboardingBranch &&
|
openPrCount++;
|
||||||
pr.sourceBranch.startsWith(config.branchPrefix!) &&
|
}
|
||||||
DateTime.fromISO(pr.createdAt!) > currentHourStart,
|
|
||||||
);
|
|
||||||
const prsRemaining = Math.max(
|
|
||||||
0,
|
|
||||||
config.prHourlyLimit - soFarThisHour.length,
|
|
||||||
);
|
|
||||||
logger.debug(`PR hourly limit remaining: ${prsRemaining}`);
|
|
||||||
return prsRemaining;
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
// istanbul ignore if
|
// istanbul ignore if
|
||||||
if (err instanceof ExternalHostError) {
|
if (err instanceof ExternalHostError) {
|
||||||
throw err;
|
throw err;
|
||||||
|
} else {
|
||||||
|
// no-op
|
||||||
}
|
}
|
||||||
logger.error({ err }, 'Error checking PRs created per hour');
|
|
||||||
return config.prHourlyLimit;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Number.MAX_SAFE_INTEGER;
|
|
||||||
|
logger.debug(`${openPrCount} PRs are currently open`);
|
||||||
|
return openPrCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function getConcurrentPrsRemaining(
|
export async function getConcurrentBranchesCount(
|
||||||
config: RenovateConfig,
|
|
||||||
branches: BranchConfig[],
|
branches: BranchConfig[],
|
||||||
): Promise<number> {
|
): Promise<number> {
|
||||||
if (config.prConcurrentLimit) {
|
let existingBranchCount = 0;
|
||||||
logger.debug(`Calculating prConcurrentLimit (${config.prConcurrentLimit})`);
|
for (const branch of branches) {
|
||||||
try {
|
if (await scm.branchExists(branch.branchName)) {
|
||||||
const openPrs: Pr[] = [];
|
existingBranchCount++;
|
||||||
for (const { branchName } of branches) {
|
|
||||||
try {
|
|
||||||
const pr = await platform.getBranchPr(branchName, config.baseBranch);
|
|
||||||
if (
|
|
||||||
pr &&
|
|
||||||
pr.sourceBranch !== config.onboardingBranch &&
|
|
||||||
pr.state === 'open'
|
|
||||||
) {
|
|
||||||
openPrs.push(pr);
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
// istanbul ignore if
|
|
||||||
if (err instanceof ExternalHostError) {
|
|
||||||
throw err;
|
|
||||||
} else {
|
|
||||||
// no-op
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
logger.debug(`${openPrs.length} PRs are currently open`);
|
|
||||||
const concurrentRemaining = Math.max(
|
|
||||||
0,
|
|
||||||
config.prConcurrentLimit - openPrs.length,
|
|
||||||
);
|
|
||||||
logger.debug(`PR concurrent limit remaining: ${concurrentRemaining}`);
|
|
||||||
return concurrentRemaining;
|
|
||||||
} catch (err) /* istanbul ignore next */ {
|
|
||||||
logger.error({ err }, 'Error checking concurrent PRs');
|
|
||||||
return config.prConcurrentLimit;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Number.MAX_SAFE_INTEGER;
|
|
||||||
}
|
logger.debug(`${existingBranchCount} already existing branches found.`);
|
||||||
|
return existingBranchCount;
|
||||||
export async function getPrsRemaining(
|
|
||||||
config: RenovateConfig,
|
|
||||||
branches: BranchConfig[],
|
|
||||||
): Promise<number> {
|
|
||||||
const hourlyRemaining = await getPrHourlyRemaining(config);
|
|
||||||
const concurrentRemaining = await getConcurrentPrsRemaining(config, branches);
|
|
||||||
return Math.min(hourlyRemaining, concurrentRemaining);
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function getConcurrentBranchesRemaining(
|
|
||||||
config: RenovateConfig,
|
|
||||||
branches: BranchConfig[],
|
|
||||||
): Promise<number> {
|
|
||||||
const { branchConcurrentLimit, prConcurrentLimit } = config;
|
|
||||||
const limit =
|
|
||||||
typeof branchConcurrentLimit === 'number'
|
|
||||||
? branchConcurrentLimit
|
|
||||||
: prConcurrentLimit;
|
|
||||||
if (typeof limit === 'number' && limit) {
|
|
||||||
logger.debug(`Calculating branchConcurrentLimit (${limit})`);
|
|
||||||
try {
|
|
||||||
const existingBranches: string[] = [];
|
|
||||||
for (const branch of branches) {
|
|
||||||
if (await scm.branchExists(branch.branchName)) {
|
|
||||||
existingBranches.push(branch.branchName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const existingCount = existingBranches.length;
|
|
||||||
logger.debug(
|
|
||||||
`${existingCount} already existing branches found: ${existingBranches.join()}`,
|
|
||||||
);
|
|
||||||
|
|
||||||
const concurrentRemaining = Math.max(0, limit - existingCount);
|
|
||||||
logger.debug(`Branch concurrent limit remaining: ${concurrentRemaining}`);
|
|
||||||
|
|
||||||
return concurrentRemaining;
|
|
||||||
} catch (err) {
|
|
||||||
// TODO: #22198 should never throw
|
|
||||||
logger.error({ err }, 'Error checking concurrent branches');
|
|
||||||
return limit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Number.MAX_SAFE_INTEGER;
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function getBranchesRemaining(
|
|
||||||
config: RenovateConfig,
|
|
||||||
branches: BranchConfig[],
|
|
||||||
): Promise<number> {
|
|
||||||
const hourlyRemaining = await getPrHourlyRemaining(config);
|
|
||||||
const concurrentRemaining = await getConcurrentBranchesRemaining(
|
|
||||||
config,
|
|
||||||
branches,
|
|
||||||
);
|
|
||||||
return Math.min(hourlyRemaining, concurrentRemaining);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ import type {
|
||||||
} from '../../../util/cache/repository/types';
|
} from '../../../util/cache/repository/types';
|
||||||
import { fingerprint } from '../../../util/fingerprint';
|
import { fingerprint } from '../../../util/fingerprint';
|
||||||
import type { LongCommitSha } from '../../../util/git/types';
|
import type { LongCommitSha } from '../../../util/git/types';
|
||||||
import { isLimitReached } from '../../global/limits';
|
import { counts } from '../../global/limits';
|
||||||
import type { BranchConfig, BranchUpgradeConfig } from '../../types';
|
import type { BranchConfig, BranchUpgradeConfig } from '../../types';
|
||||||
import * as _branchWorker from '../update/branch';
|
import * as _branchWorker from '../update/branch';
|
||||||
import * as _limits from './limits';
|
import * as _limits from './limits';
|
||||||
|
@ -32,8 +32,9 @@ const repoCache = mocked(_repoCache);
|
||||||
|
|
||||||
branchWorker.processBranch = jest.fn();
|
branchWorker.processBranch = jest.fn();
|
||||||
|
|
||||||
limits.getPrsRemaining = jest.fn().mockResolvedValue(99);
|
limits.getConcurrentPrsCount = jest.fn().mockResolvedValue(0);
|
||||||
limits.getBranchesRemaining = jest.fn().mockResolvedValue(99);
|
limits.getConcurrentBranchesCount = jest.fn().mockResolvedValue(0);
|
||||||
|
limits.getPrHourlyCount = jest.fn().mockResolvedValue(0);
|
||||||
|
|
||||||
let config: RenovateConfig;
|
let config: RenovateConfig;
|
||||||
|
|
||||||
|
@ -104,22 +105,35 @@ describe('workers/repository/process/write', () => {
|
||||||
|
|
||||||
it('increments branch counter', async () => {
|
it('increments branch counter', async () => {
|
||||||
const branchName = 'branchName';
|
const branchName = 'branchName';
|
||||||
const branches: BranchConfig[] = [
|
const branches = partial<BranchConfig[]>([
|
||||||
{ baseBranch: 'main', branchName, upgrades: [], manager: 'npm' },
|
{
|
||||||
{ baseBranch: 'dev', branchName, upgrades: [], manager: 'npm' },
|
baseBranch: 'main',
|
||||||
];
|
branchName,
|
||||||
|
upgrades: partial<BranchUpgradeConfig>([{ prConcurrentLimit: 10 }]),
|
||||||
|
manager: 'npm',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
baseBranch: 'dev',
|
||||||
|
branchName,
|
||||||
|
upgrades: partial<BranchUpgradeConfig>([{ prConcurrentLimit: 10 }]),
|
||||||
|
manager: 'npm',
|
||||||
|
},
|
||||||
|
]);
|
||||||
repoCache.getCache.mockReturnValueOnce({});
|
repoCache.getCache.mockReturnValueOnce({});
|
||||||
branchWorker.processBranch.mockResolvedValueOnce({
|
branchWorker.processBranch.mockResolvedValueOnce({
|
||||||
branchExists: true,
|
branchExists: true,
|
||||||
result: 'pr-created',
|
result: 'pr-created',
|
||||||
});
|
});
|
||||||
scm.branchExists.mockResolvedValueOnce(false).mockResolvedValueOnce(true);
|
|
||||||
limits.getBranchesRemaining.mockResolvedValueOnce(1);
|
limits.getConcurrentPrsCount.mockResolvedValue(0);
|
||||||
expect(isLimitReached('Branches')).toBeFalse();
|
limits.getConcurrentBranchesCount.mockResolvedValue(0);
|
||||||
|
limits.getPrHourlyCount.mockResolvedValue(0);
|
||||||
|
|
||||||
|
scm.branchExists.mockResolvedValueOnce(false).mockResolvedValue(true);
|
||||||
GlobalConfig.set({ dryRun: 'full' });
|
GlobalConfig.set({ dryRun: 'full' });
|
||||||
config.baseBranches = ['main', 'dev'];
|
config.baseBranches = ['main', 'dev'];
|
||||||
await writeUpdates(config, branches);
|
await writeUpdates(config, branches);
|
||||||
expect(isLimitReached('Branches')).toBeTrue();
|
expect(counts.get('Branches')).toBe(1);
|
||||||
expect(addMeta).toHaveBeenCalledWith({
|
expect(addMeta).toHaveBeenCalledWith({
|
||||||
baseBranch: 'main',
|
baseBranch: 'main',
|
||||||
branch: branchName,
|
branch: branchName,
|
||||||
|
|
|
@ -7,11 +7,15 @@ import { getCache } from '../../../util/cache/repository';
|
||||||
import type { BranchCache } from '../../../util/cache/repository/types';
|
import type { BranchCache } from '../../../util/cache/repository/types';
|
||||||
import { fingerprint } from '../../../util/fingerprint';
|
import { fingerprint } from '../../../util/fingerprint';
|
||||||
import { setBranchNewCommit } from '../../../util/git/set-branch-commit';
|
import { setBranchNewCommit } from '../../../util/git/set-branch-commit';
|
||||||
import { incLimitedValue, setMaxLimit } from '../../global/limits';
|
import { incCountValue, setCount } from '../../global/limits';
|
||||||
import type { BranchConfig, UpgradeFingerprintConfig } from '../../types';
|
import type { BranchConfig, UpgradeFingerprintConfig } from '../../types';
|
||||||
import { processBranch } from '../update/branch';
|
import { processBranch } from '../update/branch';
|
||||||
import { upgradeFingerprintFields } from './fingerprint-fields';
|
import { upgradeFingerprintFields } from './fingerprint-fields';
|
||||||
import { getBranchesRemaining, getPrsRemaining } from './limits';
|
import {
|
||||||
|
getConcurrentBranchesCount,
|
||||||
|
getConcurrentPrsCount,
|
||||||
|
getPrHourlyCount,
|
||||||
|
} from './limits';
|
||||||
|
|
||||||
export type WriteUpdateResult = 'done' | 'automerged';
|
export type WriteUpdateResult = 'done' | 'automerged';
|
||||||
|
|
||||||
|
@ -127,15 +131,15 @@ export async function writeUpdates(
|
||||||
.sort()
|
.sort()
|
||||||
.join(', ')}`,
|
.join(', ')}`,
|
||||||
);
|
);
|
||||||
const prsRemaining = await getPrsRemaining(config, branches);
|
|
||||||
logger.debug(`Calculated maximum PRs remaining this run: ${prsRemaining}`);
|
|
||||||
setMaxLimit('PullRequests', prsRemaining);
|
|
||||||
|
|
||||||
const branchesRemaining = await getBranchesRemaining(config, branches);
|
const concurrentPrsCount = await getConcurrentPrsCount(config, branches);
|
||||||
logger.debug(
|
setCount('ConcurrentPRs', concurrentPrsCount);
|
||||||
`Calculated maximum branches remaining this run: ${branchesRemaining}`,
|
|
||||||
);
|
const concurrentBranchesCount = await getConcurrentBranchesCount(branches);
|
||||||
setMaxLimit('Branches', branchesRemaining);
|
setCount('Branches', concurrentBranchesCount);
|
||||||
|
|
||||||
|
const prsThisHourCount = await getPrHourlyCount(config);
|
||||||
|
setCount('HourlyPRs', prsThisHourCount);
|
||||||
|
|
||||||
for (const branch of branches) {
|
for (const branch of branches) {
|
||||||
const { baseBranch, branchName } = branch;
|
const { baseBranch, branchName } = branch;
|
||||||
|
@ -182,7 +186,7 @@ export async function writeUpdates(
|
||||||
return 'automerged';
|
return 'automerged';
|
||||||
}
|
}
|
||||||
if (!branchExisted && (await scm.branchExists(branch.branchName))) {
|
if (!branchExisted && (await scm.branchExists(branch.branchName))) {
|
||||||
incLimitedValue('Branches');
|
incCountValue('Branches');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
removeMeta(['branch', 'baseBranch']);
|
removeMeta(['branch', 'baseBranch']);
|
||||||
|
|
|
@ -34,7 +34,7 @@ import {
|
||||||
import { coerceNumber } from '../../../../util/number';
|
import { coerceNumber } from '../../../../util/number';
|
||||||
import { toMs } from '../../../../util/pretty-time';
|
import { toMs } from '../../../../util/pretty-time';
|
||||||
import * as template from '../../../../util/template';
|
import * as template from '../../../../util/template';
|
||||||
import { isLimitReached } from '../../../global/limits';
|
import { getCount, isLimitReached } from '../../../global/limits';
|
||||||
import type { BranchConfig, BranchResult, PrBlockedBy } from '../../../types';
|
import type { BranchConfig, BranchResult, PrBlockedBy } from '../../../types';
|
||||||
import { embedChangelogs } from '../../changelog';
|
import { embedChangelogs } from '../../changelog';
|
||||||
import { ensurePr, getPlatformPrOptions } from '../pr';
|
import { ensurePr, getPlatformPrOptions } from '../pr';
|
||||||
|
@ -212,9 +212,14 @@ export async function processBranch(
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger.debug(
|
||||||
|
`Open PR Count: ${getCount('ConcurrentPRs')}, Existing Branch Count: ${getCount('Branches')}, Hourly PR Count: ${getCount('HourlyPRs')}`,
|
||||||
|
);
|
||||||
|
|
||||||
if (
|
if (
|
||||||
!branchExists &&
|
!branchExists &&
|
||||||
isLimitReached('Branches') &&
|
isLimitReached('Branches', branchConfig) &&
|
||||||
!dependencyDashboardCheck &&
|
!dependencyDashboardCheck &&
|
||||||
!config.isVulnerabilityAlert
|
!config.isVulnerabilityAlert
|
||||||
) {
|
) {
|
||||||
|
|
|
@ -89,8 +89,9 @@ describe('workers/repository/update/pr/index', () => {
|
||||||
const res = await ensurePr(config);
|
const res = await ensurePr(config);
|
||||||
|
|
||||||
expect(res).toEqual({ type: 'with-pr', pr });
|
expect(res).toEqual({ type: 'with-pr', pr });
|
||||||
expect(limits.incLimitedValue).toHaveBeenCalledOnce();
|
expect(limits.incCountValue).toHaveBeenCalledTimes(2);
|
||||||
expect(limits.incLimitedValue).toHaveBeenCalledWith('PullRequests');
|
expect(limits.incCountValue).toHaveBeenCalledWith('ConcurrentPRs');
|
||||||
|
expect(limits.incCountValue).toHaveBeenCalledWith('HourlyPRs');
|
||||||
expect(logger.logger.info).toHaveBeenCalledWith(
|
expect(logger.logger.info).toHaveBeenCalledWith(
|
||||||
{ pr: pr.number, prTitle },
|
{ pr: pr.number, prTitle },
|
||||||
'PR created',
|
'PR created',
|
||||||
|
|
|
@ -27,7 +27,7 @@ import { stripEmojis } from '../../../../util/emoji';
|
||||||
import { fingerprint } from '../../../../util/fingerprint';
|
import { fingerprint } from '../../../../util/fingerprint';
|
||||||
import { getBranchLastCommitTime } from '../../../../util/git';
|
import { getBranchLastCommitTime } from '../../../../util/git';
|
||||||
import { memoize } from '../../../../util/memoize';
|
import { memoize } from '../../../../util/memoize';
|
||||||
import { incLimitedValue, isLimitReached } from '../../../global/limits';
|
import { incCountValue, isLimitReached } from '../../../global/limits';
|
||||||
import type {
|
import type {
|
||||||
BranchConfig,
|
BranchConfig,
|
||||||
BranchUpgradeConfig,
|
BranchUpgradeConfig,
|
||||||
|
@ -482,7 +482,7 @@ export async function ensurePr(
|
||||||
try {
|
try {
|
||||||
if (
|
if (
|
||||||
!dependencyDashboardCheck &&
|
!dependencyDashboardCheck &&
|
||||||
isLimitReached('PullRequests') &&
|
isLimitReached('ConcurrentPRs', prConfig) &&
|
||||||
!config.isVulnerabilityAlert
|
!config.isVulnerabilityAlert
|
||||||
) {
|
) {
|
||||||
logger.debug('Skipping PR - limit reached');
|
logger.debug('Skipping PR - limit reached');
|
||||||
|
@ -499,7 +499,8 @@ export async function ensurePr(
|
||||||
milestone: config.milestone,
|
milestone: config.milestone,
|
||||||
});
|
});
|
||||||
|
|
||||||
incLimitedValue('PullRequests');
|
incCountValue('ConcurrentPRs');
|
||||||
|
incCountValue('HourlyPRs');
|
||||||
logger.info({ pr: pr?.number, prTitle }, 'PR created');
|
logger.info({ pr: pr?.number, prTitle }, 'PR created');
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.debug({ err }, 'Pull request creation error');
|
logger.debug({ err }, 'Pull request creation error');
|
||||||
|
|
20
package.json
20
package.json
|
@ -139,7 +139,7 @@
|
||||||
"pnpm": "^9.0.0"
|
"pnpm": "^9.0.0"
|
||||||
},
|
},
|
||||||
"volta": {
|
"volta": {
|
||||||
"node": "22.13.0",
|
"node": "22.13.1",
|
||||||
"pnpm": "9.15.4"
|
"pnpm": "9.15.4"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
@ -152,14 +152,14 @@
|
||||||
"@breejs/later": "4.2.0",
|
"@breejs/later": "4.2.0",
|
||||||
"@cdktf/hcl2json": "0.20.11",
|
"@cdktf/hcl2json": "0.20.11",
|
||||||
"@opentelemetry/api": "1.9.0",
|
"@opentelemetry/api": "1.9.0",
|
||||||
"@opentelemetry/context-async-hooks": "1.30.0",
|
"@opentelemetry/context-async-hooks": "1.30.1",
|
||||||
"@opentelemetry/exporter-trace-otlp-http": "0.57.0",
|
"@opentelemetry/exporter-trace-otlp-http": "0.57.1",
|
||||||
"@opentelemetry/instrumentation": "0.57.0",
|
"@opentelemetry/instrumentation": "0.57.1",
|
||||||
"@opentelemetry/instrumentation-bunyan": "0.45.0",
|
"@opentelemetry/instrumentation-bunyan": "0.45.0",
|
||||||
"@opentelemetry/instrumentation-http": "0.57.0",
|
"@opentelemetry/instrumentation-http": "0.57.1",
|
||||||
"@opentelemetry/resources": "1.30.0",
|
"@opentelemetry/resources": "1.30.1",
|
||||||
"@opentelemetry/sdk-trace-base": "1.30.0",
|
"@opentelemetry/sdk-trace-base": "1.30.1",
|
||||||
"@opentelemetry/sdk-trace-node": "1.30.0",
|
"@opentelemetry/sdk-trace-node": "1.30.1",
|
||||||
"@opentelemetry/semantic-conventions": "1.28.0",
|
"@opentelemetry/semantic-conventions": "1.28.0",
|
||||||
"@qnighy/marshal": "0.1.3",
|
"@qnighy/marshal": "0.1.3",
|
||||||
"@renovatebot/detect-tools": "1.1.0",
|
"@renovatebot/detect-tools": "1.1.0",
|
||||||
|
@ -207,7 +207,7 @@
|
||||||
"got": "11.8.6",
|
"got": "11.8.6",
|
||||||
"graph-data-structure": "4.3.0",
|
"graph-data-structure": "4.3.0",
|
||||||
"handlebars": "4.7.8",
|
"handlebars": "4.7.8",
|
||||||
"ignore": "7.0.1",
|
"ignore": "7.0.3",
|
||||||
"ini": "5.0.0",
|
"ini": "5.0.0",
|
||||||
"json-dup-key-validator": "1.0.3",
|
"json-dup-key-validator": "1.0.3",
|
||||||
"json-stringify-pretty-compact": "3.0.0",
|
"json-stringify-pretty-compact": "3.0.0",
|
||||||
|
@ -322,7 +322,7 @@
|
||||||
"eslint-formatter-gha": "1.5.2",
|
"eslint-formatter-gha": "1.5.2",
|
||||||
"eslint-import-resolver-typescript": "3.7.0",
|
"eslint-import-resolver-typescript": "3.7.0",
|
||||||
"eslint-plugin-import": "2.31.0",
|
"eslint-plugin-import": "2.31.0",
|
||||||
"eslint-plugin-jest": "28.10.0",
|
"eslint-plugin-jest": "28.11.0",
|
||||||
"eslint-plugin-jest-formatting": "3.1.0",
|
"eslint-plugin-jest-formatting": "3.1.0",
|
||||||
"eslint-plugin-promise": "7.2.1",
|
"eslint-plugin-promise": "7.2.1",
|
||||||
"eslint-plugin-typescript-enum": "2.1.0",
|
"eslint-plugin-typescript-enum": "2.1.0",
|
||||||
|
|
204
pnpm-lock.yaml
204
pnpm-lock.yaml
|
@ -39,29 +39,29 @@ importers:
|
||||||
specifier: 1.9.0
|
specifier: 1.9.0
|
||||||
version: 1.9.0
|
version: 1.9.0
|
||||||
'@opentelemetry/context-async-hooks':
|
'@opentelemetry/context-async-hooks':
|
||||||
specifier: 1.30.0
|
specifier: 1.30.1
|
||||||
version: 1.30.0(@opentelemetry/api@1.9.0)
|
version: 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/exporter-trace-otlp-http':
|
'@opentelemetry/exporter-trace-otlp-http':
|
||||||
specifier: 0.57.0
|
specifier: 0.57.1
|
||||||
version: 0.57.0(@opentelemetry/api@1.9.0)
|
version: 0.57.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/instrumentation':
|
'@opentelemetry/instrumentation':
|
||||||
specifier: 0.57.0
|
specifier: 0.57.1
|
||||||
version: 0.57.0(@opentelemetry/api@1.9.0)
|
version: 0.57.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/instrumentation-bunyan':
|
'@opentelemetry/instrumentation-bunyan':
|
||||||
specifier: 0.45.0
|
specifier: 0.45.0
|
||||||
version: 0.45.0(@opentelemetry/api@1.9.0)
|
version: 0.45.0(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/instrumentation-http':
|
'@opentelemetry/instrumentation-http':
|
||||||
specifier: 0.57.0
|
specifier: 0.57.1
|
||||||
version: 0.57.0(@opentelemetry/api@1.9.0)
|
version: 0.57.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/resources':
|
'@opentelemetry/resources':
|
||||||
specifier: 1.30.0
|
specifier: 1.30.1
|
||||||
version: 1.30.0(@opentelemetry/api@1.9.0)
|
version: 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/sdk-trace-base':
|
'@opentelemetry/sdk-trace-base':
|
||||||
specifier: 1.30.0
|
specifier: 1.30.1
|
||||||
version: 1.30.0(@opentelemetry/api@1.9.0)
|
version: 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/sdk-trace-node':
|
'@opentelemetry/sdk-trace-node':
|
||||||
specifier: 1.30.0
|
specifier: 1.30.1
|
||||||
version: 1.30.0(@opentelemetry/api@1.9.0)
|
version: 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/semantic-conventions':
|
'@opentelemetry/semantic-conventions':
|
||||||
specifier: 1.28.0
|
specifier: 1.28.0
|
||||||
version: 1.28.0
|
version: 1.28.0
|
||||||
|
@ -204,8 +204,8 @@ importers:
|
||||||
specifier: 4.7.8
|
specifier: 4.7.8
|
||||||
version: 4.7.8
|
version: 4.7.8
|
||||||
ignore:
|
ignore:
|
||||||
specifier: 7.0.1
|
specifier: 7.0.3
|
||||||
version: 7.0.1
|
version: 7.0.3
|
||||||
ini:
|
ini:
|
||||||
specifier: 5.0.0
|
specifier: 5.0.0
|
||||||
version: 5.0.0
|
version: 5.0.0
|
||||||
|
@ -539,8 +539,8 @@ importers:
|
||||||
specifier: 2.31.0
|
specifier: 2.31.0
|
||||||
version: 2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1)
|
version: 2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1)
|
||||||
eslint-plugin-jest:
|
eslint-plugin-jest:
|
||||||
specifier: 28.10.0
|
specifier: 28.11.0
|
||||||
version: 28.10.0(@typescript-eslint/eslint-plugin@8.20.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(jest@29.7.0(@types/node@22.10.6)(ts-node@10.9.2(@swc/core@1.10.7)(@types/node@22.10.6)(typescript@5.7.3)))(typescript@5.7.3)
|
version: 28.11.0(@typescript-eslint/eslint-plugin@8.20.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(jest@29.7.0(@types/node@22.10.6)(ts-node@10.9.2(@swc/core@1.10.7)(@types/node@22.10.6)(typescript@5.7.3)))(typescript@5.7.3)
|
||||||
eslint-plugin-jest-formatting:
|
eslint-plugin-jest-formatting:
|
||||||
specifier: 3.1.0
|
specifier: 3.1.0
|
||||||
version: 3.1.0(eslint@8.57.1)
|
version: 3.1.0(eslint@8.57.1)
|
||||||
|
@ -1325,10 +1325,6 @@ packages:
|
||||||
typescript:
|
typescript:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@opentelemetry/api-logs@0.57.0':
|
|
||||||
resolution: {integrity: sha512-l1aJ30CXeauVYaI+btiynHpw341LthkMTv3omi1VJDX14werY2Wmv9n1yudMsq9HuY0m8PvXEVX4d8zxEb+WRg==}
|
|
||||||
engines: {node: '>=14'}
|
|
||||||
|
|
||||||
'@opentelemetry/api-logs@0.57.1':
|
'@opentelemetry/api-logs@0.57.1':
|
||||||
resolution: {integrity: sha512-I4PHczeujhQAQv6ZBzqHYEUiggZL4IdSMixtVD3EYqbdrjujE7kRfI5QohjlPoJm8BvenoW5YaTMWRrbpot6tg==}
|
resolution: {integrity: sha512-I4PHczeujhQAQv6ZBzqHYEUiggZL4IdSMixtVD3EYqbdrjujE7kRfI5QohjlPoJm8BvenoW5YaTMWRrbpot6tg==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
|
@ -1337,20 +1333,20 @@ packages:
|
||||||
resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==}
|
resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==}
|
||||||
engines: {node: '>=8.0.0'}
|
engines: {node: '>=8.0.0'}
|
||||||
|
|
||||||
'@opentelemetry/context-async-hooks@1.30.0':
|
'@opentelemetry/context-async-hooks@1.30.1':
|
||||||
resolution: {integrity: sha512-roCetrG/cz0r/gugQm/jFo75UxblVvHaNSRoR0kSSRSzXFAiIBqFCZuH458BHBNRtRe+0yJdIJ21L9t94bw7+g==}
|
resolution: {integrity: sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@opentelemetry/api': '>=1.0.0 <1.10.0'
|
'@opentelemetry/api': '>=1.0.0 <1.10.0'
|
||||||
|
|
||||||
'@opentelemetry/core@1.30.0':
|
'@opentelemetry/core@1.30.1':
|
||||||
resolution: {integrity: sha512-Q/3u/K73KUjTCnFUP97ZY+pBjQ1kPEgjOfXj/bJl8zW7GbXdkw6cwuyZk6ZTXkVgCBsYRYUzx4fvYK1jxdb9MA==}
|
resolution: {integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@opentelemetry/api': '>=1.0.0 <1.10.0'
|
'@opentelemetry/api': '>=1.0.0 <1.10.0'
|
||||||
|
|
||||||
'@opentelemetry/exporter-trace-otlp-http@0.57.0':
|
'@opentelemetry/exporter-trace-otlp-http@0.57.1':
|
||||||
resolution: {integrity: sha512-BJl35PSkwoMlGEOrzjCG1ih6zqZoAZJIR4xyqSKC2BqPtwuRjID0vWBaEdP9xrxxJTEIEQw+gEY/0pUgicX0ew==}
|
resolution: {integrity: sha512-43dLEjlf6JGxpVt9RaRlJAvjHG1wGsbAuNd67RIDy/95zfKk2aNovtiGUgFdS/kcvgvS90upIUbgn0xUd9JjMg==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@opentelemetry/api': ^1.3.0
|
'@opentelemetry/api': ^1.3.0
|
||||||
|
@ -1361,68 +1357,68 @@ packages:
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@opentelemetry/api': ^1.3.0
|
'@opentelemetry/api': ^1.3.0
|
||||||
|
|
||||||
'@opentelemetry/instrumentation-http@0.57.0':
|
'@opentelemetry/instrumentation-http@0.57.1':
|
||||||
resolution: {integrity: sha512-GJD6e/YSSZUI/xZokK9L+ghMAyFrtGV+8HHXCnV8tDYCo66biLpmC9BUTg6fBnv26QsosYvFTYbdo6Sfn6TxCw==}
|
resolution: {integrity: sha512-ThLmzAQDs7b/tdKI3BV2+yawuF09jF111OFsovqT1Qj3D8vjwKBwhi/rDE5xethwn4tSXtZcJ9hBsVAlWFQZ7g==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@opentelemetry/api': ^1.3.0
|
'@opentelemetry/api': ^1.3.0
|
||||||
|
|
||||||
'@opentelemetry/instrumentation@0.57.0':
|
'@opentelemetry/instrumentation@0.57.1':
|
||||||
resolution: {integrity: sha512-qIKp+tSCLqofneUWRc5XHtr9jHIq0N0BJfaJamM9gjEFO8sthV4SDXDGNOSAx16PxkbrQJ5/AxMPAGCXl8W/Hg==}
|
resolution: {integrity: sha512-SgHEKXoVxOjc20ZYusPG3Fh+RLIZTSa4x8QtD3NfgAUDyqdFFS9W1F2ZVbZkqDCdyMcQG02Ok4duUGLHJXHgbA==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@opentelemetry/api': ^1.3.0
|
'@opentelemetry/api': ^1.3.0
|
||||||
|
|
||||||
'@opentelemetry/otlp-exporter-base@0.57.0':
|
'@opentelemetry/otlp-exporter-base@0.57.1':
|
||||||
resolution: {integrity: sha512-QQl4Ngm3D6H8SDO0EM642ncTxjRsf/HDq7+IWIA0eaEK/NTsJeQ3iYJiZj3F4jkALnvyeM1kkwd+DHtqxTBx9Q==}
|
resolution: {integrity: sha512-GNBJAEYfeiYJQ3O2dvXgiNZ/qjWrBxSb1L1s7iV/jKBRGMN3Nv+miTk2SLeEobF5E5ZK4rVcHKlBZ71bPVIv/g==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@opentelemetry/api': ^1.3.0
|
'@opentelemetry/api': ^1.3.0
|
||||||
|
|
||||||
'@opentelemetry/otlp-transformer@0.57.0':
|
'@opentelemetry/otlp-transformer@0.57.1':
|
||||||
resolution: {integrity: sha512-yHX7sdwkdAmSa6Jbi3caSLDWy0PCHS1pKQeKz8AIWSyQqL7IojHKgdk9A+7eRd98Z1n9YTdwWSWLnObvIqhEhQ==}
|
resolution: {integrity: sha512-EX67y+ukNNfFrOLyjYGw8AMy0JPIlEX1dW60SGUNZWW2hSQyyolX7EqFuHP5LtXLjJHNfzx5SMBVQ3owaQCNDw==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@opentelemetry/api': ^1.3.0
|
'@opentelemetry/api': ^1.3.0
|
||||||
|
|
||||||
'@opentelemetry/propagator-b3@1.30.0':
|
'@opentelemetry/propagator-b3@1.30.1':
|
||||||
resolution: {integrity: sha512-lcobQQmd+hLdtxJJKu/i51lNXmF1PJJ7Y9B97ciHRVQuMI260vSZG7Uf4Zg0fqR8PB+fT/7rnlDwS0M7QldZQQ==}
|
resolution: {integrity: sha512-oATwWWDIJzybAZ4pO76ATN5N6FFbOA1otibAVlS8v90B4S1wClnhRUk7K+2CHAwN1JKYuj4jh/lpCEG5BAqFuQ==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@opentelemetry/api': '>=1.0.0 <1.10.0'
|
'@opentelemetry/api': '>=1.0.0 <1.10.0'
|
||||||
|
|
||||||
'@opentelemetry/propagator-jaeger@1.30.0':
|
'@opentelemetry/propagator-jaeger@1.30.1':
|
||||||
resolution: {integrity: sha512-0hdP495V6HPRkVpowt54+Swn5NdesMIRof+rlp0mbnuIUOM986uF+eNxnPo9q5MmJegVBRTxgMHXXwvnXRnKRg==}
|
resolution: {integrity: sha512-Pj/BfnYEKIOImirH76M4hDaBSx6HyZ2CXUqk+Kj02m6BB80c/yo4BdWkn/1gDFfU+YPY+bPR2U0DKBfdxCKwmg==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@opentelemetry/api': '>=1.0.0 <1.10.0'
|
'@opentelemetry/api': '>=1.0.0 <1.10.0'
|
||||||
|
|
||||||
'@opentelemetry/resources@1.30.0':
|
'@opentelemetry/resources@1.30.1':
|
||||||
resolution: {integrity: sha512-5mGMjL0Uld/99t7/pcd7CuVtJbkARckLVuiOX84nO8RtLtIz0/J6EOHM2TGvPZ6F4K+XjUq13gMx14w80SVCQg==}
|
resolution: {integrity: sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@opentelemetry/api': '>=1.0.0 <1.10.0'
|
'@opentelemetry/api': '>=1.0.0 <1.10.0'
|
||||||
|
|
||||||
'@opentelemetry/sdk-logs@0.57.0':
|
'@opentelemetry/sdk-logs@0.57.1':
|
||||||
resolution: {integrity: sha512-6Kbxdu/QE9LWH7+WSLmYo3DjAq+c55TiCLXiXu6b/2m2muy5SyOG2m0MrGqetyRpfYSSbIqHmJoqNVTN3+2a9g==}
|
resolution: {integrity: sha512-jGdObb/BGWu6Peo3cL3skx/Rl1Ak/wDDO3vpPrrThGbqE7isvkCsX6uE+OAt8Ayjm9YC8UGkohWbLR09JmM0FA==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@opentelemetry/api': '>=1.4.0 <1.10.0'
|
'@opentelemetry/api': '>=1.4.0 <1.10.0'
|
||||||
|
|
||||||
'@opentelemetry/sdk-metrics@1.30.0':
|
'@opentelemetry/sdk-metrics@1.30.1':
|
||||||
resolution: {integrity: sha512-5kcj6APyRMvv6dEIP5plz2qfJAD4OMipBRT11u/pa1a68rHKI2Ln+iXVkAGKgx8o7CXbD7FdPypTUY88ZQgP4Q==}
|
resolution: {integrity: sha512-q9zcZ0Okl8jRgmy7eNW3Ku1XSgg3sDLa5evHZpCwjspw7E8Is4K/haRPDJrBcX3YSn/Y7gUvFnByNYEKQNbNog==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@opentelemetry/api': '>=1.3.0 <1.10.0'
|
'@opentelemetry/api': '>=1.3.0 <1.10.0'
|
||||||
|
|
||||||
'@opentelemetry/sdk-trace-base@1.30.0':
|
'@opentelemetry/sdk-trace-base@1.30.1':
|
||||||
resolution: {integrity: sha512-RKQDaDIkV7PwizmHw+rE/FgfB2a6MBx+AEVVlAHXRG1YYxLiBpPX2KhmoB99R5vA4b72iJrjle68NDWnbrE9Dg==}
|
resolution: {integrity: sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@opentelemetry/api': '>=1.0.0 <1.10.0'
|
'@opentelemetry/api': '>=1.0.0 <1.10.0'
|
||||||
|
|
||||||
'@opentelemetry/sdk-trace-node@1.30.0':
|
'@opentelemetry/sdk-trace-node@1.30.1':
|
||||||
resolution: {integrity: sha512-MeXkXEdBs9xq1JSGTr/3P1lHBSUBaVmo1+UpoQhUpviPMzDXy0MNsdTC7KKI6/YcG74lTX6eqeNjlC1jV4Rstw==}
|
resolution: {integrity: sha512-cBjYOINt1JxXdpw1e5MlHmFRc5fgj4GW/86vsKFxJCJ8AL4PdVtYH41gWwl4qd4uQjqEL1oJVrXkSy5cnduAnQ==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@opentelemetry/api': '>=1.0.0 <1.10.0'
|
'@opentelemetry/api': '>=1.0.0 <1.10.0'
|
||||||
|
@ -3240,8 +3236,8 @@ packages:
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
eslint: '>=0.8.0'
|
eslint: '>=0.8.0'
|
||||||
|
|
||||||
eslint-plugin-jest@28.10.0:
|
eslint-plugin-jest@28.11.0:
|
||||||
resolution: {integrity: sha512-hyMWUxkBH99HpXT3p8hc7REbEZK3D+nk8vHXGgpB+XXsi0gO4PxMSP+pjfUzb67GnV9yawV9a53eUmcde1CCZA==}
|
resolution: {integrity: sha512-QAfipLcNCWLVocVbZW8GimKn5p5iiMcgGbRzz8z/P5q7xw+cNEpYqyzFMtIF/ZgF2HLOyy+dYBut+DoYolvqig==}
|
||||||
engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0}
|
engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@typescript-eslint/eslint-plugin': ^6.0.0 || ^7.0.0 || ^8.0.0
|
'@typescript-eslint/eslint-plugin': ^6.0.0 || ^7.0.0 || ^8.0.0
|
||||||
|
@ -3801,8 +3797,8 @@ packages:
|
||||||
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
|
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
|
||||||
engines: {node: '>= 4'}
|
engines: {node: '>= 4'}
|
||||||
|
|
||||||
ignore@7.0.1:
|
ignore@7.0.3:
|
||||||
resolution: {integrity: sha512-D1gVletsbVOoiXF963rgZnfobGAbq7Lb+dz3fcBmlOmZg6hHkpbycLqL8PLNB8f4GVv6dOVYwhPL/r7hwiH0Fw==}
|
resolution: {integrity: sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==}
|
||||||
engines: {node: '>= 4'}
|
engines: {node: '>= 4'}
|
||||||
|
|
||||||
immediate@3.0.6:
|
immediate@3.0.6:
|
||||||
|
@ -7872,58 +7868,54 @@ snapshots:
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
typescript: 5.7.3
|
typescript: 5.7.3
|
||||||
|
|
||||||
'@opentelemetry/api-logs@0.57.0':
|
|
||||||
dependencies:
|
|
||||||
'@opentelemetry/api': 1.9.0
|
|
||||||
|
|
||||||
'@opentelemetry/api-logs@0.57.1':
|
'@opentelemetry/api-logs@0.57.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@opentelemetry/api': 1.9.0
|
'@opentelemetry/api': 1.9.0
|
||||||
|
|
||||||
'@opentelemetry/api@1.9.0': {}
|
'@opentelemetry/api@1.9.0': {}
|
||||||
|
|
||||||
'@opentelemetry/context-async-hooks@1.30.0(@opentelemetry/api@1.9.0)':
|
'@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@opentelemetry/api': 1.9.0
|
'@opentelemetry/api': 1.9.0
|
||||||
|
|
||||||
'@opentelemetry/core@1.30.0(@opentelemetry/api@1.9.0)':
|
'@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@opentelemetry/api': 1.9.0
|
'@opentelemetry/api': 1.9.0
|
||||||
'@opentelemetry/semantic-conventions': 1.28.0
|
'@opentelemetry/semantic-conventions': 1.28.0
|
||||||
|
|
||||||
'@opentelemetry/exporter-trace-otlp-http@0.57.0(@opentelemetry/api@1.9.0)':
|
'@opentelemetry/exporter-trace-otlp-http@0.57.1(@opentelemetry/api@1.9.0)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@opentelemetry/api': 1.9.0
|
'@opentelemetry/api': 1.9.0
|
||||||
'@opentelemetry/core': 1.30.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/otlp-exporter-base': 0.57.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/otlp-exporter-base': 0.57.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/otlp-transformer': 0.57.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/otlp-transformer': 0.57.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/resources': 1.30.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/sdk-trace-base': 1.30.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
|
|
||||||
'@opentelemetry/instrumentation-bunyan@0.45.0(@opentelemetry/api@1.9.0)':
|
'@opentelemetry/instrumentation-bunyan@0.45.0(@opentelemetry/api@1.9.0)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@opentelemetry/api': 1.9.0
|
'@opentelemetry/api': 1.9.0
|
||||||
'@opentelemetry/api-logs': 0.57.1
|
'@opentelemetry/api-logs': 0.57.1
|
||||||
'@opentelemetry/instrumentation': 0.57.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/instrumentation': 0.57.1(@opentelemetry/api@1.9.0)
|
||||||
'@types/bunyan': 1.8.9
|
'@types/bunyan': 1.8.9
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@opentelemetry/instrumentation-http@0.57.0(@opentelemetry/api@1.9.0)':
|
'@opentelemetry/instrumentation-http@0.57.1(@opentelemetry/api@1.9.0)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@opentelemetry/api': 1.9.0
|
'@opentelemetry/api': 1.9.0
|
||||||
'@opentelemetry/core': 1.30.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/instrumentation': 0.57.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/instrumentation': 0.57.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/semantic-conventions': 1.28.0
|
'@opentelemetry/semantic-conventions': 1.28.0
|
||||||
forwarded-parse: 2.1.2
|
forwarded-parse: 2.1.2
|
||||||
semver: 7.6.3
|
semver: 7.6.3
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@opentelemetry/instrumentation@0.57.0(@opentelemetry/api@1.9.0)':
|
'@opentelemetry/instrumentation@0.57.1(@opentelemetry/api@1.9.0)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@opentelemetry/api': 1.9.0
|
'@opentelemetry/api': 1.9.0
|
||||||
'@opentelemetry/api-logs': 0.57.0
|
'@opentelemetry/api-logs': 0.57.1
|
||||||
'@types/shimmer': 1.2.0
|
'@types/shimmer': 1.2.0
|
||||||
import-in-the-middle: 1.12.0
|
import-in-the-middle: 1.12.0
|
||||||
require-in-the-middle: 7.4.0
|
require-in-the-middle: 7.4.0
|
||||||
|
@ -7932,67 +7924,67 @@ snapshots:
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@opentelemetry/otlp-exporter-base@0.57.0(@opentelemetry/api@1.9.0)':
|
'@opentelemetry/otlp-exporter-base@0.57.1(@opentelemetry/api@1.9.0)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@opentelemetry/api': 1.9.0
|
'@opentelemetry/api': 1.9.0
|
||||||
'@opentelemetry/core': 1.30.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/otlp-transformer': 0.57.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/otlp-transformer': 0.57.1(@opentelemetry/api@1.9.0)
|
||||||
|
|
||||||
'@opentelemetry/otlp-transformer@0.57.0(@opentelemetry/api@1.9.0)':
|
'@opentelemetry/otlp-transformer@0.57.1(@opentelemetry/api@1.9.0)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@opentelemetry/api': 1.9.0
|
'@opentelemetry/api': 1.9.0
|
||||||
'@opentelemetry/api-logs': 0.57.0
|
'@opentelemetry/api-logs': 0.57.1
|
||||||
'@opentelemetry/core': 1.30.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/resources': 1.30.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/sdk-logs': 0.57.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/sdk-logs': 0.57.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/sdk-metrics': 1.30.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/sdk-trace-base': 1.30.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
protobufjs: 7.4.0
|
protobufjs: 7.4.0
|
||||||
|
|
||||||
'@opentelemetry/propagator-b3@1.30.0(@opentelemetry/api@1.9.0)':
|
'@opentelemetry/propagator-b3@1.30.1(@opentelemetry/api@1.9.0)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@opentelemetry/api': 1.9.0
|
'@opentelemetry/api': 1.9.0
|
||||||
'@opentelemetry/core': 1.30.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
|
|
||||||
'@opentelemetry/propagator-jaeger@1.30.0(@opentelemetry/api@1.9.0)':
|
'@opentelemetry/propagator-jaeger@1.30.1(@opentelemetry/api@1.9.0)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@opentelemetry/api': 1.9.0
|
'@opentelemetry/api': 1.9.0
|
||||||
'@opentelemetry/core': 1.30.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
|
|
||||||
'@opentelemetry/resources@1.30.0(@opentelemetry/api@1.9.0)':
|
'@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@opentelemetry/api': 1.9.0
|
'@opentelemetry/api': 1.9.0
|
||||||
'@opentelemetry/core': 1.30.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/semantic-conventions': 1.28.0
|
'@opentelemetry/semantic-conventions': 1.28.0
|
||||||
|
|
||||||
'@opentelemetry/sdk-logs@0.57.0(@opentelemetry/api@1.9.0)':
|
'@opentelemetry/sdk-logs@0.57.1(@opentelemetry/api@1.9.0)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@opentelemetry/api': 1.9.0
|
'@opentelemetry/api': 1.9.0
|
||||||
'@opentelemetry/api-logs': 0.57.0
|
'@opentelemetry/api-logs': 0.57.1
|
||||||
'@opentelemetry/core': 1.30.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/resources': 1.30.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
|
|
||||||
'@opentelemetry/sdk-metrics@1.30.0(@opentelemetry/api@1.9.0)':
|
'@opentelemetry/sdk-metrics@1.30.1(@opentelemetry/api@1.9.0)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@opentelemetry/api': 1.9.0
|
'@opentelemetry/api': 1.9.0
|
||||||
'@opentelemetry/core': 1.30.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/resources': 1.30.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
|
|
||||||
'@opentelemetry/sdk-trace-base@1.30.0(@opentelemetry/api@1.9.0)':
|
'@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@opentelemetry/api': 1.9.0
|
'@opentelemetry/api': 1.9.0
|
||||||
'@opentelemetry/core': 1.30.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/resources': 1.30.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/semantic-conventions': 1.28.0
|
'@opentelemetry/semantic-conventions': 1.28.0
|
||||||
|
|
||||||
'@opentelemetry/sdk-trace-node@1.30.0(@opentelemetry/api@1.9.0)':
|
'@opentelemetry/sdk-trace-node@1.30.1(@opentelemetry/api@1.9.0)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@opentelemetry/api': 1.9.0
|
'@opentelemetry/api': 1.9.0
|
||||||
'@opentelemetry/context-async-hooks': 1.30.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/context-async-hooks': 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/core': 1.30.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/propagator-b3': 1.30.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/propagator-b3': 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/propagator-jaeger': 1.30.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/propagator-jaeger': 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
'@opentelemetry/sdk-trace-base': 1.30.0(@opentelemetry/api@1.9.0)
|
'@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0)
|
||||||
semver: 7.6.3
|
semver: 7.6.3
|
||||||
|
|
||||||
'@opentelemetry/semantic-conventions@1.28.0': {}
|
'@opentelemetry/semantic-conventions@1.28.0': {}
|
||||||
|
@ -10122,7 +10114,7 @@ snapshots:
|
||||||
dependencies:
|
dependencies:
|
||||||
eslint: 8.57.1
|
eslint: 8.57.1
|
||||||
|
|
||||||
eslint-plugin-jest@28.10.0(@typescript-eslint/eslint-plugin@8.20.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(jest@29.7.0(@types/node@22.10.6)(ts-node@10.9.2(@swc/core@1.10.7)(@types/node@22.10.6)(typescript@5.7.3)))(typescript@5.7.3):
|
eslint-plugin-jest@28.11.0(@typescript-eslint/eslint-plugin@8.20.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(jest@29.7.0(@types/node@22.10.6)(ts-node@10.9.2(@swc/core@1.10.7)(@types/node@22.10.6)(typescript@5.7.3)))(typescript@5.7.3):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/utils': 8.20.0(eslint@8.57.1)(typescript@5.7.3)
|
'@typescript-eslint/utils': 8.20.0(eslint@8.57.1)(typescript@5.7.3)
|
||||||
eslint: 8.57.1
|
eslint: 8.57.1
|
||||||
|
@ -10810,7 +10802,7 @@ snapshots:
|
||||||
|
|
||||||
ignore@5.3.2: {}
|
ignore@5.3.2: {}
|
||||||
|
|
||||||
ignore@7.0.1: {}
|
ignore@7.0.3: {}
|
||||||
|
|
||||||
immediate@3.0.6: {}
|
immediate@3.0.6: {}
|
||||||
|
|
||||||
|
|
|
@ -5,23 +5,23 @@ ARG BASE_IMAGE_TYPE=slim
|
||||||
# --------------------------------------
|
# --------------------------------------
|
||||||
# slim image
|
# slim image
|
||||||
# --------------------------------------
|
# --------------------------------------
|
||||||
FROM ghcr.io/renovatebot/base-image:9.33.5@sha256:47de2daa1bb96e37da15d2b91f1f57d970db8322f271a8d2f2c3b6a8fd6f73a6 AS slim-base
|
FROM ghcr.io/renovatebot/base-image:9.34.1@sha256:29f6bf5ef45fdb516cb6c09987d2f3349aaa6edc60af4ac7b43f5a4f8a9c15e8 AS slim-base
|
||||||
|
|
||||||
# --------------------------------------
|
# --------------------------------------
|
||||||
# full image
|
# full image
|
||||||
# --------------------------------------
|
# --------------------------------------
|
||||||
FROM ghcr.io/renovatebot/base-image:9.33.5-full@sha256:60cf607b73eeeac22b9d75fbaf04062f0d3eece86a608e26fb8f2bac35626fe6 AS full-base
|
FROM ghcr.io/renovatebot/base-image:9.34.0-full@sha256:9a4d5f592b9f4c6d0ae9a5e46987c2120660f7ccaa0ab38f9a773a8ba1bfd495 AS full-base
|
||||||
|
|
||||||
ENV RENOVATE_BINARY_SOURCE=global
|
ENV RENOVATE_BINARY_SOURCE=global
|
||||||
|
|
||||||
# --------------------------------------
|
# --------------------------------------
|
||||||
# build image
|
# build image
|
||||||
# --------------------------------------
|
# --------------------------------------
|
||||||
FROM --platform=$BUILDPLATFORM ghcr.io/renovatebot/base-image:9.33.5@sha256:47de2daa1bb96e37da15d2b91f1f57d970db8322f271a8d2f2c3b6a8fd6f73a6 AS build
|
FROM --platform=$BUILDPLATFORM ghcr.io/renovatebot/base-image:9.34.1@sha256:29f6bf5ef45fdb516cb6c09987d2f3349aaa6edc60af4ac7b43f5a4f8a9c15e8 AS build
|
||||||
|
|
||||||
# We want a specific node version here
|
# We want a specific node version here
|
||||||
# renovate: datasource=node-version
|
# renovate: datasource=node-version
|
||||||
RUN install-tool node 22.13.0
|
RUN install-tool node 22.13.1
|
||||||
|
|
||||||
WORKDIR /usr/local/renovate
|
WORKDIR /usr/local/renovate
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue