gowalk-cicd 1.0.55 → 1.0.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CLAUDE.md CHANGED
@@ -99,8 +99,10 @@ node /path/to/gowalk-cicd/bin/cli.mjs
99
99
  - Store API calls belong in GitHub Actions. Local tests may build/sign but must
100
100
  never connect to App Store Connect or Google Play.
101
101
  - Signing material should use encrypted Actions secrets. `deploy.yml`
102
- materializes `ASC_KEY_P8` + its ID/issuer and the Android keystore,
103
- properties and Play service account into an ephemeral runner checkout.
102
+ materializes `ASC_KEY_P8` + its ID/issuer, the Apple distribution identity
103
+ (`IOS_DISTRIBUTION_P12_BASE64`, `IOS_DISTRIBUTION_CERT_META_JSON`,
104
+ `IOS_DISTRIBUTION_CERT_REGISTRY_JSON`), and the Android keystore, properties
105
+ and Play service account into an ephemeral runner checkout.
104
106
  Tracked `creds/` files remain a backward-compatible fallback.
105
107
  - Backend runtime credentials use the single encrypted `BACKEND_RUNTIME_ENV`
106
108
  secret. The action writes it to host-side `.runtime.env` with mode 0600 and
package/README.md CHANGED
@@ -40,21 +40,30 @@ account or domain.
40
40
 
41
41
  ## iOS credentials
42
42
 
43
- 1. Create an **App Store Connect API key** with the **App Manager** role
44
- (App Store Connect Users and Access → Keys → generate).
45
- 2. Download the `.p8` and save it into your repo at:
43
+ Use encrypted repository secrets for both the App Store Connect API key and
44
+ the reusable Apple Distribution identity:
45
+
46
+ - `ASC_KEY_P8`, `ASC_KEY_ID`, `ASC_ISSUER_ID`
47
+ - `IOS_DISTRIBUTION_P12_BASE64`
48
+ - `IOS_DISTRIBUTION_CERT_META_JSON`
49
+ - `IOS_DISTRIBUTION_CERT_REGISTRY_JSON`
50
+
51
+ The workflow materializes them with mode `0600` only in the ephemeral runner
52
+ checkout. Secret-backed signing files are never staged or committed by the
53
+ composite action. The distribution identity files come from the signing
54
+ registry provisioner; pass their paths to the secret tooling without printing
55
+ their contents.
56
+
57
+ Legacy private repositories can still provide the API key at:
58
+
46
59
  ```
47
60
  creds/AuthKey_<KEY_ID>_Issuer_<ISSUER_UUID>.p8
48
61
  ```
49
- Example: `creds/AuthKey_ABC123DEFG_Issuer_69a6de70-xxxx-47e3-e053-5b8c7c11a4d1.p8`
50
- The filename encodes both the `KEY_ID` and the `ISSUER_ID` the composite
51
- action parses them from the filename.
52
- 3. The repo **must be private**. The p8 is a long-lived credential; never
53
- commit it to a public repo.
54
- 4. (First time only, per app) Create the app record in App Store Connect. See
55
- [First-time app setup](#first-time-app-setup) below.
56
- 5. The existing metadata-rich form
57
- `*(key_id_<KEY_ID>_issuer_<UUID>_vendor_id_<ID>).p8` is also accepted.
62
+
63
+ The filename encodes both the key ID and issuer ID. The metadata-rich form
64
+ `*(key_id_<KEY_ID>_issuer_<UUID>_vendor_id_<ID>).p8` is also accepted. Never
65
+ commit this fallback to a public repository. The app record must already exist
66
+ in App Store Connect; see [First-time app setup](#first-time-app-setup).
58
67
 
59
68
  ## Backend deploy (Python + Postgres, Docker)
60
69
 
@@ -1 +1 @@
1
- 1.0.55
1
+ 1.0.56
package/action/action.yml CHANGED
@@ -10,12 +10,9 @@
10
10
  name: iOS native TestFlight deploy
11
11
  description: >
12
12
  Build a native Swift/SwiftUI iOS app on a macOS runner and upload it to
13
- TestFlight. Provisions an Apple Distribution cert + App Store provisioning
14
- profiles at runtime via the App Store Connect API and persists them under
15
- ``creds/`` so subsequent runs reuse the same identity (cert auto-renews at
16
- T-30 days). Caller workflow MUST grant ``permissions: contents: write`` so
17
- the action can commit the refreshed signing identity back to the default
18
- branch on push events. Only secrets required are the ASC API key trio.
13
+ TestFlight. Reuses an encrypted Apple Distribution identity when supplied,
14
+ or provisions one through App Store Connect for legacy checkout-backed
15
+ consumers. App Store provisioning profiles are reconciled at runtime.
19
16
 
20
17
  inputs:
21
18
  project:
@@ -60,6 +57,12 @@ inputs:
60
57
  listing or revoking any existing certificate.
61
58
  required: false
62
59
  default: "revoke-oldest"
60
+ persist-signing-cache:
61
+ description: >
62
+ Commit refreshed signing files back to the default branch. Set to
63
+ 'false' when credentials were materialized from encrypted secrets.
64
+ required: false
65
+ default: "true"
63
66
  upload:
64
67
  description: "Set to 'false' to stop after producing the IPA"
65
68
  required: false
@@ -518,6 +521,7 @@ runs:
518
521
  # commit and clutter PR diffs). The signing identity is a long-lived
519
522
  # artifact owned by the canonical branch.
520
523
  if: ${{ inputs.archive == 'true'
524
+ && inputs.persist-signing-cache == 'true'
521
525
  && github.event_name == 'push'
522
526
  && github.ref == format('refs/heads/{0}', github.event.repository.default_branch) }}
523
527
  shell: bash
@@ -1 +1 @@
1
- 1.0.55
1
+ 1.0.56
@@ -1 +1 @@
1
- 1.0.55
1
+ 1.0.56
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gowalk-cicd",
3
- "version": "1.0.55",
3
+ "version": "1.0.56",
4
4
  "description": "Zero-config GitHub Actions delivery for iOS TestFlight and Android Google Play.",
5
5
  "type": "module",
6
6
  "bin": {
package/src/install.mjs CHANGED
@@ -213,6 +213,8 @@ function printSummary() {
213
213
  console.log('Next steps:');
214
214
  console.log(' Recommended: configure encrypted Actions secrets:');
215
215
  console.log(' ASC_KEY_P8, ASC_KEY_ID, ASC_ISSUER_ID');
216
+ console.log(' IOS_DISTRIBUTION_P12_BASE64, IOS_DISTRIBUTION_CERT_META_JSON');
217
+ console.log(' IOS_DISTRIBUTION_CERT_REGISTRY_JSON');
216
218
  console.log(' ANDROID_UPLOAD_KEY_BASE64, ANDROID_SIGNING_PROPERTIES');
217
219
  console.log(' GOOGLE_PLAY_SERVICE_ACCOUNT_JSON');
218
220
  console.log(' The workflow materializes them with mode 0600 only on its ephemeral runner.');
@@ -36,18 +36,35 @@ jobs:
36
36
  fetch-depth: 0
37
37
  persist-credentials: true
38
38
  - name: Materialize encrypted iOS credentials
39
+ id: ios_credentials
39
40
  shell: bash
40
41
  env:
41
42
  CI_ASC_KEY_P8: ${{ secrets.ASC_KEY_P8 }}
42
43
  CI_ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }}
43
44
  CI_ASC_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }}
