diff --git a/CHANGELOG.md b/CHANGELOG.md index b91fba1c..ad5ee505 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ # Changelog -## [unreleased] +## [3.1.0] - 2025-05-12 + +### Added + +- Add support for Linux ARM platforms [#202](https://github.com/bugsnag/bugsnag-cli/pull/202) + +### Fixed + +- Call the CLI directly rather than using NPX in the JS CLI wrapper [#201](https://github.com/bugsnag/bugsnag-cli/pull/201) ### Changed diff --git a/features/steps/steps.rb b/features/steps/steps.rb index 53249b09..028b4b08 100644 --- a/features/steps/steps.rb +++ b/features/steps/steps.rb @@ -202,7 +202,7 @@ def get_version_number(file_path) # Change directory to the js directory @js_dir = "#{base_dir}/js" Dir.chdir(@js_dir) - @output = `npm pack` + @output = `npm i && npm pack` @bugsnag_cli_package_path = "#{@js_dir}/#{@output}" Dir.chdir(base_dir) end diff --git a/install.sh b/install.sh index b7d6b718..aff2de23 100755 --- a/install.sh +++ b/install.sh @@ -91,7 +91,7 @@ display_help() { EOS } -VERSION="3.0.1" +VERSION="3.1.0" while [[ "$#" -gt 0 ]]; do case "$1" in diff --git a/js/package.json b/js/package.json index 33d39b1b..2a75029a 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@bugsnag/cli", - "version": "3.0.1", + "version": "3.1.0", "description": "BugSnag CLI", "main": "dist/bugsnag-cli-wrapper.js", "types": "dist/bugsnag-cli-wrapper.d.ts", @@ -33,7 +33,7 @@ "build": "tsc", "postinstall": "node postinstall.js", "prepack": "npm run prepublish", - "prepublish": "cp bin/bugsnag-cli-placeholder bin/bugsnag-cli" + "prepublish": "npm run build && cp bin/bugsnag-cli-placeholder bin/bugsnag-cli" }, "devDependencies": { "@types/node": "^22.15.3", diff --git a/js/src/bugsnag-cli-wrapper.ts b/js/src/bugsnag-cli-wrapper.ts index d85b16a8..21b2317f 100644 --- a/js/src/bugsnag-cli-wrapper.ts +++ b/js/src/bugsnag-cli-wrapper.ts @@ -1,72 +1,6 @@ -import { exec } from 'child_process' - -interface BaseOptions { - apiKey?: string - dryRun?: boolean - logLevel?: string - port?: number - failOnUploadError?: boolean - verbose?: boolean - overwrite?: boolean - retries?: number - timeout?: number -} - -export interface BugsnagCreateBuildOptions extends BaseOptions { - autoAssignRelease?: boolean - buildApiRootUrl?: string - builderName?: string - metadata?: object - provider?: string - releaseStage?: string - repository?: string - revision?: string - versionName?: string - androidAab?: string - appManifest?: string - versionCode?: string - bundleVersion?: string -} - -interface UploadOptions extends BaseOptions { - uploadApiRootUrl?: string - projectRoot?: string - dev?: boolean - bundle?: string - versionName?: string - sourceMap?: string - codeBundleId?: string -} - -export interface BugsnagUploadReactNativeOptions extends UploadOptions { - androidAppManifest?: string - androidVariant?: string - androidVersionCode?: string - iosBundleVersion?: string - iosPlist?: string - iosScheme?: string - iosXcodeProject?: string -} - -export interface BugsnagUploadiOSOptions extends UploadOptions { - sourceMap?: string - bundleVersion?: string - plist?: string - scheme?: string - xcodeProject?: string -} - -export interface BugsnagUploadAndroidOptions extends UploadOptions { - appManifest?: string - variant?: string - versionCode?: string -} - -export interface BugsnagUploadJsOptions extends UploadOptions { - baseUrl?: string - bundleUrl?: string - projectRoot?: string -} +import { execFile } from 'child_process' +import { BugsnagCreateBuildOptions, BugsnagUploadiOSOptions, BugsnagUploadJsOptions, BugsnagUploadAndroidOptions, BugsnagUploadReactNativeOptions } from './types' +import * as path from "path" /** * Wrapper for Bugsnag CLI @@ -98,13 +32,13 @@ class BugsnagCLI { .filter(Boolean) .join(' ') - const positionalArg = target ? `"${target}"` : '' - const cliCommand = `npx bugsnag-cli ${command} ${kebabCaseOptions} ${positionalArg}`.trim() - + const binPath = path.resolve(__dirname, path.join('..','bin','bugsnag-cli')) + // Split CLI options to pass to execFile + const args = [...command.split(" "), ...kebabCaseOptions.split(" "), target.trim()] // Execute the command - exec(cliCommand, (error, stdout, stderr) => { + execFile(binPath, args, (error, stdout, stderr) => { if (error) { - const errorMessage = `Command failed: ${cliCommand}\n` + + const errorMessage = `Command failed: ${binPath}\n` + `Error: ${error.message}\n` + `${stdout.trim()}` reject(errorMessage) @@ -156,4 +90,4 @@ class BugsnagCLI { } -export default BugsnagCLI +export = BugsnagCLI diff --git a/js/src/types.ts b/js/src/types.ts new file mode 100644 index 00000000..cadab372 --- /dev/null +++ b/js/src/types.ts @@ -0,0 +1,67 @@ +interface BaseOptions { + apiKey?: string + dryRun?: boolean + logLevel?: string + port?: number + failOnUploadError?: boolean + verbose?: boolean + overwrite?: boolean + retries?: number + timeout?: number +} + +export interface BugsnagCreateBuildOptions extends BaseOptions { + autoAssignRelease?: boolean + buildApiRootUrl?: string + builderName?: string + metadata?: object + provider?: string + releaseStage?: string + repository?: string + revision?: string + versionName?: string + androidAab?: string + appManifest?: string + versionCode?: string + bundleVersion?: string +} + +interface UploadOptions extends BaseOptions { + uploadApiRootUrl?: string + projectRoot?: string + dev?: boolean + bundle?: string + versionName?: string + sourceMap?: string + codeBundleId?: string +} + +export interface BugsnagUploadReactNativeOptions extends UploadOptions { + androidAppManifest?: string + androidVariant?: string + androidVersionCode?: string + iosBundleVersion?: string + iosPlist?: string + iosScheme?: string + iosXcodeProject?: string +} + +export interface BugsnagUploadiOSOptions extends UploadOptions { + sourceMap?: string + bundleVersion?: string + plist?: string + scheme?: string + xcodeProject?: string +} + +export interface BugsnagUploadAndroidOptions extends UploadOptions { + appManifest?: string + variant?: string + versionCode?: string +} + +export interface BugsnagUploadJsOptions extends UploadOptions { + baseUrl?: string + bundleUrl?: string + projectRoot?: string +} \ No newline at end of file diff --git a/js/supported-platforms.yml b/js/supported-platforms.yml index 7e1375e1..5069bd2e 100644 --- a/js/supported-platforms.yml +++ b/js/supported-platforms.yml @@ -23,6 +23,11 @@ ARTIFACT_NAME: 'x86_64-linux-bugsnag-cli' BINARY_NAME: 'bugsnag-cli' +- TYPE: 'Linux' + ARCHITECTURE: 'arm64' + ARTIFACT_NAME: 'arm64-linux-bugsnag-cli' + BINARY_NAME: 'bugsnag-cli' + - TYPE: 'Linux' ARCHITECTURE: 'i386' ARTIFACT_NAME: 'i386-linux-bugsnag-cli' diff --git a/main.go b/main.go index 117fcbd7..1d5535dc 100644 --- a/main.go +++ b/main.go @@ -13,7 +13,7 @@ import ( "github.com/bugsnag/bugsnag-cli/pkg/utils" ) -var package_version = "3.0.1" +var package_version = "3.1.0" func main() { commands := options.CLI{} diff --git a/makefile b/makefile index f680a823..32c7e8e9 100644 --- a/makefile +++ b/makefile @@ -30,6 +30,7 @@ build-windows: .PHONY: build-linux build-linux: [ -d bin ] || mkdir -p bin + GOOS=linux GOARCH=arm64 go build -ldflags '-s' -o bin/arm64-linux-bugsnag-cli main.go GOOS=linux GOARCH=amd64 go build -ldflags '-s' -o bin/x86_64-linux-bugsnag-cli main.go GOOS=linux GOARCH=386 go build -ldflags '-s' -o bin/i386-linux-bugsnag-cli main.go diff --git a/scripts/bump-version.sh b/scripts/bump-version.sh index 50bf66c2..cf1c86b6 100755 --- a/scripts/bump-version.sh +++ b/scripts/bump-version.sh @@ -14,5 +14,5 @@ fi echo Bumping the version number to $VERSION sed -i '' "s/package_version = \".*\"/package_version = \"$VERSION\"/" main.go sed -i '' "s/\"version\": \".*\"/\"version\": \"$VERSION\"/" js/package.json -sed -i '' "s/## \[Unreleased\]/## \[$VERSION\] - $(date '+%Y-%m-%d')/" CHANGELOG.md +sed -i '' "s/## \[unreleased\]/## \[$VERSION\] - $(date '+%Y-%m-%d')/" CHANGELOG.md sed -i '' "s/VERSION=\".*\"/VERSION=\"$VERSION\"/" install.sh