jaxxstorm / action-install-gh-release Goto Github PK
View Code? Open in Web Editor NEWGitHub Action to install the Github Release binaries
License: Apache License 2.0
GitHub Action to install the Github Release binaries
License: Apache License 2.0
Why?
action-install-gh-release/src/main.ts
Lines 206 to 211 in f2bcf76
The ['platform', 'arch'] are not recognized as valid parameters despite being shown in the README.
This workflow snippet where I picked a public repo to use as a test case:
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Download repo-copier binary
uses: jaxxstorm/[email protected]
with: # Grab a specific platform and/or architecture
repo: jaxxstorm/connecti
tag: v0.0.3
platform: linux <- this
arch: x86-64 <- and this
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
log:
Warning: Unexpected input(s) 'platform', 'arch', valid inputs are ['repo', 'tag']
##[debug]Loading env
Run jaxxstorm/[email protected]
with:
repo: jaxxstorm/connecti
tag: v0.0.3
platform: linux
arch: x86-64
env:
GITHUB_TOKEN: ***
Ref: https://github.com/jaxxstorm/action-install-gh-release#grab-a-specific-platform-andor-architecture
From docs:
name: my_action
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Github token scoped to action
jobs:
my_job:
steps:
- name: Install tfsec
uses: jaxxstorm/[email protected]
with: # Grab a specific platform and/or architecture
repo: aquasecurity/tfsec
platform: linux
arch: x86-64
When using this action I get the following warning:
Node.js 16 actions are deprecated. Please update the following actions to use Node.js 20: jaxxstorm/action-install-gh-release@HEAD. For more information see: https://github.blog/changelog/2023-09-22-github-actions-transitioning-from-node-16-to-node-20/.
This seems like a simple fix, but I'm unsure how to test the action.
I'm using this action by way of uses: jaxxstorm/[email protected]
, and in the workflow UI I see this deprecation notice:
Node.js 12 actions are deprecated. For more information see: https://github.blog/changelog/2022-09-22-github-actions-all-actions-will-begin-running-on-node16-instead-of-node12/. Please update the following actions to use Node.js 16: jaxxstorm/action-install-gh-release
As per the doc linked in the recommendation, this action should be upgraded to Node16.
This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.
Warning
These dependencies are deprecated:
Datasource | Name | Replacement PR? |
---|---|---|
npm | mkdirp-promise |
These updates have all been created already. Click a checkbox below to force a retry/rebase of any.
.github/workflows/tag.yml
.github/workflows/test.yml
actions/checkout v1
actions/checkout v1
actions/checkout v1
actions/checkout v1
actions/checkout v1
actions/checkout v1
actions/checkout v1
actions/checkout v1
actions/checkout v1
package.json
@actions/core ^1.10.0
@actions/exec ^1.1.1
@actions/github ^5.1.1
@actions/tool-cache ^2.0.1
@octokit/plugin-throttling ^5.0.1
eslint ^9.2.0
minimist ^1.2.7
mkdirp-promise ^5.0.1
node-fetch ^3.3.0
@types/node ^20.0.0
typescript ^4.9.4
If a github release has the binary under a bin folder it won't be easily accessible. It won't be found using the existing PATH add of just the top level folder.
It would be nice if the action included an option to specify an additional folder to add or perhaps add an output for the full path to the extracted folder.
I use this to install promtool:
- name: Install promtool
uses: jaxxstorm/[email protected]
with:
repo: prometheus/prometheus
tag: 'v2.37.9'
platform: linux
arch: amd64
cache: enable
binaries-location: prometheus-2.37.9.linux-amd64
However when using promtool, the command is not found. I tried to echo $PATH and could see:
/opt/hostedtoolcache/prometheus/prometheus/v2.37.9/linux-amd64:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/runner/.local/bin
I think the path for prometheus should be /opt/hostedtoolcache/prometheus/prometheus/v2.37.9/linux-amd64/prometheus-2.37.9.linux-amd64
instead of /opt/hostedtoolcache/prometheus/prometheus/v2.37.9/linux-amd64
? ๐ค
I'm using github runner self-hosted by the way.
Having bad luck with very slow builds (+10m, +30m, +40m) resulting from rate-limiting and aggressive backoff in the action-install-gh-release. It seems that specifying a concrete tag to install does not avoid the issue. Most commonly I'm hitting this with trying to install pulumictl
utility.
https://github.com/pulumi/pulumi/runs/6494195830?check_suite_focus=true
https://github.com/pulumi/pulumi/runs/6495836989?check_suite_focus=true
https://github.com/pulumi/pulumi/runs/6494195830?check_suite_focus=true
Warning: RateLimit detected for request GET /repos/{owner}/{repo}/releases/latest.
Retrying after 1014 seconds.
Warning: RateLimit detected for request GET /repos/{owner}/{repo}/releases/latest.
Retrying after 0 seconds.
Warning: RateLimit detected for request GET /repos/{owner}/{repo}/releases/latest.
Retrying after 0 seconds.
Warning: RateLimit detected for request GET /repos/{owner}/{repo}/releases/latest.
Retrying after 0 seconds.
Open to work arounds here on how to fix this:
I am trying to download assets published on the private repository in my org.
Run jaxxstorm/[email protected]
==> System reported platform: linux
==> Using platform: linux
==> System reported arch: x64
==> Using arch: x64
==> Using default file extension matching: .(tar.gz|zip)
==> Binaries will be located at: /opt/hostedtoolcache/mypkg-inc/mypkg/latest/linux-x64
searching for checksums.txt with (linux|x86_64|x64|amd64).*(linux|x86_64|x64|amd64).*.(tar.gz|zip)
searching for mypkg_darwin_v2023.06.13-1_arm64.tar.gz with (linux|x86_64|x64|amd64).*(linux|x86_64|x64|amd64).*.(tar.gz|zip)
searching for mypkg_darwin_v2023.06.13-1_x86_64.tar.gz with (linux|x86_64|x64|amd64).*(linux|x86_64|x64|amd64).*.(tar.gz|zip)
searching for mypkg_linux_v2023.06.13-1_arm64.tar.gz with (linux|x86_64|x64|amd64).*(linux|x86_64|x64|amd64).*.(tar.gz|zip)
searching for mypkg_linux_v2023.06.13-1_x86_64.tar.gz with (linux|x86_64|x64|amd64).*(linux|x86_64|x64|amd64).*.(tar.gz|zip)
Downloading mypkg from https://api.github.com/repos/mypkg-inc/mypkg/releases/assets/112551931
/usr/bin/tar xz --warning=no-unknown-keyword --overwrite -C /opt/hostedtoolcache/mypkg-inc/mypkg/latest/linux-x64 -f /home/runner/work/_temp/6c684165-caf8-4fa7-b77c-8ddb5b5f440e
Automatically extracted release asset mypkg_linux_v2023.06.13-1_x86_64.tar.gz to /opt/hostedtoolcache/mypkg-inc/mypkg/latest/linux-x64
Adding /opt/hostedtoolcache/mypkg-inc/mypkg/latest/linux-x64 to the path
Successfully installed mypkg
Binaries available at /opt/hostedtoolcache/mypkg-inc/mypkg/latest/linux-x64
The response of https://api.github.com/repos/mypkg-inc/mypkg/releases/assets/112551931
is as follows.
{
"message": "Not Found",
"documentation_url": "https://docs.github.com/rest/reference/repos#get-a-release-asset"
}
I am giving token
field with my own, and without it the action throws an error with (Error: Not Found
) so it looks working.
Hey @jaxxstorm, thanks for this really useful action!
Is there any chance that you could publish a release with the changes from #44 when you have time?
I'm trying to use this to install Binaryen, which uses a bin/
folder to store binaries.
Please add support for cases when binary was published using custom naming scheme like without platform/architecture. Currently, the action is failing as it can't find the binary:
- uses: jaxxstorm/[email protected]
with:
extension-matching: disable
rename-to: cli
repo: <private repo>/cli
tag: latest
token: ***
Action log:
Run jaxxstorm/action-install-gh-release@c5ead9a448b4660cf1e7866ee22e4dc56538031a
==> System reported platform: linux
==> Using platform: linux
==> System reported arch: x64
==> Using arch: x64
==> File extension matching disabled
==> Will rename downloaded release to cli
==> Binaries will be located at: /opt/hostedtoolcache/cli/cli/latest/linux-x64
searching for sha256sums.txt.asc with (linux|x86_64|x64|amd64).*(linux|x86_64|x64|amd64).*
searching for cli-alpine with (linux|x86_64|x64|amd64).*(linux|x86_64|x64|amd64).*
searching for cli-linux with (linux|x86_64|x64|amd64).*(linux|x86_64|x64|amd64).*
searching for cli-win.exe with (linux|x86_64|x64|amd64).*(linux|x86_64|x64|amd64).*
Error: Could not find a release for latest. Found: sha256sums.txt.asc,cli-alpine,cli-linux,cli-win.exe
|npm WARN deprecated [email protected]: This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that.
We tried running a couple of our jobs on the ARM instances of buildjet, everything works fine on the x64 based ones.
We use the auto-detect feature in this action, but it stops after detecting the OS:
Run jaxxstorm/[email protected]
with:
repo: cloudflare/cloudflared
extension-matching: disable
rename-to: cloudflared
chmod: 755
token: ***
tag: latest
env:
AWS_DEFAULT_REGION: eu-central-1
AWS_REGION: eu-central-1
AWS_ACCESS_KEY_ID: ***
AWS_SECRET_ACCESS_KEY: ***
AWS_SESSION_TOKEN: ***
==> System reported platform: linux
==> Using platform: linux
So in the next step(s) we are faced with a /home/runner/actions-runner/_work/_temp/485aef00-6518-476f-858a-831665b49bc3.sh: line 14: cloudflared: command not found
We were trying to run on the actions-runner image buildjet-2vcpu-ubuntu-2204-arm
. It works fine on the non-arm based buildjet-2vcpu-ubuntu-2204
Is there something we're missing to have the detection work on ARM as well?
I am trying to install cargo-make
from here.
This is my step:
- name: Install cargo-make
uses: jaxxstorm/[email protected]
with:
repo: sagiegurari/cargo-make
platform: unknown-linux-gnu
arch: x86_64
Here is the log output:
Run jaxxstorm/[email protected]
==> System reported platform: linux
==> Using platform: unknown-linux-gnu
==> System reported arch: x64
==> Using arch: x86_64
==> Using default file extension matching: .(tar.gz|zip)
==> Binaries will be located at: /opt/hostedtoolcache/sagiegurari/cargo-make/latest/unknown-linux-gnu-x86_64
searching for cargo-make-v0.36.12-aarch64-apple-darwin.zip with (unknown-linux-gnu|x86_64).*(unknown-linux-gnu|x86_64).*.(tar.gz|zip)
searching for cargo-make-v0.36.12-x86_64-apple-darwin.zip with (unknown-linux-gnu|x86_64).*(unknown-linux-gnu|x86_64).*.(tar.gz|zip)
searching for cargo-make-v0.36.12-x86_64-pc-windows-msvc.zip with (unknown-linux-gnu|x86_64).*(unknown-linux-gnu|x86_64).*.(tar.gz|zip)
searching for cargo-make-v0.36.12-x86_64-unknown-linux-gnu.zip with (unknown-linux-gnu|x86_64).*(unknown-linux-gnu|x86_64).*.(tar.gz|zip)
Downloading cargo-make from https://api.github.com/repos/sagiegurari/cargo-make/releases/assets/117691823
/usr/bin/unzip -o -q /home/runner/work/_temp/e2cd5860-2580-4835-8605-2f3db971730b
Automatically extracted release asset cargo-make-v0.36.12-x86_64-unknown-linux-gnu.zip to /opt/hostedtoolcache/sagiegurari/cargo-make/latest/unknown-linux-gnu-x86_64
Error: No files found in /opt/hostedtoolcache/sagiegurari/cargo-make/latest/unknown-linux-gnu-x86_64
However when I download the archive and extract manually the extracted folder name is cargo-make-v0.36.12-x86_64-unknown-linux-gnu
which does not match the presumed installation location of unknown-linux-gnu-x86_64
- could this be the problem?
Would be great if this worked as expected, thanks ๐
I have run into this error in a Ubuntu runner set to run this CI.
searching for tfsec_1.28.1_checksums.txt with (linux|x86-64).*(linux|x86-64).*.(tar.gz|zip)
searching for tfsec_1.28.1_darwin_amd64.tar.gz with (linux|x86-64).*(linux|x86-64).*.(tar.gz|zip)
searching for tfsec_1.28.1_darwin_arm64.tar.gz with (linux|x86-64).*(linux|x86-64).*.(tar.gz|zip)
searching for tfsec_1.28.1_linux_amd64.tar.gz with (linux|x86-64).*(linux|x86-64).*.(tar.gz|zip)
searching for tfsec_1.28.1_linux_arm64.tar.gz with (linux|x86-64).*(linux|x86-64).*.(tar.gz|zip)
searching for tfsec_1.28.1_windows_amd64.tar.gz with (linux|x86-64).*(linux|x86-64).*.(tar.gz|zip)
searching for tfsec_1.28.1_windows_arm64.tar.gz with (linux|x86-64).*(linux|x86-64).*.(tar.gz|zip)
searching for tfsec_checksums.txt with (linux|x86-64).*(linux|x86-64).*.(tar.gz|zip)
Error: Could not find a release for latest. Found: tfsec-checkgen-darwin-amd64,tfsec-checkgen-darwin-amd64.D66B222A3EA4C25D5D1A097FC34ACEFB[46](https://github.com/equinix-labs/terraform-equinix-labs/actions/runs/4919748728/jobs/8878914685?pr=1#step:9:47)EC39CE.sig,tfsec-checkgen-darwin-arm64,tfsec-checkgen-darwin-arm64.D66B222A3EA4C25D5D1A097FC34ACEFB46EC39CE.sig,tfsec-checkgen-linux-amd64,tfsec-checkgen-linux-amd64.D66B222A3EA4C25D5D1A097FC34ACEFB46EC39CE.sig,tfsec-checkgen-linux-arm64,tfsec-checkgen-linux-arm64.D66B222A3EA4C25D5D1A097FC34ACEFB46EC39CE.sig,tfsec-checkgen-windows-amd64.exe,tfsec-checkgen-windows-amd64.exe.D66B222A3EA4C25D5D1A097FC34ACEFB46EC39CE.sig,tfsec-checkgen-windows-arm64.exe,tfsec-checkgen-windows-arm64.exe.D66B222A3EA4C25D5D1A097FC34ACEFB46EC39CE.sig,tfsec-darwin-amd64,tfsec-darwin-amd64.D66B222A3EA4C25D5D1A097FC34ACEFB46EC39CE.sig,tfsec-darwin-arm64,tfsec-darwin-arm64.D66B222A3EA4C25D5D1A097FC34ACEFB46EC39CE.sig,tfsec-linux-amd64,tfsec-linux-amd64.D66B222A3EA4C25D5D1A097FC34ACEFB46EC39CE.sig,tfsec-linux-arm64,tfsec-linux-arm64.D66B222A3EA4C25D5D1A097FC34ACEFB46EC39CE.sig,tfsec-windows-amd64.exe,tfsec-windows-amd64.exe.D66B222A3EA4C25D5D1A097FC34ACEFB46EC39CE.sig,tfsec-windows-arm64.exe,tfsec-windows-arm64.exe.D66B222A3EA4C25D5D1A097FC34ACEFB46EC39CE.sig,tfsec_1.28.1_checksums.txt,tfsec_1.28.1_darwin_amd64.tar.gz,tfsec_1.28.1_darwin_arm64.tar.gz,tfsec_1.28.1_linux_amd64.tar.gz,tfsec_1.28.1_linux_arm64.tar.gz,tfsec_1.28.1_windows_amd64.tar.gz,tfsec_1.28.1_windows_arm64.tar.gz,tfsec_checksums.txt
This is how the runner is set up:
Current runner version: '2.304.0'
Operating System
Runner Image
Runner Image Provisioner
GITHUB_TOKEN Permissions
Secret source: Actions
Prepare workflow directory
Prepare all required actions
Getting action download info
Download action repository 'actions/checkout@v3' (SHA:8e5e7e5ab8b370d6c3[2](https://github.com/equinix-labs/terraform-equinix-labs/actions/runs/4919748728/jobs/8878914685?pr=1#step:1:2)9ec480221332ada57f0ab)
Download action repository 'actions/setup-python@v4' (SHA:57ded4d7d5e98[6](https://github.com/equinix-labs/terraform-equinix-labs/actions/runs/4919748728/jobs/8878914685?pr=1#step:1:7)d7296eab16560982c6dd7c923b)
Download action repository 'terraform-linters/setup-tflint@v3' (SHA:ba6bb2989f94daf58a4cc6eac2c1ca7398a678bf)
Download action repository 'actions/cache@v3' (SHA:88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8)
Download action repository 'hashicorp/setup-terraform@v2' (SHA:633666f66e0061ca3b725c73b2ec20cd[13](https://github.com/equinix-labs/terraform-equinix-labs/actions/runs/4919748728/jobs/8878914685?pr=1#step:1:16)a8fdd1)
Download action repository 'jaxxstorm/[email protected]' (SHA:c5ead9a448b4660cf1e7866ee22e4dc56538031a)
Download action repository 'pre-commit/[email protected]' (SHA:646c83fcd040023954eafda54b4db0[19](https://github.com/equinix-labs/terraform-equinix-labs/actions/runs/4919748728/jobs/8878914685?pr=1#step:1:23)2ce70507)
Getting action download info
Complete job name: pre-commit (ubuntu-latest, 1.3.0, v0.44.1)
This snippet works when pulling jaxxstorm/connecti
but not another private project. Seems to be the lack of the version/tag embedded in the artifact name.
(owner and repo redacted as I'm not sure of the privacy issues)
##[debug]Loading env
Run jaxxstorm/[email protected]
searching for REPO_darwin_amd64 with linux.(x64|amd64).*.(tar.gz|zip)
searching for REPO_darwin_arm64 with linux.(x64|amd64).*.(tar.gz|zip)
searching for REPO_linux_386 with linux.(x64|amd64).*.(tar.gz|zip)
searching for REPO_linux_amd64 with linux.(x64|amd64).*.(tar.gz|zip)
searching for REPO_linux_arm64 with linux.(x64|amd64).*.(tar.gz|zip)
searching for REPO_windows_386.exe with linux.(x64|amd64).*.(tar.gz|zip)
searching for REPO_windows_amd64.exe with linux.(x64|amd64).*.(tar.gz|zip)
Error: Could not find a release for v0.1.1. Found: REPO_darwin_amd64,REPO_darwin_arm64,REPO_linux_386,REPO_linux_amd64,REPO_linux_arm64,REPO_windows_386.exe,REPO_windows_amd64.exe
##[debug]Node Action run completed with exit code 1
##[debug]Finishing: Download REPO binary
Using jaxxstorm/connecti
as a working template, I can see the version info using:
[I] โ gh --repo jaxxstorm/connecti release view v0.0.3
v0.0.3
jaxxstorm released this about 1 day ago
Assets
connecti-v0.0.3-darwin-amd64.tar.gz 25.19 MiB
connecti-v0.0.3-darwin-arm64.tar.gz 25.26 MiB
connecti-v0.0.3-linux-amd64.tar.gz 25.35 MiB
connecti-v0.0.3-linux-arm64.tar.gz 24.21 MiB
connecti-v0.0.3-windows-amd64.zip 25.56 MiB
connecti-v0.0.3-windows-arm64.zip 24.48 MiB
connecti_0.0.3_checksums.txt 606 B
View on GitHub: https://github.com/jaxxstorm/connecti/releases/tag/v0.0.3
There's a private repo I'm trying to pull a release artifacts for that has multiple releases:
[I] โ gh --repo OWNER/REPO release list
v0.1.1 Latest v0.1.1 2022-12-01T17:57:45Z
v0.1.0 v0.1.0 2022-06-01T23:38:43Z
v0.0.26 v0.0.26 2022-05-23T09:56:44Z
v0.0.25 v0.0.25 2022-02-23T19:57:25Z
v0.0.24 v0.0.24 2022-01-12T11:50:10Z
v0.0.23 v0.0.23 2021-12-17T19:02:41Z
v0.0.22 v0.0.22 2021-12-09T12:56:35Z
v0.0.21 v0.0.21 2021-11-10T13:52:44Z
v0.0.20 v0.0.20 2021-11-09T11:46:10Z
v0.0.19 v0.0.19 2021-10-07T11:35:22Z
v0.0.18 v0.0.18 2021-09-22T11:32:07Z
v0.0.17 v0.0.17 2021-08-19T11:44:02Z
v0.0.16 v0.0.16 2021-03-29T08:53:32Z
v0.0.15 v0.0.15 2021-03-25T09:32:00Z
v0.0.14 v0.0.14 2021-03-23T13:53:21Z
v0.0.13 v0.0.13 2021-03-18T16:00:18Z
v0.0.12 v0.0.12 2021-03-09T11:49:04Z
v0.0.11 v0.0.11 2021-02-16T14:03:35Z
v0.0.10 v0.0.10 2021-02-10T13:05:03Z
v0.0.9 v0.0.9 2021-02-05T11:20:02Z
v0.0.8 v0.0.8 2021-02-04T13:55:45Z
v0.0.7 v0.0.7 2021-01-29T19:30:22Z
v0.0.6 v0.0.6 2021-01-29T17:18:05Z
v0.0.5 v0.0.5 2021-01-27T11:24:17Z
v0.0.4 v0.0.4 2021-01-21T12:31:32Z
v0.0.3 v0.0.3 2021-01-21T09:15:10Z
v0.0.2 v0.0.2 2021-01-19T18:13:43Z
v0.0.1 v0.0.1 2021-01-16T01:37:00Z
From which I can query individual repos, but the releases don't embed the name:
[I] โ gh --repo OWNER/REPO release view v0.1.1
title: v0.1.1
tag: v0.1.1
draft: false
prerelease: false
author: XXXX
created: 2022-12-01T17:56:53Z
published: 2022-12-01T17:57:45Z
url: https://github.com/OWNER/REPO/releases/tag/v0.1.1
asset: REPO_darwin_amd64
asset: REPO_darwin_arm64
asset: REPO_linux_386
asset: REPO_linux_amd64
asset: REPO_linux_arm64
asset: REPO_windows_386.exe
asset: REPO_windows_amd64.exe
--
**Full Changelog**: https://github.com/OWNER/REPO/compare/v0.1.0...v0.1.1
When using the action for the documented pure binary releases scenario a warning shows in the execution summary which is not needed as that is the desired behaviour, would it make sense to remove it? thanks
action-install-gh-release/src/main.ts
Lines 218 to 219 in f2bcf76
This is a Github Action. Even if there actually is an application, in which a release is preferred for a platform or architecture different to the one the code itself is running on, that should not be the default.
instead of
steps:
- name: install substreams cli
uses: jaxxstorm/[email protected]
with:
repo: streamingfast/substreams
cache: enable
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: install buf
uses: jaxxstorm/[email protected]
with:
repo: bufbuild/buf
cache: enable
can I do the below instead?
- name: install substreams cli
uses: jaxxstorm/[email protected]
with:
- repo: streamingfast/substreams
cache: enable
- repo: bufbuild/buf
cache: enable
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
thanks!
Some projects use bz, for example https://github.com/mozilla/grcov/releases/tag/v0.8.11, in which case this action fails
Unfortunately this action does not allow currently to specify exact filename when there are multiple different binaries in the release.
Example - https://github.com/bazel-contrib/target-determinator/releases
It publishes 2 binaries: driver and target-determinator. Currently with the following configuration, it downloads the driver although I want the latter.
uses: jaxxstorm/[email protected]
with:
repo: bazel-contrib/target-determinator
tag: v0.26.0
extension-matching: disable
rename-to: target-determinator
chmod: 0755
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.