gowalk-cicd 1.0.33 → 1.0.34

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.
@@ -570,6 +577,7 @@ common ones:
570
577
  | `uses-non-exempt-encryption` | Value for `ITSAppUsesNonExemptEncryption` |
571
578
  | `archive` | `false` to build-only (PR runs without secrets) |
572
579
  | `upload` | `false` to archive but not upload to TestFlight |
580
+ | `manage-app-store-version` | `false` to upload without creating/editing the App Store release slot |
573
581
  | `app-store-whats-new` | Inline "What's New" text (overrides files) |
574
582
  | `ai-metadata` | `false` to disable AI auto-fill of empty ASC metadata |
575
583
  | `ai-metadata-model` | GitHub Models model id (default `openai/gpt-4o`) |
@@ -1 +1 @@
1
- 1.0.33
1
+ 1.0.34
package/action/action.yml CHANGED
@@ -71,6 +71,13 @@ inputs:
71
71
  secrets. When 'false', `upload` is ignored.
72
72
  required: false
73
73
  default: "true"
74
+ manage-app-store-version:
75
+ description: >
76
+ Set to 'false' to archive and upload a TestFlight build without creating
77
+ or editing an App Store version. App Store metadata automation is skipped.
78
+ This is useful for feature-branch validation while a release is in review.
79
+ required: false
80
+ default: "true"
74
81
  run-tests:
75
82
  description: "Set to 'false' to skip the simulator test stage"
76
83
  required: false
@@ -289,7 +296,7 @@ runs:
289
296
  | tee -a "$GITHUB_ENV"
290
297
 
291
298
  - name: Resolve App Store version slot (REUSE or CREATE)
292
- if: ${{ inputs.archive == 'true' }}
299
+ if: ${{ inputs.archive == 'true' && inputs.manage-app-store-version == 'true' }}
293
300
  shell: bash
294
301
  env:
295
302
  APP_STORE_APPLE_ID: ${{ inputs.app-store-apple-id || env.CFG_APP_STORE_APPLE_ID }}
@@ -335,6 +342,18 @@ runs:
335
342
  echo "APP_STORE_VERSION_ID=$APP_STORE_VERSION_ID" >> "$GITHUB_ENV"
336
343
  echo "Using marketing version $MARKETING_VERSION build $BUILD_NUMBER (decision=$DECISION_JSON)"
337
344
 
345
+ - name: Resolve TestFlight build number
346
+ if: ${{ inputs.archive == 'true' && inputs.manage-app-store-version == 'false' }}
347
+ shell: bash
348
+ env:
349
+ APP_STORE_APPLE_ID: ${{ inputs.app-store-apple-id || env.CFG_APP_STORE_APPLE_ID }}
350
+ run: |
351
+ set -o pipefail
352
+ BUILD_NUMBER=$(python3 "${{ github.action_path }}/scripts/next_build_number.py")
353
+ echo "BUILD_NUMBER=$BUILD_NUMBER" >> "$GITHUB_ENV"
354
+ echo "APP_STORE_VERSION_ID=" >> "$GITHUB_ENV"
355
+ echo "Using marketing version $MARKETING_VERSION build $BUILD_NUMBER without an App Store version slot"
356
+
338
357
  - name: Notice on deprecated profile-name input
339
358
  if: ${{ inputs.archive == 'true' && inputs.profile-name != '' }}
340
359
  shell: bash
@@ -714,7 +733,9 @@ runs:
714
733
 
715
734
  - name: Detect empty ASC metadata fields
716
735
  id: detect_metadata
717
- if: ${{ inputs.archive == 'true' && inputs.upload == 'true' && inputs.ai-metadata != 'false' }}
736
+ if: >-
737
+ ${{ inputs.archive == 'true' && inputs.upload == 'true'
738
+ && inputs.manage-app-store-version == 'true' && inputs.ai-metadata != 'false' }}
718
739
  shell: bash
719
740
  env:
720
741
  APP_STORE_APPLE_ID: ${{ inputs.app-store-apple-id || env.CFG_APP_STORE_APPLE_ID }}
@@ -969,6 +990,7 @@ runs:
969
990
  # with the default (CFG_WHATS_NEW), preserving any AI-generated notes.
970
991
  - name: Set App Store "What's New"
971
992
  if: ${{ inputs.archive == 'true' && inputs.upload == 'true'
993
+ && inputs.manage-app-store-version == 'true'
972
994
  && (inputs.app-store-whats-new != '' || env.CFG_WHATS_NEW != '') }}
973
995
  shell: bash
974
996
  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.33
1
+ 1.0.34
@@ -1 +1 @@
1
- 1.0.33
1
+ 1.0.34
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gowalk-cicd",
3
- "version": "1.0.33",
3
+ "version": "1.0.34",
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