Skip to content

Commit e3b0359

Browse files
committed
Enhance Capacitor build workflows by adding version_code handling and improving upload status management
1 parent 3e0139b commit e3b0359

2 files changed

Lines changed: 72 additions & 24 deletions

File tree

.github/workflows/capacitor-app-build.yml

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ jobs:
3333
should-build: ${{ steps.check-update.outputs.should-build }}
3434
tag: ${{ steps.check-update.outputs.tag }}
3535
version: ${{ steps.check-update.outputs.version }}
36+
version_code: ${{ steps.check-update.outputs.version_code }}
3637

3738
steps:
3839
- name: 🛎️ Checkout
@@ -47,6 +48,11 @@ jobs:
4748
4849
SEMVER_TAG_REGEX='^v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$' # vX.Y.Z
4950
SEMVER_VER_REGEX='^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$' # X.Y.Z
51+
52+
SHOULD_BUILD="false"
53+
TAG=""
54+
VERSION=""
55+
VERSION_CODE=""
5056
5157
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
5258
# 수동 실행인 경우
@@ -57,6 +63,7 @@ jobs:
5763
exit 1
5864
fi
5965
VERSION="${TAG#v}"
66+
SHOULD_BUILD="true"
6067
echo "should-build=true" >> $GITHUB_OUTPUT
6168
echo "tag=$TAG" >> $GITHUB_OUTPUT
6269
echo "version=$VERSION" >> $GITHUB_OUTPUT
@@ -66,12 +73,17 @@ jobs:
6673
RAW_VER="${{ github.event.client_payload.new_version }}"
6774
6875
if [ -n "$RAW_TAG" ] && [[ "$RAW_TAG" =~ $SEMVER_TAG_REGEX ]]; then
76+
TAG="$RAW_TAG"
6977
VERSION="${RAW_TAG#v}"
78+
SHOULD_BUILD="true"
7079
echo "should-build=true" >> "$GITHUB_OUTPUT"
7180
echo "tag=$RAW_TAG" >> "$GITHUB_OUTPUT"
7281
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
7382
echo "✅ repository_dispatch tag: $RAW_TAG"
7483
elif [ -n "$RAW_VER" ] && [[ "$RAW_VER" =~ $SEMVER_VER_REGEX ]]; then
84+
TAG="$RAW_TAG"
85+
VERSION="${RAW_TAG#v}"
86+
SHOULD_BUILD="true"
7587
echo "should-build=true" >> "$GITHUB_OUTPUT"
7688
echo "tag=v$RAW_VER" >> "$GITHUB_OUTPUT"
7789
echo "version=$RAW_VER" >> "$GITHUB_OUTPUT"
@@ -81,6 +93,33 @@ jobs:
8193
echo "📝 repository_dispatch payload에 유효한 tag/version이 없습니다. 빌드 생략"
8294
fi
8395
fi
96+
97+
echo "should-build=$SHOULD_BUILD" >> "$GITHUB_OUTPUT"
98+
99+
if [ "$SHOULD_BUILD" = "true" ]; then
100+
# VERSION_CODE 생성 (v0.1.15 -> 000115 -> 115)
101+
IFS='.' read -r MAJOR MINOR PATCH <<< "$VERSION"
102+
103+
# 각 파트 0~99 제한 (2자리 스키마 고정)
104+
if [ "$MAJOR" -gt 99 ] || [ "$MINOR" -gt 99 ] || [ "$PATCH" -gt 99 ]; then
105+
echo "❌ VERSION_CODE 생성 실패: major/minor/patch는 0~99 범위여야 함 (현재: $VERSION)"
106+
exit 1
107+
fi
108+
109+
PADDED="$(printf "%02d%02d%02d" "$MAJOR" "$MINOR" "$PATCH")"
110+
VERSION_CODE="$(echo "$PADDED" | sed 's/^0*//')"
111+
if [ -z "$VERSION_CODE" ]; then
112+
VERSION_CODE="1"
113+
fi
114+
115+
echo "tag=$TAG" >> "$GITHUB_OUTPUT"
116+
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
117+
echo "version_code=$VERSION_CODE" >> "$GITHUB_OUTPUT"
118+
119+
echo "✅ TAG=$TAG"
120+
echo "✅ VERSION=$VERSION"
121+
echo "✅ VERSION_CODE=$VERSION_CODE (from $PADDED)"
122+
fi
84123
85124
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
86125
# Job 2: Next.js 빌드
@@ -175,7 +214,7 @@ jobs:
175214
- name: 🏗️ Build APK
176215
env:
177216
VERSION_NAME: ${{ needs.check-version-update.outputs.version }}
178-
VERSION_CODE: ${{ github.run_number }}
217+
VERSION_CODE: ${{ needs.check-version-update.outputs.version_code }}
179218
KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
180219
KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
181220
KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
@@ -191,7 +230,7 @@ jobs:
191230
- name: 🏗️ Build AAB
192231
env:
193232
VERSION_NAME: ${{ needs.check-version-update.outputs.version }}
194-
VERSION_CODE: ${{ github.run_number }}
233+
VERSION_CODE: ${{ needs.check-version-update.outputs.version_code }}
195234
KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
196235
KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
197236
KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
@@ -283,18 +322,18 @@ jobs:
283322
shell: bash
284323
run: |
285324
set -euo pipefail
286-
325+
287326
xcodebuild -version
288327
xcodebuild -showsdks
289-
328+
290329
# ✅ (추가) iOS 26 SDK 존재 여부 강제 검증
291330
if ! xcodebuild -showsdks | grep -q "iphoneos26"; then
292331
echo "❌ iOS 26 SDK not found on this runner."
293332
echo "Installed Xcode apps:"
294333
ls -d /Applications/Xcode*.app 2>/dev/null || true
295334
exit 1
296335
fi
297-
336+
298337
echo "✅ iOS 26 SDK detected."
299338
300339
- name: 📥 Download web build

