Release Automation
Overview
Use this skill for the recurring release flow that updates versionCode to today's date, verifies the build, syncs the develop -> main release PR, and triggers deployment.
This is a docs-only skill. Follow the mode that matches the risk level you want.
Repo defaults
- Working branch:
develop - Base branch:
main - Version file:
gradle/libs.versions.toml - Version key:
versionCode - Default verification:
./gradlew :composeApp:assemble - Workflow:
.github/workflows/app_deploy.yml - Workflow dispatch name:
app_deploy.yml - Release label:
release - Assignee:
keelim
Modes
1. dry-run
Read-only inspection only. Do not modify files, commits, PRs, or workflows.
Run these checks and report them with Would ... wording:
date +%Y%m%d
rg -n '^versionCode = ' gradle/libs.versions.toml
git branch --show-current
gh pr list --state all --base main --limit 10 --json number,title,headRefName,baseRefName,assignees,labels,body,createdAt
gh pr list --state open --base main --head develop --json number,title,body,labels,assignees,url
gh workflow view app_deploy.yml
Then summarize like:
- Would update
gradle/libs.versions.tomlto today's date - Would run
./gradlew :composeApp:assemble - Would update or create
develop -> mainPR - Would dispatch
app_deploy.ymlondevelop
2. confirm
Same flow as execute, but stop before each risky write:
- file update
- git commit
- git push
- PR edit/create
- workflow dispatch
Use short confirmations such as:
Update versionCode to 20260308?Commit and push develop?Edit release PR metadata?Dispatch app_deploy.yml on develop?
3. execute
Perform the full release flow end to end.
Execute flow
Step 1: calculate today's release version
date +%Y%m%d
Step 2: update versionCode
sed -i '' 's/^versionCode = .*/versionCode = "YYYYMMDD"/' gradle/libs.versions.toml
If GNU sed is in use, adapt the in-place flag accordingly.
Step 3: verify before any git/GitHub mutation
./gradlew :composeApp:assemble
If verification fails, stop immediately.
Step 4: commit and push
git add gradle/libs.versions.toml
git commit -m "chore: update versionCode to YYYYMMDD"
git push origin develop
Step 5: inspect recent release PR conventions
gh pr list --state all --base main --limit 10 --json number,title,headRefName,baseRefName,assignees,labels,body,createdAt
Prefer the latest develop -> main release PR pattern for:
- title format
- body structure
- release label
- assignee
Step 6: update or create the release PR
Check whether an open develop -> main PR already exists:
gh pr list --state open --base main --head develop --json number,title,body,labels,assignees,url
If one exists, update it:
gh pr edit <number> \
--title "release/YYMMDD" \
--body $'## Summary\n- update release versionCode to YYYYMMDD\n- dispatch app_deploy workflow on develop\n\n## Verification\n- ./gradlew :composeApp:assemble' \
--add-label release \
--add-assignee keelim
If none exists, create one:
gh pr create \
--base main \
--head develop \
--title "release/YYMMDD" \
--body $'## Summary\n- update release versionCode to YYYYMMDD\n- dispatch app_deploy workflow on develop\n\n## Verification\n- ./gradlew :composeApp:assemble'
After creation, add the label and assignee if needed.
Step 7: dispatch deployment workflow
gh workflow run app_deploy.yml --ref develop
Step 8: capture run status
gh run list --workflow app_deploy.yml --branch develop --limit 1
gh run view <run-id> --json status,conclusion,url,workflowName,headBranch,event,createdAt
Report format
Always end with:
- release version used
- verification command and result
- commit hash
- PR number and URL
- workflow run URL
- current workflow status
Common mistakes
- Updating
versionCodebefore confirming the active branch isdevelop - Continuing after a failed build
- Creating duplicate release PRs when an open
develop -> mainPR already exists - Forgetting to reapply label/assignee when editing PR metadata
- Claiming deployment started without checking the Actions run URL
Quick reference
# release date
date +%Y%m%d
# verify
./gradlew :composeApp:assemble
# open release PR
gh pr list --state open --base main --head develop
# dispatch deploy
gh workflow run app_deploy.yml --ref develop