Skip to content

ci: automated release workflow (semantic-release + OIDC trusted publishing) - #46

Merged
oliverlaz merged 11 commits into
masterfrom
ci/automated-release-workflow
Jul 28, 2026
Merged

ci: automated release workflow (semantic-release + OIDC trusted publishing)#46
oliverlaz merged 11 commits into
masterfrom
ci/automated-release-workflow

Conversation

@oliverlaz

@oliverlaz oliverlaz commented Jun 11, 2026

Copy link
Copy Markdown
Member

What

Adds an automated, workflow_dispatch-triggered release for @stream-io/react-native-webrtc, modeled on stream-chat-js's release.yml. Uses semantic-release for version computation, changelog, git tag, and GitHub Release, and publishes to npm via tokenless Trusted Publishing (OIDC) with automatic provenance.

Replaces the manual flow (tools/release.sh + hand-run npm publish).

Files

File Purpose
.github/workflows/release.yml Dispatch release job: dry_run input, OIDC + issue/PR token scopes, concurrency group, branch safety guard, npx semantic-release
.github/actions/setup-node/action.yml Composite action — Node from .nvmrc (v24) + npm ci
.releaserc.json semantic-release branches + plugin pipeline (commit-analyzer → release-notes → changelog → npm → git → github)
.github/workflows/{ci,android_ci,ios_ci}.yml Adopt the composite action; bump checkout@v6 / setup-java@v5; drop the now-redundant root npm install
.github/stale.yml Removed — config for the long-retired Probot Stale app
README.md Stream-specific rewrite of stale upstream sections + new Releasing section documenting the branch↔channel mapping
package.json / package-lock.json semantic-release script + 4 devDependencies, lockfile synced so npm ci succeeds

Release channels

There is no channel input — the branch you dispatch from selects the channel, via the "Use workflow from" dropdown. Documented in the README's Releasing section.

Dispatch from Version npm dist-tag
master 145.1.0 latest
beta 145.1.0-beta.1 beta
alpha 145.1.0-alpha.1 alpha
<major>.x (e.g. 145.x) 145.0.1 145.x
any, with dry_run: true computed + printed only

alpha is included deliberately: the alpha dist-tag currently points at 145.1.0-alpha.1 and the 145 line has 10 published alphas, so dropping that channel would have been a regression.

A branch only appears in the dispatch dropdown once it exists on the remote and contains release.yml, so alpha / beta / <major>.x need branching off master before first use.

⚠️ Remaining prerequisite

Configure the npm Trusted Publisher for @stream-io/react-native-webrtc on npmjs.com (Settings → Trusted Publisher → GitHub Actions → this repo + release.yml). Tokenless OIDC publish fails without it.

This must happen before any dispatch, including dry_run: true@semantic-release/npm runs verifyConditions on every invocation, so a dry run without a registered publisher falls back to looking for NPM_TOKEN and fails with ENONPMTOKEN. That failure reads like a broken release config but is only the missing registry setting.

The baseline-tag concern from the original description is resolved: v145.0.0 now exists on the remote and is an ancestor of master, and it matches semantic-release's default v${version} tag format.

Verification performed

