Giter Club home page Giter Club logo

bugsnag-dsym-upload's Introduction

bugsnag-dsym-upload

Commands for uploading files to Bugsnag via the Bugsnag Upload APIs

Current Features

  • Uploads dSYM files in bulk
  • Converts bitcode-enabled symbol files stripped of symbol names into full files

Installation

Basic

Copy bin/bugsnag-dsym-upload into your PATH, or run make install to install to the default directory, /usr/lib/bin.

View usage here or using man bugsnag-dsym-upload

Install via the Homebrew formula:

brew install bugsnag/tap/bugsnag-dsym-upload

This will also add the Bugsnag Homebrew tap for future updates.

Add bugsnag as a plugin in your configuration:

fastlane add_plugin bugsnag

Then add the upload_symbols_to_bugsnag action to your lane:

lane :refresh_dsyms do
  download_dsyms(version: "1.4.2.1")     # Download dSYM files from App Store Connect
  upload_symbols_to_bugsnag              # Upload them to Bugsnag
  clean_build_artifacts                  # Delete the local dSYM files
end

Common options:

  • api_key: The API key associated with the project. Informs Bugsnag which project the dSYMs should be applied to.
  • dsym_path: A path or array of paths for directories containing *.dSYM files or a single *.zip file to upload. If unspecified, the default behavior is to upload the zip files retrieved by a prior invocation of download_dsyms, or any .dSYM files within the current directory.
  • upload_url: The URL of the server receiving symbol files. Update this value if you are using a private instance of Bugsnag
  • config_file: The path to the project's Info.plist. Set this value if your configuration file is not automatically detected.

View usage additional usage information and options by running:

fastlane action upload_symbols_to_bugsnag

For more information, take a look at the Bugsnag docs on using the Fastfile plugin.

Check out the example Fastfile to see how to use this plugin. Try it by cloning the repo, running fastlane install_plugins and bundle exec fastlane test.

If you have trouble using plugins, check out the Plugins Troubleshooting guide.

License

This module is free software released under the MIT License. See LICENSE.txt for details.

bugsnag-dsym-upload's People

Contributors

bengourley avatar bullmo avatar cawllec avatar codehex avatar duncanhewett avatar foygl avatar fractalwrench avatar imjoehaines avatar kattrali avatar matthewjhowells avatar philihp avatar snmaynard avatar stephenfeather avatar steve-nester-uk avatar tomlongridge avatar twometresteve avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

bugsnag-dsym-upload's Issues

v1.3.3 results in an error

Expected behavior

With v1.3.2 and the following setup uploading to Bugsnag worked well:

lane :refresh_dsyms do
  download_dsyms(version: "latest")
  upload_symbols_to_bugsnag
  clean_build_artifacts
end

Running fastlane action upload_symbols_to_bugsnag outputs the correct default locations for all dsyms.

Observed behavior

It no longer works. Instead it results in the following error:

