Unverified Commit f23da9cc authored by Jari Kolehmainen's avatar Jari Kolehmainen Committed by GitHub
Browse files

Bundle helm3 binary (#220)

Signed-off-by: default avatarJari Kolehmainen <jari.kolehmainen@gmail.com>
parent 2593f701
master Nokel81-patch-1 allowed-resources api-manager-claenup asdasd ban-circular-deps bar-chart-cleanup better-release-script bug/port-forward-missing build-flatpak bundled-extensions-update catalog-entity-detail-registry chore/eslint-rules cleanup-pod-details-container cleanup-shell-session cleanup-terminal cluster-icons-as-letters consolidate-running-of-setups-on-application-start customize-colour debugging-integration-tests dependabot/npm_and_yarn/react-select-5.3.2 dependabot/npm_and_yarn/react-window-1.8.7 dependabot/npm_and_yarn/types/node-14.18.16 dependabot/npm_and_yarn/types/webpack-env-1.16.4 di-stores disposer-for-singletons doc/cluster-feature-extension-guide doc/status-bar-kube-object-extension-guides docs-spelling docs/api-all-exported electron-11.4.3 electron-12 endpoints-free-functions enhancement-node-vertical-metric-bars enhancement/group-app-preferences-by-extension ensure-listref-current entity-settings extension-auto-update extension-dir extension-discovery-changes extension-startup extensions/lens-version-check feat/add-bg-to-cluster-status feat/add-tests-for-main-extension-api-and-catalog-entity-registry feat/capture-logger-error feat/capture-winston-logger feat/lazy-load-compoment feat/new-api feature/auto-update feature/catalog-helm-repos feature/context-providers feature/kube-api-manager feature/lens-proxy-tls feature/navigate-back-ui-button feature/webpack5 feature/workspace-overview-extension-support feature/workspace-overview-landing fix-2109/compact-events fix-NamespaceSelect-gradients fix-api-doc-generate fix-change-os-theme-crash fix-concurrent-access fix-lint-error fix-linter-errors fix-local-make-dev fix-local-shell-session fix-namespace-filter-select fix-optimise-update-events-from-buffer fix-reload-list-items-on-mount fix-remove-watch-flush-headers fix-reseting-select-value fix-resource-applier fix-spelling fix-sync-open fix/allown-entity-id fix/blank-disabled-select-option fix/consistent-inputs fix/log-store-loading fix/metrics-resources-link fix/no-ui fix/node-shell-fail fix/ns-selector-performance-issue fix/pod-logs-storage fix/rewatch-if-resume fix/search_input_autofocus front-end-routes-ocp front-end-routes-ocp-2 front-end-routes-ocp-3 fuzz-tests global-watch hackweek-protocol-handler hackweek/multiple-windows helm-repo-cleanup helm-repo-manager helm-repo-manager-removal helm-routes hide-metrics improve-metrics-queries improve-pipelines-cache improve-workspace-validation improved-categories issue-1262 issue-1432 issue-1759 issue-1909 issue-2116 issue-2293 issue-2549 issue-2648 issue-2727 issue-3126 issue-3232 issue-3276 issue-3374 issue-3498 issue-3797 issue-3896 issue-4633 issue-4766 issue-4829 issue-4997 issue-5141 issue-5165 issue-5173 issue-5177 issue-5238 issue-745 kubectl-proxy-unix-socket lockdown-ownership make-LensExtension-abstract menu_enhancement mobx-6.2 more-places-to-check-for-updates move-docs native-menus port-forward-pod-deleted prometheus/victoria-metrics-single reactive-table refactor-settings-layout-styles release/v3.6 release/v4.0 release/v4.0-cherry-pick-fixes release/v4.0-doc-update release/v4.0-extension-publishing release/v4.0.0 release/v4.0.1 release/v4.0.2 release/v4.0.3 release/v4.0.4 release/v4.0.5 release/v4.0.6 release/v4.0.7 release/v4.0.8 release/v4.1 release/v4.1.0-alpha.1 release/v4.1.0-alpha.2 release/v4.1.0-beta.1 release/v4.1.0-beta.2 release/v4.1.0-rc.1 release/v4.1.0-rc.2 release/v4.1.1 release/v4.1.2 release/v4.1.3 release/v4.1.4 release/v4.2 release/v4.2.0-alpha.0 release/v5.0.0-rc.0 release/v5.2 release/v5.2.4 release/v5.2.7-beta.0 release/v5.3 release/v5.4 remove-font-icons remove-in-app-release-notes remove-unused-telemetry resizable_table_columns revert/store-and-watch-changes run-npm-publish-master-always set-build-version show-extension-preferences-in-separate-page single-logger squashed-update-injectable strict-mode temporary-manual-update-notification test/remove-sentry testing/issue-4314 testing/virtual-select tidy-hiddenTableColumns titles-and-headings top-bar-registry turn-on-strict typed-ipc-refactoring ui-table-empty-state-lines ui-tweaks update-bundled-extensions update-electon-builder-to-3-0-8 update-locks upgrade-typedoc-to-0.20 validate-cluster-model verify-quit-events watch-api-fixes websocket-catalog-sync welcome-banners-rounded-corners welcome-menu-registry workspace-overview-bug-test 4.2.0-beta.1 v5.5.0-beta.0 v5.4.6 v5.4.5 v5.4.4 v5.4.3 v5.4.2 v5.4.1 v5.4.0 v5.4.0-beta.5 v5.4.0-beta.4 v5.4.0-beta.3 v5.4.0-beta.2 v5.4.0-beta.1 v5.4.0-beta.0 v5.4.0-alpha.1 v5.4.0-alpha.0 v5.3.4 v5.3.3 v5.3.2 v5.3.1 v5.3.0 v5.3.0-beta.4 v5.3.0-beta.3 v5.3.0-beta.2 v5.3.0-beta.1 v5.3.0-beta.0 v5.3.0-alpha.11 v5.3.0-alpha.10 v5.3.0-alpha.9 v5.3.0-alpha.8 v5.3.0-alpha.7 v5.3.0-alpha.6 v5.3.0-alpha.5 v5.3.0-alpha.4 v5.3.0-alpha.3 v5.3.0-alpha.2 v5.3.0-alpha.1 v5.3.0-alpha.0 v5.2.7 v5.2.6 v5.2.6-beta.1 v5.2.6-beta.0 v5.2.5 v5.2.4 v5.2.3 v5.2.2 v5.2.1 v5.2.0 v5.2.0-rc.1 v5.2.0-beta.4 v5.2.0-beta.3 v5.2.0-beta.2 v5.2.0-beta.1 v5.1.3 v5.1.2 v5.1.1 v5.1.0 v5.1.0-beta.2 v5.1.0-beta.1 v5.0.2 v5.0.1 v5.0.0 v5.0.0-rc.0 v5.0.0-beta.13 v5.0.0-beta.12 v5.0.0-beta.11 v5.0.0-beta.10 v5.0.0-beta.9 v5.0.0-beta.8 v5.0.0-beta.7 v5.0.0-beta.6 v5.0.0-beta.5 v5.0.0-beta.4 v5.0.0-beta.3 v5.0.0-beta.2 v5.0.0-beta.1 v5.0.0-alpha.4 v5.0.0-alpha.3 v5.0.0-alpha.2 v5.0.0-alpha.1 v4.2.5 v4.2.4 v4.2.3 v4.2.2 v4.2.1 v4.2.0 v4.2.0-rc.3 v4.2.0-rc.2 v4.2.0-rc.1 v4.2.0-beta.1 v4.2.0-alpha.1 v4.1.5 v4.1.4 v4.1.3 v4.1.2 v4.1.1 v4.1.0 v4.1.0-rc.2 v4.1.0-rc.1 v4.1.0-beta.2 v4.1.0-beta.1 v4.1.0-alpha.2 v4.1.0-alpha.1 v4.0.8 v4.0.7 v4.0.6 v4.0.5 v4.0.4 v4.0.3 v4.0.2 v4.0.1 v4.0.0 v4.0.0-rc.3 v4.0.0-rc.2 v4.0.0-rc.1 v4.0.0-beta.4 v4.0.0-beta.3 v4.0.0-beta.2 v4.0.0-beta.1 v4.0.0-alpha.5 v4.0.0-alpha.4 v4.0.0-alpha.3 v4.0.0-alpha.2 v4.0.0-alpha.1 v3.6.10 v3.6.9 v3.6.8 v3.6.7 v3.6.6 v3.6.5 v3.6.5-rc.1 v3.6.4 v3.6.3 v3.6.2 v3.6.1 v3.6.0 v3.6.0-rc.3 v3.6.0-rc.2 v3.6.0-rc.1 v3.6.0-beta.2 v3.6.0-beta.1 v3.5.6-rc.1 v3.5.3 v3.5.2 v3.5.1 v3.5.1-rc.1 v3.5.0 v3.5.0-rc.1 v3.5.0-beta.1 v3.4.0 v3.4.0-rc.1 v3.4.0-beta.2 v3.4.0-beta.1 v3.3.1 v3.3.0 v3.3.0-rc.1 v3.2.0 v3.2.0-rc.2 v0.2 v0.1
No related merge requests found
Showing with 56 additions and 33 deletions
+56 -33
......@@ -27,6 +27,7 @@ module.exports = {
},
{
files: [
"build/*.ts",
"src/**/*.ts",
"spec/**/*.ts"
],
......
import { helmCli } from "../src/main/helm-cli"
helmCli.ensureBinary()
......@@ -11,7 +11,8 @@
"version": "3.2.0-rc.1",
"main": "main.ts",
"config": {
"bundledKubectlVersion": "1.17.3"
"bundledKubectlVersion": "1.17.3",
"bundledHelmVersion": "3.1.2"
},
"engines": {
"node": ">=12.0 <13.0"
......@@ -41,6 +42,10 @@
{
"from": "binaries/client/linux/x64/kubectl",
"to": "./x64/kubectl"
},
{
"from": "binaries/client/helm3/helm3",
"to": "./helm3/helm3"
}
]
},
......@@ -53,6 +58,10 @@
{
"from": "binaries/client/darwin/x64/kubectl",
"to": "./x64/kubectl"
},
{
"from": "binaries/client/helm3/helm3",
"to": "./helm3/helm3"
}
]
},
......@@ -68,6 +77,10 @@
{
"from": "binaries/client/windows/ia32/kubectl.exe",
"to": "./ia32/kubectl.exe"
},
{
"from": "binaries/client/helm3/helm3.exe",
"to": "./helm3/helm3.exe"
}
]
},
......@@ -94,7 +107,7 @@
"dev": "concurrently -n app,dash \"yarn dev-electron\" \"yarn dev-dashboard\"",
"dev-dashboard": "cd dashboard && yarn dev",
"dev-electron": "electron-webpack dev",
"compile": "yarn download:kubectl && electron-webpack",
"compile": "yarn download:bins && electron-webpack",
"build:linux": "yarn compile && electron-builder --linux --dir",
"build:mac": "yarn compile && electron-builder --mac --dir",
"build:win": "yarn compile && electron-builder --win --dir",
......@@ -105,7 +118,9 @@
"lint-dashboard": "eslint $@ --ext js,ts,tsx --max-warnings=0 dashboard/client dashboard/server",
"postinstall": "patch-package",
"test": "node_modules/.bin/jest",
"download:kubectl": "yarn run ts-node build/download_kubectl.ts"
"download:bins": "concurrently \"yarn download:kubectl\" \"yarn download:helm\"",
"download:kubectl": "yarn run ts-node build/download_kubectl.ts",
"download:helm": "yarn run ts-node build/download_helm.ts"
},
"dependencies": {
"@hapi/call": "^6.0.1",
......
import * as path from "path"
import { LensBinary, LensBinaryOpts } from "./lens-binary"
import { userStore } from "../common/user-store"
const helmVersion = "3.1.2"
const packageMirrors: Map<string, string> = new Map([
["default", "https://get.helm.sh"],
["china", "https://mirror.azure.cn/kubernetes/helm"]
])
export class HelmCli extends LensBinary {
public constructor(version: string) {
public constructor(baseDir: string, version: string) {
const opts: LensBinaryOpts = {
version,
baseDir: baseDir,
originalBinaryName: "helm",
newBinaryName: "helm3"
}
super(opts)
}
protected getTarName(): string|null {
return `${this.binaryName}-v${this.binaryVersion}-${this.platformName}-${this.arch}.tar.gz`
}
protected getUrl() {
return `${this.getDownloadMirror()}/helm-v${this.binaryVersion}-${this.platformName}-${this.arch}.tar.gz`
}
protected getDownloadMirror() {
const mirror = packageMirrors.get(userStore.getPreferences().downloadMirror)
if (mirror) { return mirror }
return packageMirrors.get("default")
return `https://get.helm.sh/helm-v${this.binaryVersion}-${this.platformName}-${this.arch}.tar.gz`
}
protected getBinaryPath() {
return path.join(this.dirname, this.platformName+"-"+this.arch, this.binaryName)
return path.join(this.dirname, this.binaryName)
}
protected getOriginalBinaryPath() {
......@@ -42,4 +30,15 @@ export class HelmCli extends LensBinary {
}
}
export const helmCli = new HelmCli(helmVersion)
const helmVersion = require("../../package.json").config.bundledHelmVersion
const isDevelopment = process.env.NODE_ENV !== "production"
let baseDir: string = null
if(isDevelopment) {
baseDir = path.join(process.cwd(), "binaries", "client")
} else {
baseDir = path.join(process.resourcesPath)
}
export const helmCli = new HelmCli(baseDir, helmVersion)
......@@ -100,9 +100,6 @@ async function main() {
})
},
}, promiseIpc)
// download helm cli
helmCli.ensureBinary()
}
app.on("ready", main)
......
import { app, remote } from "electron"
import * as path from "path"
import * as fs from "fs"
import * as request from "request"
import logger from "./logger"
import { ensureDir, pathExists } from "fs-extra"
import * as tar from "tar"
import { globalRequestOpts} from "../common/request"
export type LensBinaryOpts = {
version: string;
baseDir: string;
originalBinaryName: string;
newBinaryName?: string;
requestOpts?: request.Options;
}
export class LensBinary {
......@@ -24,12 +24,14 @@ export class LensBinary {
protected platformName: string
protected arch: string
protected originalBinaryName: string
protected requestOpts: request.Options
constructor(opts: LensBinaryOpts) {
const baseDir = opts.baseDir
this.originalBinaryName = opts.originalBinaryName
this.binaryName = opts.newBinaryName || opts.originalBinaryName
this.binaryVersion = opts.version
this.requestOpts = opts.requestOpts
let arch = null
......@@ -41,20 +43,24 @@ export class LensBinary {
arch = process.arch
}
this.arch = arch
const binaryDir = path.join((app || remote.app).getPath("userData"), "binaries", this.binaryName)
this.platformName = process.platform === "win32" ? "windows" : process.platform
if (process.platform === "win32") {
this.binaryName = this.binaryName+".exe"
this.originalBinaryName = this.originalBinaryName+".exe"
}
this.dirname = path.normalize(path.join(binaryDir, this.binaryVersion))
this.dirname = path.normalize(path.join(baseDir, this.binaryName))
const tarName = this.getTarName()
if (tarName) {
this.tarPath = path.join(this.dirname, tarName)
}
}
protected binaryDir() {
throw new Error("binaryDir not implemented")
}
public async binaryPath() {
await this.ensureBinary()
return this.getBinaryPath()
......@@ -101,6 +107,7 @@ export class LensBinary {
await this.downloadBinary().catch((error) => { logger.error(error) });
if (this.tarPath) await this.untarBinary()
if(this.originalBinaryName != this.binaryName ) await this.renameBinary()
logger.info(`${this.originalBinaryName} has been downloaded to ${this.getBinaryPath()}`)
}
}
......@@ -139,13 +146,14 @@ export class LensBinary {
logger.info(`Downloading ${this.originalBinaryName} ${this.binaryVersion} from ${url} to ${binaryPath}`)
const requestOpts: request.UriOptions & request.CoreOptions = {
uri: url,
gzip: true
gzip: true,
...this.requestOpts
}
const stream = request(globalRequestOpts(requestOpts))
const stream = request(requestOpts)
stream.on("complete", () => {
logger.info(`${this.originalBinaryName} binary download finished`)
logger.info(`Download of ${this.originalBinaryName} finished`)
file.end(() => {})
})
......
......@@ -30,7 +30,7 @@
<h2>Download Mirror</h2>
<b-form-group
label="Download mirror for kubectl/helm:"
label="Download mirror for kubectl:"
label-for="input-download-mirror"
>
<b-form-select
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment