gowalk-cicd 1.0.30 → 1.0.32

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/README.md CHANGED
@@ -437,6 +437,13 @@ The iOS composite action runs on `macos-15` and:
437
437
 
438
438
  The iOS action requires only the p8. Everything else is derived.
439
439
 
440
+ Feature-branch runs installed from the standard workflow still archive and
441
+ upload to TestFlight, but pass `manage-app-store-version: 'false'`. This keeps
442
+ branch validation independent of the editable App Store release slot, so a
443
+ build can upload while the current release is locked in review. Default-branch
444
+ runs retain version creation and metadata automation. Direct action callers
445
+ keep the historical behavior because the new input defaults to `true`.
446
+
440
447
  ### App ID capabilities
441
448
 
442
449
  A provisioning profile carries only the capabilities enabled on its App ID.
@@ -569,6 +576,7 @@ common ones:
569
576
  | `uses-non-exempt-encryption` | Value for `ITSAppUsesNonExemptEncryption` |
570
577
  | `archive` | `false` to build-only (PR runs without secrets) |
571
578
  | `upload` | `false` to archive but not upload to TestFlight |
579
+ | `manage-app-store-version` | `false` to upload without creating/editing the App Store release slot |
572
580
  | `app-store-whats-new` | Inline "What's New" text (overrides files) |
573
581
  | `ai-metadata` | `false` to disable AI auto-fill of empty ASC metadata |
574
582
  | `ai-metadata-model` | GitHub Models model id (default `openai/gpt-4o`) |
@@ -1 +1 @@
1
- 1.0.30
1
+ 1.0.32
package/action/action.yml CHANGED
@@ -64,6 +64,13 @@ inputs:
64
64
  secrets. When 'false', `upload` is ignored.
65
65
  required: false
66
66
  default: "true"
67
+ manage-app-store-version:
68
+ description: >
69
+ Set to 'false' to archive and upload a TestFlight build without creating
70
+ or editing an App Store version. App Store metadata automation is skipped.
71
+ This is useful for feature-branch validation while a release is in review.
72
+ required: false
73
+ default: "true"
67
74
  run-tests:
68
75
  description: "Set to 'false' to skip the simulator test stage"
69
76
  required: false
@@ -282,7 +289,7 @@ runs:
282
289
  | tee -a "$GITHUB_ENV"
283
290
 
284
291
  - name: Resolve App Store version slot (REUSE or CREATE)
285
- if: ${{ inputs.archive == 'true' }}
292
+ if: ${{ inputs.archive == 'true' && inputs.manage-app-store-version == 'true' }}
286
293
  shell: bash
287
294
  env:
288
295
  APP_STORE_APPLE_ID: ${{ inputs.app-store-apple-id || env.CFG_APP_STORE_APPLE_ID }}
@@ -328,6 +335,18 @@ runs:
328
335
  echo "APP_STORE_VERSION_ID=$APP_STORE_VERSION_ID" >> "$GITHUB_ENV"
329
336
  echo "Using marketing version $MARKETING_VERSION build $BUILD_NUMBER (decision=$DECISION_JSON)"
330
337
 
338
+ - name: Resolve TestFlight build number
339
+ if: ${{ inputs.archive == 'true' && inputs.manage-app-store-version == 'false' }}
340
+ shell: bash
341
+ env:
342
+ APP_STORE_APPLE_ID: ${{ inputs.app-store-apple-id || env.CFG_APP_STORE_APPLE_ID }}
343
+ run: |
344
+ set -o pipefail
345
+ BUILD_NUMBER=$(python3 "${{ github.action_path }}/scripts/next_build_number.py")
346
+ echo "BUILD_NUMBER=$BUILD_NUMBER" >> "$GITHUB_ENV"
347
+ echo "APP_STORE_VERSION_ID=" >> "$GITHUB_ENV"
348
+ echo "Using marketing version $MARKETING_VERSION build $BUILD_NUMBER without an App Store version slot"
349
+
331
350
  - name: Notice on deprecated profile-name input
332
351
  if: ${{ inputs.archive == 'true' && inputs.profile-name != '' }}
333
352
  shell: bash
@@ -690,7 +709,9 @@ runs:
690
709
 
691
710
  - name: Detect empty ASC metadata fields
692
711
  id: detect_metadata