.github/workflows/capacitor-app-upload.yml

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ permissions:
1515
contents: read
1616

1717
concurrency:
18-
group: capacitor-upload-${{ github.event.client_payload.tag || github.event.inputs.tag }}
18+
group: capacitor-upload-${{ github.event.client_payload.run_id || github.run_id }}-${{ github.event.client_payload.tag || github.event.inputs.tag }}
1919
cancel-in-progress: false
2020

2121
env:
@@ -33,6 +33,10 @@ env:
3333
# Google Play 업로드 트랙: internal / alpha / beta / production
3434
GOOGLE_PLAY_TRACK: "internal"
3535

36+
# draft 앱이면 completed 불가 -> 일단 draft로 고정
37+
# 앱이 draft 상태를 벗어나면 "completed"로 변경하여 내부 테스트 '출시'까지 자동화 가능
38+
GOOGLE_PLAY_RELEASE_STATUS: "completed"
39+
3640
# 표시용 프로젝트명
3741
PROJECT_DISPLAY_NAME: "AppName"
3842

@@ -136,7 +140,7 @@ jobs:
136140
releaseFiles: ${{ env.AAB_PATH }}
137141
track: ${{ env.GOOGLE_PLAY_TRACK }}
138142
releaseName: ${{ needs.resolve_inputs.outputs.release_name }}
139-
status: completed
143+
status: ${{ env.GOOGLE_PLAY_RELEASE_STATUS }}
140144

141145
upload_ios:
142146
name: Upload iOS (IPA) to TestFlight
@@ -207,29 +211,34 @@ jobs:
207211
KEY_DIR="$RUNNER_TEMP/appstoreconnect"
208212
mkdir -p "$KEY_DIR"
209213
210-
P8_PATH="$KEY_DIR/AuthKey_${ASC_KEY_ID}.p8"
211-
export P8_PATH # python에서 os.environ로 읽도록 환경변수로 export
214+
API_KEY_INFO="$KEY_DIR/api_key.json"
215+
export API_KEY_INFO
212216
213-
# macOS/Linux base64 옵션 차이 제거를 위해 python으로 디코딩
217+
# api_key_path(JSON 파일)는 "key"(p8 내용) 필드를 요구함.
218+
# key_filepath/key_content는 JSON 키로는 유효하지 않음. :contentReference[oaicite:6]{index=6}
214219
python3 - <<'PY'
215-
import base64, os
216-
p8_path = os.environ["P8_PATH"]
217-
data = os.environ["ASC_PRIVATE_KEY_BASE64"].strip()
218-
with open(p8_path, "wb") as f:
219-
f.write(base64.b64decode(data))
220-
PY
220+
import base64, json, os
221+
222+
key_id = os.environ["ASC_KEY_ID"].strip()
223+
issuer_id = os.environ["ASC_ISSUER_ID"].strip()
224+
key_b64 = os.environ["ASC_PRIVATE_KEY_BASE64"].strip()
221225
222-
API_KEY_INFO="$KEY_DIR/api_key_info.json"
223-
cat > "$API_KEY_INFO" <<EOF
224-
{
225-
"key_id": "${ASC_KEY_ID}",
226-
"issuer_id": "${ASC_ISSUER_ID}",
227-
"key_filepath": "${P8_PATH}"
226+
key_text = base64.b64decode(key_b64).decode("utf-8").strip()
227+
228+
payload = {
229+
"key_id": key_id,
230+
"issuer_id": issuer_id,
231+
"key": key_text,
232+
"in_house": False
228233
}
229-
EOF
234+
235+
path = os.environ["API_KEY_INFO"]
236+
with open(path, "w", encoding="utf-8") as f:
237+
json.dump(payload, f)
238+
PY
230239
231240
echo "ASC_API_KEY_INFO=$API_KEY_INFO" >> "$GITHUB_ENV"
232-
echo "✅ App Store Connect API key files ready"
241+
echo "✅ App Store Connect API key JSON ready: $API_KEY_INFO"
233242
234243
- name: 🚀 Upload to TestFlight (pilot)
235244
env:

0 commit comments

Comments
 (0)