From 3b02eedca69ae217929daeefa512432f899e4bb7 Mon Sep 17 00:00:00 2001 From: Daniel Hougaard Date: Tue, 12 Nov 2024 20:36:09 +0400 Subject: [PATCH] feat: npm CLI --- .../workflows/release_build_infisical_cli.yml | 68 ++++++++- npm/.eslintrc.json | 9 ++ npm/README.md | 45 ++++++ npm/package-lock.json | 8 +- npm/package.json | 16 ++- npm/src/index.cjs | 131 +++++++++--------- 6 files changed, 200 insertions(+), 77 deletions(-) create mode 100644 npm/.eslintrc.json create mode 100644 npm/README.md diff --git a/.github/workflows/release_build_infisical_cli.yml b/.github/workflows/release_build_infisical_cli.yml index 02c349237..d270a9603 100644 --- a/.github/workflows/release_build_infisical_cli.yml +++ b/.github/workflows/release_build_infisical_cli.yml @@ -1,12 +1,15 @@ name: Build and release CLI on: + pull_request: + types: [opened, synchronize] + workflow_dispatch: - push: - # run only against tags - tags: - - "infisical-cli/v*.*.*" + # push: + # run only against tags + # tags: + # - "infisical-cli/v*.*.*" permissions: contents: write @@ -26,6 +29,63 @@ jobs: CLI_TESTS_USER_PASSWORD: ${{ secrets.CLI_TESTS_USER_PASSWORD }} CLI_TESTS_INFISICAL_VAULT_FILE_PASSPHRASE: ${{ secrets.CLI_TESTS_INFISICAL_VAULT_FILE_PASSPHRASE }} + npm-release: + runs-on: ubuntu-20.04 + env: + working-directory: ./npm + CLI_VERSION: 1.1.1 + needs: + - cli-integration-tests + # - goreleaser + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + + # - name: Extract version + # run: | + # VERSION=$(echo ${{ github.ref_name }} | sed 's/infisical-cli\/v//') + # echo "Version extracted: $VERSION" + # echo "CLI_VERSION=$VERSION" >> $GITHUB_ENV + + - name: Print version + run: echo ${{ env.CLI_VERSION }} + + - name: Setup Node + uses: actions/setup-node@8f152de45cc393bb48ce5d89d36b731f54556e65 # v4.0.0 + with: + node-version: 20 + cache: "npm" + cache-dependency-path: ./npm/package-lock.json + - name: Install dependencies + working-directory: ${{ env.working-directory }} + run: npm install + + - name: Set NPM version + working-directory: ${{ env.working-directory }} + run: npm version ${{ env.CLI_VERSION }} --allow-same-version --no-git-tag-version + + - name: Setup NPM + working-directory: ${{ env.working-directory }} + run: | + echo 'registry="https://registry.npmjs.org/"' > ./.npmrc + echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ./.npmrc + + echo 'registry="https://registry.npmjs.org/"' > ~/.npmrc + echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc + env: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + + - name: Pack NPM + working-directory: ${{ env.working-directory }} + run: npm pack + + - name: Publish NPM + run: npm publish --tarball=./infisical-sdk-${{github.ref_name}} --access public --registry=https://registry.npmjs.org/ --dry-run + env: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + goreleaser: runs-on: ubuntu-20.04 needs: [cli-integration-tests] diff --git a/npm/.eslintrc.json b/npm/.eslintrc.json new file mode 100644 index 000000000..de8743bbb --- /dev/null +++ b/npm/.eslintrc.json @@ -0,0 +1,9 @@ +{ + "env": { + "es6": true, + "node": true + }, + "parserOptions": { + "ecmaVersion": "latest" + } +} diff --git a/npm/README.md b/npm/README.md new file mode 100644 index 000000000..a27a5bc86 --- /dev/null +++ b/npm/README.md @@ -0,0 +1,45 @@ +

Infisical

+

+

The open-source secret management platform: Sync secrets/configs across your team/infrastructure and prevent secret leaks.

+

+ +

+ Slack | + Infisical Cloud | + Self-Hosting | + Docs | + Website | + Hiring (Remote/SF) +

+ + +

+ + Infisical is released under the MIT license. + + + PRs welcome! + + + git commit activity + + + Cloudsmith downloads + + + Slack community channel + + + Infisical Twitter + +

