Skip to content

Commit f83bf74

Browse files
authored
feat: add mise (#5978)
Add support for https://github.com/jdx/mise Fix: #5935
1 parent 5564cb1 commit f83bf74

8 files changed

Lines changed: 115 additions & 0 deletions

File tree

.github/renovate.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
"hashin",
8282
"helm",
8383
"helmfile",
84+
"mise",
8485
"nix",
8586
"node",
8687
"npm",
@@ -130,6 +131,7 @@
130131
"hashin",
131132
"helm",
132133
"helmfile",
134+
"mise",
133135
"nix",
134136
"node",
135137
"npm",

docs/custom-registries.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,23 @@ Samples:
386386
https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv5.3.0/kustomize_v5.3.0_linux_amd64.tar.gz
387387
```
388388

389+
## `mise`
390+
391+
mise releases are downloaded from:
392+
393+
- `https://github.com/jdx/mise/releases`
394+
395+
When no version is specified, the url `https://mise.jdx.dev/VERSION` is used to find the latest version.
396+
397+
Samples:
398+
399+
```txt
400+
https://github.com/jdx/mise/releases/download/v2026.2.13/mise-v2026.2.13-linux-x64.tar.xz
401+
https://github.com/jdx/mise/releases/download/v2026.2.13/mise-v2026.2.13-linux-arm64.tar.xz
402+
https://github.com/jdx/mise/releases/download/v2026.2.13/SHASUMS256.txt
403+
https://mise.jdx.dev/VERSION
404+
```
405+
389406
## `mono`
390407

391408
Mono releases are downloaded from:

src/cli/install-tool/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ import { ScalaInstallService } from '../tools/java/scala';
4848
import { JsonnetBundlerInstallService } from '../tools/jb';
4949
import { KubectlInstallService } from '../tools/kubectl';
5050
import { KustomizeInstallService } from '../tools/kustomize';
51+
import { MiseInstallService, MiseVersionResolver } from '../tools/mise';
5152
import { MonoInstallService } from '../tools/mono';
5253
import { NixInstallService } from '../tools/nix';
5354
import { NodeInstallService } from '../tools/node';
@@ -145,6 +146,7 @@ async function prepareInstallContainer(): Promise<Container> {
145146
container.bind(INSTALL_TOOL_TOKEN).to(KubectlInstallService);
146147
container.bind(INSTALL_TOOL_TOKEN).to(KustomizeInstallService);
147148
container.bind(INSTALL_TOOL_TOKEN).to(MavenInstallService);
149+
container.bind(INSTALL_TOOL_TOKEN).to(MiseInstallService);
148150
container.bind(INSTALL_TOOL_TOKEN).to(MonoInstallService);
149151
container.bind(INSTALL_TOOL_TOKEN).to(NixInstallService);
150152
container.bind(INSTALL_TOOL_TOKEN).to(NugetInstallService);
@@ -202,6 +204,7 @@ function prepareResolveContainer(): Container {
202204
container.bind(TOOL_VERSION_RESOLVER).to(JavaJreVersionResolver);
203205
container.bind(TOOL_VERSION_RESOLVER).to(JavaJdkVersionResolver);
204206
container.bind(TOOL_VERSION_RESOLVER).to(MavenVersionResolver);
207+
container.bind(TOOL_VERSION_RESOLVER).to(MiseVersionResolver);
205208
container.bind(TOOL_VERSION_RESOLVER).to(NodeVersionResolver);
206209
container.bind(TOOL_VERSION_RESOLVER).to(NugetVersionResolver);
207210
container.bind(TOOL_VERSION_RESOLVER).to(PhpVersionResolver);

src/cli/tools/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export const NoPrepareTools = [
2727
'kustomize',
2828
'lerna',
2929
'maven',
30+
'mise',
3031
'nix',
3132
'nuget',
3233
'npm',

src/cli/tools/mise.ts

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import fs from 'node:fs/promises';
2+
import { join } from 'node:path';
3+
import { isNonEmptyStringAndNotWhitespace } from '@sindresorhus/is';
4+
import { injectFromHierarchy, injectable } from 'inversify';
5+
import { BaseInstallService } from '../install-tool/base-install.service';
6+
import { ToolVersionResolver } from '../install-tool/tool-version-resolver';
7+
8+
@injectable()
9+
@injectFromHierarchy()
10+
export class MiseInstallService extends BaseInstallService {
11+
readonly name = 'mise';
12+
13+
private get arch(): string {
14+
switch (this.envSvc.arch) {
15+
case 'arm64':
16+
return 'arm64';
17+
case 'amd64':
18+
return 'x64';
19+
}
20+
}
21+
22+
override async install(version: string): Promise<void> {
23+
/**
24+
* @example
25+
* @see {@href https://github.com/jdx/mise/releases/tag/v2026.2.13}
26+
*/
27+
const baseUrl = `https://github.com/jdx/mise/releases/download/v${version}/`;
28+
29+
const filename = `mise-v${version}-linux-${this.arch}.tar.xz`;
30+
31+
const checksumFile = await this.http.download({
32+
url: `${baseUrl}SHASUMS256.txt`,
33+
});
34+
const expectedChecksum = (await fs.readFile(checksumFile, 'utf-8'))
35+
.split('\n')
36+
.find((l) => l.endsWith(` ./${filename}`))
37+
?.split(/\s+/)[0];
38+
39+
if (!expectedChecksum) {
40+
throw new Error(
41+
`Cannot find checksum for '${filename}' in SHASUMS256.txt`,
42+
);
43+
}
44+
45+
const file = await this.http.download({
46+
url: `${baseUrl}${filename}`,
47+
checksumType: 'sha256',
48+
expectedChecksum,
49+
});
50+
51+
await this.pathSvc.ensureToolPath(this.name);
52+
53+
const path = await this.pathSvc.createVersionedToolPath(this.name, version);
54+
await this.compress.extract({
55+
file,
56+
cwd: path,
57+
strip: 1,
58+
files: ['mise/bin/mise'],
59+
});
60+
}
61+
62+
override async link(version: string): Promise<void> {
63+
const src = join(this.pathSvc.versionedToolPath(this.name, version), 'bin');
64+
await this.shellwrapper({ srcDir: src });
65+
}
66+
67+
override async test(_version: string): Promise<void> {
68+
await this._spawn(this.name, ['version']);
69+
}
70+
}
71+
72+
@injectable()
73+
@injectFromHierarchy()
74+
export class MiseVersionResolver extends ToolVersionResolver {
75+
readonly tool = 'mise';
76+
77+
async resolve(version: string | undefined): Promise<string | undefined> {
78+
if (!isNonEmptyStringAndNotWhitespace(version) || version === 'latest') {
79+
return (await this.http.get('https://mise.jdx.dev/VERSION')).trim();
80+
}
81+
return version;
82+
}
83+
}

test/Dockerfile.distro

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ RUN install-tool kubectl v1.35.1
8888
# renovate: datasource=github-releases packageName=kubernetes-sigs/kustomize
8989
RUN install-tool kustomize 5.8.1
9090

91+
# renovate: datasource=github-releases packageName=jdx/mise
92+
RUN install-tool mise 2026.2.13
93+
9194
# renovate: datasource=datasource=github-releases packageName=containerbase/nix-prebuild
9295
RUN install-tool nix 2.24.10
9396

test/latest/Dockerfile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,9 @@ RUN install-tool gleam 1.14.0
237237
# renovate: datasource=github-releases packageName=kubernetes/kubernetes
238238
RUN install-tool kubectl v1.35.1
239239

240+
# renovate: datasource=github-releases packageName=jdx/mise
241+
RUN install-tool mise 2026.2.13
242+
240243
# renovate: datasource=github-releases packageName=containerbase/skopeo-prebuild
241244
RUN install-tool skopeo 1.22.0
242245

test/latest/Dockerfile.arm64

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,9 @@ FROM base AS test-others
176176
# renovate: datasource=github-releases packageName=kubernetes/kubernetes
177177
RUN install-tool kubectl v1.35.1
178178

179+
# renovate: datasource=github-releases packageName=jdx/mise
180+
RUN install-tool mise 2026.2.13
181+
179182
# renovate: datasource=github-releases packageName=containerbase/skopeo-prebuild
180183
RUN install-tool skopeo 1.22.0
181184

0 commit comments

Comments
 (0)