GitHub Release Process
Step-by-step guide to triggering releases using GitHub Actions workflows
GitHub Release Process
Our release process is fully automated via GitHub Actions dispatch workflows. Release engineers trigger workflows from the GitHub Actions UI — no manual git merges or CLI commands needed.
Who Can Trigger Releases
Only members of these teams can trigger release workflows:
release-devs— release engineersdevops— infrastructure team
Unauthorized users will be denied at the authorize job.
Release Flow Overview
Step 1: Merge to Main
Workflow: Release: Merge to Main
Location: Actions tab → Release: Merge to Main → Run workflow
This merges either develop or hotfix into main.
Inputs
| Input | Options | Description |
|---|---|---|
| Release type | feature-release / hotfix-release | Merges develop or hotfix into main |
| Dry run | true / false | Preview what would be merged without making changes |
What happens
- Validates the triggering user is in
release-devsordevops - Fetches
mainand the source branch - Merges source → main with
--no-ff - Pushes to
main - On conflict: sends Slack notification with conflicting files, aborts merge
After merge
The Merge main → develop & hotfix workflow triggers automatically on push to main. This keeps develop and hotfix in sync with main. If there's a conflict during realignment, a Slack notification is sent.
Step 2: Pre-Production (Release PR + Notes)
Workflow: Release: Pre-Production
Location: Actions tab → Release: Pre-Production → Run workflow
Restriction: Can only be triggered from the main branch
This creates (or updates) a release PR from main → production with auto-generated release notes.
Inputs
| Input | Options | Description |
|---|---|---|
| Target branch | production | Target deployment branch |
| Dry run | true / false | Show diff without creating PR |
| Notes only | true / false | Update existing PR body with latest notes (no new PR) |
| Skip AI | true / false | Skip Gemini AI-enhanced notes for faster runs |
What happens
- Pre-flight checks: verifies
mainis ahead ofproduction, warns ifdevelophas unmerged commits - Walks all commits in
production...maindiff - For each commit, finds associated PRs, extracts Jira ticket IDs from PR titles, branch names, and commit messages
- Links Jira tickets as
[EN-XXXXX](https://crelio.atlassian.net/browse/EN-XXXXX) - Optionally generates AI-enhanced release notes via Gemini (with raw fallback)
- Creates or updates a PR from
main → productionwith labels:release,production,ignore-semantic-pull-request - Requests review from
release-devsteam
Notes-only mode
If a release PR already exists, use notes_only: true to refresh the PR body with the latest notes without creating a new PR. Useful after cherry-picks or last-minute merges.
Step 3: Merge Release PR
Once QA approves the release PR on the sanity environment:
- Go to the release PR (
main → production) - Review the release notes
- Merge the PR (squash or merge commit)
After merge
The branch realignment workflows handle syncing production changes back to develop and hotfix automatically.
Step 4: Release Summary (Cross-Repo)
Workflow: Release: Summary
Repo: CrelioHealth/release-notes
Location: Actions tab → Release: Summary → Run workflow
This generates a combined release summary across all three main repos and posts it to Slack.
Inputs
| Input | Options | Description |
|---|---|---|
| Dry run | true / false | Preview summary without posting to Slack |
What happens
- Compares
production...maindiff in each repo:livehealth-frontendcrelio-applivehealthapp
- Extracts Jira ticket IDs from commits, PR titles, and branch names
- Fetches Jira issue titles from the Jira REST API
- Deduplicates tickets across repos (same EN-XXXXX in multiple repos shows once)
- Removes reverted tickets
- Posts Slack Block Kit message with:
- Numbered Jira ticket list with links
- Repo tags per ticket
- Buttons to release PRs
- User and group tags
Conflict Handling
All merge workflows send Slack Block Kit notifications on conflict. Each notification includes:
- Header with merge direction (e.g.,
hotfix → develop) - Repo link
- Source PR (last merged PR that triggered the merge)
- Target PR (last PR on the target branch)
- Who triggered it
- Conflicting files in a code block
- View Diff and Workflow Run buttons
Resolving conflicts
- Check the Slack notification for conflicting files
- Locally:
git checkout <target-branch> git merge origin/<source-branch> # Resolve conflicts git commit git push origin <target-branch> - Or create a PR from
source → targetto resolve in the GitHub UI
Automated Branch Realignment
These workflows run automatically — you don't trigger them manually:
| Trigger | Workflow | What it does |
|---|---|---|
Push to main | Merge main → develop & hotfix | Keeps develop and hotfix in sync with main |
Push to hotfix | Merge hotfix → develop | Keeps develop in sync with hotfix changes |
Both have concurrency groups to prevent race conditions when multiple PRs merge quickly.
Quick Reference
Release day checklist
- Merge to Main — trigger
Release: Merge to Main(feature-release or hotfix-release) - Wait for branch realignment to complete
- Pre-Production — trigger
Release: Pre-Production(target: production) - QA verifies on sanity environment
- Merge the release PR
- Release Summary — trigger
Release: Summaryin the release-notes repo - Verify production deployment
Workflow locations
| Workflow | Repo | Trigger |
|---|---|---|
| Release: Merge to Main | Each repo | Manual dispatch |
| Release: Pre-Production | Each repo | Manual dispatch (main branch only) |
| Merge main → develop & hotfix | Each repo | Auto on push to main |
| Merge hotfix → develop | Each repo | Auto on push to hotfix |
| Release: Summary | release-notes | Manual dispatch |
Required secrets
| Secret | Scope | Used by |
|---|---|---|
APP_ID | Org | All workflows (GitHub App auth) |
APP_PRIVATE_KEY | Org | All workflows (GitHub App auth) |
SLACK_CONFLICT_WEBHOOK_URL | Org | Conflict notifications |
GEMINI_API_KEY | Org | AI release notes |
JIRA_EMAIL | release-notes repo | Release summary |
JIRA_API_TOKEN | release-notes repo | Release summary |
SLACK_RELEASE_WEBHOOK_URL | release-notes repo | Release summary Slack post |
Required variables
| Variable | Value | Used by |
|---|---|---|
GEMINI_MODEL | gemini-3.1-pro-preview | AI release notes |
Last Updated: March 2026