Skip to content

Commit

Permalink
feat(cli): convert helmfile
Browse files Browse the repository at this point in the history
- closes #2064
  • Loading branch information
viceice committed Jul 30, 2024
1 parent 3885faf commit ef1c140
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/cli/install-tool/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { InstallFlutterService } from '../tools/flutter';
import { InstallFluxService } from '../tools/flux';
import { InstallGleamService } from '../tools/gleam';
import { HelmInstallService } from '../tools/helm';
import { HelmfileInstallService } from '../tools/helmfile';
import {
InstallJavaJdkService,
InstallJavaJreService,
Expand Down Expand Up @@ -77,6 +78,7 @@ function prepareInstallContainer(): Container {
container.bind(INSTALL_TOOL_TOKEN).to(InstallGleamService);
container.bind(INSTALL_TOOL_TOKEN).to(InstallGradleService);
container.bind(INSTALL_TOOL_TOKEN).to(HelmInstallService);
container.bind(INSTALL_TOOL_TOKEN).to(HelmfileInstallService);
container.bind(INSTALL_TOOL_TOKEN).to(InstallJavaService);
container.bind(INSTALL_TOOL_TOKEN).to(InstallJavaJreService);
container.bind(INSTALL_TOOL_TOKEN).to(InstallJavaJdkService);
Expand Down
75 changes: 75 additions & 0 deletions src/cli/tools/helmfile.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import fs from 'node:fs/promises';
import path from 'node:path';
import { execa } from 'execa';
import { inject, injectable } from 'inversify';
import { InstallToolBaseService } from '../install-tool/install-tool-base.service';
import {
CompressionService,
EnvService,
HttpService,
PathService,
} from '../services';

@injectable()
export class HelmfileInstallService extends InstallToolBaseService {
readonly name = 'helmfile';

constructor(
@inject(EnvService) envSvc: EnvService,
@inject(PathService) pathSvc: PathService,
@inject(HttpService) private http: HttpService,
@inject(CompressionService) private compress: CompressionService,
) {
super(pathSvc, envSvc);
}

override async install(version: string): Promise<void> {
const name = this.name;
const filename = `${name}_${version}_linux_${this.envSvc.arch}.tar.gz`;
const url = `https://github.com/${name}/${name}/releases/download/v${version}/`;

const expectedChecksum = await this._getChecksum(
`${url}${name}_${version}_checksums.txt`,
filename,
);
const file = await this.http.download({
url: `${url}${filename}`,
checksumType: 'sha256',
expectedChecksum,
});
await this.pathSvc.ensureToolPath(this.name);
const cwd = path.join(
await this.pathSvc.createVersionedToolPath(this.name, version),
'bin',
);
await fs.mkdir(cwd);
await this.compress.extract({ file, cwd });
}

override async link(version: string): Promise<void> {
const src = path.join(
this.pathSvc.versionedToolPath(this.name, version),
'bin',
);
await this.shellwrapper({ srcDir: src });
}

override async test(_version: string): Promise<void> {
await execa(this.name, ['version'], {
stdio: ['inherit', 'inherit', 1],
});
}

/** TODO: create helper */
protected async _getChecksum(
url: string,
filename: string,
): Promise<string | undefined> {
const checksumFile = await this.http.download({ url });
const expectedChecksum = (await fs.readFile(checksumFile, 'utf-8'))
.split('\n')
.find((l) => l.includes(filename))
?.split(' ')[0];
return expectedChecksum;
}
}
1 change: 1 addition & 0 deletions src/cli/tools/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ export const NoPrepareTools = [
'gradle',
'hashin',
'helm',
'helmfile',
'kubectl',
'lerna',
'maven',
Expand Down

0 comments on commit ef1c140

Please sign in to comment.