------------------------------
--- Step: default_platform ---
------------------------------
Driving the lane 'refresh_dsyms' πŸš€
----------------------------
--- Step: download_dsyms ---
----------------------------
To not be asked about this value, you can specify it using 'username'
Your Apple ID Username for App Store Connect: email@email.com
Login to App Store Connect (email@email.com)
Login successful
Looking for latest version...
Looking for dSYM files for com.runemadsen.myapp v1.0.0 (100)
πŸ”‘  Successfully downloaded dSYM file for 1.0.0 - 100 to 'com.runemadsen.myapp-1.0.0-100.dSYM.zip'
---------------------------------------
--- Step: upload_symbols_to_bugsnag ---
---------------------------------------
+------------------+-------------------------------------------------------------------------------------+
|                                              Lane Context                                              |
+------------------+-------------------------------------------------------------------------------------+
| DEFAULT_PLATFORM | ios                                                                                 |
| PLATFORM_NAME    |                                                                                     |
| LANE_NAME        | refresh_dsyms                                                                       |
| DSYM_PATHS       | ["/Users/runemadsen/Development/myapp-ios/com.runemadsen.myapp-1.0.0-100.dSYM.z  |
|                  | ip"]                                                                                |
+------------------+-------------------------------------------------------------------------------------+
Failed uploading /Users/runemadsen/Development/myapp-ios/com.runemadsen.myapp-1.0.0-100.dSYM.zip
fastlane finished with errors

[!] Failed uploading /Users/runemadsen/Development/myapp-ios/com.runemadsen.myapp-1.0.0-100.dSYM.zip

Here's a more verbose version:

INFO [2018-07-14 17:56:47.41]: πŸ”‘  Successfully downloaded dSYM file for 1.0.0 - 100 to 'com.runemadsen.myapp-1.0.0-100.dSYM.zip'
DEBUG [2018-07-14 17:56:47.41]: Found train: 0.9.8, comparing to supplied version: 1.0.0
DEBUG [2018-07-14 17:56:47.41]: Version 1.0.0 doesn't match: 0.9.8
INFO [2018-07-14 17:56:47.41]: ---------------------------------------
INFO [2018-07-14 17:56:47.41]: --- Step: upload_symbols_to_bugsnag ---
INFO [2018-07-14 17:56:47.41]: ---------------------------------------
WARN [2018-07-14 17:56:47.42]: Lane Context:
INFO [2018-07-14 17:56:47.42]: {:DEFAULT_PLATFORM=>:ios, :PLATFORM_NAME=>nil, :LANE_NAME=>"refresh_dsyms", :DSYM_PATHS=>["/Users/runemadsen/Development/myapp-ios/com.runemadsen.myapp-1.0.0-100.dSYM.zip"]}
ERROR [2018-07-14 17:56:47.42]: Failed uploading /Users/runemadsen/Development/myapp-ios/com.runemadsen.myapp-1.0.0-100.dSYM.zip
ERROR [2018-07-14 17:56:47.42]: fastlane finished with errors
bundler: failed to load command: fastlane (/Users/runemadsen/.gem/ruby/2.5.0/bin/fastlane)
FastlaneCore::Interface::FastlaneError: [!] Failed uploading /Users/runemadsen/Development/myapp-ios/com.runemadsen.myapp-1.0.0-100.dSYM.zip
  /Users/runemadsen/.gem/ruby/2.5.0/gems/fastlane-2.99.1/fastlane_core/lib/fastlane_core/ui/interface.rb:141:in `user_error!'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/fastlane-2.99.1/fastlane_core/lib/fastlane_core/ui/ui.rb:17:in `method_missing'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/fastlane-plugin-bugsnag-1.3.3/lib/fastlane/plugin/bugsnag/actions/upload_symbols_to_bugsnag.rb:16:in `block in run'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/fastlane-plugin-bugsnag-1.3.3/lib/fastlane/plugin/bugsnag/actions/upload_symbols_to_bugsnag.rb:9:in `each'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/fastlane-plugin-bugsnag-1.3.3/lib/fastlane/plugin/bugsnag/actions/upload_symbols_to_bugsnag.rb:9:in `run'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/fastlane-2.99.1/fastlane/lib/fastlane/runner.rb:253:in `block (2 levels) in execute_action'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/fastlane-2.99.1/fastlane/lib/fastlane/actions/actions_helper.rb:50:in `execute_action'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/fastlane-2.99.1/fastlane/lib/fastlane/runner.rb:232:in `block in execute_action'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/fastlane-2.99.1/fastlane/lib/fastlane/runner.rb:227:in `chdir'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/fastlane-2.99.1/fastlane/lib/fastlane/runner.rb:227:in `execute_action'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/fastlane-2.99.1/fastlane/lib/fastlane/runner.rb:157:in `trigger_action_by_name'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/fastlane-2.99.1/fastlane/lib/fastlane/fast_file.rb:149:in `method_missing'
  Fastfile:24:in `block in parsing_binding'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/fastlane-2.99.1/fastlane/lib/fastlane/lane.rb:33:in `call'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/fastlane-2.99.1/fastlane/lib/fastlane/runner.rb:49:in `block in execute'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/fastlane-2.99.1/fastlane/lib/fastlane/runner.rb:45:in `chdir'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/fastlane-2.99.1/fastlane/lib/fastlane/runner.rb:45:in `execute'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/fastlane-2.99.1/fastlane/lib/fastlane/lane_manager.rb:56:in `cruise_lane'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/fastlane-2.99.1/fastlane/lib/fastlane/command_line_handler.rb:36:in `handle'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/fastlane-2.99.1/fastlane/lib/fastlane/commands_generator.rb:108:in `block (2 levels) in run'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/commander-fastlane-4.4.6/lib/commander/command.rb:178:in `call'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/commander-fastlane-4.4.6/lib/commander/command.rb:153:in `run'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/commander-fastlane-4.4.6/lib/commander/runner.rb:476:in `run_active_command'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/fastlane-2.99.1/fastlane_core/lib/fastlane_core/ui/fastlane_runner.rb:74:in `run!'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/commander-fastlane-4.4.6/lib/commander/delegates.rb:15:in `run!'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/fastlane-2.99.1/fastlane/lib/fastlane/commands_generator.rb:333:in `run'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/fastlane-2.99.1/fastlane/lib/fastlane/commands_generator.rb:41:in `start'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/fastlane-2.99.1/fastlane/lib/fastlane/cli_tools_distributor.rb:108:in `take_off'
  /Users/runemadsen/.gem/ruby/2.5.0/gems/fastlane-2.99.1/bin/fastlane:20:in `<top (required)>'
  /Users/runemadsen/.gem/ruby/2.5.0/bin/fastlane:23:in `load'
  /Users/runemadsen/.gem/ruby/2.5.0/bin/fastlane:23:in `<top (required)>'

Steps to reproduce

See above. Reproducible every time on 1.3.3, same command works fine on 1.3.2.

Version

v1.3.3

Additional information

Fastlane version is 2.99.1

Can't comment on Issues?

Some users have been unable to comment on Github issues when an adblocker extension is enabled.
We recommend temporarily disabling the extension, or if that fails, contacting [email protected].

Cannot upload DSYMs - Uploader barfs HTML

Expected behavior

Bugsnag fastlane plugin should upload to Bugsnag

Observed behavior

Regardless of network conditions, the plugin fails to upload to Bugsnag. My current uploading speed is: 49.21 Mbps according to speediest.net (personal network doesn't seem to be the issue here).

I get the following HTML barf

10:31:51]: ------------------------------
[10:31:51]: --- Step: default_platform ---
[10:31:51]: ------------------------------
[10:31:51]: Driving the lane 'ios refresh_dsyms_beta' πŸš€
[10:31:51]: ---------------------------------------
[10:31:51]: --- Step: upload_symbols_to_bugsnag ---
[10:31:51]: ---------------------------------------
<html><head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>502 Server Error</title> </head> <body text=#000000 bgcolor=#ffffff> <h1>Error: Server Error</h1> <h2>The server encountered a temporary error and could not complete your request.<p>Please try again in 30 seconds.</h2> <h2></h2> </body></html>
  • I've verified my API Key is correct (previously it was working and I was not getting these issues).

Steps to reproduce

Run the following command in a Fastlane lane
upload_symbols_to_bugsnag(api_key: "<my_bugsnag_api_key_here")

Version

Fastlane Version: 2.134.0
Bugsnag Version: 1.4.1

Can't comment on Issues?

Some users have been unable to comment on Github issues when an adblocker extension is enabled.
We recommend temporarily disabling the extension, or if that fails, contacting [email protected].

Config file not found on Android

Expected behavior

Indicate a specific error when the config file is not found.

Observed behavior

A Bugsnag API key is required to release a build. Set com.bugsnag.android.API_KEY in your AndroidManifest.xml to detect API key automatically.

Steps to reproduce

It is a React Native project organized like this :

/android
/ios
/fastlane
   /Fastfile

With no config_file

platform :android do
    lane :beta do
        send_build_to_bugsnag
    end
end

A Bugsnag API key is required to release a build. Set the config_file option with the path to your AndroidManifest.xml and set com.bugsnag.android.API_KEY in it to detect API key automatically.

With good config_file containing the API KEY

platform :android do
    lane :beta2 do
        send_build_to_bugsnag(
            config_file: "./android/app/src/main/AndroidManifest.xml",
        )
    end
end

A Bugsnag API key is required to release a build. Set com.bugsnag.android.API_KEY in your AndroidManifest.xml to detect API key automatically.

With unknown config_file

platform :android do
    lane :beta2 do
        send_build_to_bugsnag(
            config_file: "./android/app/src/main/UnknownFile.xml",
        )
    end
end

A Bugsnag API key is required to release a build. Set com.bugsnag.android.API_KEY in your AndroidManifest.xml to detect API key automatically.

There is no way to figure out what's wrong.

Version

+------------------------+---------+------------------------+
|                       Used plugins                        |
+------------------------+---------+------------------------+
| Plugin                 | Version | Action                 |
+------------------------+---------+------------------------+
| fastlane-plugin-bugsn  | 1.2.1   | send_build_to_bugsnag  |
| ag                     |         | upload_symbols_to_bug  |
|                        |         | snag                   |
+------------------------+---------+------------------------+

Additional information

Can't comment on Issues?

Some users have been unable to comment on Github issues when an adblocker extension is enabled.
We recommend temporarily disabling the extension, or if that fails, contacting [email protected].

dSYM upload fails after update to v1.3.4

After updating from version 1.3.2 to 1.3.4 of this plugin with no changes to my Fastfile, the upload_symbols_to_bugsnag step of my build process started failing.

Expected behavior

dSYM upload to Bugsnag succeeds

Observed behavior

Received the following error messages:

[12:21:44]: undefined method `each' for "/Users/distiller/project/ParkWhiz.app.dSYM.zip":String
[12:21:44]: You passed invalid parameters to 'upload_symbols_to_bugsnag'.
[12:21:44]: Check out the error below and available options by running `fastlane action upload_symbols_to_bugsnag`
...
[12:21:44]: Invalid default value for dsym_path, doesn't match verify_block

Steps to reproduce

Here is the relevant snippet of my Fastlane action:

gym(scheme: params[:scheme], export_method: "app-store", archive_path: archive_path(params))    
upload_symbols_to_bugsnag

Version

Worked with version 1.3.2. Failed with no changes to my Fastfile after update to version 1.3.4.

Additional information

I don't have time to investigate fully, but looking at your code, it appears that the issue is that the value of Actions.lane_context[SharedValues::DSYM_OUTPUT_PATH] is not an array; that causes the verify_block to fail when upload_symbols_to_bugsnag starts.

See:
https://github.com/bugsnag/bugsnag-dsym-upload/blob/v1.3.2/tools/fastlane-plugin/lib/fastlane/plugin/bugsnag/actions/upload_symbols_to_bugsnag.rb#L113

Support for react native?

Hi do you plan to support react native in the near future. I would like to upload my sourcemap files to bugsnag so i can track the errors properly.

Swift Support

Expected behavior

Tried to call "uploadSymbolsToBugsnag()" using fastlane swift

Observed behavior

Getting following error
❌ /Users/deshawnbrown/Projects/iOS/coworks-ios/fastlane/Fastfile.swift:87:9: use of unresolved identifier 'uploadSymbolsToBugsnag'; did you mean 'uploadSymbolsToSentry'?

Steps to reproduce

[Insert reproduction steps (if known)]

Version

1.4.1

Ubuntu doesn't have dwarfdump command

This is related to this issue:
#50

But if you're building and uploading dSYM on Ubuntu it will fail unless you install dwarfdump as it's required here:

uuid=$(dwarfdump -u $file 2>/dev/null)

If you install dwarfdump using apt-get install dwarfdump, the upload will still fail because for iOS because it's requiring the llvm-dwarfdump, they have different options and the ability to print DWARF UUIDs is present only in llvm-dwarfdump

The solution is to install llvm on Ubuntu.

On Mac dwarfdump is the correct comamnd, on Ubuntu the correct command is prefixed with llvm-

iOS build missing metadata

Expected behavior

Release dashboard in Bugsnag should show release metadata (sourcecode links, git hash, releaser name) on both platforms when using send_build_to_bugsnag.

Observed behavior

Dashboard only shows this information when using the bugsnag gradle plugin for Android, but not when using this tool in fastlane.

Steps to reproduce

Make build, send build info to bugsnag using the send_build_to_bugsnag action.

Fastfile:

platform :ios do
  desc 'Distribute a new beta build'
  lane :beta do
    build_number = sh('../../scripts/version/versions.sh')
    increment_build_number(
      build_number: build_number
    )
    build_ios_app
    upload_to_testflight
    upload_symbols_to_bugsnag
    send_build_to_bugsnag(
      config_file: './<project name>/Info.plist'
    )
  end
end

Note the manual config_file option that I have to set in order to avoid issue #31.

Version

1.4.1

Skipping file without UUID errors?

Describe the bug

Attempting to upload an appDsyms.zip file downloaded from App Store Connect is giving errors all of a sudden when it's worked fine before. Any advice?

Steps to reproduce

Not sure what to specify here since it's specific to my app, and I can't upload it. See example code snippet below though.

Environment

Version: 2.2.0

Example code snippet

$ bugsnag-dsym-upload --api-key MY_KEY ~/Downloads/appDsyms.zip

Error message:

[ERROR] Skipping file without UUID: /var/folders/k_/hcmp1ytx47gbp_k1_y_p_1xw0000gn/T/bugsnag-dsym-upload.XXX.96vWPJUI/d69c5ca9-3f28-303f-b05c-343f14fd0273.dSYM/Contents/Resources/DWARF/MyApp
[ERROR] Skipping file without UUID: /var/folders/k_/hcmp1ytx47gbp_k1_y_p_1xw0000gn/T/bugsnag-dsym-upload.XXX.96vWPJUI/fcf9e7a3-b178-375f-946c-05219a8fe50f.dSYM/Contents/Resources/DWARF/MyAppExtension
2 file(s) failed to upload with errors
Re-run the bugsnag-dsym-upload tool with the --verbose option for more information

upload_symbols_to_bugsnag only works for me when I add the version and build code

Describe the bug

upload_symbols_to_bugsnag only works for me when I add the version and build code. I ended up having some huge versions 1.8.151445

upload_symbols_to_bugsnag is only based on getting the app version, it should be able to work using the build version

Captura de pantalla 2021-03-16 a las 10 09 13

Steps to reproduce

if I upload the dsym like this, it generally doesn't work.
The UUID of the dsym appears to me uploaded but the dsym of the version that I just uploaded appears to me without uploading

download_dsyms(version: ENV["VERSION"], build_number: ENV["VERSION_CODE"], wait_for_dsym_processing: true)       # Download dSYM files from iTC
upload_symbols_to_bugsnag

If I do it like this it usually works

download_dsyms(version: ENV["VERSION"] + ENV["VERSION_CODE"], build_number: ENV["VERSION_CODE"], wait_for_dsym_processing: true)       # Download dSYM files from iTC
upload_symbols_to_bugsnag

Environment

  • fastlane:
    • fastlane version: 2.178.0

Move homebrew formula to separate formula tap

The current steps to install via homebrew are as follows:

$ brew install https://raw.github.com/bugsnag/bugsnag-upload/master/tools/homebrew/bugsnag-dsym-upload.rb

Since this is via a direct URL to the formula, there is a downside that the version cannot be easily updated and upgraded via homebrew. I cannot do brew update && brew upgrade to update bugsnag-dsym-upload and I would end up keeping an older version so it is not easy to upgrade the package.

See https://github.com/Homebrew/brew/blob/master/docs/How-to-Create-and-Maintain-a-Tap.md .

Error installing Bugsnag from Homebrew

Our CI/CD pipeline broke due to installing Bugsnag from homebrew as part of our dependencies.

Error: Calling Non-checksummed download of bugsnag-dsym-upload formula file from an arbitrary URL is disabled! Use 'brew extract' or 'brew create' and 'brew tap-new' to create a formula file in a tap on GitHub instead.
If reporting this issue please do so at (not Homebrew/brew or Homebrew/core):

It appears Bugsnag tap has been removed from Homebrew without any warning.

Command used is directly from read me of this repository.

brew install \ https://raw.github.com/bugsnag/bugsnag-upload/master/tools/homebrew/bugsnag-dsym-upload.rb

Bugsnag on Fastlane - Couldn't find action for the given filter

I think there is an installation issue with Bugsnag's action on Fastlane Android. I am unable to even get it to appear in fastlane actions after installation. Perhaps im missing something? This is an extremely simple example.

Describe the bug

Cannot use bugsnag actions on fastlane.
$ fastlane action send_build_to_bugsnag says the action was not found.

image

Verified that the Gemfile and fastlane repo are on same depth.

image

Steps to reproduce

Inside a react-native android project with fastlane:
$ fastlane add_plugin bugsnag
$ tail Fastfile

# Autogenerated by fastlane
#
# Ensure this file is checked in to source control!

gem 'fastlane-plugin-bugsnag'

$ fastlane action send_build_to_bugsnag

Couldn't find action for the given filter.

Environment

  • basic: curl version:
  • homebrew: ruby version: 3.2.12
  • fastlane:
    • fastlane version: 2.185.0
    • Related environment variables (if applicable):
    • Info.plist or AndroidManifest.xml (if applicable):
    • Copy of Fastfile:
default_platform(:android)

platform :android do
  desc "Build a release version & deploy to internal test track"
  lane :beta do
    gradle(task: "bundle", build_type: "Release")
    upload_to_play_store(track: "internal", skip_upload_apk: true)
    send_build_to_bugsnag(
      config_file: "./app/src/debug/AndroidManifest.xml"
    )
  end

  desc "Build a release version & deploy to production on Google Play"
  lane :relase do
    gradle(task: "bundle", build_type: "Release")
    upload_to_play_store(skip_upload_apk: true)
    send_build_to_bugsnag(
      config_file: "./app/src/main/AndroidManifest.xml"
    )
  end
end

Example Repo

  • Create a minimal repository that can reproduce the issue
  • Link to it here:
Error messages:
Get started using a Gemfile for fastlane https://docs.fastlane.tools/getting-started/ios/setup/#use-a-gemfile
[13:02:10]: It seems like you wanted to load some plugins, however they couldn't be loaded
[13:02:10]: Please follow the troubleshooting guide: https://docs.fastlane.tools/plugins/plugins-troubleshooting/
Loading documentation for send_build_to_bugsnag:

Couldn't find action for the given filter.
==========================================

uploadSymbolsToBugsnag() is not detecting dsymPath

Hi there,

is Swift officially supported now? uploadSymbolsToBugsnag() is not detecting the dsymPath in my setup. Neither the files in the current directory nor through invocation of downloadDsyms before.

func refreshDsymsLane() {
    downloadDsyms(username: "m***@***.com", appIdentifier: "com.vjeton.diamond")
    uploadSymbolsToBugsnag(apiKey: "71b**************867")
    cleanBuildArtifacts()
  }

Result:

INFO [2021-08-26 22:24:20.10]: ---------------------------------------
INFO [2021-08-26 22:24:20.10]: --- Step: upload_symbols_to_bugsnag ---
INFO [2021-08-26 22:24:20.10]: ---------------------------------------
DEBUG [2021-08-26 22:24:20.10]: Uploading dSYMs to Bugsnag with the following parameters:
DEBUG [2021-08-26 22:24:20.10]:              api_key: 71b**************867
DEBUG [2021-08-26 22:24:20.10]:            dsym_path: []
DEBUG [2021-08-26 22:24:20.10]:         project_root: /Users/mario/Repository/VJeton
DEBUG [2021-08-26 22:24:20.10]:           upload_url:
DEBUG [2021-08-26 22:24:20.10]:     symbol_maps_path:
DEBUG [2021-08-26 22:24:20.10]:   ignore_missing_dwarf: false
DEBUG [2021-08-26 22:24:20.10]:    ignore_empty_dsym: false
DEBUG [2021-08-26 22:24:20.10]:          config_file:
DEBUG [2021-08-26 22:24:20.10]: return_value_type is nil value: []
DEBUG [2021-08-26 22:24:20.10]: sending {"payload":{"status":"ready_for_next","return_object":[],"closure_argument_value":""}}
DEBUG [2021-08-26 22:24:20.10]: received done signal shutting down

+------+---------------------------+-------------+
|                fastlane summary                |
+------+---------------------------+-------------+
| Step | Action                    | Time (in s) |
+------+---------------------------+-------------+
| 1    | download_dsyms            | 20          |
| 2    | upload_symbols_to_bugsnag | 0           |
+------+---------------------------+-------------+

When I try to set it manually, it works. Example:

uploadSymbolsToBugsnag(
      apiKey: "71b**************867",
      dsymPath: ["com.vjeton.diamond-1.0-25.dSYM.zip"]
    )

What I find especially strange is that when I call fastlane action upload_symbols_to_bugsnag the files are actually detected just fine:

+----------------------+---------------------------+---------------------------+---------------------------+
|                                    upload_symbols_to_bugsnag Options                                     |
+----------------------+---------------------------+---------------------------+---------------------------+
| Key                  | Description               | Env Var(s)                | Default                   |
+----------------------+---------------------------+---------------------------+---------------------------+
| api_key              | Bugsnag API Key           | BUGSNAG_API_KEY           |                           |
| dsym_path            | Path to the DSYM          | BUGSNAG_DSYM_PATH         | ["./com.vjeton.diamond-1  |
|                      | directory, file, or zip   |                           | .0-17.dSYM.zip",          |
|                      | to upload                 |                           | "./com.vjeton.diamond-1.  |
|                      |                           |                           | 0-18.dSYM.zip",           |
|                      |                           |                           | "./com.vjeton.diamond-1.  |
|                      |                           |                           | 0-19.dSYM.zip",           |
|                      |                           |                           | "./com.vjeton.diamond-1.  |
|                      |                           |                           | 0-20.dSYM.zip",           |
|                      |                           |                           | "./com.vjeton.diamond-1.  |
|                      |                           |                           | 0-21.dSYM.zip",           |
|                      |                           |                           | "./com.vjeton.diamond-1.  |
|                      |                           |                           | 0-22.dSYM.zip",           |
|                      |                           |                           | "./com.vjeton.diamond-1.  |
|                      |                           |                           | 0-23.dSYM.zip",           |
|                      |                           |                           | "./com.vjeton.diamond-1.  |
|                      |                           |                           | 0-25.dSYM.zip",           |
|                      |                           |                           | "./com.vjeton.diamond-1.  |
|                      |                           |                           | 0.1-26.dSYM.zip",         |
|                      |                           |                           | "./com.vjeton.diamond-1.  |
|                      |                           |                           | 0.1-27.dSYM.zip",         |
|                      |                           |                           | "./com.vjeton.diamond-1.  |
|                      |                           |                           | 0.1-28.dSYM.zip"]

It'd be really convenient for me if the files could be detected automatically. :)

Kind regards
Mario

Fastlane plugin specify app version

Expected behavior

Uploaded DSYM should have specific app version

Observed behavior

DSYM is versioned with package.json version

Steps to reproduce

[Insert reproduction steps (if known)]

Version

[Insert version information]

Additional information

We don't keep versions using package.json. It is maintained on repository by other means. In such a situation one needs to specify version when uploading.

Skipping file missing DWARF data

Expected behavior

Upload success

Observed behavior

Uploading files to https://upload.bugsnag.com
Preparing to upload /var/folders/zx/1j0vlwt55s53zzjtqy425v6m0000gn/T/bugsnag-dsym-upload.XXX.qsJitINp/*.dSYM
Skipping file missing DWARF data: /var/folders/zx/1j0vlwt55s53zzjtqy425v6m0000gn/T/bugsnag-dsym-upload.XXX.qsJitINp/*.dSYM
1 files failed to upload

Steps to reproduce

  • build iOS app using https://appcenter.ms
  • Download symbols.zip from appcenter
  • Run bugsnag-dsym-upload -v symbols.zip

Version

Commit 8327d1f

Additional information

Cannot run unit tests

We just integrated BugSnag in our project. Everything works fine in the main target. But when we try to run unit tests the build fails with the following error:

No Bugsnag API key detected - add your key to your Info.plist, BUGSNAG_API_KEY environment variable or this Run Script phase (RuntimeError)

I do have the key added to the test target info.plist.
Screen Shot 2021-07-18 at 9 45 41 AM

Bugsnag API key not being found in Info.plist

Expected behavior

It should send my build to bugsnag.

Observed behavior

When running send_build_to_bugsnag in fastlane, I get the following error:

A Bugsnag API key is required to release a build. Set BugsnagAPIKey in your Info.plist file to detect API key automatically.

Steps to reproduce

  • Insert BugsnagAPIKey in Info.plist like so:

    <dict>
       ...
       <key>BugsnagAPIKey</key>
       <string>1234567890</string>
    </dict>
    
  • Run send_build_to_bugsnag in fastlane and you get that error.

Unable to upload dsym on ci

Describe the bug

I created a lane like this and running it after my ios and android release lanes on my ci (working well locally):

lane :bugsnag do
  upload_symbols_to_bugsnag
  send_build_to_bugsnag()
end

Unfortunately I got an error on the upload_symbols_to_bugsnag step.
Screen Shot 2021-03-10 at 2 40 26 PM

Environment

  • fastlane:
    • fastlane version: fastlane 2.177.0
    • Copy of Fastfile:
# This file contains the fastlane.tools configuration
# You can find the documentation at https://docs.fastlane.tools
#
# For a list of all available actions, check out
#
#     https://docs.fastlane.tools/actions
#
# For a list of all available plugins, check out
#
#     https://docs.fastlane.tools/plugins/available-plugins
#

# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane

default_platform(:ios)
ruby_version("2.7.2")

# IOS Lane

platform :ios do
  lane :make_keychain do
    create_keychain(
      name: ENV["KEYCHAIN_NAME"],
      password: ENV["KEYCHAIN_PASSWORD"],
      default_keychain: true,
      unlock: true,
      timeout: 3600,
      lock_when_sleeps: false
    )
  end

  lane :build_release do | options |
    increment_build_number(
      xcodeproj: "./ios/Willo.xcodeproj",
      build_number: options[:build_number]
    )

    sync_code_signing(
      type: 'appstore',
      readonly: true,
      output_path: './ios',
      api_key_path: options[:api_key_path],
      app_identifier: 'com.willo.onderon',
      storage_mode: 's3',
      s3_bucket: ENV["AWS_S3_BUCKET_NAME"],
      keychain_name: ENV["KEYCHAIN_NAME"],
      keychain_password: ENV["KEYCHAIN_PASSWORD"],
    )

    update_project_provisioning(
      xcodeproj: "./ios/Willo.xcodeproj",
      profile: "./ios/AppStore_com.willo.onderon.mobileprovision",
      build_configuration: "Release",
    )
    build_app(export_method: 'app-store')
    upload_to_testflight(api_key_path: options[:api_key_path])
  end
end

# Android Lane

platform :android do
  lane :build_release do | options |
    gradle(task: 'clean', project_dir: './android')
    android_set_version_code(
      version_code: options[:build_number],
      gradle_file: "./android/app/build.gradle",
    )
    gradle(
      task: 'assemble',
      build_type: 'Release',
      project_dir: './android'
    )
    upload_to_play_store(track: 'internal')
  end
end

# Bugsnag

lane :bugsnag do
  upload_symbols_to_bugsnag
  send_build_to_bugsnag()
end

Acute characters in CFBundleIdentifier causes upload to fail

Expected behavior

Upload data

Observed behavior

error: cannot create /var/folders/wh/w71drswxxxxxsb1jdd7v9v540000gp/T/bugsnag-dsym-upload.XXX.bIUl4wOG/A7660156-XXXX-3F45-A0AD-4F663D8585EE.dSYM/Contents/Resources/DWARF/+?ntima M+?vil

Steps to reproduce

Use a product name that uses acute characters

Version

1.3.2

[Fastlane] Info.plist from UnitTest target overrides values read from `config_file`

Expected behavior

send_build_to_bugsnag(config_file: application.info_plist_path)

Above code should read appVersion from the given config_file.

Observed behavior

appVersion reported to bugsnag is taken from UnitTests/Info.plist.

Steps to reproduce

  1. Have a unit test target with an Info.plist.
  2. Have an app target with a letter that begins with a letter later than U in the alphabet, (our case: V).
  3. send_build_to_bugsnag(config_file: "App/Info.plist")

Version

fastlane-plugin-bugsnag (1.3.0)

Additional information

This happens because of two issues.

  1. default_info_plist_path is used despite providing a config_file, unfortunately default_info_plist_path returns the wrong Info.plist.
  2. The default plist path is used to populate the default params
  3. Default params override any values from config_file-specified, due to the order they're read, see here:
    def self.run(params)
    payload = {buildTool: BUILD_TOOL, sourceControl: {}}
    if lane_context[:PLATFORM_NAME] == :android
    payload.merge!(options_from_android_manifest(params[:config_file])) if params[:config_file]
    else
    payload.merge!(options_from_info_plist(params[:config_file])) if params[:config_file]
    end
    payload.delete(:config_file)
    # Overwrite automated options with configured if set
    payload[:apiKey] = params[:api_key] unless params[:api_key].nil?
    payload[:appVersion] = params[:app_version] unless params[:app_version].nil?
    payload[:releaseStage] = params[:release_stage] unless params[:release_stage].nil?
    payload[:appVersionCode] = params[:android_version_code] unless params[:android_version_code].nil?
    payload[:appBundleVersion] = params[:ios_bundle_version] unless params[:ios_bundle_version].nil?
    payload[:builderName] = params[:builder]

Code linked assumes that params are only explicitly set by the user, but params also contains default values, which happens to be provided by the default_info_plist_path, which in my particular case finds the wrong Info.plist because UnitTests/Info.plist appears before our app V/Info.plist in directory listings.

Explicitly set variables

How can I set the release stage via this plugin without setting values in Info.plist.

It's because my info.plist not saving the bugsnag key-value as defaults hierarchy.
I have passed API key into the lane but finding way to pass release stage as well.

Error in uploading symbol directory on v.1.3.3

Expected behavior

I'm running this plugin on the Bitrise CI service. When using v1.3.2, I've had no problem with this lane:

  desc "Uploads local dSYM files to BugSnag"
  lane :upload_dev_dsyms do
    upload_symbols_to_bugsnag(
      dsym_path: ENV['BITRISE_DSYM_DIR_PATH'],
      symbol_maps_path: "#{ENV['BITRISE_XCARCHIVE_PATH']}/BCSymbolMaps"
    )
  end

Observed behavior

On v1.3.3 I get an error and not much help from the logs:

fastlane 2.99.1
Run Fastlane
$ fastlane "upload_dev_dsyms"
[13:26:33]: fastlane detected a Gemfile in the current directory
[13:26:33]: however it seems like you don't use `bundle exec`
[13:26:33]: to launch fastlane faster, please use
[13:26:33]: 
[13:26:33]: $ bundle exec fastlane upload_dev_dsyms
[13:26:33]: 
[13:26:33]: Get started using a Gemfile for fastlane https://docs.fastlane.tools/getting-started/ios/setup/#use-a-gemfile
[13:26:34]: Installing Ruby gem 'fastlane-plugin-bugsnag'...
[13:26:42]: Successfully installed 'fastlane-plugin-bugsnag'
+-------------------------+---------+---------------------------+
|                         Used plugins                          |
+-------------------------+---------+---------------------------+
| Plugin                  | Version | Action                    |
+-------------------------+---------+---------------------------+
| fastlane-plugin-bugsnag | 1.3.3   | send_build_to_bugsnag     |
|                         |         | upload_symbols_to_bugsnag |
+-------------------------+---------+---------------------------+
[13:26:42]: ----------------------------------------
[13:26:42]: --- Step: Verifying fastlane version ---
[13:26:42]: ----------------------------------------
[13:26:42]: Your fastlane version 2.99.1 matches the minimum requirement of 2.47.0  βœ…
[13:26:42]: ------------------------------
[13:26:42]: --- Step: default_platform ---
[13:26:42]: ------------------------------
[13:26:42]: Driving the lane 'ios upload_dev_dsyms' πŸš€
[13:26:42]: ---------------------------------------
[13:26:42]: --- Step: upload_symbols_to_bugsnag ---
[13:26:42]: ---------------------------------------
+------------------+----------------------+
|              Lane Context               |
+------------------+----------------------+
| DEFAULT_PLATFORM | ios                  |
| PLATFORM_NAME    | ios                  |
| LANE_NAME        | ios upload_dev_dsyms |
+------------------+----------------------+
[13:26:43]: Failed uploading /var/folders/90/5stft2v13fb_m_gv3c8x9nwc0000gn/T/__dsyms__298483659
+------+----------------------------+-------------+
|                fastlane summary                 |
+------+----------------------------+-------------+
| Step | Action                     | Time (in s) |
+------+----------------------------+-------------+
| 1    | Verifying fastlane version | 0           |
| 2    | default_platform           | 0           |
| πŸ’₯    | upload_symbols_to_bugsnag  | 0           |
+------+----------------------------+-------------+

Version

Fastlane 2.99 and bugsnag-dsym-upload v1.3.3

Additional information

If I pin to version v1.3.2 it works fine.

I had it print out the directories in a step before to make sure nothing was amiss:

BITRISE_DSYM_DIR_PATH=/var/folders/90/5stft2v13fb_m_gv3c8x9nwc0000gn/T/__dsyms__298483659
+ ls /var/folders/90/5stft2v13fb_m_gv3c8x9nwc0000gn/T/__dsyms__298483659
Alamofire.framework.dSYM
AlamofireNetworkActivityIndicator.framework.dSYM
AppAuth.framework.dSYM
BugsnagReactNative.framework.dSYM
Charts.framework.dSYM
DoubleConversion.framework.dSYM
MaterialComponents.framework.dSYM
React.framework.dSYM
Shareworks.app.dSYM
SwiftHEXColors.framework.dSYM
TrustKit.framework.dSYM
folly.framework.dSYM
glog.framework.dSYM
yoga.framework.dSYM

BITRISE_XCARCHIVE_PATH=/var/folders/90/5stft2v13fb_m_gv3c8x9nwc0000gn/T/__archive__913519322/Shareworks.xcarchive
+ls /var/folders/90/5stft2v13fb_m_gv3c8x9nwc0000gn/T/__archive__913519322/Shareworks.xcarchive
BCSymbolMaps
Info.plist
Products
SwiftSupport
dSYMs

+ ls $BITRISE_XCARCHIVE_PATH/BCSymbolMaps
/var/folders/90/5stft2v13fb_m_gv3c8x9nwc0000gn/T/__archive__913519322/Shareworks.xcarchive/BCSymbolMaps
0FF932A6-FA12-36E8-AB46-E971474AF560.bcsymbolmap
144A7C03-4E27-38F2-9F3D-C95D67350EC1.bcsymbolmap
16B78612-B5FB-38FF-9F31-412D3DBB35CA.bcsymbolmap
24A6F955-DB34-3819-9328-B643AABC0B59.bcsymbolmap
2CE15ADD-1783-3CE3-8288-38491D02A40D.bcsymbolmap
2DCA8B87-BAB6-34D7-8EC2-10BE905F7624.bcsymbolmap
3886E319-6E1A-30D5-BF9E-ED11ECCD0FA1.bcsymbolmap
3D08373B-04CA-352C-B1B6-F2EF9BB7A899.bcsymbolmap
4183A961-8C2E-3F63-8B26-C648492920B4.bcsymbolmap
42BAAAAE-0529-3634-8A86-57DA506B8152.bcsymbolmap
4D7B1A6B-52FC-37CA-A509-0D6424C99FAB.bcsymbolmap
4F9A40D3-C3F8-3324-9862-490F910AE6C3.bcsymbolmap
50703F68-F447-3BBA-8EF8-23164D8909AE.bcsymbolmap
62158EBF-DA90-3DFF-B856-5864F848A4B6.bcsymbolmap
6946EF1C-41EB-3ACF-B3AB-A6343532EA84.bcsymbolmap
91E27542-5991-34D7-9804-0BAF834A296A.bcsymbolmap
92D6842C-3748-31B1-840F-F22A603A1B4A.bcsymbolmap
98B0B1D4-D899-33AB-8759-C6EF15CFD1D0.bcsymbolmap
A9F6BB28-F2D3-3C7C-B651-CE2B25D38D78.bcsymbolmap
B42BC10C-A1C0-35C3-BA72-2F04D900D6F9.bcsymbolmap
CF5F694F-FF2C-3433-AC30-6657DAB2C89E.bcsymbolmap
D62E62FE-0FE2-392E-AED1-16B1D6FCA102.bcsymbolmap
E239A154-CD05-34F9-B2A3-216CCE4BC698.bcsymbolmap
F0520049-8352-33E8-B25D-2B777FE2B729.bcsymbolmap
FBA3D656-8F78-3525-9A45-A2E0593BD156.bcsymbolmap
FCBEED81-16C9-3C2B-8054-E98BA913A66B.bcsymbolmap
FCD8E4A5-56B2-37E1-9D7C-6666DCF3D219.bcsymbolmap
FECC5EE2-2482-349C-83AC-BD02DC4DB6EE.bcsymbolmap

I'm guessing it may be related to this change, but I'm not sure: #18

Let me know if I can help with more information, possibly a more verbose log?

Please add release_stage parameter to the upload_symbols_to_bugsnag action

Description

The send_build_to_bugsnag action has the parameter release_stage but the upload_symbols_to_bugsnag does not. It would be really useful for this to be configurable from the Fastfile as opposed to having to set it in the Info.plist.

Describe alternatives you've considered
Setting it the Info.plist is a possibility however it forces you to use the name of the app or a variable that's available to the ios build. In my case I use App Name Beta but would prefer Beta.

Additional context
I assume that that release_stage given in Info.plist (for upload_symbols_to_bugsnag) must match the release_stage specified for the send_build_to_bugsnag action?

dSYM upload breaks when dSYM paths contain certain valid characters

We (my coworker and I at Dropbox) ran into an issue with integrating with this plugin for submitting our dSYM paths to Bugsnag for the past two days. I hope this can be fixed for future users and so we can remove the workaround from our ci for better performance and less maintenance.

Expected behavior

a dSYM path that looks like the following should be uploaded without an error:
/path/to/buck/module#apple-dsym,iphoneos-architecture.dSYM

The # and , are valid characters in the APFS filesystem and should be accepted as paths.

Observed behavior

Redactions surrounded by < >:

May  7 23:43:43.623: Preparing to upload /var/folders/<path>/<TargetName>Binary#apple-dsym,iphoneos-arm64.dSYM
May  7 23:43:43.637: Uploading UUID: <uuid> (arm64) /var/folders/<path>/<TargetName>Binary#apple-dsym,iphoneos-arm64.dSYM/Contents/Resources/DWARF/<TargetName>Binary
May  7 23:43:43.648: curl: (26) Failed to open/read local data from file/application

Steps to reproduce

Try uploading a dSYM with a # or , inside the path and it should reproduce.

This is common notation for files produced by Buck, if I understand correctly.

Version

1.4.2

Can't comment on Issues?

Some users have been unable to comment on Github issues when an adblocker extension is enabled.
We recommend temporarily disabling the extension, or if that fails, contacting [email protected].

`catalyst` is not in supported platform list of `upload_symbols_to_bugsnag`

Describe the bug

When running upload_symbols_to_bugsnag for catalyst build, I got this error:

Action 'upload_symbols_to_bugsnag' isn't known to support operating system 'catalyst'.

Upon checking this file, I see that it only support [:ios, :mac, :tvos].

Please add catalyst to this as well.

Thanks

Steps to reproduce

Run upload_symbols_to_bugsnag for catalyst

'dsym_path' value must be a String! Found Array instead.

Expected behavior

Being able to pass an array with multiple locations to dSYM files.

Observed behavior

Error stating 'dsym_path' value must be a String! Found Array instead..

Steps to reproduce

Run a lane with upload_symbols_to_bugsnag(dsym_path: ['./Carthage/Build/iOS/', './artifacts/']).

Version

1.3.2

Additional information

According to the docs and the release notes, we should be able to pass an array to the dsym_path option.

Http status codes of 5xx should be counted as failed uploads

Expected behavior

"uploaded successfully" message should be accurate

Observed behavior

"uploaded successfully" message is inaccurate because it counts http status code of 502 as a success. This is probably because curl exits with 0 since it successfully received a response from the server.

example out put

Uploading UUID: 8C347340-A95A-31CA-B9A1-AD02BC7D4895 (arm64) /a/b/appDsyms/8c347340-a95a-31ca-b9a1-ad02bc7d4895.dSYM/Contents/Resources/DWARF/abcd
<html><head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>502 Server Error</title> </head> <body text=#000000 bgcolor=#ffffff> <h1>Error: Server Error</h1> <h2>The server encountered a temporary error and could not complete your request.<p>Please try again in 30 seconds.</h2> <h2></h2> </body></html>

Steps to reproduce

Not sure why my uploads fail but I do see the script output the html from the server that indicates a 502.

Version

bugsnag-dsym-upload 1.4.1

Additional information

Adding --fail to the curl command will probably fix this

Can't comment on Issues?

Some users have been unable to comment on Github issues when an adblocker extension is enabled.
We recommend temporarily disabling the extension, or if that fails, contacting [email protected].

mktemp template needs XXX appended

This isn't a problem when running on a macOS machine, but when running on a Linux machine it happens.

Expected behavior

  • Script should fail with an error code when failing to create a temp directory

  • Replace:

      temp_dir=$(mktemp -dt "bugsnag-dsym-upload")
    

    with

      temp_dir=$(mktemp -dt "bugsnag-dsym-upload.XXX")
    

Observed behavior

Reports successful upload

[22:57:12]: --- Step: upload_symbols_to_bugsnag ---
[22:57:12]: ---------------------------------------
mktemp: too few X's in template β€˜bugsnag-dsym-upload’
error:  must specify directory to which to extract with -d option
Uploaded dSYMs in MyApp-18.13-dSYM.zip

Steps to reproduce

Run the plugin action on a machine with gnu-mktemp (e.g. a linux machine). This can be confirmed with mktemp --version

Usage: mktemp [OPTION]... [TEMPLATE]
Create a temporary file or directory, safely, and print its name.
TEMPLATE must contain at least 3 consecutive 'X's in last component.
If TEMPLATE is not specified, use tmp.XXXXXXXXXX, and --tmpdir is implied.
Files are created u+rw, and directories u+rwx, minus umask restrictions.

v1.3.3 results in an error

Expected behavior

With v1.3.2 and the following setup uploading to Bugsnag worked well:

lane :refresh_dsyms do
  download_dsyms(version: "latest")
  upload_symbols_to_bugsnag
  clean_build_artifacts
end

Running fastlane action upload_symbols_to_bugsnag outputs the correct default locations for all dsyms.

Observed behavior

It no longer works. Instead it results in the following error:
``

Steps to reproduce

[Insert reproduction steps (if known)]

Version

v1.3.3

Additional information

[Insert any additional information]

Can't comment on Issues?

Some users have been unable to comment on Github issues when an adblocker extension is enabled.
We recommend temporarily disabling the extension, or if that fails, contacting [email protected].

No documentation on send_build_to_bugsnag

The readme of this repo only mentions upload_symbols_to_bugsnag but nothing on send_build_to_bugsnag.

It would be great if the readme would outline why you would want to use this script and how to use it!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.