45
+ CI_DISTRIBUTION_P12: ${{ secrets.IOS_DISTRIBUTION_P12_BASE64 }}
46
+ CI_DISTRIBUTION_META: ${{ secrets.IOS_DISTRIBUTION_CERT_META_JSON }}
47
+ CI_DISTRIBUTION_REGISTRY: ${{ secrets.IOS_DISTRIBUTION_CERT_REGISTRY_JSON }}
44
48
  run: |
45
- [ -n "${CI_ASC_KEY_P8:-}" ] || exit 0
46
- : "${CI_ASC_KEY_ID:?ASC_KEY_ID secret is required with ASC_KEY_P8}"
47
- : "${CI_ASC_ISSUER_ID:?ASC_ISSUER_ID secret is required with ASC_KEY_P8}"
48
49
  umask 077
49
50
  mkdir -p creds
50
- printf '%s' "$CI_ASC_KEY_P8" > "creds/AuthKey_${CI_ASC_KEY_ID}_Issuer_${CI_ASC_ISSUER_ID}.p8"
51
+ if [ -n "${CI_ASC_KEY_P8:-}" ]; then
52
+ : "${CI_ASC_KEY_ID:?ASC_KEY_ID secret is required with ASC_KEY_P8}"
53
+ : "${CI_ASC_ISSUER_ID:?ASC_ISSUER_ID secret is required with ASC_KEY_P8}"
54
+ printf '%s' "$CI_ASC_KEY_P8" \
55
+ > "creds/AuthKey_${CI_ASC_KEY_ID}_Issuer_${CI_ASC_ISSUER_ID}.p8"
56
+ fi
57
+ if [ -z "${CI_DISTRIBUTION_P12:-}${CI_DISTRIBUTION_META:-}${CI_DISTRIBUTION_REGISTRY:-}" ]; then
58
+ echo "source=checkout" >> "$GITHUB_OUTPUT"
59
+ exit 0
60
+ fi
61
+ : "${CI_DISTRIBUTION_P12:?IOS_DISTRIBUTION_P12_BASE64 secret is required}"
62
+ : "${CI_DISTRIBUTION_META:?IOS_DISTRIBUTION_CERT_META_JSON secret is required}"
63
+ : "${CI_DISTRIBUTION_REGISTRY:?IOS_DISTRIBUTION_CERT_REGISTRY_JSON secret is required}"
64
+ printf '%s' "$CI_DISTRIBUTION_P12" | base64 -D > creds/cert.p12
65
+ printf '%s' "$CI_DISTRIBUTION_META" > creds/cert.meta.json
66
+ printf '%s' "$CI_DISTRIBUTION_REGISTRY" > creds/cert.registry.json
67
+ echo "source=encrypted" >> "$GITHUB_OUTPUT"
51
68
  - name: Detect Flutter
52
69
  id: flutter
53
70
  shell: bash
@@ -141,6 +158,8 @@ jobs:
141
158
  # is locked in review. Default-branch deploys retain metadata automation.
142
159
  manage-app-store-version: >-
143
160
  ${{ github.ref_name == github.event.repository.default_branch && 'true' || 'false' }}
161
+ persist-signing-cache: >-
162
+ ${{ steps.ios_credentials.outputs.source == 'encrypted' && 'false' || 'true' }}
144
163
  # Repository variable FIREBASE_APP_ID: the app's Firebase App ID(s),
145
164
  # comma-separated when it ships both platforms. With an iOS id the
146
165
  # action uploads the archive's dSYMs to Crashlytics before TestFlight.