From a526058af0ffef07be0c1a438fcf14b896ab5b19 Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Fri, 14 Feb 2025 14:37:34 +0100 Subject: [PATCH] feat(npm): npm packages --- .github/workflows/release.yaml | 4 ++ .gitignore | 19 ++++++---- Makefile | 30 ++++++++++++++- go.mod | 2 +- npm/bin/kubernetes-mcp-server.js | 19 ++++++++++ .../package.json | 11 ++++++ .../package.json | 11 ++++++ .../package.json | 11 ++++++ .../package.json | 11 ++++++ .../package.json | 11 ++++++ .../package.json | 11 ++++++ npm/package-lock.json | 24 ++++++++++++ npm/package.json | 38 +++++++++++++++++++ 13 files changed, 193 insertions(+), 9 deletions(-) create mode 100755 npm/bin/kubernetes-mcp-server.js create mode 100644 npm/kubernetes-mcp-server-darwin-amd64/package.json create mode 100644 npm/kubernetes-mcp-server-darwin-arm64/package.json create mode 100644 npm/kubernetes-mcp-server-linux-amd64/package.json create mode 100644 npm/kubernetes-mcp-server-linux-arm64/package.json create mode 100644 npm/kubernetes-mcp-server-windows-amd64/package.json create mode 100644 npm/kubernetes-mcp-server-windows-arm64/package.json create mode 100644 npm/package-lock.json create mode 100644 npm/package.json diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 2f1e11e..7d14957 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -12,6 +12,7 @@ concurrency: env: GO_VERSION: 1.23 + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} permissions: contents: write @@ -39,3 +40,6 @@ jobs: files: | LICENSE kubernetes-mcp-server-* + - name: Publish npm + run: + make npm-publish diff --git a/.gitignore b/.gitignore index 6f92a75..b211a8c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,14 @@ .idea/ -/kubernetes-mcp-server -/kubernetes-mcp-server-darwin-amd64 -/kubernetes-mcp-server-darwin-arm64 -/kubernetes-mcp-server-linux-amd64 -/kubernetes-mcp-server-linux-arm64 -/kubernetes-mcp-server-windows-amd64.exe -/kubernetes-mcp-server-windows-arm64.exe +.npmrc +kubernetes-mcp-server +kubernetes-mcp-server-darwin-amd64 +!npm/kubernetes-mcp-server-darwin-amd64/ +kubernetes-mcp-server-darwin-arm64 +!npm/kubernetes-mcp-server-darwin-arm64 +kubernetes-mcp-server-linux-amd64 +!npm/kubernetes-mcp-server-linux-amd64 +kubernetes-mcp-server-linux-arm64 +!npm/kubernetes-mcp-server-linux-arm64 +kubernetes-mcp-server-windows-amd64.exe +kubernetes-mcp-server-windows-arm64.exe diff --git a/Makefile b/Makefile index 56bd6c9..7114e11 100644 --- a/Makefile +++ b/Makefile @@ -19,12 +19,16 @@ LD_FLAGS = -s -w \ -X '$(PACKAGE)/pkg/version.BinaryName=$(BINARY_NAME)' COMMON_BUILD_ARGS = -ldflags "$(LD_FLAGS)" +NPM_VERSION ?= $(shell echo $(GIT_VERSION) | sed 's/^v//') OSES = darwin linux windows ARCHS = amd64 arm64 CLEAN_TARGETS := CLEAN_TARGETS += '$(BINARY_NAME)' -CLEAN_TARGETS += $(foreach os,$(OSES),$(foreach arch,$(ARCHS),$(BINARY_NAME)-$(os)-$(arch))) +CLEAN_TARGETS += $(foreach os,$(OSES),$(foreach arch,$(ARCHS),$(BINARY_NAME)-$(os)-$(arch)$(if $(findstring windows,$(os)),.exe,))) +CLEAN_TARGETS += $(foreach os,$(OSES),$(foreach arch,$(ARCHS),./npm/$(BINARY_NAME)-$(os)-$(arch)/bin/)) +CLEAN_TARGETS += ./npm/.npmrc +CLEAN_TARGETS += $(foreach os,$(OSES),$(foreach arch,$(ARCHS),./npm/$(BINARY_NAME)-$(os)-$(arch)/.npmrc)) # The help will print out all targets with their descriptions organized bellow their categories. The categories are represented by `##@` and the target descriptions by `##`. # The awk commands is responsible to read the entire set of makefiles included in this invocation, looking for lines of the file as xyz: ## something, and then pretty-format the target and help. Then, if there's a line with ##@ something, that gets pretty-printed as a category. @@ -53,6 +57,30 @@ build-all-platforms: clean tidy format ## Build the project for all platforms GOOS=$(os) GOARCH=$(arch) go build $(COMMON_BUILD_ARGS) -o $(BINARY_NAME)-$(os)-$(arch)$(if $(findstring windows,$(os)),.exe,) ./cmd/kubernetes-mcp-server; \ )) +.PHONY: npm +npm: build-all-platforms ## Create the npm packages + $(foreach os,$(OSES),$(foreach arch,$(ARCHS), \ + EXECUTABLE=./$(BINARY_NAME)-$(os)-$(arch)$(if $(findstring windows,$(os)),.exe,); \ + DIRNAME=$(BINARY_NAME)-$(os)-$(arch); \ + mkdir -p ./npm/$$DIRNAME/bin; \ + cp $$EXECUTABLE ./npm/$$DIRNAME/bin/; \ + )) + +.PHONY: npm-publish +npm-publish: npm ## Publish the npm packages + $(foreach os,$(OSES),$(foreach arch,$(ARCHS), \ + DIRNAME="$(BINARY_NAME)-$(os)-$(arch)"; \ + cd npm/$$DIRNAME; \ + echo '//registry.npmjs.org/:_authToken=\$(NPM_TOKEN)' >> .npmrc; \ + jq '.version = "$(NPM_VERSION)"' package.json > tmp.json && mv tmp.json package.json; \ + echo npm publish; \ + cd ../..; \ + )) + echo '//registry.npmjs.org/:_authToken=\$(NPM_TOKEN)' >> ./npm/.npmrc + jq '.version = "$(NPM_VERSION)"' ./npm/package.json > tmp.json && mv tmp.json ./npm/package.json; \ + jq '.optionalDependencies |= with_entries(.value = "$(NPM_VERSION)")' ./npm/package.json > tmp.json && mv tmp.json ./npm/package.json; \ + cd npm && echo npm publish + .PHONY: test test: ## Run the tests go test -count=1 -v ./... diff --git a/go.mod b/go.mod index b1cab37..f67fcb0 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/spf13/afero v1.12.0 github.com/spf13/cobra v1.8.1 github.com/spf13/viper v1.19.0 + golang.org/x/net v0.33.0 k8s.io/api v0.32.1 k8s.io/apimachinery v0.32.1 k8s.io/cli-runtime v0.32.1 @@ -77,7 +78,6 @@ require ( github.com/xlab/treeprint v1.2.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect - golang.org/x/net v0.33.0 // indirect golang.org/x/oauth2 v0.25.0 // indirect golang.org/x/sync v0.10.0 // indirect golang.org/x/sys v0.29.0 // indirect diff --git a/npm/bin/kubernetes-mcp-server.js b/npm/bin/kubernetes-mcp-server.js new file mode 100755 index 0000000..a4cbf8f --- /dev/null +++ b/npm/bin/kubernetes-mcp-server.js @@ -0,0 +1,19 @@ +const childProcess = require("child_process"); + +const BINARY_MAP = { + darwin_x86: {name: "kubernetes-mcp-server-darwin-amd64", suffix: ''}, + darwin_arm64: {name: "kubernetes-mcp-server-darwin-arm64", suffix: ''}, + linux_x86: {name: "kubernetes-mcp-server-linux-amd64", suffix: ''}, + linux_arm64: {name: "kubernetes-mcp-server-linux-arm64", suffix: ''}, + win32_x86: {name: "kubernetes-mcp-server-windows-amd64", suffix: '.exe'}, + win32_arm64: {name: "kubernetes-mcp-server-windows-arm64", suffix: '.exe'}, +}; + +const binary = BINARY_MAP[`${process.platform}_${process.arch}`]; + +module.exports.runBinary = function (...args) { + // Resolving will fail if the optionalDependency was not installed + childProcess.execFileSync(require.resolve(`${binary.name}/bin/${binary.name}+${binary.suffix}`), args, { + stdio: "inherit", + }); +}; diff --git a/npm/kubernetes-mcp-server-darwin-amd64/package.json b/npm/kubernetes-mcp-server-darwin-amd64/package.json new file mode 100644 index 0000000..f83bf58 --- /dev/null +++ b/npm/kubernetes-mcp-server-darwin-amd64/package.json @@ -0,0 +1,11 @@ +{ + "name": "kubernetes-mcp-server-darwin-amd64", + "version": "0.0.0", + "description": "Model Context Protocol (MCP) server for Kubernetes and OpenShift", + "os": [ + "darwin" + ], + "cpu": [ + "x64" + ] +} diff --git a/npm/kubernetes-mcp-server-darwin-arm64/package.json b/npm/kubernetes-mcp-server-darwin-arm64/package.json new file mode 100644 index 0000000..d8cbc61 --- /dev/null +++ b/npm/kubernetes-mcp-server-darwin-arm64/package.json @@ -0,0 +1,11 @@ +{ + "name": "kubernetes-mcp-server-darwin-arm64", + "version": "0.0.0", + "description": "Model Context Protocol (MCP) server for Kubernetes and OpenShift", + "os": [ + "darwin" + ], + "cpu": [ + "arm64" + ] +} diff --git a/npm/kubernetes-mcp-server-linux-amd64/package.json b/npm/kubernetes-mcp-server-linux-amd64/package.json new file mode 100644 index 0000000..deaa536 --- /dev/null +++ b/npm/kubernetes-mcp-server-linux-amd64/package.json @@ -0,0 +1,11 @@ +{ + "name": "kubernetes-mcp-server-linux-amd64", + "version": "0.0.0", + "description": "Model Context Protocol (MCP) server for Kubernetes and OpenShift", + "os": [ + "linux" + ], + "cpu": [ + "x64" + ] +} diff --git a/npm/kubernetes-mcp-server-linux-arm64/package.json b/npm/kubernetes-mcp-server-linux-arm64/package.json new file mode 100644 index 0000000..ba2f647 --- /dev/null +++ b/npm/kubernetes-mcp-server-linux-arm64/package.json @@ -0,0 +1,11 @@ +{ + "name": "kubernetes-mcp-server-linux-arm64", + "version": "0.0.0", + "description": "Model Context Protocol (MCP) server for Kubernetes and OpenShift", + "os": [ + "linux" + ], + "cpu": [ + "arm64" + ] +} diff --git a/npm/kubernetes-mcp-server-windows-amd64/package.json b/npm/kubernetes-mcp-server-windows-amd64/package.json new file mode 100644 index 0000000..04b5d8e --- /dev/null +++ b/npm/kubernetes-mcp-server-windows-amd64/package.json @@ -0,0 +1,11 @@ +{ + "name": "kubernetes-mcp-server-windows-amd64", + "version": "0.0.0", + "description": "Model Context Protocol (MCP) server for Kubernetes and OpenShift", + "os": [ + "win32" + ], + "cpu": [ + "x64" + ] +} diff --git a/npm/kubernetes-mcp-server-windows-arm64/package.json b/npm/kubernetes-mcp-server-windows-arm64/package.json new file mode 100644 index 0000000..0319b25 --- /dev/null +++ b/npm/kubernetes-mcp-server-windows-arm64/package.json @@ -0,0 +1,11 @@ +{ + "name": "kubernetes-mcp-server-windows-arm64", + "version": "0.0.0", + "description": "Model Context Protocol (MCP) server for Kubernetes and OpenShift", + "os": [ + "arm64" + ], + "cpu": [ + "x64" + ] +} diff --git a/npm/package-lock.json b/npm/package-lock.json new file mode 100644 index 0000000..07c535b --- /dev/null +++ b/npm/package-lock.json @@ -0,0 +1,24 @@ +{ + "name": "kubernetes-mcp-server", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "kubernetes-mcp-server", + "version": "0.0.0", + "license": "Apache-2.0", + "bin": { + "kubernetes-mcp-server": "bin/kubernetes-mcp-server.js" + }, + "optionalDependencies": { + "kubernetes-mcp-server-darwin-amd64": "0.0.0", + "kubernetes-mcp-server-darwin-arm64": "0.0.0", + "kubernetes-mcp-server-linux-amd64": "0.0.0", + "kubernetes-mcp-server-linux-arm64": "0.0.0", + "kubernetes-mcp-server-win32-amd64": "0.0.0", + "kubernetes-mcp-server-win32-arm64": "0.0.0" + } + } + } +} diff --git a/npm/package.json b/npm/package.json new file mode 100644 index 0000000..1a586e6 --- /dev/null +++ b/npm/package.json @@ -0,0 +1,38 @@ +{ + "name": "kubernetes-mcp-server", + "version": "0.0.0", + "description": "Model Context Protocol (MCP) server for Kubernetes and OpenShift", + "main": "bin/kubernetes-mcp-server.js", + "bin": { + "kubernetes-mcp-server": "bin/kubernetes-mcp-server.js" + }, + "optionalDependencies": { + "kubernetes-mcp-server-darwin-amd64": "0.0.0", + "kubernetes-mcp-server-darwin-arm64": "0.0.0", + "kubernetes-mcp-server-linux-amd64": "0.0.0", + "kubernetes-mcp-server-linux-arm64": "0.0.0", + "kubernetes-mcp-server-win32-amd64": "0.0.0", + "kubernetes-mcp-server-win32-arm64": "0.0.0" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/manusa/kubernetes-mcp-server.git" + }, + "keywords": [ + "mcp", + "kubernetes", + "openshift", + "model", + "context", + "protocol" + ], + "author": { + "name": "Marc Nuri", + "url": "https://www.marcnuri.com" + }, + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/manusa/kubernetes-mcp-server/issues" + }, + "homepage": "https://github.com/manusa/kubernetes-mcp-server#readme" +}