+ +## Introduction + +**[Infisical](https://infisical.com)** is the open source secret management platform that teams use to centralize their application configuration and secrets like API keys and database credentials as well as manage their internal PKI. + +We're on a mission to make security tooling more accessible to everyone, not just security teams, and that means redesigning the entire developer experience from ground up. + +## [CLI Documentation](https://infisical.com/docs/cli/usage) + + diff --git a/npm/package-lock.json b/npm/package-lock.json index e1e50a15c..872adcf77 100644 --- a/npm/package-lock.json +++ b/npm/package-lock.json @@ -1,12 +1,12 @@ { - "name": "infisical-cli", - "version": "0.14.2", + "name": "@infisical/cli", + "version": "0.14.3", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "infisical-cli", - "version": "0.14.2", + "name": "@infisical/cli", + "version": "0.14.3", "hasInstallScript": true, "dependencies": { "tar": "^6.2.0" diff --git a/npm/package.json b/npm/package.json index 8d2c5bdf5..31859c598 100644 --- a/npm/package.json +++ b/npm/package.json @@ -1,9 +1,21 @@ { - "name": "infisical-cli", - "version": "0.14.2", + "name": "@infisical/cli", + "private": false, + "version": "0.0.0", + "keywords": [ + "infisical", + "cli", + "command-line" + ], "bin": { "infisical": "./bin/infisical" }, + "repository": { + "type": "git", + "url": "https://github.com/Infisical/infisical.git" + }, + "author": "Infisical Inc, ", + "scripts": { "postinstall": "node src/index.cjs" }, diff --git a/npm/src/index.cjs b/npm/src/index.cjs index 8ee818102..1f52111a0 100644 --- a/npm/src/index.cjs +++ b/npm/src/index.cjs @@ -1,4 +1,4 @@ -const { execSync } = require("child_process"); +const childProcess = require("child_process"); const fs = require("fs"); const stream = require("node:stream"); const tar = require("tar"); @@ -10,79 +10,76 @@ const supportedPlatforms = ["linux", "darwin", "win32", "freebsd"]; const outputDir = "bin"; const getPlatform = () => { - const platform = process.platform; - if (!supportedPlatforms.includes(platform)) { - console.error( - "Your platform doesn't seem to be of type darwin, linux or windows" - ); - process.exit(1); - } - return platform; + const platform = process.platform; + if (!supportedPlatforms.includes(platform)) { + console.error("Your platform doesn't seem to be of type darwin, linux or windows"); + process.exit(1); + } + return platform; }; const getArchitecture = () => { - const architecture = execSync("uname -m").toString().trim(); - let arch = ""; - if (architecture === "x86_64" || architecture === "amd64") { - arch = "amd64"; - } else if (architecture === "arm64" || architecture === "aarch64") { - arch = "arm64"; - } else if (architecture.startsWith("armv5")) { - arch = "armv5"; - } else if (architecture.startsWith("armv6")) { - arch = "armv6"; - } else if (architecture.startsWith("armv7")) { - arch = "armv7"; - } else if (architecture === "i386" || architecture === "i686") { - arch = "i386"; - } else { - console.error( - "Your architecture doesn't seem to be supported. Your architecture is", - architecture - ); - process.exit(1); - } - return arch; + const architecture = childProcess.execSync("uname -m").toString().trim(); + let arch = ""; + if (architecture === "x86_64" || architecture === "amd64") { + arch = "amd64"; + } else if (architecture === "arm64" || architecture === "aarch64") { + arch = "arm64"; + } else if (architecture.startsWith("armv5")) { + arch = "armv5"; + } else if (architecture.startsWith("armv6")) { + arch = "armv6"; + } else if (architecture.startsWith("armv7")) { + arch = "armv7"; + } else if (architecture === "i386" || architecture === "i686") { + arch = "i386"; + } else { + console.error("Your architecture doesn't seem to be supported. Your architecture is", architecture); + process.exit(1); + } + return arch; }; -function main() { - const PLATFORM = getPlatform(); - const ARCH = getArchitecture(); - const NUMERIC_RELEASE_VERSION = packageJSON.version; - const LATEST_RELEASE_VERSION = `v${NUMERIC_RELEASE_VERSION}`; - const downloadLink = `https://github.com/Infisical/infisical/releases/download/infisical-cli/${LATEST_RELEASE_VERSION}/infisical_${NUMERIC_RELEASE_VERSION}_${PLATFORM}_${ARCH}.tar.gz`; +async function main() { + const PLATFORM = getPlatform(); + const ARCH = getArchitecture(); + const NUMERIC_RELEASE_VERSION = packageJSON.version; + const LATEST_RELEASE_VERSION = `v${NUMERIC_RELEASE_VERSION}`; + const downloadLink = `https://github.com/Infisical/infisical/releases/download/infisical-cli/${LATEST_RELEASE_VERSION}/infisical_${NUMERIC_RELEASE_VERSION}_${PLATFORM}_${ARCH}.tar.gz`; - if (!fs.existsSync(outputDir)) { - fs.mkdirSync(outputDir); - fetch(downloadLink, { - headers: { - Accept: "application/octet-stream", - }, - }) - .then(async (response) => { - if (!response.ok) { - throw new Error( - `Failed to fetch: ${response.status} - ${response.statusText}` - ); - } + // Ensure the output directory exists + if (!fs.existsSync(outputDir)) { + fs.mkdirSync(outputDir); + } - return new Promise((resolve, reject) => { - const outStream = stream.Readable.fromWeb(response.body) - .pipe(zlib.createGunzip()) - .pipe( - tar.x({ - C: path.join(outputDir), - filter: (path) => path === "infisical", - }) - ); + // Download the latest CLI binary + try { + const response = await fetch(downloadLink, { + headers: { + Accept: "application/octet-stream" + } + }); - outStream.on("error", reject); - outStream.on("close", resolve); - }); - }) - .catch((error) => { - console.error("Error downloading or extracting the asset:", error); - }); - } + if (!response.ok) { + throw new Error(`Failed to fetch: ${response.status} - ${response.statusText}`); + } + + return await new Promise((resolve, reject) => { + const outStream = stream.Readable.fromWeb(response.body) + .pipe(zlib.createGunzip()) + .pipe( + tar.x({ + C: path.join(outputDir), + filter: path => path === "infisical" + }) + ); + + outStream.on("error", reject); + outStream.on("close", resolve); + }); + } catch (error) { + console.error("Error downloading or extracting the asset:", error); + process.exit(1); + } } main();