This is an automated email from the ASF dual-hosted git repository.

wu-sheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking-nodejs.git


The following commit(s) were added to refs/heads/master by this push:
     new 4c340ac  docs: fix build instructions (Node 20 + submodule) and make 
the release guide script-oriented (#136)
4c340ac is described below

commit 4c340ac8db5954a2c907bbcb44e8d06a19577ba4
Author: 吴晟 Wu Sheng <[email protected]>
AuthorDate: Wed Jun 24 16:51:34 2026 +0800

    docs: fix build instructions (Node 20 + submodule) and make the release 
guide script-oriented (#136)
---
 CONTRIBUTING.md        |  26 ++++--
 README.md              |   2 +-
 docs/How-to-release.md | 244 ++++++++++++++++++++++++++-----------------------
 3 files changed, 148 insertions(+), 124 deletions(-)

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 46b6dd7..e651767 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,21 +1,31 @@
 # Compiling and Building
 
-We use NodeJS 14 to build skywalking-nodejs project, if you don't have NodeJS 
14 installed,
-you can choose a node version manager like 
[nvm](https://github.com/nvm-sh/nvm) to easily
-manage multiple node vesions, or you can start a Docker container and build 
this project inside
-the container.
+We build skywalking-nodejs with NodeJS 20 (the current LTS baseline; CI tests 
Node 20, 22, and 24).
+If you don't have a suitable NodeJS installed, use a version manager such as
+[nvm](https://github.com/nvm-sh/nvm) to manage multiple node versions, or 
build inside a Docker
+container:
 
 ```shell
 # Suppose you have the source codes in folder skywalking-nodejs
-docker run -it --rm -v $(pwd)/skywalking-nodejs:/workspace -w /workspace 
node:14 bash
+docker run -it --rm -v $(pwd)/skywalking-nodejs:/workspace -w /workspace 
node:20 bash
 ```
 
-Then run the following commands to build the project:
+The gRPC / protobuf definitions live in the `protocol/` git submodule, so 
initialize it first (or
+clone the repository with `--recurse-submodules`). Then install dependencies — 
the `prepare` hook
+generates the protobuf stubs into `src/proto/` — and compile:
 
 ```shell
+git submodule update --init --recursive
 npm install
 npm run build
 ```
 
-Warnings can be ignored, but if you have any error that prevents you to 
continue, try
-`rm -rf node_modules/` and then rerun the commands above.
+`npm run build` compiles the TypeScript sources into `lib/`. Other useful 
commands:
+
+```shell
+npm run lint     # ESLint: code style + Apache license headers
+npm run test     # plugin tests (require Docker)
+```
+
+Warnings can be ignored, but if an error prevents you from continuing, try `rm 
-rf node_modules/`
+and rerun the commands above.
diff --git a/README.md b/README.md
index b08dd18..2a31b3e 100644
--- a/README.md
+++ b/README.md
@@ -22,7 +22,7 @@ $ npm install --save skywalking-backend-js
 
 ## Set up NodeJS Agent
 
-SkyWalking NodeJS SDK requires SkyWalking backend (OAP) 8.0+ and NodeJS >= 14,
+SkyWalking NodeJS SDK requires SkyWalking backend (OAP) 8.0+ and NodeJS >= 20,
 other versions are not tested and SkyWalking NodeJS SDK may or may not work,
 please make sure to use the supported versions before reporting any issue.
 
diff --git a/docs/How-to-release.md b/docs/How-to-release.md
index c0d85ba..240fce2 100644
--- a/docs/How-to-release.md
+++ b/docs/How-to-release.md
@@ -1,84 +1,91 @@
 # Apache SkyWalking NodeJS Release Guide
 
-This documentation guides the release manager to release the SkyWalking NodeJS 
in the Apache Way, and also helps people to check the release for voting.
+This guide releases SkyWalking NodeJS the Apache Way using the two release 
scripts, and helps
+voters check a release. The shell scripts 
[`scripts/release.sh`](../scripts/release.sh) and
+[`scripts/release-finalize.sh`](../scripts/release-finalize.sh) do the 
mechanical work (versioning,
+tagging, signing, svn staging, the GitHub release, npm); this guide covers the 
human steps around
+them (GPG/KEYS, the vote, the announce).
 
-## Automated release (recommended)
+`master` carries the in-flight dev version (e.g. `0.9.0-dev`), like 
SkyWalking's `-SNAPSHOT`. You
+do **not** edit `package.json` by hand — `scripts/release.sh` strips `-dev` 
for the release commit
+and bumps the branch back to the next `-dev` in the same PR.
 
-`master` carries the in-flight dev version (e.g. `0.9.0-dev`), like 
SkyWalking's `-SNAPSHOT` convention. Two scripts automate the rest. Run them on 
a single-user trusted host, with your Apache GPG key (an `@apache.org` uid, 
already in the 
[KEYS](https://dist.apache.org/repos/dist/release/skywalking/KEYS) file) 
configured and Node >= 20:
+## The release scripts
+
+The whole flow is three commands (steps 1–3 below detail each phase):
 
 ```shell
-npm run release            # cut a release branch: strip -dev, commit + tag 
the release commit,
-                           # build + sign the source release, verify it, push 
the tag, add a
-                           # second commit bumping the branch to the next 
-dev, open the release PR,
-                           # upload the RC to svn dev, and print the [VOTE] 
email
-# ... after the vote passes (open >= 72h, >= 3 binding +1, more +1 than -1) ...
-npm run release:finalize   # svn move dev -> release, publish the GitHub 
release, optionally publish to npm
-# then merge the release PR opened by `npm run release` (master returns to 
-dev; the tag stays put).
+bash scripts/release.sh --dry-run     # rehearse: full local build + sign + 
verify, NO push/svn/PR
+bash scripts/release.sh               # cut the RC: tag, sign, svn-stage, open 
the release PR, print the [VOTE] email
+# ... [VOTE] on [email protected] for >= 72h, >= 3 binding +1 ...
+bash scripts/release-finalize.sh      # promote svn dev -> release, publish 
the GitHub release, optional npm publish
 ```
 
-You do **not** bump the version by hand — `npm run release` strips the `-dev` 
suffix for the release commit and bumps the branch to the next dev version in 
the same PR (master returns to `-dev` when the PR merges).
-
-To rehearse the whole flow with **zero side effects** — a full local clone, 
strip, build, sign and verify, but **no** tag/branch push, **no** svn upload 
and **no** PR — run `npm run release -- --dry-run` (or `SW_RELEASE_DRY_RUN=1 
npm run release`).
-
-If you intend to publish to npm in `release:finalize`, run `npm login` first 
(you must be a maintainer of `skywalking-backend-js`). The script verifies npm 
auth **up front** — before the irreversible svn move — and auto-skips the npm 
step if that version is already published.
-
-The rest of this guide is the reference those scripts implement, and the 
fallback for running a step by hand.
-
-## Prerequisites
+(They are also wired as `npm run release` / `npm run release:finalize` if you 
prefer npm — but note
+the dry-run flag then needs `npm run release -- --dry-run`.)
 
-1. Close (if finished, or move to next milestone otherwise) all issues in the 
current milestone from 
[skywalking-nodejs](https://github.com/apache/skywalking-nodejs/milestones) and 
[skywalking](https://github.com/apache/skywalking/milestones), create a new 
milestone for the next release.
-1. The version is managed by `npm run release` (it strips `-dev` for the 
release commit and bumps `master` to the next `-dev`); you do not edit 
`package.json` by hand. CHANGELOG.md is a stub — release notes are the 
auto-generated [GitHub 
Release](https://github.com/apache/skywalking-nodejs/releases) notes.
+Both scripts are **interactive** (every irreversible step asks `y/N`), must 
run on a single trusted
+host (they read your SVN password), and are heavily commented — read the two 
files above for the
+details. Knobs (all optional):
 
+| Variable / flag | Effect | Default |
+| :--- | :--- | :--- |
+| `--dry-run` or `SW_RELEASE_DRY_RUN=1` | Run everything locally, perform 
**no** remote mutation (no tag/branch push, no svn, no PR) | off |
+| `SW_RELEASE_REPO_URL` | Git repo to clone + push | 
`https://github.com/apache/skywalking-nodejs.git` |
+| `SW_RELEASE_BRANCH` | Branch to cut from | `master` |
+| `SW_RELEASE_GH_REPO` | `owner/repo` for the release PR / GitHub release | 
`apache/skywalking-nodejs` |
+| `SW_GPG_KEY` | Pin the signing key (`release.sh` sets this from your 
`@apache.org` key automatically) | git/gpg default |
+| `NPM_OTP` | npm one-time password for the `release-finalize.sh` publish | 
prompt |
 
-## Add your GPG public key to Apache svn
+> Tip: `unset SW_RELEASE_REPO_URL SW_RELEASE_BRANCH SW_RELEASE_GH_REPO` before 
a real release —
+> a stray override from an earlier test would otherwise retarget the 
clone/push.
 
-1. Upload your GPG public key to a public GPG site, such as [MIT's 
site](http://pgp.mit.edu:11371/).
+## Prerequisites (one-time)
 
-1. Log in [id.apache.org](https://id.apache.org/) and submit your key 
fingerprint.
+- **Apache GPG key** with an `@apache.org` uid, added to the SkyWalking `KEYS` 
file:
+  1. Upload the public key to a keyserver (e.g. 
[MIT](http://pgp.mit.edu:11371/)).
+  1. Register the fingerprint at [id.apache.org](https://id.apache.org/).
+  1. **Append** (never overwrite) your key to the [SkyWalking 
KEYS](https://dist.apache.org/repos/dist/release/skywalking/KEYS)
+     file — **PMC only**; ask a PMC member if needed.
+- **Tools**: Node >= 20, plus `git`, `svn`, `gh`, `gpg`, `shasum`, `tar` (and 
`license-eye`,
+  optional). Run `gh auth login`; for the npm publish, `npm login` as a 
maintainer of
+  `skywalking-backend-js`.
+- **Milestones**: close/roll the milestone on
+  [skywalking-nodejs](https://github.com/apache/skywalking-nodejs/milestones) 
and
+  [skywalking](https://github.com/apache/skywalking/milestones), and create 
the next one.
 
-1. Add your GPG public key into [SkyWalking GPG 
KEYS](https://dist.apache.org/repos/dist/release/skywalking/KEYS) file, **you 
can do this only if you are a PMC member**.  You can ask a PMC member for help. 
**DO NOT override the existed `KEYS` file content, only append your key at the 
end of the file.**
+Run the scripts on a single-user trusted host (they read your SVN password).
 
-
-## Build and sign the source code package
-
-`npm run release` automates this. To do it by hand, mirror the script — strip 
`-dev`, build, and push the tag **only after** the build verifies (master 
carries `$VERSION-dev`):
+## 1. Cut the release candidate — `bash scripts/release.sh`
 
 ```shell
-export VERSION=<the release version, e.g. 0.9.0>     # bare semver
-
-git clone --recurse-submodules [email protected]:apache/skywalking-nodejs && cd 
skywalking-nodejs
-git checkout -b "prepare-release-$VERSION"
-npm version "$VERSION" --no-git-tag-version          # strip -dev: 
package.json + lockfile -> $VERSION
-npm install
-git commit -am "Prepare release $VERSION"
-git tag -a "v$VERSION" -m "Release Apache SkyWalking-NodeJS $VERSION"   # tag 
LOCALLY first
-
-npm run release-src                                  # 
skywalking-nodejs-src-$VERSION.tgz{,.asc,.sha512}
-# verify the tarball + signature, THEN push the tag (and branch, for the 
next-dev PR):
-git push origin "v$VERSION" "prepare-release-$VERSION"
+bash scripts/release.sh --dry-run     # rehearse first: full local build + 
sign + verify, NO push/svn/PR
+bash scripts/release.sh               # the real cut
 ```
 
-## Upload to Apache svn
+`scripts/release.sh` does, each irreversible step behind a `y/N`:
 
-```bash
-svn co https://dist.apache.org/repos/dist/dev/skywalking/node-js/ 
release/skywalking/node-js
-mkdir -p release/skywalking/node-js/"$VERSION"
-cp skywalking-node-js/skywalking*.tgz release/skywalking/node-js/"$VERSION"
-cp skywalking-node-js/skywalking*.tgz.asc release/skywalking/node-js/"$VERSION"
-cp skywalking-node-js/skywalking*.tgz.sha512 
release/skywalking/node-js/"$VERSION"
+1. preflight — the GPG signer is an `@apache.org` key, required tools present, 
Node >= 20;
+1. fresh recursive clone of `master`; cut a `prepare-release-<v>` branch; 
strip `-dev` and
+   commit + **tag** the release commit;
+1. build + sign + verify `skywalking-nodejs-src-<v>.tgz{,.asc,.sha512}`;
+1. push the tag (**only after** verify), add a `Prepare next release 
<next>-dev` commit, and
+   **open the release PR**;
+1. upload the RC to `dist/dev/skywalking/node-js/<v>/`;
+1. print the **[VOTE] email** (with the real tag, commit, and sha512 — copy it 
for step 2).
 
-cd release/skywalking && svn add node-js/$VERSION && svn commit node-js -m 
"Draft Apache SkyWalking-NodeJS release $VERSION"
-```
+> Release notes come from the auto-generated [GitHub 
Release](https://github.com/apache/skywalking-nodejs/releases)
+> notes (`CHANGELOG.md` is a stub). Draft them once the tag exists:
+> `gh release create v<v> --draft --generate-notes --verify-tag 
--notes-start-tag v<prev>`
 
-## Call for vote in dev@ mailing list
+## 2. Call for vote — `[email protected]`
 
-Call for vote in `[email protected]`.
+Send the `[VOTE]` email the script printed (template below). Keep it open **>= 
72 hours**; it
+passes with **>= 3 binding +1** (PMC) and more +1 than -1.
 
 ```text
 Subject: [VOTE] Release Apache SkyWalking NodeJS version $VERSION
 
-Content:
-
 Hi the SkyWalking Community:
 This is a call for vote to release Apache SkyWalking NodeJS version $VERSION.
 
@@ -106,9 +113,10 @@ Keys to verify the Release Candidate :
 
 Guide to build the release from source :
 
- * 
https://github.com/apache/skywalking-nodejs/blob/master/CONTRIBUTING.md#compiling-and-building
+ * 
https://github.com/apache/skywalking-nodejs/blob/v$VERSION/CONTRIBUTING.md#compiling-and-building
 
-Voting will start now and will remain open for at least 72 hours, all PMC 
members are required to give their votes.
+Voting will start now and will remain open for at least 72 hours.
+A release passes with at least 3 binding +1 (PMC) votes and more +1 than -1.
 
 [ ] +1 Release this package.
 [ ] +0 No opinion.
@@ -119,92 +127,98 @@ Thanks.
 [1] 
https://github.com/apache/skywalking-nodejs/blob/master/docs/How-to-release.md#vote-check
 ```
 
-## Vote Check
+### Vote check
 
-All PMC members and committers should check these before voting +1:
+Before voting +1, verify (all PMC members and committers):
 
 1. Features test.
-1. All artifacts in staging repository are published with `.asc` and `.sha512` 
files.
-1. Source codes and distribution packages 
(`skywalking-nodejs-src-$VERSION.tgz`)
-are in `https://dist.apache.org/repos/dist/dev/skywalking/node-js/$VERSION` 
with `.asc`, `.sha512`.
-1. `LICENSE` and `NOTICE` are in source codes and distribution package.
-1. Check `shasum -c skywalking-nodejs-src-$VERSION.tgz.sha512`.
-1. Check `gpg --verify skywalking-nodejs-src-$VERSION.tgz.asc 
skywalking-nodejs-src-$VERSION.tgz`.
-1. Build distribution from source code package by following this [the build 
guide](#build-and-sign-the-source-code-package).
-1. License-header check via license-eye (`apache/skywalking-eyes`, as run by 
`.github/workflows/license.yaml`); style lint via `npm run lint`.
-
-Vote result should follow these:
+1. All artifacts in the staging dir are published with `.asc` and `.sha512` 
files (no `.md5`).
+1. The source package `skywalking-nodejs-src-$VERSION.tgz` is in
+   `https://dist.apache.org/repos/dist/dev/skywalking/node-js/$VERSION` with 
its `.asc` + `.sha512`.
+1. `LICENSE` and `NOTICE` are present in the source package.
+1. `shasum -c skywalking-nodejs-src-$VERSION.tgz.sha512`.
+1. `gpg --verify skywalking-nodejs-src-$VERSION.tgz.asc 
skywalking-nodejs-src-$VERSION.tgz`.
+1. Build from the source package following the
+   [build guide](../CONTRIBUTING.md#compiling-and-building).
+1. License-header check via license-eye (`apache/skywalking-eyes`, as run by
+   `.github/workflows/license.yaml`); style lint via `npm run lint`.
 
-1. PMC vote is +1 binding, all others is +1 no binding.
+### Close the vote
 
-1. Within 72 hours, you get at least 3 (+1 binding), and have more +1 than -1. 
Vote pass.
+After it passes, send the closing mail, listing the binding and non-binding 
voters:
 
-1. **Send the closing vote mail to announce the result**.  When count the 
binding and no binding votes, please list the names of voters. An example like 
this:
-
-   ```
-   [RESULT][VOTE] Release Apache SkyWalking NodeJS version $VERSION
-
-   72+ hours passed, we’ve got ($NUMBER) +1 bindings (and ... +1 non-bindings):
-
-   (list names)
-   +1 bindings:
-   xxx
-   ...
-
-   +1 non-bindings:
-   xxx
-   ...
-
-   Thank you for voting, I’ll continue the release process.
-   ```
+```text
+[RESULT][VOTE] Release Apache SkyWalking NodeJS version $VERSION
 
-## Publish release
+72+ hours passed, we’ve got ($NUMBER) +1 bindings (and ... +1 non-bindings):
 
-1. Move source codes tar balls and distributions to 
`https://dist.apache.org/repos/dist/release/skywalking/`, **you can do this 
only if you are a PMC member**.
+(list names)
++1 bindings:
+xxx
+...
 
-    ```shell
-    svn mv 
https://dist.apache.org/repos/dist/dev/skywalking/node-js/"$VERSION"; 
https://dist.apache.org/repos/dist/release/skywalking/node-js/"$VERSION";
-    ```
++1 non-bindings:
+xxx
+...
 
-1. Refer to the previous 
[PR](https://github.com/apache/skywalking-website/pull/190), update news and 
links on the website. There are several files need to modify.
+Thank you for voting, I’ll continue the release process.
+```
 
-1. Update [Github release 
page](https://github.com/apache/skywalking-nodejs/releases), follow the 
previous convention.
+## 3. Finalize — `bash scripts/release-finalize.sh`
 
-1. Publish to npmjs.com, this is optional for Apache releases, but we usually 
want to do this to let users use it conveniently.
+```shell
+npm login                  # only if you will publish to npm (maintainer of 
skywalking-backend-js)
+bash scripts/release-finalize.sh
+```
 
-  ```shell
-  npm run build && npm pack && npm publish
-  ```
+It does, each irreversible step behind a `y/N` (npm auth is verified **up 
front**):
 
-**NOTE**: please double check before publishing to npmjs.com, it's difficult 
to unpublish and republish the module at the moment.
+1. promotes the RC on svn: `dev/<v>` -> `release/<v>`, retiring the previous 
(strictly-older)
+   release (it auto-archives to archive.apache.org);
+1. publishes the **GitHub release** on `v<v>` (auto-notes), attaching the 
voted artifacts;
+1. optionally publishes `skywalking-backend-js@<v>` to npm (skipped if already 
published).
 
-1. Send ANNOUNCE email to `[email protected]` and 
`[email protected]`, the sender should use his/her Apache email account.
+Then finish the human steps it reminds you about:
 
-    ```
-    Subject: [ANNOUNCEMENT] Apache SkyWalking NodeJS $VERSION Released
+1. **Merge the release PR** opened in step 1 (`master` returns to the next 
`-dev`; the `v<v>` tag
+   stays pinned to the release commit).
+1. **Website** 
([apache/skywalking-website](https://github.com/apache/skywalking-website)): 
add the
+   release event, bump the NodeJS Agent block in `data/releases.yml` and the 
docs pointer in
+   `data/docs.yml` (see a prior 
[PR](https://github.com/apache/skywalking-website/pull/190)).
+1. **[ANNOUNCE] email** from your `@apache.org` address to 
`[email protected]` and
+   `[email protected]`:
 
-    Content:
+```text
+Subject: [ANNOUNCEMENT] Apache SkyWalking NodeJS $VERSION Released
 
-    Hi the SkyWalking Community
+Hi the SkyWalking Community
 
-    On behalf of the SkyWalking Team, I’m glad to announce that SkyWalking 
NodeJS $VERSION is now released.
+On behalf of the SkyWalking Team, I’m glad to announce that SkyWalking NodeJS 
$VERSION is now released.
 
-    SkyWalking NodeJS: The NodeJS Agent for Apache SkyWalking, which provides 
the native tracing abilities for NodeJS backend project.
+SkyWalking NodeJS: The NodeJS Agent for Apache SkyWalking, which provides the 
native tracing abilities for NodeJS backend project.
 
-    SkyWalking: APM (application performance monitor) tool for distributed 
systems, especially designed for microservices, cloud native and 
container-based (Docker, Kubernetes, Mesos) architectures.
+SkyWalking: APM (application performance monitor) tool for distributed 
systems, especially designed for microservices, cloud native and 
container-based (Docker, Kubernetes, Mesos) architectures.
 
-    Download Links: http://skywalking.apache.org/downloads/
+Download Links: http://skywalking.apache.org/downloads/
 
-    Release Notes : 
https://github.com/apache/skywalking-nodejs/releases/tag/v$VERSION
+Release Notes : 
https://github.com/apache/skywalking-nodejs/releases/tag/v$VERSION
 
-    Website: http://skywalking.apache.org/
+Website: http://skywalking.apache.org/
 
-    SkyWalking NodeJS Resources:
+SkyWalking NodeJS Resources:
 - Issue: https://github.com/apache/skywalking/issues
-    - Mailing list: [email protected]
-    - Documents: 
https://github.com/apache/skywalking-nodejs/blob/v$VERSION/README.md
+- Mailing list: [email protected]
+- Documents: 
https://github.com/apache/skywalking-nodejs/blob/v$VERSION/README.md
 
-    The Apache SkyWalking Team
+The Apache SkyWalking Team
 ```
 
+## Manual fallback
 
+The scripts implement the standard ASF steps and are heavily commented; if you 
must run a step by
+hand, read [`scripts/release.sh`](../scripts/release.sh) and
+[`scripts/release-finalize.sh`](../scripts/release-finalize.sh). The 
essentials: clone with
+`--recurse-submodules`; `npm version <v> --no-git-tag-version` to strip 
`-dev`; `npm install`;
+commit; tag locally; `npm run release-src` to build + sign; verify the tarball 
+ signature;
+**then** push the tag; `svn` the three artifacts to 
`dist/dev/.../node-js/<v>/`; after the vote
+`svn mv` dev -> release; publish the GitHub release; `npm run build && npm 
publish`.

Reply via email to