iBrowe Pull Request Uplift System Guide
A developer-friendly reference for managing pull request uplifts across iBrowe release channels (Nightly → Beta → Release). Below is a restructured and rewritten overview with helpful command-line automation tips and implementation insights.
📌 Table of Contents
- What Are Uplifts?
- Automation with
uplift.py
- Using Jenkins
- Running Locally
- Getting Started
- Uplift Workflow Summary
- Example Commands
- Advanced CLI Usage
- Getting Help
- Command-Line Reference
- Helpful Notes
- Internal Implementation Notes
- Known Issues & Improvements
- Related Docs
🚀 What Are Uplifts?
In iBrowe, development happens on the main
branch (Nightly). When a pull request (PR) is approved and merged there, it may also need to be ported (“uplifted”) to other channels like beta
or release
.
- PR authors are responsible for submitting uplifts.
- CI must pass before merging.
- The PR author must confirm the fix works in Nightly before uplifting.
- Stalled uplifts should be nudged by the requester.
- Anyone may merge, but uplift owners are responsible by default.
🤖 Automating Uplifts with uplift.py
Use the provided ./script/uplift.py
to automatically generate uplift PRs for Beta/Release branches.
Note: Only works for clean cherry-picks. Merge conflicts must be resolved manually.
GitHub Token Required:
- Generate one at: https://github.com/settings/tokens
- Save to
~/.npmrc
as:
IBROWE\_GITHUB\_TOKEN=your\_token\_here
Or pass it inline:
IBROWE\_GITHUB\_TOKEN=... ./script/uplift.py --options
🛠️ Jenkins-Based Uplifts (Preferred Method)
- Visit:
https://ci.ibrowe.com/job/ibrowe-core-create-uplift-prs/
- Click Build with Parameters
- Enter the merged PR number
- Select target channels:
beta
,release
, or both - Hit Build
✨ Jenkins will auto-create the required PRs, no CLI needed.
💻 Running Locally
If Jenkins isn’t your flavor, run the script yourself:
./script/uplift.py --uplift-to=release --uplift-using-pr=1632
This will:
- Cherry-pick commits
- Push new branches
- Create new PRs via GitHub API
- Open them in your browser
📋 Uplift Workflow Summary
- Diff local branch against master
- Create uplift branches
- Cherry-pick commits
- Push to remote
- Create GitHub PRs for each channel
- Open PRs in browser
🧪 Example Commands
Basic uplift to Release:
./script/uplift.py --uplift-to=release --uplift-using-pr=1632
Dry run (no PRs created):
./script/uplift.py --uplift-to=beta --uplift-using-pr=1632 --dry-run
Verbose output (GitHub API responses):
./script/uplift.py --verbose --uplift-to=beta --uplift-using-pr=1632
With owners:
./script/uplift.py --owners=dev1,dev2 --uplift-to=release --uplift-using-pr=1632
Custom title:
./script/uplift.py --title="Fix crash on startup" --uplift-to=release --uplift-using-pr=1632
Apply labels:
./script/uplift.py --labels=bug,ui --uplift-to=release --uplift-using-pr=1632
🆘 Getting Help
- Ask in Slack:
#ibrowe-core
,#ci-support
- Ping:
@clifton
(Slack handle)
📌 Command-Line Reference
./script/uplift.py --help
Key flags:
--uplift-to
: Target branch (beta
,release
)--uplift-using-pr
: Required PR number--owners
: GitHub usernames--labels
: Comma-separated list--dry-run
: Simulate without creating PRs--verbose
: Print full GitHub API output--start-from
: Specify base (e.g.,beta
)--title
: Custom PR title
📝 Helpful Notes
- Version is inferred from
package.json
- Milestone assignment is automatic
- Labels and titles can be customized
- GitHub token validation ensures correct usernames
- Dry runs are ideal for previewing results
🔧 Internal Implementation
-
Script available since iBrowe v0.63.x
-
Key PRs:
⚠️ Known Issues & Enhancements
- Should replicate “skip labels” from original PR
- Should support unmerged source PRs
- Should restore deleted branches automatically
- Unicode handling is limited
📚 Related Documentation
- [Triage Guidelines]
- [CI / PR Builder Overview]
- [iBrowe Release Schedule]
- [Protocol Schemes in iBrowe]
- [Android Release Checklist]
- [Components System]
Adapted and rebranded from the original Brave documentation: https://github.com/brave/brave-browser.wiki.git Source: uplift.py