-
Notifications
You must be signed in to change notification settings - Fork 68
210 lines (182 loc) · 7.67 KB
/
Copy pathfoundation-lab-testflight.yml
File metadata and controls
210 lines (182 loc) · 7.67 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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
name: Foundation Lab TestFlight
on:
push:
branches:
- main
paths:
- 'Foundation Lab/**'
- 'Foundation Lab.icon/**'
- 'FoundationLabCore/**'
- 'FoundationLab.xcodeproj/**'
- 'SampleCode.xcconfig'
- '.asc/**'
- '.github/workflows/foundation-lab-testflight.yml'
workflow_dispatch:
inputs:
upload:
description: Upload the validated archive to the external TestFlight group
required: false
type: boolean
default: false
permissions:
contents: read
concurrency:
group: foundation-lab-testflight
cancel-in-progress: false
jobs:
upload:
runs-on: macos-26
timeout-minutes: 90
env:
ASC_BYPASS_KEYCHAIN: "1"
APP_ID: ${{ vars.FOUNDATION_LAB_APP_ID }}
TESTFLIGHT_GROUP: ${{ vars.FOUNDATION_LAB_EXTERNAL_GROUP_ID }}
TARGET_BUNDLE_ID: ${{ vars.FOUNDATION_LAB_BUNDLE_ID }}
TEAM_ID: ${{ vars.FOUNDATION_LAB_TEAM_ID }}
PROFILE_NAME: ${{ vars.FOUNDATION_LAB_PROFILE_NAME }}
UPLOAD: ${{ github.event_name == 'push' || inputs.upload }}
steps:
- name: Check out repository
uses: actions/checkout@v7
- name: Select Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: '26.5'
- name: Install asc
env:
GH_TOKEN: ${{ github.token }}
run: |
ASC_VERSION="$(gh release view \
--repo rudrankriyam/App-Store-Connect-CLI \
--json tagName \
--jq .tagName)"
ASC_ASSET="asc_${ASC_VERSION}_macOS_arm64"
gh release download "$ASC_VERSION" \
--repo rudrankriyam/App-Store-Connect-CLI \
--pattern "$ASC_ASSET" \
--dir "$RUNNER_TEMP"
install -m 0755 "$RUNNER_TEMP/$ASC_ASSET" "$RUNNER_TEMP/asc"
export PATH="$RUNNER_TEMP:$PATH"
echo "$RUNNER_TEMP" >> "$GITHUB_PATH"
asc --version
asc builds next-build-number --help >/dev/null
- name: Validate repository configuration
env:
ASC_KEY_ID_SECRET: ${{ secrets.ASC_KEY_ID }}
ASC_ISSUER_ID_SECRET: ${{ secrets.ASC_ISSUER_ID }}
ASC_PRIVATE_KEY_B64_SECRET: ${{ secrets.ASC_PRIVATE_KEY_B64 }}
SIGNING_CERTIFICATE_P12_B64_SECRET: ${{ secrets.FOUNDATION_LAB_DISTRIBUTION_P12_B64 }}
SIGNING_CERTIFICATE_PASSWORD_SECRET: ${{ secrets.FOUNDATION_LAB_DISTRIBUTION_P12_PASSWORD }}
PROVISIONING_PROFILE_B64_SECRET: ${{ secrets.FOUNDATION_LAB_PROVISIONING_PROFILE_B64 }}
run: |
for key in APP_ID TESTFLIGHT_GROUP TARGET_BUNDLE_ID TEAM_ID PROFILE_NAME; do
if [ -z "${!key}" ]; then
echo "Missing required repository variable: $key" >&2
exit 1
fi
done
for key in \
ASC_KEY_ID_SECRET \
ASC_ISSUER_ID_SECRET \
ASC_PRIVATE_KEY_B64_SECRET \
SIGNING_CERTIFICATE_P12_B64_SECRET \
SIGNING_CERTIFICATE_PASSWORD_SECRET \
PROVISIONING_PROFILE_B64_SECRET; do
if [ -z "${!key}" ]; then
echo "Missing required repository secret for $key" >&2
exit 1
fi
done
- name: Materialize ASC key
env:
ASC_KEY_ID_SECRET: ${{ secrets.ASC_KEY_ID }}
ASC_ISSUER_ID_SECRET: ${{ secrets.ASC_ISSUER_ID }}
ASC_PRIVATE_KEY_B64_SECRET: ${{ secrets.ASC_PRIVATE_KEY_B64 }}
run: |
KEY_PATH="$RUNNER_TEMP/AuthKey_${ASC_KEY_ID_SECRET}.p8"
printf '%s' "$ASC_PRIVATE_KEY_B64_SECRET" | base64 --decode > "$KEY_PATH"
chmod 600 "$KEY_PATH"
{
echo "ASC_KEY_ID=$ASC_KEY_ID_SECRET"
echo "ASC_ISSUER_ID=$ASC_ISSUER_ID_SECRET"
echo "ASC_PRIVATE_KEY_PATH=$KEY_PATH"
} >> "$GITHUB_ENV"
- name: Install distribution signing assets
env:
SIGNING_CERTIFICATE_P12_B64: ${{ secrets.FOUNDATION_LAB_DISTRIBUTION_P12_B64 }}
SIGNING_CERTIFICATE_PASSWORD: ${{ secrets.FOUNDATION_LAB_DISTRIBUTION_P12_PASSWORD }}
PROVISIONING_PROFILE_B64: ${{ secrets.FOUNDATION_LAB_PROVISIONING_PROFILE_B64 }}
run: |
set -euo pipefail
CERTIFICATE_PATH="$RUNNER_TEMP/foundation-lab-distribution.p12"
PROFILE_PATH="$RUNNER_TEMP/foundation-lab.mobileprovision"
PROFILE_PLIST="$RUNNER_TEMP/foundation-lab-profile.plist"
KEYCHAIN_PATH="$RUNNER_TEMP/foundation-lab-signing.keychain-db"
KEYCHAIN_PASSWORD="$(openssl rand -base64 36)"
printf '%s' "$SIGNING_CERTIFICATE_P12_B64" | base64 --decode > "$CERTIFICATE_PATH"
printf '%s' "$PROVISIONING_PROFILE_B64" | base64 --decode > "$PROFILE_PATH"
security create-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
security set-keychain-settings -lut 21600 "$KEYCHAIN_PATH"
security unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
security import "$CERTIFICATE_PATH" \
-k "$KEYCHAIN_PATH" \
-P "$SIGNING_CERTIFICATE_PASSWORD" \
-T /usr/bin/codesign \
-T /usr/bin/security
security set-key-partition-list \
-S apple-tool:,apple:,codesign: \
-s \
-k "$KEYCHAIN_PASSWORD" \
"$KEYCHAIN_PATH"
security list-keychains -d user -s \
"$KEYCHAIN_PATH" \
"$HOME/Library/Keychains/login.keychain-db"
security cms -D -i "$PROFILE_PATH" > "$PROFILE_PLIST"
PROFILE_UUID="$(/usr/libexec/PlistBuddy -c 'Print :UUID' "$PROFILE_PLIST")"
INSTALLED_PROFILE_NAME="$(/usr/libexec/PlistBuddy -c 'Print :Name' "$PROFILE_PLIST")"
if [ "$INSTALLED_PROFILE_NAME" != "$PROFILE_NAME" ]; then
echo "Provisioning profile name does not match FOUNDATION_LAB_PROFILE_NAME" >&2
exit 1
fi
mkdir -p "$HOME/Library/MobileDevice/Provisioning Profiles"
cp "$PROFILE_PATH" \
"$HOME/Library/MobileDevice/Provisioning Profiles/$PROFILE_UUID.mobileprovision"
security find-identity -v -p codesigning
echo "SIGNING_KEYCHAIN_PATH=$KEYCHAIN_PATH" >> "$GITHUB_ENV"
- name: Resolve marketing version
id: version
run: |
VERSION="$(awk -F' = ' '/MARKETING_VERSION = / { gsub(/;/, "", $2); print $2; exit }' \
FoundationLab.xcodeproj/project.pbxproj)"
if [ -z "$VERSION" ]; then
VERSION="$(xcodebuild -showBuildSettings \
-project FoundationLab.xcodeproj \
-scheme 'Foundation Lab' \
-configuration Release \
-destination 'generic/platform=iOS' | awk '/MARKETING_VERSION = / { print $3; exit }')"
fi
if [ -z "$VERSION" ]; then
echo "Failed to resolve MARKETING_VERSION" >&2
exit 1
fi
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
- name: Validate ASC workflow
run: asc workflow validate
- name: Dry run ASC workflow
run: |
asc workflow run --dry-run foundation_lab_testflight \
"VERSION:${{ steps.version.outputs.version }}" \
"UPLOAD:$UPLOAD"
- name: Build and optionally upload Foundation Lab
run: |
asc workflow run foundation_lab_testflight \
"VERSION:${{ steps.version.outputs.version }}" \
"UPLOAD:$UPLOAD"
- name: Remove temporary signing keychain
if: always()
run: |
if [ -n "${SIGNING_KEYCHAIN_PATH:-}" ]; then
security list-keychains -d user -s \
"$HOME/Library/Keychains/login.keychain-db" || true
security delete-keychain "$SIGNING_KEYCHAIN_PATH" || true
fi