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.
+
+
+
+
+
+
+
+## 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();