-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
148 lines (133 loc) · 6 KB
/
runway_android_rc_workflow.yml
File metadata and controls
148 lines (133 loc) · 6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
##############################################################################################
#
# Runway Android RC Workflow
#
# Triggered from Runway to either:
# - Push an OTA update (when OTA_VERSION in app/constants/ota.ts line 9 is bumped), or
# - Build the mobile app (when there is no OTA version bump).
#
# When triggering workflow_dispatch, select the release branch (e.g. release/7.71.0).
#
##############################################################################################
name: Runway Android RC
on:
workflow_dispatch:
inputs:
ref:
description: 'Optional git ref (branch) to run against. Defaults to the branch selected in the UI.'
required: false
type: string
permissions:
contents: write # required by build.yml (update-build-version job)
pull-requests: read
actions: write
id-token: write # required by build.yml
jobs:
decide:
name: Check OTA version and resolve inputs
runs-on: ubuntu-latest
outputs:
ota_bump: ${{ steps.decide.outputs.ota_bump }}
base_ref: ${{ steps.decide.outputs.base_ref }}
ota_version: ${{ steps.decide.outputs.ota_version }}
pr_number: ${{ steps.resolve-pr.outputs.pr_number }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ inputs.ref || github.ref }}
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
- name: Resolve PR number for current branch
id: resolve-pr
run: |
BRANCH="${{ inputs.ref || github.ref_name }}"
# Strip refs/heads/ if present
BRANCH="${BRANCH#refs/heads/}"
echo "Resolving PR for branch: $BRANCH (repo: $GITHUB_REPOSITORY)"
# Try same-repo head first, then owner:branch (required by API when listing pulls)
PR_NUMBER=$(gh pr list --repo "$GITHUB_REPOSITORY" --head "$BRANCH" --json number --jq '.[0].number' 2>/dev/null || echo "")
if [[ -z "$PR_NUMBER" ]]; then
PR_NUMBER=$(gh pr list --repo "$GITHUB_REPOSITORY" --head "$GITHUB_REPOSITORY_OWNER:$BRANCH" --json number --jq '.[0].number' 2>/dev/null || echo "")
fi
echo "pr_number=${PR_NUMBER}" >> "$GITHUB_OUTPUT"
echo "Branch: $BRANCH, PR number: ${PR_NUMBER:-none}"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Decide OTA vs build
id: decide
run: |
set -e
# Version from package.json (e.g. 7.70.0) → base ref for OTA workflow is always v{VERSION}
VERSION=$(node -p "require('./package.json').version")
RELEASE_TAG="v${VERSION}"
echo "base_ref=${RELEASE_TAG}" >> "$GITHUB_OUTPUT"
# Extract OTA_VERSION from line 9 (format: export const OTA_VERSION: string = 'vX.Y.Z';)
extract_ota() { sed -n '9p' "$1" | sed "s/.*'\\([^']*\\)'.*/\1/"; }
# OTA_VERSION from current ref
CURRENT_OTA=$(extract_ota app/constants/ota.ts)
echo "ota_version=${CURRENT_OTA}" >> "$GITHUB_OUTPUT"
# Ref to compare against for detecting bump: use release tag if it exists, else main
if git rev-parse "$RELEASE_TAG" >/dev/null 2>&1; then
COMPARE_REF="$RELEASE_TAG"
BASE_OTA=$(git show "${COMPARE_REF}:app/constants/ota.ts" 2>/dev/null | sed -n '9p' | sed "s/.*'\\([^']*\\)'.*/\1/" || echo "")
else
COMPARE_REF="main"
BASE_OTA=$(git show "origin/main:app/constants/ota.ts" 2>/dev/null | sed -n '9p' | sed "s/.*'\\([^']*\\)'.*/\1/" || echo "")
echo "Release tag ${RELEASE_TAG} not found; comparing OTA_VERSION to ${COMPARE_REF} to detect bump"
fi
if [[ -n "$BASE_OTA" && "$CURRENT_OTA" != "$BASE_OTA" ]]; then
echo "ota_bump=true" >> "$GITHUB_OUTPUT"
echo "OTA_VERSION changed: $BASE_OTA -> $CURRENT_OTA → will trigger OTA update"
else
echo "ota_bump=false" >> "$GITHUB_OUTPUT"
echo "No OTA version bump (base: $BASE_OTA, current: $CURRENT_OTA) → will trigger build"
fi
trigger-ota:
name: Trigger OTA update
needs: decide
if: needs.decide.outputs.ota_bump == 'true'
runs-on: ubuntu-latest
steps:
- name: Validate PR number
run: |
if [[ -z "${{ needs.decide.outputs.pr_number }}" ]]; then
echo "::error::No PR found for this branch. OTA update requires a PR number."
echo "::error::If you ran the workflow manually (workflow_dispatch), select your release branch in the 'Use workflow from' dropdown (e.g. release/7.71.0), not main."
exit 1
fi
echo "Using PR #${{ needs.decide.outputs.pr_number }}"
- name: Trigger Push OTA Update workflow
uses: actions/github-script@v6
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const ref = '${{ inputs.ref || github.ref_name }}'.replace(/^refs\/heads\//, '');
await github.rest.actions.createWorkflowDispatch({
owner: context.repo.owner,
repo: context.repo.repo,
workflow_id: 'push-eas-update.yml',
ref: ref,
inputs: {
pr_number: '${{ needs.decide.outputs.pr_number }}',
base_branch: '${{ needs.decide.outputs.base_ref }}',
message: '${{ needs.decide.outputs.ota_version }}',
channel: 'rc',
platform: 'android'
}
});
core.notice(`Triggered Push OTA Update on ${ref} (PR #${{ needs.decide.outputs.pr_number }}, base: ${{ needs.decide.outputs.base_ref }}, message: ${{ needs.decide.outputs.ota_version }})`);
trigger-build:
name: Trigger build mobile app
needs: decide
if: needs.decide.outputs.ota_bump != 'true'
uses: ./.github/workflows/build.yml
with:
build_name: main-rc
platform: android
skip_version_bump: false
ref: ${{ inputs.ref || github.ref_name }}
secrets: inherit