On the merged tree, not just tsc:

  • npm ci — clean; lockfile stays lockfileVersion: 2 with no drift
  • npm run lint (eslint + tsc --noEmit) — pass
  • git status --porcelain after npm ci — clean, so ci.yml's dirty-tree gate still holds with bob 0.43
  • npm pack --dry-runlib/ present (built by prepare at publish time)
  • Config load: all 15 plugin hooks resolve; branch guard correctly refuses to publish from a feature branch
  • Version computation exercised end-to-end (--dry-run, --branches override, no publish/push): computes 145.1.0 from feat(ios): setEngineAvailability (#53) + the stereo fix:, with correctly rendered release notes
  • alpha channel resolution checked against semantic-release's own lib/branches/normalize.jschannel="alpha", prerelease="alpha", matching the existing dist-tag
  • npm version --no-git-tag-version confirmed to update all three version fields in package-lock.json, so no package.json/lock drift after a release commit (the lock is in the git plugin's assets)
  • Trusted publishing confirmed supported in the installed @semantic-release/npm@13.1.5 (lib/trusted-publishing/); Node 24 bundles npm 11.16, above the 11.5.1 floor, so no npm install -g npm@latest step is needed

Fixed during review

  • permissions was missing issues: write / pull-requests: write. Declaring any scope sets all undeclared scopes to none, and @semantic-release/github's success step comments on / labels / closes released issues and PRs, rethrowing failures. Since 7c971e1 feat(ios): … (#53) is in range, the first release would have published to npm, pushed the tag and release commit, created the GitHub Release — and then failed the job with 403s. Dry runs cannot catch this; they skip publish/success entirely.
  • Added a concurrency group (cancel-in-progress: false). Two overlapping dispatches would both compute the same version and race on the tag, the branch push, and the publish. Cancellation is deliberately disabled because the tag and release commit are pushed before publish, so a cancelled run can leave the repo tagged with nothing on npm.
  • GITHUB_TOKEN now passed to the Release step (was flagged in the original description).
  • Merged master — resolved conflicts in ios_ci.yml (kept master's Xcode-versioned Pods cache + the composite action), package.json (master's bob ^0.43.0 + semantic-release), and regenerated package-lock.json.

Known follow-ups (not addressed here)

  • The branch guard admits release* and non-numeric *.x names that .releaserc.json doesn't handle, so a dispatch from e.g. release/145.2 produces a green run that publishes nothing.
  • { "scope": "deps", "release": "patch" } constrains only the scope, so feat(deps): yields a patch instead of a minor. Adding "type": "chore" would confine it to dependabot-style commits.
  • tools/release.sh is still present alongside the new flow.
  • The README rewrite dropped the Picture-in-Picture section, which is Stream-authored content pointing users at @stream-io/video-react-native-sdk — worth restoring if the removal was unintentional.

Lockfile note

The large diff is almost entirely the reshuffling of lockfileVersion: 2's legacy nested dependencies block. Compared structurally against master's lockfile, the change is 398 packages added, 0 removed, 0 version changes — a pure addition of semantic-release's tree.

Summary by CodeRabbit

  • New Features

    • Added an automated Release workflow using semantic-release, including a dry-run option.
    • Enabled consistent Node provisioning in CI via a shared local setup action across Android, iOS, and general CI.
  • Chores

    • Added semantic-release tooling and release scripts/configuration (including changelog and package publishing).
    • Removed stale-issue automation configuration.
  • Documentation

    • Updated README to reflect the @stream-io/react-native-webrtc package branding and streamlined related/example project sections.

Adds a workflow_dispatch-triggered release job that uses semantic-release
to publish the package to npm via tokenless Trusted Publishing (OIDC),
with automatic provenance. Supports stable (master), beta (prerelease
branch), and <major>.x maintenance releases, plus a dry-run mode.

- .github/workflows/release.yml: dispatch release job (OIDC, dry-run)
- .github/actions/setup-node: composite npm + Node-from-.nvmrc setup
- .releaserc.json: semantic-release branches and plugin pipeline
- package.json: semantic-release script + devDependencies (lockfile synced)
@coderabbitai

coderabbitai Bot commented Jun 11, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Adds semantic-release configuration and a manual release workflow using a reusable Node setup action. CI workflows now share the action, package tooling includes semantic-release scripts and plugins, and README branding and documentation are updated.

Changes

Release Automation and CI updates

Layer / File(s) Summary
Reusable Node setup action
.github/actions/setup-node/action.yml
Configures Node using an optional version or .nvmrc, enables npm caching, and runs npm ci.
Semantic-release configuration and package tooling
.releaserc.json, package.json
Defines release branches, commit analysis, changelog generation, npm publishing, GitHub releases, release asset commits, and semantic-release scripts and dependencies.
Manual release workflow
.github/workflows/release.yml
Adds manual dispatch with dry_run, branch gating, write permissions, full-history checkout, shared Node setup, and semantic-release execution.
CI workflows switched to local setup action
.github/workflows/android_ci.yml, .github/workflows/ci.yml, .github/workflows/ios_ci.yml
Updates checkout and Android Java actions, replaces inline Node setup with the shared action, and removes redundant root dependency installation.
README adjustments
README.md
Updates package branding and installation instructions and removes Community and Picture-in-Picture sections.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant GitHubActions
  participant Checkout
  participant SetupNode
  participant SemanticRelease
  participant Npm

  User->>GitHubActions: Trigger release workflow with dry_run input
  GitHubActions->>Checkout: Checkout full history and tags
  GitHubActions->>SetupNode: Configure Node and run npm ci
  GitHubActions->>SemanticRelease: Run semantic-release with optional --dry-run
  SemanticRelease->>Npm: Publish package when not dry-running
Loading

Suggested reviewers: greenfrvr

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: adding an automated release workflow with semantic-release and OIDC trusted publishing.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch ci/automated-release-workflow

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

semantic-release reads GITHUB_TOKEN/GH_TOKEN from the environment to create
the GitHub Release and push the changelog/version commit; Actions does not
populate it automatically.
- android_ci / ci / ios_ci: use ./.github/actions/setup-node (Node from
  .nvmrc) instead of inline setup-node@v4 pinned to 22.x; bump
  actions/checkout to v6 and actions/setup-java to v5
- remove .github/stale.yml

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (2)
.github/workflows/release.yml (1)

21-24: 💤 Low value

Consider pinning actions/checkout to a commit SHA.

Line 22 uses actions/checkout@v6 (tag-based reference). The static analysis tool flags this as unpinned, suggesting commit SHA pinning for supply-chain security (e.g., actions/checkout@<sha256>). While major-version tags are common practice, SHA pinning provides stronger immutability guarantees.

🔐 Pinning example (fetch current SHA)
#!/bin/bash
# Get the current SHA for actions/checkout@v6
gh api repos/actions/checkout/git/ref/tags/v6 --jq '.object.sha' 2>/dev/null || \
gh api repos/actions/checkout/commits/v6 --jq '.sha' 2>/dev/null || \
echo "Run: gh api repos/actions/checkout/git/matching-refs/tags/v6"

Note: The persist-credentials warning is a false positive here—semantic-release requires credentials to push the release commit.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/release.yml around lines 21 - 24, The workflow uses the
tag-based action reference "actions/checkout@v6" under the step named
"Checkout"; switch this to a pinned commit SHA for supply-chain security by
replacing the tag reference with the corresponding full commit SHA for
actions/checkout v6 (obtain the SHA via the GitHub API or gh CLI) so the step
uses an immutable reference instead of `@v6`.

Source: Linters/SAST tools

package.json (1)

3-3: ⚖️ Poor tradeoff

Baseline tag setup required before first semantic-release run.

The current version 145.0.0-alpha.8 indicates the package is mid-development. Semantic-release needs a baseline tag (e.g., v145.0.0) pushed to the repository before the first workflow run to correctly detect the current version and generate the next release. Without it, semantic-release may fail or produce an incorrect version bump.

Pre-release checklist:

  1. Decide on the baseline version (e.g., 145.0.0)
  2. Create and push the tag: git tag v145.0.0 && git push origin v145.0.0
  3. Update package.json version to match if needed
  4. Run workflow in dry-run mode first to verify

This aligns with the PR objectives' "Create/push a baseline tag" requirement.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@package.json` at line 3, The repo is missing a baseline git tag for
semantic-release given the package.json "version" field set to
"145.0.0-alpha.8"; create and push a baseline tag that matches the stable
version (e.g., git tag v145.0.0 && git push origin v145.0.0), ensure the
package.json "version" value aligns with that baseline if required, and run the
semantic-release workflow in dry-run mode first to verify detection and bumping
behavior before enabling full releases.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/release.yml:
- Around line 14-19: The branch guard in the package_release job is too
permissive because the conditional uses endsWith(github.ref_name, '.x'); update
the check to only allow numeric maintenance branches that match semantic-release
(e.g., patterns like 1.x or 1.0.x) by replacing the simple endsWith check with a
precise regex test against github.ref_name (or add a validation step in the job
that rejects non-numeric .x branches), and ensure this aligns with the branch
rules defined in .releaserc.json so only branches matching the numeric
maintenance pattern are permitted to run the release.

In @.releaserc.json:
- Around line 12-15: The releaseRules entry for scope "deps" currently overrides
type-based versioning (so commits like feat(deps): ... would be downgraded to
patch); update the releaseRules array to either narrow the rule by adding an
explicit "type" constraint (for example add "type":"chore" alongside
"scope":"deps" and "release":"patch") or remove/replace the scope-only rule and
add a comment/documentation explaining the intended behavior; target the
"releaseRules" array and the rule object with "scope":"deps" when making this
change.

---

Nitpick comments:
In @.github/workflows/release.yml:
- Around line 21-24: The workflow uses the tag-based action reference
"actions/checkout@v6" under the step named "Checkout"; switch this to a pinned
commit SHA for supply-chain security by replacing the tag reference with the
corresponding full commit SHA for actions/checkout v6 (obtain the SHA via the
GitHub API or gh CLI) so the step uses an immutable reference instead of `@v6`.

In `@package.json`:
- Line 3: The repo is missing a baseline git tag for semantic-release given the
package.json "version" field set to "145.0.0-alpha.8"; create and push a
baseline tag that matches the stable version (e.g., git tag v145.0.0 && git push
origin v145.0.0), ensure the package.json "version" value aligns with that
baseline if required, and run the semantic-release workflow in dry-run mode
first to verify detection and bumping behavior before enabling full releases.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: b1400ce8-d1ab-4b05-bc80-9d98d186570a

📥 Commits

Reviewing files that changed from the base of the PR and between 6e0e888 and 98b99a2.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (4)
  • .github/actions/setup-node/action.yml
  • .github/workflows/release.yml
  • .releaserc.json
  • package.json

Comment thread .github/workflows/release.yml Outdated
Comment on lines +14 to +19
jobs:
package_release:
name: Release from "${{ github.ref_name }}" branch
runs-on: ubuntu-latest
# GH does not allow limiting branches in workflow_dispatch settings, so guard here.
if: ${{ inputs.dry_run || github.ref_name == 'master' || github.ref_name == 'beta' || startsWith(github.ref_name, 'release') || endsWith(github.ref_name, '.x') }}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Branch guard is more permissive than semantic-release configuration.

Line 19 uses endsWith(github.ref_name, '.x'), which would allow branches like test.x or foo.x. However, .releaserc.json Line 3 expects numeric maintenance branches (1.x, 2.x, 1.0.x). This mismatch could allow releases from unintended branches.

🔒 Proposed fix to align with semantic-release branch patterns
-    if: ${{ inputs.dry_run || github.ref_name == 'master' || github.ref_name == 'beta' || startsWith(github.ref_name, 'release') || endsWith(github.ref_name, '.x') }}
+    if: ${{ inputs.dry_run || github.ref_name == 'master' || github.ref_name == 'beta' || startsWith(github.ref_name, 'release/') || contains(github.ref_name, '.x') && contains(github.ref_name, fromJSON('[0-9]')) }}

Or use a more precise regex check by adding a validation step before the release.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/release.yml around lines 14 - 19, The branch guard in the
package_release job is too permissive because the conditional uses
endsWith(github.ref_name, '.x'); update the check to only allow numeric
maintenance branches that match semantic-release (e.g., patterns like 1.x or
1.0.x) by replacing the simple endsWith check with a precise regex test against
github.ref_name (or add a validation step in the job that rejects non-numeric .x
branches), and ensure this aligns with the branch rules defined in
.releaserc.json so only branches matching the numeric maintenance pattern are
permitted to run the release.

Comment thread .releaserc.json
Comment on lines +12 to +15
"releaseRules": [
{ "type": "refactor", "release": "patch" },
{ "scope": "deps", "release": "patch" }
]

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

The deps scope rule may override type-based versioning.

Line 14 matches any commit with scope deps regardless of type. This means feat(deps): add feature would trigger a patch release instead of minor, potentially violating semver expectations. Consider adding a type constraint or documenting this intentional override.

📝 Alternative configuration if type-based versioning should be preserved
         "releaseRules": [
           { "type": "refactor", "release": "patch" },
-          { "scope": "deps", "release": "patch" }
+          { "type": "chore", "scope": "deps", "release": "patch" }
         ]

Or document the current behavior if intentional.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"releaseRules": [
{ "type": "refactor", "release": "patch" },
{ "scope": "deps", "release": "patch" }
]
"releaseRules": [
{ "type": "refactor", "release": "patch" },
{ "type": "chore", "scope": "deps", "release": "patch" }
]
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.releaserc.json around lines 12 - 15, The releaseRules entry for scope
"deps" currently overrides type-based versioning (so commits like feat(deps):
... would be downgraded to patch); update the releaseRules array to either
narrow the rule by adding an explicit "type" constraint (for example add
"type":"chore" alongside "scope":"deps" and "release":"patch") or remove/replace
the scope-only rule and add a comment/documentation explaining the intended
behavior; target the "releaseRules" array and the rule object with
"scope":"deps" when making this change.

The shared ./.github/actions/setup-node action already runs `npm ci`, so the
extra root-level `npm install` in ci/android_ci/ios_ci was a no-op. The
example-app installs (examples/GumTestApp/) are kept.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@README.md`:
- Line 37: Update the phrase "Real Time Communication" in README.md to the
hyphenated compound adjective "Real‑Time Communication" wherever it modifies
"Communication" (e.g., the sentence containing "provides a number of packages
which are more than useful when developing Real Time Communication
applications"); replace the unhyphenated occurrence with "Real-Time
Communication" to correct grammar.
- Line 32: The README contains the incorrect phrase "much more broader"; update
that sentence to use a correct comparative such as "much broader" or "a more
comprehensive example with backend included" to remove the double comparative.
Locate the sentence in README.md and replace "much more broader example with
backend included" with one of the suggested alternatives so the grammar is
corrected.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 04f66d05-f064-464b-82da-48fa33f241df

📥 Commits

Reviewing files that changed from the base of the PR and between 98b99a2 and 60e2b62.

📒 Files selected for processing (6)
  • .github/stale.yml
  • .github/workflows/android_ci.yml
  • .github/workflows/ci.yml
  • .github/workflows/ios_ci.yml
  • .github/workflows/release.yml
  • README.md
💤 Files with no reviewable changes (1)
  • .github/stale.yml
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/release.yml

Comment thread README.md
## Picture-in-Picture (PIP)

This package does not include a built-in PIP implementation. PIP support is available via [`@stream-io/video-react-native-sdk`](https://github.com/GetStream/stream-video-js).
Don't worry, there are plans to include a much more broader example with backend included.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix grammatical error: "much more broader" is incorrect.

The phrase "much more broader" uses a double comparative, which is grammatically incorrect. It should be either "much broader" or "a more comprehensive".

📝 Proposed fix
-Don't worry, there are plans to include a much more broader example with backend included.
+Don't worry, there are plans to include a much broader example with backend included.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
Don't worry, there are plans to include a much more broader example with backend included.
Don't worry, there are plans to include a much broader example with backend included.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README.md` at line 32, The README contains the incorrect phrase "much more
broader"; update that sentence to use a correct comparative such as "much
broader" or "a more comprehensive example with backend included" to remove the
double comparative. Locate the sentence in README.md and replace "much more
broader example with backend included" with one of the suggested alternatives so
the grammar is corrected.

Comment thread README.md

Looking for extra functionality coverage?
The [react-native-webrtc](https://github.com/react-native-webrtc) organization provides a number of packages which are more than useful when developing Real Time Communication applications.
The [react-native-webrtc](https://github.com/react-native-webrtc) organization provides a number of packages which are more than useful when developing Real Time Communication applications.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add hyphen to compound adjective "Real Time Communication".

When "Real Time" modifies "Communication" as a compound adjective, it should be hyphenated as "Real-Time Communication" for correct English grammar.

📝 Proposed fix
-The [react-native-webrtc](https://github.com/react-native-webrtc) organization provides a number of packages which are more than useful when developing Real Time Communication applications.
+The [react-native-webrtc](https://github.com/react-native-webrtc) organization provides a number of packages which are more than useful when developing Real-Time Communication applications.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
The [react-native-webrtc](https://github.com/react-native-webrtc) organization provides a number of packages which are more than useful when developing Real Time Communication applications.
The [react-native-webrtc](https://github.com/react-native-webrtc) organization provides a number of packages which are more than useful when developing Real-Time Communication applications.
🧰 Tools
🪛 LanguageTool

[uncategorized] ~37-~37: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...ch are more than useful when developing Real Time Communication applications.

(EN_COMPOUND_ADJECTIVE_INTERNAL)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README.md` at line 37, Update the phrase "Real Time Communication" in
README.md to the hyphenated compound adjective "Real‑Time Communication"
wherever it modifies "Communication" (e.g., the sentence containing "provides a
number of packages which are more than useful when developing Real Time
Communication applications"); replace the unhyphenated occurrence with
"Real-Time Communication" to correct grammar.

Source: Linters/SAST tools

Conflict resolutions:
- .github/workflows/ios_ci.yml: keep master's Xcode-versioned Pods cache and
  'Get Xcode version' step, keep this branch's checkout@v6 + shared
  ./.github/actions/setup-node composite (which already runs npm ci at the root,
  so master's separate 'Install node modules' step stays dropped).
- package.json: take master's react-native-builder-bob ^0.43.0, keep this
  branch's semantic-release ^25.0.3.
- package-lock.json: regenerated from master's lock plus the new semantic-release
  devDependencies (398 packages added, 0 removed, 0 version changes).

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/ios_ci.yml:
- Line 20: Update the actions/checkout step in the iOS build job to set
persist-credentials to false, ensuring the checkout token is not retained for
subsequent npm, CocoaPods, or Xcode commands. Do not add authenticated Git
operations or other workflow changes.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 2a851afa-2460-44c6-92c5-32fa3c634e39

📥 Commits

Reviewing files that changed from the base of the PR and between 60e2b62 and 6e59f3f.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (4)
  • .github/workflows/android_ci.yml
  • .github/workflows/ci.yml
  • .github/workflows/ios_ci.yml
  • package.json
🚧 Files skipped from review as they are similar to previous changes (3)
  • .github/workflows/ci.yml
  • .github/workflows/android_ci.yml
  • package.json

node-version: '22.x'
cache: 'npm'
cache-dependency-path: '**/package-lock.json'
- uses: actions/checkout@v6

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== workflow files =="
git ls-files '.github/workflows/*' | sed -n '1,120p'

echo
echo "== ios_ci.yml with line numbers =="
if [ -f .github/workflows/ios_ci.yml ]; then
  nl -ba .github/workflows/ios_ci.yml | sed -n '1,220p'
fi

echo
echo "== checkout persist-credentials/default usage across workflows =="
rg -n --hidden --glob '!node_modules/**' --glob '!dist/**' --glob '!build/**' 'actions/checkout|persist-credentials|permissions:|GITHUB_TOKEN|git ' .github/workflows || true

echo
echo "== local composite actions mentioning checkout/default credentials =="
fd -e yml -e yaml . .github -d 3 -x sh -c 'echo "--- $1"; rg -n "actions/checkout|persist-credentials|permissions|GITHUB_TOKEN|git " "$1" || true' sh {}

Repository: GetStream/react-native-webrtc

Length of output: 382


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== ios_ci.yml with awk line numbers =="
awk '{printf "%6d  %s\n", NR, $0}' .github/workflows/ios_ci.yml | sed -n '1,240p'

echo
echo "== relevant permissions and checkout usage across workflows =="
python3 - <<'PY'
from pathlib import Path
for p in Path('.github/workflows').glob('*.yml'):
    print(f"--- {p} ---")
    for i, line in enumerate(p.read_text().splitlines(), 1):
        if any(k in line for k in ['permissions:', 'actions/checkout', 'persist-credentials', 'GITHUB_TOKEN', 'git ']):
            print(f"{i}: {line}")
PY

Repository: GetStream/react-native-webrtc

Length of output: 2912


Disable checkout credential persistence for this build job.

This job only needs read access to check out the repository, but it then runs repository-controlled npm install, pod install, and Xcode build commands. The default persisted checkout token would unnecessarily remain available to those later steps; set persist-credentials: false unless a later step requires authenticated Git operations.

🧰 Tools
🪛 zizmor (1.26.1)

[warning] 20-20: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ios_ci.yml at line 20, Update the actions/checkout step in
the iOS build job to set persist-credentials to false, ensuring the checkout
token is not retained for subsequent npm, CocoaPods, or Xcode commands. Do not
add authenticated Git operations or other workflow changes.

Source: Linters/SAST tools

The repo has shipped alphas continuously (the 'alpha' dist-tag currently points
at 145.1.0-alpha.1, with 10 published 145.x alphas), but .releaserc.json only
defined 'beta'. Add an 'alpha' prerelease branch so that channel keeps working,
and allow it through the release workflow's branch guard.

Verified via semantic-release's own lib/branches/normalize.js: 'alpha' resolves
to channel="alpha" prerelease="alpha", matching the existing dist-tag.
The Release workflow has no channel input; the branch it is dispatched from
selects the channel. That was only recorded in the PR description, so document
the branch -> version -> dist-tag mapping, the dry_run option, and the
Conventional Commits rules in the README.
25.0.8 is the current latest; the declared floor already resolved to it, so this
only makes the intent explicit. No transitive changes (lockfile churn is the
single range line).
Two fixes to release.yml:

- Declaring any scope in 'permissions' sets every undeclared scope to 'none',
  so GITHUB_TOKEN had issues: none / pull-requests: none. @semantic-release/github
  runs its 'success' step after publishing and posts a comment, adds the
  'released' label, and closes referenced issues -- all issues/PR writes, whose
  failures it rethrows. Without these scopes the first release would publish to
  npm, push the tag and release commit, and only then fail the job with 403s.
  Dry runs cannot catch this: they skip publish/success entirely.

- Add a concurrency group so two dispatches cannot both compute the same version
  and race on the tag, the branch push, and the publish. cancel-in-progress is
  false on purpose: the tag and release commit are pushed before publish, so
  cancelling mid-run can leave the repo tagged with nothing on npm.
@oliverlaz
oliverlaz merged commit c961d1e into master Jul 28, 2026
5 of 6 checks passed
@oliverlaz
oliverlaz deleted the ci/automated-release-workflow branch July 28, 2026 14:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants