fix(ci): fix iOS release workflow provisioning profile and build number - #197
Conversation
|
@claude review |
|
Claude finished @Chibuzor-Nwemambu's task in 1m 19s —— View job Code Review — PR #197
Overall this is a solid, well-documented fix. The PR description does a great job explaining the why behind each change, and the test plan (full workflow run → TestFlight) gives real confidence. Two of the three changes are clearly correct; the third has a documentation ripple effect worth addressing. 🔴
|
| Change | Verdict |
|---|---|
app.json buildNumber placeholder |
✅ Correct |
| UUID grep extraction | ✅ Works; consider an empty-value guard |
package.json rename |
🔴 Update the 8 stale dev:storybook doc references (or alias) |
The core CI fix is good to go. The main thing I'd resolve before merge is the doc drift from the script rename.
Note: I can review and comment, but I can't modify files under
.github/workflows/(GitHub App permission), so I haven't applied any changes — this is review feedback only.
·fix/iOS-release-workflow-debug
|
Added an empty-value guard after the UUID extraction (line 64). The concern isn't that Also updated 8 doc references from |
Adds an empty-value guard after UUID extraction to surface misconfigured secrets or silent base64 decode failures immediately rather than letting an empty value propagate silently through PlistBuddy and xcodebuild. Updates 8 doc references from pnpm dev:storybook to pnpm storybook to match the earlier script rename.
Replaces the grep workaround with the structured security cms -D approach. The original failure (Cannot parse a NULL or zero-length data) was caused by an empty provisioning profile file, not a security cms limitation. A -s file size guard now surfaces that failure immediately with a clear error message. Also reverts dev:storybook script rename to preserve the verb:scope convention used throughout the repo, and updates docs accordingly.
security cms -D fails on macos-26 runners because they lack the Apple root certificate needed to verify the CMS signature. openssl smime with -noverify performs the same structured DER decode without requiring the signing cert, giving a keyed UUID extraction that works on the current runner image.
Both security cms -D and openssl smime fail on macos-26 — the former needs Apple root certs in the keychain, the latter is incompatible with the runner's LibreSSL. Python's plistlib reads the UUID by key name from the embedded XML plist, requiring no external tools or certificates.
…compatible with macos-26
xcodebuild accepts a profile name in ExportOptions.plist, so extracting the UUID from the binary mobileprovision file is unnecessary. The profile name is stored as APPLE_PROVISIONING_PROFILE_NAME in repository variables, removing the macos-26 runner incompatibility entirely.
🤖 I have created a release *beep* *boop* --- <details><summary>eds-mobile-components: 0.3.0</summary> ## [0.3.0](eds-mobile-components-v0.2.0...eds-mobile-components-v0.3.0) (2026-06-30) ### ⚠ BREAKING CHANGES * **deps:** upgrade Expo SDK 53 → 55 ([#202](#202)) ### Features * **components:** add Badge component ([#190](#190)) ([6c18b76](6c18b76)) * **components:** implement Divider component ([#207](#207)) ([069e07d](069e07d)) * **components:** implement Link component ([#188](#188)) ([b0b3a6d](b0b3a6d)) * **components:** implement TextArea component ([#204](#204)) ([4fe04dc](4fe04dc)), closes [#131](#131) * **components:** implement TextField component ([#195](#195)) ([2701d5b](2701d5b)) * **components:** migrate Search component ([#206](#206)) ([606dedb](606dedb)) ### Bug Fixes * **components:** adopt nested typography token shape from @equinor/eds-tokens@2.3.0-beta.3 ([#180](#180)) ([02e82bd](02e82bd)) * **components:** read-only Input allows copy; disabled blocks all interaction ([#200](#200)) ([cec811f](cec811f)) ### Miscellaneous Chores * **deps:** upgrade Expo SDK 53 → 55 ([#202](#202)) ([7eaef66](7eaef66)), closes [#196](#196) </details> <details><summary>mobile-storybook: 0.3.0</summary> ## [0.3.0](mobile-storybook-v0.2.0...mobile-storybook-v0.3.0) (2026-06-30) ### ⚠ BREAKING CHANGES * **deps:** upgrade Expo SDK 53 → 55 ([#202](#202)) ### Features * **components:** add Badge component ([#190](#190)) ([6c18b76](6c18b76)) * **components:** implement Divider component ([#207](#207)) ([069e07d](069e07d)) * **components:** implement Link component ([#188](#188)) ([b0b3a6d](b0b3a6d)) * **components:** implement TextArea component ([#204](#204)) ([4fe04dc](4fe04dc)), closes [#131](#131) * **components:** implement TextField component ([#195](#195)) ([2701d5b](2701d5b)) * **components:** migrate Search component ([#206](#206)) ([606dedb](606dedb)) ### Bug Fixes * **ci:** fix iOS release workflow provisioning profile and build number ([#197](#197)) ([5ed8c9a](5ed8c9a)) * **components:** adopt nested typography token shape from @equinor/eds-tokens@2.3.0-beta.3 ([#180](#180)) ([02e82bd](02e82bd)) * **components:** read-only Input allows copy; disabled blocks all interaction ([#200](#200)) ([cec811f](cec811f)) * **storybook:** Components header title not theme-aware in dark mode ([#210](#210)) ([432242f](432242f)) ### Miscellaneous Chores * **deps:** upgrade Expo SDK 53 → 55 ([#202](#202)) ([7eaef66](7eaef66)), closes [#196](#196) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Chibuzor Nwemambu <75029767+Chibuzor-Nwemambu@users.noreply.github.com>
🤖 I have created a release *beep* *boop* --- <details><summary>eds-mobile-components: 0.3.0</summary> ## [0.3.0](equinor/design-system-mobile@eds-mobile-components-v0.2.0...eds-mobile-components-v0.3.0) (2026-06-30) ### ⚠ BREAKING CHANGES * **deps:** upgrade Expo SDK 53 → 55 ([#202](equinor/design-system-mobile#202)) ### Features * **components:** add Badge component ([#190](equinor/design-system-mobile#190)) ([6c18b76](equinor/design-system-mobile@6c18b76)) * **components:** implement Divider component ([#207](equinor/design-system-mobile#207)) ([069e07d](equinor/design-system-mobile@069e07d)) * **components:** implement Link component ([#188](equinor/design-system-mobile#188)) ([b0b3a6d](equinor/design-system-mobile@b0b3a6d)) * **components:** implement TextArea component ([#204](equinor/design-system-mobile#204)) ([4fe04dc](equinor/design-system-mobile@4fe04dc)), closes [#131](equinor/design-system-mobile#131) * **components:** implement TextField component ([#195](equinor/design-system-mobile#195)) ([2701d5b](equinor/design-system-mobile@2701d5b)) * **components:** migrate Search component ([#206](equinor/design-system-mobile#206)) ([606dedb](equinor/design-system-mobile@606dedb)) ### Bug Fixes * **components:** adopt nested typography token shape from @equinor/eds-tokens@2.3.0-beta.3 ([#180](equinor/design-system-mobile#180)) ([02e82bd](equinor/design-system-mobile@02e82bd)) * **components:** read-only Input allows copy; disabled blocks all interaction ([#200](equinor/design-system-mobile#200)) ([cec811f](equinor/design-system-mobile@cec811f)) ### Miscellaneous Chores * **deps:** upgrade Expo SDK 53 → 55 ([#202](equinor/design-system-mobile#202)) ([7eaef66](equinor/design-system-mobile@7eaef66)), closes [#196](equinor/design-system-mobile#196) </details> <details><summary>mobile-storybook: 0.3.0</summary> ## [0.3.0](equinor/design-system-mobile@mobile-storybook-v0.2.0...mobile-storybook-v0.3.0) (2026-06-30) ### ⚠ BREAKING CHANGES * **deps:** upgrade Expo SDK 53 → 55 ([#202](equinor/design-system-mobile#202)) ### Features * **components:** add Badge component ([#190](equinor/design-system-mobile#190)) ([6c18b76](equinor/design-system-mobile@6c18b76)) * **components:** implement Divider component ([#207](equinor/design-system-mobile#207)) ([069e07d](equinor/design-system-mobile@069e07d)) * **components:** implement Link component ([#188](equinor/design-system-mobile#188)) ([b0b3a6d](equinor/design-system-mobile@b0b3a6d)) * **components:** implement TextArea component ([#204](equinor/design-system-mobile#204)) ([4fe04dc](equinor/design-system-mobile@4fe04dc)), closes [#131](equinor/design-system-mobile#131) * **components:** implement TextField component ([#195](equinor/design-system-mobile#195)) ([2701d5b](equinor/design-system-mobile@2701d5b)) * **components:** migrate Search component ([#206](equinor/design-system-mobile#206)) ([606dedb](equinor/design-system-mobile@606dedb)) ### Bug Fixes * **ci:** fix iOS release workflow provisioning profile and build number ([#197](equinor/design-system-mobile#197)) ([5ed8c9a](equinor/design-system-mobile@5ed8c9a)) * **components:** adopt nested typography token shape from @equinor/eds-tokens@2.3.0-beta.3 ([#180](equinor/design-system-mobile#180)) ([02e82bd](equinor/design-system-mobile@02e82bd)) * **components:** read-only Input allows copy; disabled blocks all interaction ([#200](equinor/design-system-mobile#200)) ([cec811f](equinor/design-system-mobile@cec811f)) * **storybook:** Components header title not theme-aware in dark mode ([#210](equinor/design-system-mobile#210)) ([432242f](equinor/design-system-mobile@432242f)) ### Miscellaneous Chores * **deps:** upgrade Expo SDK 53 → 55 ([#202](equinor/design-system-mobile#202)) ([7eaef66](equinor/design-system-mobile@7eaef66)), closes [#196](equinor/design-system-mobile#196) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Chibuzor Nwemambu <75029767+Chibuzor-Nwemambu@users.noreply.github.com>
🤖 I have created a release *beep* *boop* --- <details><summary>eds-mobile-components: 0.3.0</summary> ## [0.3.0](equinor/design-system-mobile@eds-mobile-components-v0.2.0...eds-mobile-components-v0.3.0) (2026-06-30) ### ⚠ BREAKING CHANGES * **deps:** upgrade Expo SDK 53 → 55 ([#202](equinor/design-system-mobile#202)) ### Features * **components:** add Badge component ([#190](equinor/design-system-mobile#190)) ([6c18b76](equinor/design-system-mobile@6c18b76)) * **components:** implement Divider component ([#207](equinor/design-system-mobile#207)) ([069e07d](equinor/design-system-mobile@069e07d)) * **components:** implement Link component ([#188](equinor/design-system-mobile#188)) ([b0b3a6d](equinor/design-system-mobile@b0b3a6d)) * **components:** implement TextArea component ([#204](equinor/design-system-mobile#204)) ([4fe04dc](equinor/design-system-mobile@4fe04dc)), closes [#131](equinor/design-system-mobile#131) * **components:** implement TextField component ([#195](equinor/design-system-mobile#195)) ([2701d5b](equinor/design-system-mobile@2701d5b)) * **components:** migrate Search component ([#206](equinor/design-system-mobile#206)) ([606dedb](equinor/design-system-mobile@606dedb)) ### Bug Fixes * **components:** adopt nested typography token shape from @equinor/eds-tokens@2.3.0-beta.3 ([#180](equinor/design-system-mobile#180)) ([02e82bd](equinor/design-system-mobile@02e82bd)) * **components:** read-only Input allows copy; disabled blocks all interaction ([#200](equinor/design-system-mobile#200)) ([cec811f](equinor/design-system-mobile@cec811f)) ### Miscellaneous Chores * **deps:** upgrade Expo SDK 53 → 55 ([#202](equinor/design-system-mobile#202)) ([7eaef66](equinor/design-system-mobile@7eaef66)), closes [#196](equinor/design-system-mobile#196) </details> <details><summary>mobile-storybook: 0.3.0</summary> ## [0.3.0](equinor/design-system-mobile@mobile-storybook-v0.2.0...mobile-storybook-v0.3.0) (2026-06-30) ### ⚠ BREAKING CHANGES * **deps:** upgrade Expo SDK 53 → 55 ([#202](equinor/design-system-mobile#202)) ### Features * **components:** add Badge component ([#190](equinor/design-system-mobile#190)) ([6c18b76](equinor/design-system-mobile@6c18b76)) * **components:** implement Divider component ([#207](equinor/design-system-mobile#207)) ([069e07d](equinor/design-system-mobile@069e07d)) * **components:** implement Link component ([#188](equinor/design-system-mobile#188)) ([b0b3a6d](equinor/design-system-mobile@b0b3a6d)) * **components:** implement TextArea component ([#204](equinor/design-system-mobile#204)) ([4fe04dc](equinor/design-system-mobile@4fe04dc)), closes [#131](equinor/design-system-mobile#131) * **components:** implement TextField component ([#195](equinor/design-system-mobile#195)) ([2701d5b](equinor/design-system-mobile@2701d5b)) * **components:** migrate Search component ([#206](equinor/design-system-mobile#206)) ([606dedb](equinor/design-system-mobile@606dedb)) ### Bug Fixes * **ci:** fix iOS release workflow provisioning profile and build number ([#197](equinor/design-system-mobile#197)) ([5ed8c9a](equinor/design-system-mobile@5ed8c9a)) * **components:** adopt nested typography token shape from @equinor/eds-tokens@2.3.0-beta.3 ([#180](equinor/design-system-mobile#180)) ([02e82bd](equinor/design-system-mobile@02e82bd)) * **components:** read-only Input allows copy; disabled blocks all interaction ([#200](equinor/design-system-mobile#200)) ([cec811f](equinor/design-system-mobile@cec811f)) * **storybook:** Components header title not theme-aware in dark mode ([#210](equinor/design-system-mobile#210)) ([432242f](equinor/design-system-mobile@432242f)) ### Miscellaneous Chores * **deps:** upgrade Expo SDK 53 → 55 ([#202](equinor/design-system-mobile#202)) ([7eaef66](equinor/design-system-mobile@7eaef66)), closes [#196](equinor/design-system-mobile#196) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Chibuzor Nwemambu <75029767+Chibuzor-Nwemambu@users.noreply.github.com>
Summary
This PR fixes two issues that were blocking the
build-release-iosworkflow from successfully building and uploading the Storybook app to TestFlight, and adds encryption compliance configuration to avoid manual answers on every App Store submission.1. UUID extraction fails on
macos-26runnerThe original step used
security cms -Dto decode the provisioning profile and extract the UUID:UUID=$(security cms -D -i "$PROFILE" | /usr/libexec/PlistBuddy -c "Print :UUID" /dev/stdin)On the
macos-26runner,security cms -Dconsistently fails withCannot parse a NULL or zero-length data, even though the provisioning profile file is valid (12 KB, correct content). The root cause is unclear — likely a runner-level compatibility issue with the Security framework on macOS 26.Fix: Extract the UUID by grepping the raw binary directly. The UUID is stored as plain ASCII within the CMS envelope, so this works reliably without needing to decode the CMS wrapper:
UUID=$(grep -aEo '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}' "$PROFILE" | head -1)Note: the pattern uses
[0-9a-fA-F](case-insensitive) because Apple provisioning profiles use lowercase UUIDs. An uppercase-only pattern returns no match.2.
patch-files-actionfails becausebuildNumberfield is missingThe workflow patches
app.jsonto set the build number before archiving:= /expo/ios/buildNumber => "${{ env.BUILD_NUMBER }}"The
patch-files-actionrequires the field to already exist at the target path — it cannot create new fields. Sinceios.buildNumberwas absent fromapp.json, the patch step failed withOPERATION_PATH_UNRESOLVABLE.Fix: Added
"buildNumber": "1"as a placeholder toapp.json. The value is overwritten on every CI run and never used as-is.3. Encryption compliance key added to
app.jsonAdded
ITSAppUsesNonExemptEncryption: falseto theios.infoPlistsection ofapp.json. This tells Apple the app uses no exempt encryption algorithms, skipping the manual compliance questionnaire on every future App Store and TestFlight submission.Added via
app.jsonrather than directly inInfo.plistso it is applied automatically on everyexpo prebuildrun and cannot be accidentally wiped.Test plan
workflow_dispatchon this branch