mirror of
https://github.com/renovatebot/renovate.git
synced 2025-01-12 15:06:27 +00:00
feat(manager/cargo): support private registry index env var (#20379)
Co-authored-by: Rhys Arkins <rhys@arkins.net> Co-authored-by: HonkingGoose <34918129+HonkingGoose@users.noreply.github.com> Co-authored-by: Sebastian Poxhofer <secustor@users.noreply.github.com>
This commit is contained in:
parent
7d6438b16f
commit
2a72f85cc2
3 changed files with 65 additions and 2 deletions
|
@ -11,7 +11,7 @@ Renovate supports upgrading dependencies in `Cargo.toml` files and their accompa
|
||||||
|
|
||||||
1. Renovate searches in each repository for any `Cargo.toml` files
|
1. Renovate searches in each repository for any `Cargo.toml` files
|
||||||
1. Renovate extracts existing dependencies from `[dependencies]`, `[dev-dependencies]`, `[build-dependencies]` and `[workspace.dependencies]`
|
1. Renovate extracts existing dependencies from `[dependencies]`, `[dev-dependencies]`, `[build-dependencies]` and `[workspace.dependencies]`
|
||||||
1. Renovate tries to find and parse a `.cargo/config.toml` file to discover index URLs for private registries
|
1. Renovate looks up Cargo configuration to find index URLs for private registries
|
||||||
1. Renovate resolves the dependency's version using the crates.io API or by cloning the index URL
|
1. Renovate resolves the dependency's version using the crates.io API or by cloning the index URL
|
||||||
1. If Renovate finds an update, Renovate will use `cargo update` to update both `Cargo.toml` and `Cargo.lock`
|
1. If Renovate finds an update, Renovate will use `cargo update` to update both `Cargo.toml` and `Cargo.lock`
|
||||||
|
|
||||||
|
@ -19,6 +19,16 @@ Renovate supports upgrading dependencies in `Cargo.toml` files and their accompa
|
||||||
|
|
||||||
Renovate updates Rust crates by default.
|
Renovate updates Rust crates by default.
|
||||||
|
|
||||||
|
## Cargo configuration and private registry discovery
|
||||||
|
|
||||||
|
Renovate can find private registry URLs in these Cargo configuration files:
|
||||||
|
|
||||||
|
- `.cargo/config.toml`
|
||||||
|
- `.cargo/config` (legacy)
|
||||||
|
|
||||||
|
Renovate can also find private registry URLs via a `CARGO_REGISTRIES_<name>_INDEX` environment variable.
|
||||||
|
Read the [Rust environment variables docs](https://doc.rust-lang.org/cargo/reference/environment-variables.html#configuration-environment-variables) to learn more.
|
||||||
|
|
||||||
## Private crate registries and private Git dependencies
|
## Private crate registries and private Git dependencies
|
||||||
|
|
||||||
If any dependencies are hosted in private Git repositories, [Git Authentication for cargo](https://doc.rust-lang.org/cargo/appendix/git-authentication.html) must be set up.
|
If any dependencies are hosted in private Git repositories, [Git Authentication for cargo](https://doc.rust-lang.org/cargo/appendix/git-authentication.html) must be set up.
|
||||||
|
|
|
@ -31,6 +31,8 @@ describe('modules/manager/cargo/extract', () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
GlobalConfig.set(adminConfig);
|
GlobalConfig.set(adminConfig);
|
||||||
|
delete process.env.CARGO_REGISTRIES_PRIVATE_CRATES_INDEX;
|
||||||
|
delete process.env.CARGO_REGISTRIES_MCORBIN_INDEX;
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
|
@ -113,6 +115,50 @@ describe('modules/manager/cargo/extract', () => {
|
||||||
expect(res?.deps).toHaveLength(3);
|
expect(res?.deps).toHaveLength(3);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('extracts registry urls from environment', async () => {
|
||||||
|
process.env.CARGO_REGISTRIES_PRIVATE_CRATES_INDEX =
|
||||||
|
'https://dl.cloudsmith.io/basic/my-org/my-repo/cargo/index.git';
|
||||||
|
process.env.CARGO_REGISTRIES_MCORBIN_INDEX =
|
||||||
|
'https://github.com/mcorbin/testregistry';
|
||||||
|
const res = await extractPackageFile(cargo6toml, 'Cargo.toml', {
|
||||||
|
...config,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(res?.deps).toEqual([
|
||||||
|
{
|
||||||
|
currentValue: '0.1.0',
|
||||||
|
datasource: 'crate',
|
||||||
|
depName: 'proprietary-crate',
|
||||||
|
depType: 'dependencies',
|
||||||
|
managerData: {
|
||||||
|
nestedVersion: true,
|
||||||
|
},
|
||||||
|
registryUrls: [
|
||||||
|
'https://dl.cloudsmith.io/basic/my-org/my-repo/cargo/index.git',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
currentValue: '3.0.0',
|
||||||
|
datasource: 'crate',
|
||||||
|
depName: 'mcorbin-test',
|
||||||
|
depType: 'dependencies',
|
||||||
|
managerData: {
|
||||||
|
nestedVersion: true,
|
||||||
|
},
|
||||||
|
registryUrls: ['https://github.com/mcorbin/testregistry'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
currentValue: '0.2',
|
||||||
|
datasource: 'crate',
|
||||||
|
depName: 'tokio',
|
||||||
|
depType: 'dependencies',
|
||||||
|
managerData: {
|
||||||
|
nestedVersion: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
it('extracts workspace dependencies', async () => {
|
it('extracts workspace dependencies', async () => {
|
||||||
const cargoToml = codeBlock`
|
const cargoToml = codeBlock`
|
||||||
[package]
|
[package]
|
||||||
|
|
|
@ -15,6 +15,11 @@ import type {
|
||||||
CargoSection,
|
CargoSection,
|
||||||
} from './types';
|
} from './types';
|
||||||
|
|
||||||
|
function getCargoIndexEnv(registryName: string): string | null {
|
||||||
|
const registry = registryName.toUpperCase().replaceAll('-', '_');
|
||||||
|
return process.env[`CARGO_REGISTRIES_${registry}_INDEX`] ?? null;
|
||||||
|
}
|
||||||
|
|
||||||
function extractFromSection(
|
function extractFromSection(
|
||||||
parsedContent: CargoSection,
|
parsedContent: CargoSection,
|
||||||
section: keyof CargoSection,
|
section: keyof CargoSection,
|
||||||
|
@ -47,7 +52,9 @@ function extractFromSection(
|
||||||
currentValue = version;
|
currentValue = version;
|
||||||
nestedVersion = true;
|
nestedVersion = true;
|
||||||
if (registryName) {
|
if (registryName) {
|
||||||
const registryUrl = cargoRegistries[registryName];
|
const registryUrl =
|
||||||
|
cargoRegistries[registryName] ?? getCargoIndexEnv(registryName);
|
||||||
|
|
||||||
if (registryUrl) {
|
if (registryUrl) {
|
||||||
registryUrls = [registryUrl];
|
registryUrls = [registryUrl];
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue