- Introduction
- Git Conventions
- Development Process
- Hotfix Process
- Release Process
- React Native Specific Steps
- Version Management
- Build Generation
- Store Deployment
This document outlines the development workflow, release process, and deployment procedures for the React Native Atomic Design project. Following these processes ensures consistent code quality, smooth releases, and reliable deployments.
Purpose:
- Standardize development workflow
- Ensure code quality through review processes
- Maintain consistent versioning across platforms
- Streamline release and deployment procedures
- Document React Native specific build and deployment steps
The project follows a Git Flow-inspired branching strategy:
master(ormain): Production-ready code. Always deployable.develop: Integration branch for development. Latest development changes.
feature/*: New features or enhancementsbugfix/*: Bug fixes for developmentrelease/${releaseName}: Release preparation brancheshotfix/*: Critical production fixes
Feature Branches:
feature/add-search-functionality
feature/implement-dark-mode
feature/repository-detail-screen
Bugfix Branches:
bugfix/fix-loading-state
bugfix/correct-api-error-handling
bugfix/resolve-memory-leak
Release Branches:
release/v1.0.0
release/v1.1.0
release/v2.0.0
Hotfix Branches:
hotfix/critical-crash-fix
hotfix/security-patch
hotfix/urgent-api-fix
Follow the Conventional Commits specification:
<type>(<scope>): <subject>
<body>
<footer>
Types:
feat: New featurefix: Bug fixdocs: Documentation changesstyle: Code style changes (formatting, missing semicolons, etc.)refactor: Code refactoringtest: Adding or updating testschore: Maintenance tasks (dependencies, build config, etc.)
Examples:
feat(home): add pull-to-refresh functionality
fix(api): handle network timeout errors
docs(readme): update installation instructions
refactor(components): extract common card styles
chore(deps): update axios to latest versionGuidelines:
- Use present tense ("add" not "added")
- Use imperative mood ("move" not "moves")
- First line should be 50 characters or less
- Reference issues in footer:
Closes #123
Before merging:
- ✅ Code follows Code Conventions
- ✅ All tests pass (
yarn test) - ✅ Linting passes (
yarn lint) - ✅ No TypeScript errors
- ✅ PR description is clear and complete
- ✅ At least one code review approval
- ✅ Branch is up to date with target branch
PR Template:
## Description
Brief description of changes
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Testing
- [ ] Unit tests added/updated
- [ ] Manual testing completed
- [ ] Tested on iOS
- [ ] Tested on Android
## Checklist
- [ ] Code follows conventions
- [ ] Self-review completed
- [ ] Comments added for complex logic
- [ ] Documentation updatedFor small features, bug fixes, or improvements:
-
Create Feature Branch:
git checkout develop git pull origin develop git checkout -b feature/task-name
-
Develop and Commit:
# Make changes git add . git commit -m "feat(scope): description"
-
Keep Branch Updated:
git checkout develop git pull origin develop git checkout feature/task-name git rebase develop
-
Create Pull Request:
- Target:
develop - Fill out PR template
- Request review
- Address review comments
- Target:
-
Merge:
- After approval, merge to
develop - Delete feature branch
- After approval, merge to
For large features requiring multiple PRs:
-
Create Feature Branch:
git checkout develop git checkout -b feature/large-feature
-
Break into Sub-tasks:
- Create sub-branches from feature branch
- Each sub-task should be < 500 LOC
- Merge sub-tasks into feature branch
# Sub-task 1 git checkout -b feature/large-feature/subtask-1 # ... work and PR to feature/large-feature # Sub-task 2 git checkout feature/large-feature git checkout -b feature/large-feature/subtask-2 # ... work and PR to feature/large-feature
-
Final Integration:
- Merge feature branch to
developwhen complete - Ensure all sub-tasks are integrated and tested
- Merge feature branch to
-
Before Creating PR:
# Ensure branch is up to date git checkout develop git pull origin develop git checkout feature/your-branch git rebase develop # Run tests and linting yarn test yarn lint
-
Create PR:
- Push branch to remote
- Create PR on GitHub/GitLab
- Fill out PR template
- Add reviewers
- Link related issues
-
Review Process:
- Address review comments
- Update PR with fixes
- Request re-review if needed
- Wait for approval
-
Merge:
- Squash and merge (preferred for feature branches)
- Or rebase and merge (for cleaner history)
- Delete branch after merge
Use Rebase When:
- Updating feature branch with latest
develop - Cleaning up commit history before merge
- Working on feature branches
git checkout feature/your-branch
git rebase developUse Merge When:
- Merging feature branch to
develop - Merging release branch to
master - Preserving branch history
git checkout develop
git merge feature/your-branchAvoid:
- Rebasing shared/public branches
- Rebasing after PR is created (unless coordinated)
If using dev-notes.txt for tracking:
- Keep notes in branch-specific files
- Document breaking changes
- Note configuration changes
- List dependencies added/removed
- Include migration steps if needed
Hotfixes are for critical production issues that need immediate fixes.
-
Create Hotfix Branch:
git checkout master git pull origin master git checkout -b hotfix/critical-issue-description
-
Fix the Issue:
- Make minimal changes to fix the issue
- Add tests if applicable
- Update documentation if needed
-
Commit:
git add . git commit -m "fix(scope): critical issue description"
-
Update Version in package.json:
{ "version": "1.0.1" // Patch version increment } -
Update Version in app.json:
{ "version": "1.0.1" } -
Update iOS Version:
- Open
ios/codeSampleReactNative.xcodeprojin Xcode - Update
CFBundleShortVersionStringin Info.plist - Update
CFBundleVersion(build number)
- Open
-
Update Android Version:
- Edit
android/app/build.gradle:
android { defaultConfig { versionCode 2 // Increment versionName "1.0.1" } }
- Edit
-
Archive in Xcode:
# Open workspace open ios/codeSampleReactNative.xcworkspace- Select "Any iOS Device" or "Generic iOS Device"
- Product → Archive
- Wait for archive to complete
-
Export IPA:
- In Organizer, select archive
- Click "Distribute App"
- Choose distribution method (App Store, Ad Hoc, Enterprise)
- Follow prompts to export
.ipafile
-
Alternative: Command Line (if Fastlane configured):
cd ios fastlane build
-
Generate Release AAB:
cd android ./gradlew bundleRelease- Output:
android/app/build/outputs/bundle/release/app-release.aab
- Output:
-
Generate APK (if needed):
./gradlew assembleRelease
- Output:
android/app/build/outputs/apk/release/app-release.apk
- Output:
-
Internal Testing:
- Test on physical devices (iOS and Android)
- Test critical paths
- Verify fix resolves the issue
- Check for regressions
-
QA Review:
- Submit build to QA team
- Provide test cases
- Document changes in release notes
- Wait for QA approval
-
Staging Testing (if applicable):
- Deploy to TestFlight (iOS) or Internal Testing (Android)
- Limited user testing
- Collect feedback
-
Upload to App Store Connect:
- Use Xcode Organizer or Transporter app
- Upload
.ipafile - Wait for processing
-
Submit for Review:
- Go to App Store Connect
- Select app version
- Fill out "What's New" section
- Submit for review
- Monitor review status
-
Upload to Play Console:
- Go to Play Console
- Select app
- Create new release
- Upload
.aabfile - Fill release notes
-
Review and Rollout:
- Review release details
- Start with internal testing track
- Promote to production after validation
- Consider gradual rollout (10% → 50% → 100%)
-
Create Git Tag:
git checkout master git pull origin master git tag -a v1.0.1 -m "Hotfix: Critical issue fix" git push origin v1.0.1 -
Create GitHub Release:
- Go to Releases page
- Click "Draft a new release"
- Select tag
- Add release notes:
## Hotfix v1.0.1 ### Fixed - Critical crash on repository list load - API timeout handling ### Changed - Updated error messages for better UX
-
Merge to Master:
git checkout master git merge hotfix/critical-issue-description git push origin master
-
Merge to Develop:
git checkout develop git merge hotfix/critical-issue-description git push origin develop
-
Delete Hotfix Branch:
git branch -d hotfix/critical-issue-description git push origin --delete hotfix/critical-issue-description
-
Create Release Branch:
git checkout develop git pull origin develop git checkout -b release/v1.1.0 git push origin release/v1.1.0
-
Purpose:
- Finalize release
- Bug fixes only (no new features)
- Version updates
- Documentation updates
Update versions in all required files:
-
package.json:
{ "version": "1.1.0" } -
app.json:
{ "version": "1.1.0" } -
iOS (Info.plist):
CFBundleShortVersionString: "1.1.0"CFBundleVersion: Increment build number
-
Android (build.gradle):
android { defaultConfig { versionCode 3 // Increment versionName "1.1.0" } }
Follow the same build process as hotfixes:
-
iOS:
- Archive in Xcode
- Export
.ipa - Upload to App Store Connect
-
Android:
- Generate release AAB
- Upload to Play Console
-
Pre-Release Testing:
- Full regression testing
- Test on multiple devices
- Test on both platforms
- Performance testing
- Security review
-
Release Candidate:
- Tag release candidate:
v1.1.0-rc1 - Distribute to QA team
- Collect and address feedback
- Create new RC if needed
- Tag release candidate:
-
Final Approval:
- QA sign-off
- Product owner approval
- Technical lead approval
-
Prepare for Submission:
- Complete App Store Connect metadata
- Prepare screenshots
- Write release notes
- Set pricing and availability
-
Submit for Review:
- Submit build for review
- Monitor review status
- Respond to review feedback if needed
-
Release:
- Manual release after approval
- Or automatic release on approval
- Monitor crash reports and reviews
-
Prepare Release:
- Complete store listing
- Prepare screenshots and graphics
- Write release notes
- Set content rating
-
Rollout Strategy:
- Start with internal testing
- Move to closed testing (beta)
- Gradual production rollout:
- 10% of users (monitor for 24-48 hours)
- 50% of users (monitor for 24-48 hours)
- 100% rollout
-
Monitor:
- Crash reports
- User reviews
- Performance metrics
- Rollback if critical issues found
-
Create Release Tag:
git checkout release/v1.1.0 git tag -a v1.1.0 -m "Release v1.1.0" git push origin v1.1.0 -
Release Notes Template:
# Release v1.1.0 ## 🎉 New Features - Added repository search functionality - Implemented pull-to-refresh - Added dark mode support ## 🐛 Bug Fixes - Fixed memory leak in repository list - Corrected API error handling - Resolved iOS crash on app launch ## 🔧 Improvements - Improved loading states - Enhanced error messages - Performance optimizations ## 📱 Platform Updates - iOS: Minimum version iOS 15.0 - Android: Minimum API 21 ## 📦 Dependencies - Updated React Native to 0.83.1 - Updated axios to 1.13.2
-
Merge to Master:
git checkout master git merge release/v1.1.0 git push origin master
-
Merge to Develop:
git checkout develop git merge release/v1.1.0 git push origin develop
-
Delete Release Branch:
git branch -d release/v1.1.0 git push origin --delete release/v1.1.0
iOS:
# Start Metro bundler
yarn start
# Run on iOS simulator
yarn ios
# Run on specific simulator
yarn ios --simulator="iPhone 15 Pro"
# Run on connected device
yarn ios --deviceAndroid:
# Start Metro bundler
yarn start
# Run on Android emulator
yarn android
# Run on specific device
yarn android --deviceId=<device-id>
# Run on connected device
yarn android --deviceiOS:
# Clean build
cd ios
xcodebuild clean -workspace codeSampleReactNative.xcworkspace -scheme codeSampleReactNative
# Build for device (requires signing)
# Use Xcode for production buildsAndroid:
# Clean build
cd android
./gradlew clean
# Build release APK
./gradlew assembleRelease
# Build release AAB (for Play Store)
./gradlew bundleReleaseIf using EAS Build (not currently configured):
# Install EAS CLI
npm install -g eas-cli
# Configure
eas build:configure
# Build for iOS
eas build --platform ios
# Build for Android
eas build --platform android
# Build for both
eas build --platform allIf using Fastlane (not currently configured):
iOS Fastfile:
lane :build do
increment_build_number
build_app(
workspace: "codeSampleReactNative.xcworkspace",
scheme: "codeSampleReactNative"
)
end
lane :beta do
build
upload_to_testflight
endAndroid Fastfile:
lane :build do
gradle(
task: "bundle",
build_type: "Release"
)
end
lane :beta do
build
upload_to_play_store(track: "internal")
endInfo.plist:
<key>CFBundleShortVersionString</key>
<string>1.1.0</string>
<key>CFBundleVersion</key>
<string>3</string>Build Number Rules:
- Increment for each build submitted to App Store
- Can be same across hotfixes if not submitted
- Must be unique for each App Store submission
build.gradle:
android {
defaultConfig {
versionCode 3 // Integer, must increment
versionName "1.1.0" // User-facing version
}
}Version Code Rules:
- Must be unique and incrementing
- Each Play Store upload requires higher versionCode
- Can't decrease versionCode
- Use versionName for user-facing version
-
Prerequisites:
- Apple Developer account
- App Store Connect access
- Valid provisioning profiles
- Code signing certificates
-
Archive Process:
- Open
.xcworkspace(not.xcodeproj) - Select "Any iOS Device" or "Generic iOS Device"
- Product → Archive
- Wait for archive completion
- Open
-
Distribution:
- Use Organizer to distribute
- Choose App Store distribution
- Upload to App Store Connect
- Wait for processing (10-30 minutes)
-
App Store Connect:
- Select build in TestFlight or App Store
- Complete metadata if needed
- Submit for review
- Monitor review status
-
Prerequisites:
- Google Play Developer account
- Play Console access
- Signing key (keystore file)
- App signing configured
-
Signing Configuration:
android { signingConfigs { release { storeFile file("release.keystore") storePassword "password" keyAlias "release" keyPassword "password" } } buildTypes { release { signingConfig signingConfigs.release } } }
-
Build Process:
cd android ./gradlew clean ./gradlew bundleRelease -
Play Console:
- Go to Play Console
- Select app
- Create new release
- Upload AAB file
- Fill release notes
- Review and rollout
Google Play Gradual Rollout:
-
Internal Testing:
- Upload to internal testing track
- Test with internal team
- Fix critical issues
-
Closed Testing (Beta):
- Move to closed testing track
- Invite beta testers
- Collect feedback
-
Production Rollout:
- Start with 10% rollout
- Monitor for 24-48 hours
- Check crash reports and reviews
- Increase to 50% if stable
- Monitor for 24-48 hours
- Full rollout to 100%
iOS TestFlight:
- Internal testing (up to 100 testers)
- External testing (up to 10,000 testers)
- Production release after App Store approval
Post-Deployment Monitoring:
- Monitor crash reports (Firebase Crashlytics, Sentry)
- Check user reviews and ratings
- Monitor performance metrics
- Track API errors and timeouts
Rollback Procedure:
iOS:
- Can't rollback once released
- Must submit new version to fix issues
- Can pause new downloads in App Store Connect
Android:
- Can halt rollout in Play Console
- Can rollback to previous version
- Can unpublish if critical issues
Remember: Always test thoroughly before release. A well-tested release is better than a rushed one.