693
- if: ${{ inputs.archive == 'true' && inputs.upload == 'true' && inputs.ai-metadata != 'false' }}
712
+ if: >-
713
+ ${{ inputs.archive == 'true' && inputs.upload == 'true'
714
+ && inputs.manage-app-store-version == 'true' && inputs.ai-metadata != 'false' }}
694
715
  shell: bash
695
716
  env:
696
717
  APP_STORE_APPLE_ID: ${{ inputs.app-store-apple-id || env.CFG_APP_STORE_APPLE_ID }}
@@ -945,6 +966,7 @@ runs:
945
966
  # with the default (CFG_WHATS_NEW), preserving any AI-generated notes.
946
967
  - name: Set App Store "What's New"
947
968
  if: ${{ inputs.archive == 'true' && inputs.upload == 'true'
969
+ && inputs.manage-app-store-version == 'true'
948
970
  && (inputs.app-store-whats-new != '' || env.CFG_WHATS_NEW != '') }}
949
971
  shell: bash
950
972
  env:
@@ -0,0 +1,50 @@
1
+ import re
2
+ import unittest
3
+ from pathlib import Path
4
+
5
+
6
+ ACTION_YAML = Path(__file__).resolve().parents[1] / "action.yml"
7
+
8
+
9
+ def step_block(source: str, name: str) -> str:
10
+ pattern = rf" - name: {re.escape(name)}\n(?P<body>.*?)(?=\n - name:|\Z)"
11
+ match = re.search(pattern, source, re.DOTALL)
12
+ if match is None:
13
+ raise AssertionError(f"missing action step: {name}")
14
+ return match.group("body")
15
+
16
+
17
+ class TestTestFlightVersionSlotWiring(unittest.TestCase):
18
+ @classmethod
19
+ def setUpClass(cls) -> None:
20
+ cls.source = ACTION_YAML.read_text(encoding="utf-8")
21
+
22
+ def test_opt_out_is_backward_compatible(self) -> None:
23
+ self.assertRegex(
24
+ self.source,
25
+ r"(?m)^ manage-app-store-version:\n(?: .*\n)*? default: \"true\"$",
26
+ )
27
+
28
+ def test_opt_out_skips_store_version_but_keeps_build_number(self) -> None:
29
+ store_slot = step_block(self.source, "Resolve App Store version slot (REUSE or CREATE)")
30
+ testflight = step_block(self.source, "Resolve TestFlight build number")
31
+
32
+ self.assertIn("inputs.manage-app-store-version == 'true'", store_slot)
33
+ self.assertIn("inputs.manage-app-store-version == 'false'", testflight)
34
+ self.assertIn(
35
+ "APP_STORE_APPLE_ID: ${{ inputs.app-store-apple-id || env.CFG_APP_STORE_APPLE_ID }}",
36
+ testflight,
37
+ )
38
+ self.assertIn("next_build_number.py", testflight)
39
+ self.assertNotIn("manage_marketing_version.py", testflight)
40
+
41
+ def test_metadata_requires_a_managed_store_version(self) -> None:
42
+ detector = step_block(self.source, "Detect empty ASC metadata fields")
43
+ whats_new = step_block(self.source, 'Set App Store "What\'s New"')
44
+
45
+ self.assertIn("inputs.manage-app-store-version == 'true'", detector)
46
+ self.assertIn("inputs.manage-app-store-version == 'true'", whats_new)
47
+
48
+
49
+ if __name__ == "__main__":
50
+ unittest.main()
@@ -1 +1 @@
1
- 1.0.30
1
+ 1.0.32
@@ -1 +1 @@
1
- 1.0.30
1
+ 1.0.32
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gowalk-cicd",
3
- "version": "1.0.30",
3
+ "version": "1.0.32",
4
4
  "description": "Zero-config GitHub Actions delivery for iOS TestFlight and Android Google Play.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -113,6 +113,11 @@ jobs:
113
113
  workspace: ${{ steps.flutter.outputs.enabled == 'true' && 'ios/Runner.xcworkspace' || '' }}
114
114
  scheme: ${{ steps.flutter.outputs.enabled == 'true' && 'Runner' || '' }}
115
115
  run-tests: 'false' # tests belong to the CI gate, not the deploy path
116
+ # A feature-branch TestFlight build must not create or mutate a live
117
+ # App Store version. That also lets it upload while the current version
118
+ # is locked in review. Default-branch deploys retain metadata automation.
119
+ manage-app-store-version: >-
120
+ ${{ github.ref_name == github.event.repository.default_branch && 'true' || 'false' }}
116
121
 
117
122
  android:
118
123
  name: Android Google Play