Skip to content

Add native macOS and Windows installers for vip-next - #3055

Merged
rinatkhaziev merged 13 commits into
trunkfrom
codex/native-installers
Sep 21, 2026
Merged

rinatkhaziev merged 13 commits into
trunkfrom
codex/native-installers

Conversation

@rinatkhaziev

@rinatkhaziev rinatkhaziev commented Sep 14, 2026 •

Copy link
Copy Markdown
Contributor

Description

The Go CLI currently ships portable archives, so installing it requires extracting both binaries and configuring PATH manually. This adds macOS PKG and Windows MSI installers through separate native Buildkite jobs, while retaining all existing archives for portable installations and self-updates.

Packaging and installation

  • macOS produces separate Apple Silicon and Intel packages containing vip-next and go-search-replace under /usr/local/lib/vip-cli/bin, with a matching /etc/paths.d entry. The packages reject conflicting installation paths and downgrades, and include a scoped uninstaller that preserves user configuration and credentials.
  • Windows produces an x64, per-machine MSI under %ProgramFiles%\Automattic\VIP CLI, with a minimal installation wizard, system PATH management, major upgrades, downgrade refusal, and normal uninstall support. WiX 5.0.2 and its matching UI extension are restored into a temporary build directory; .NET is build tooling only.
  • Both packages include ownership metadata. When an update is available, vip-next update directs installer-managed installations to the appropriate package instead of replacing their files. Portable installations retain the existing self-update behavior. No vip alias is introduced, and the Node/npm runtime is unchanged.

Signing and release promotion

Binary signing and installer signing run in separate Buildkite jobs. Each installer job depends on its platform's binary job, downloads the signed archives from that exact build/step, verifies their checksums and strict two-file payload, and packages the existing signed bytes. Installer jobs use soft_fail so installer tooling or certificate failures cannot fail a binary release. Binary jobs remain required.

macOS binary signing retrieves only the Developer ID Application certificate. The separate installer job retrieves only Developer ID Installer in readonly mode, then signs, notarizes, and staples each PKG. Buildkite #95 confirmed the Installer identity is currently unavailable: the former combined certificate setup failed before binary signing and uploaded zero macOS artifacts. Provisioning that certificate remains necessary to produce PKGs. Windows uses the existing Azure Authenticode setup in both jobs. There is no unsigned fallback.

Installer jobs extract completed packages and compare their contents with the intended inputs before generating checksums. They explicitly upload only after every signature and payload check passes; post-failure automatic installer uploads are disabled. Prerelease promotion requires all five archive/checksum pairs (10 assets) and includes available complete installer/checksum pairs (up to 16 assets). Missing installers do not block binary releases; incomplete pairs, corrupt checksums, unexpected/duplicate/unfinished artifacts, and invalid containers still do. Native signature verification remains in Buildkite.

Both package formats use an ordered numeric version derived from the semantic release version: major.minor.(patch*1000+stage), with development, alpha, beta, RC, and stable stages. Major/minor are limited to 255, patch to 64, and prerelease sequence to 199. Unsupported installer versions fail only installer jobs; the binary release version range is unchanged. Development MSI builds sharing a numeric version may require uninstalling the previous build first.

Changelog Description

Added

  • Go CLI: Add native macOS and Windows installers with PATH configuration and installer-managed upgrades.

Validation

Passed locally:

  • make test — 56 Go packages reported successful results.
  • make lint.
  • Uncached focused installer, updater, release promotion, and prerelease command tests.
  • Real macOS unsigned package creation/expansion, payload verification, mismatched-payload rejection, and preinstall conflict/downgrade checks against temporary volume trees.
  • Failure injection proving unavailable Installer signing leaves the real macOS binary script's archives unchanged; actual Fastfile DSL checks keep certificate retrieval separate.
  • Optional installer download, verification, and GitHub draft asset replacement with byte comparisons against local HTTP fixtures, plus strict binary payload extraction tests.
  • Shell and Ruby syntax, WiX XML parsing, workflow/pipeline YAML parsing, and git diff --check.

The existing native Go Actions matrix now exercises actual installer install/upgrade/downgrade/PATH/ownership/uninstall behavior on disposable macOS and Windows runners. These tests use distinct fixture payloads, require an explicit CI-only gate, and refuse existing installations. They do not install the CLI on shared Buildkite agents.

CI on the initial commit passed macOS and Windows installer lifecycle tests, Windows signed MSI production, Linux builds, and the Go/Node checks. Buildkite #95's macOS certificate failure motivated the isolation fix above. The documentation formatting failure is also corrected. On the isolation commit a444a163, all three binary jobs passed in Buildkite #96, and all native Actions jobs and formatting passed. Both installer jobs actually soft-failed, despite green GitHub statuses: macOS lacks its Installer identity; Windows could not match the stored backslash artifact paths using a slash-prefixed download query. The follow-up uses a separator-independent query scoped to the Windows binary step, with a PowerShell regression that executes the real installer script against both stored path styles. Signed MSI production on this revised pipeline must be verified from the job exit status and artifacts, not its soft-fail GitHub status. Actual PKG signing still requires the unavailable Installer identity. No release was dispatched.

Pull request checklist

  • Document the installer test environment variable in docs/SETUP.md.
  • Update signing, release, setup, and updater documentation.
  • Add automated installer version, ownership, artifact, payload, and native lifecycle tests.
  • Verify local Go tests and real macOS package construction.
  • Verify native installer lifecycle and signed Windows MSI in CI.
  • Verify all three separate binary jobs on the isolation fix.
  • Verify the corrected Windows installer job exits successfully and uploads its MSI/checksum pair.
  • Produce signed PKGs after the unavailable Installer identity is provisioned.

Steps to Test

  1. Run make test and make lint.
  2. On macOS, run PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s packaging/macos -p 'test_package.py'. This builds and inspects packages without installing them on the host.
  3. Confirm the native macOS/Windows Actions jobs pass, including install, upgrade, downgrade refusal, PATH preservation, ownership instructions, and uninstall.
  4. Confirm all three Buildkite binary jobs pass and upload all five archive/checksum pairs, even if an installer job fails. With the current unavailable macOS Installer identity, only the macOS installer job should warn.
  5. Confirm successful installer jobs produce signed/notarized PKGs or a signed MSI, validate their extracted payloads, and upload complete package/checksum pairs. See docs/BUILD-SIGNING.md for the platform verification commands.

@github-actions

github-actions Bot commented Sep 14, 2026 •

Copy link
Copy Markdown
Contributor

Dependency Review

The following issues were found:
  • ✅ 0 vulnerable package(s)
  • ✅ 0 package(s) with incompatible licenses
  • ✅ 0 package(s) with invalid SPDX license definitions
  • ⚠️ 1 package(s) with unknown licenses.
See the Details below.

License Issues

.github/workflows/ci-go.yml

PackageVersionLicenseIssue Type
actions/setup-dotnet5.*.*NullUnknown License

OpenSSF Scorecard

Scorecard details
PackageVersionScoreDetails
actions/actions/setup-dotnet 5.*.* 🟢 6.5
Details
CheckScoreReason
Code-Review🟢 10all changesets reviewed
Binary-Artifacts🟢 10no binaries found in the repo
Maintained🟢 911 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 9
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Packaging⚠️ -1packaging workflow not detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Pinned-Dependencies🟢 8dependency not pinned by hash detected -- score normalized to 8
License🟢 10license file detected
Fuzzing⚠️ 0project is not fuzzed
Signed-Releases⚠️ -1no releases found
Security-Policy🟢 9security policy file detected
Branch-Protection⚠️ 0branch protection not enabled on development/release branches
SAST🟢 9SAST tool is not run on all commits -- score normalized to 9
rubygems/aws-partitions 1.1287.0 🟢 6.8
Details
CheckScoreReason
Code-Review⚠️ 2Found 6/30 approved changesets -- score normalized to 2
Maintained🟢 1030 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Packaging⚠️ -1packaging workflow not detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Token-Permissions🟢 8detected GitHub workflow tokens with excessive permissions
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
License🟢 10license file detected
Fuzzing⚠️ 0project is not fuzzed
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
Security-Policy🟢 10security policy file detected
Binary-Artifacts🟢 10no binaries found in the repo
Branch-Protection🟢 6branch protection is not maximal on development and all release branches
SAST🟢 10SAST tool is run on all commits
Pinned-Dependencies🟢 10all dependencies are pinned
rubygems/aws-sdk-core 3.257.0 🟢 6.8
Details
CheckScoreReason
Code-Review⚠️ 2Found 6/30 approved changesets -- score normalized to 2
Maintained🟢 1030 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Packaging⚠️ -1packaging workflow not detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Token-Permissions🟢 8detected GitHub workflow tokens with excessive permissions
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
License🟢 10license file detected
Fuzzing⚠️ 0project is not fuzzed
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
Security-Policy🟢 10security policy file detected
Binary-Artifacts🟢 10no binaries found in the repo
Branch-Protection🟢 6branch protection is not maximal on development and all release branches
SAST🟢 10SAST tool is run on all commits
Pinned-Dependencies🟢 10all dependencies are pinned
rubygems/aws-sdk-kms 1.132.0 🟢 6.8
Details
CheckScoreReason
Code-Review⚠️ 2Found 6/30 approved changesets -- score normalized to 2
Maintained🟢 1030 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Packaging⚠️ -1packaging workflow not detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Token-Permissions🟢 8detected GitHub workflow tokens with excessive permissions
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
License🟢 10license file detected
Fuzzing⚠️ 0project is not fuzzed
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
Security-Policy🟢 10security policy file detected
Binary-Artifacts🟢 10no binaries found in the repo
Branch-Protection🟢 6branch protection is not maximal on development and all release branches
SAST🟢 10SAST tool is run on all commits
Pinned-Dependencies🟢 10all dependencies are pinned
rubygems/aws-sdk-s3 1.232.1 🟢 6.8
Details
CheckScoreReason
Code-Review⚠️ 2Found 6/30 approved changesets -- score normalized to 2
Maintained🟢 1030 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Packaging⚠️ -1packaging workflow not detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Token-Permissions🟢 8detected GitHub workflow tokens with excessive permissions
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
License🟢 10license file detected
Fuzzing⚠️ 0project is not fuzzed
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
Security-Policy🟢 10security policy file detected
Binary-Artifacts🟢 10no binaries found in the repo
Branch-Protection🟢 6branch protection is not maximal on development and all release branches
SAST🟢 10SAST tool is run on all commits
Pinned-Dependencies🟢 10all dependencies are pinned
rubygems/bigdecimal 4.1.3 UnknownUnknown
rubygems/cgi 0.5.2 🟢 5.3
Details
CheckScoreReason
Code-Review🟢 6Found 6/10 approved changesets -- score normalized to 6
Maintained🟢 1019 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Packaging⚠️ -1packaging workflow not detected
Binary-Artifacts🟢 10no binaries found in the repo
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Pinned-Dependencies🟢 4dependency not pinned by hash detected -- score normalized to 4
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Fuzzing⚠️ 0project is not fuzzed
License🟢 9license file detected
Signed-Releases⚠️ -1no releases found
Branch-Protection⚠️ 0branch protection not enabled on development/release branches
Security-Policy🟢 10security policy file detected
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
rubygems/domain_name 0.6.20260907 🟢 4.7
Details
CheckScoreReason
Maintained🟢 1020 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Binary-Artifacts🟢 10no binaries found in the repo
Dangerous-Workflow⚠️ 0dangerous workflow patterns detected
Code-Review⚠️ 2Found 5/23 approved changesets -- score normalized to 2
Packaging⚠️ -1packaging workflow not detected
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Pinned-Dependencies🟢 10all dependencies are pinned
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Fuzzing⚠️ 0project is not fuzzed
Signed-Releases⚠️ -1no releases found
License🟢 9license file detected
Security-Policy⚠️ 0security policy file not detected
Branch-Protection🟢 4branch protection is not maximal on development and all release branches
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
rubygems/faraday 2.14.4 🟢 6.3
Details
CheckScoreReason
Packaging⚠️ -1packaging workflow not detected
Security-Policy🟢 10security policy file detected
Code-Review🟢 4Found 10/25 approved changesets -- score normalized to 4
Maintained🟢 87 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 8
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Token-Permissions🟢 9detected GitHub workflow tokens with excessive permissions
Binary-Artifacts🟢 10no binaries found in the repo
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Signed-Releases⚠️ -1no releases found
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
rubygems/fastlane 2.240.1 🟢 4.2
Details
CheckScoreReason
Maintained🟢 1030 commit(s) and 25 issue activity found in the last 90 days -- score normalized to 10
Code-Review🟢 10all changesets reviewed
Packaging⚠️ -1packaging workflow not detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
CII-Best-Practices⚠️ 2badge detected: InProgress
Binary-Artifacts⚠️ 2binaries present in source code
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
Signed-Releases⚠️ 0Project has not signed or included provenance with any releases.
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
Security-Policy⚠️ 0security policy file not detected
SAST⚠️ 2SAST tool is not run on all commits -- score normalized to 2
rubygems/google-apis-androidpublisher_v3 0.108.0 🟢 8.1
Details
CheckScoreReason
Maintained🟢 1030 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Packaging⚠️ -1packaging workflow not detected
Code-Review🟢 10all changesets reviewed
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Security-Policy🟢 10security policy file detected
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration
Binary-Artifacts🟢 10no binaries found in the repo
Signed-Releases⚠️ -1no releases found
Pinned-Dependencies🟢 10all dependencies are pinned
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
rubygems/google-apis-storage_v1 0.67.0 🟢 8.1
Details
CheckScoreReason
Maintained🟢 1030 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Packaging⚠️ -1packaging workflow not detected
Code-Review🟢 10all changesets reviewed
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Security-Policy🟢 10security policy file detected
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration
Binary-Artifacts🟢 10no binaries found in the repo
Signed-Releases⚠️ -1no releases found
Pinned-Dependencies🟢 10all dependencies are pinned
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
rubygems/google-cloud-env 2.3.1 🟢 7.2
Details
CheckScoreReason
Packaging⚠️ -1packaging workflow not detected
Code-Review🟢 8Found 18/22 approved changesets -- score normalized to 8
Binary-Artifacts🟢 10no binaries found in the repo
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
Security-Policy🟢 10security policy file detected
Maintained🟢 45 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 4
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Pinned-Dependencies🟢 10all dependencies are pinned
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Signed-Releases⚠️ -1no releases found
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration
SAST⚠️ 1SAST tool is not run on all commits -- score normalized to 1
rubygems/http-cookie 1.1.6 UnknownUnknown
rubygems/io-console 0.9.4 UnknownUnknown
rubygems/jwt 3.3.0 🟢 6.6
Details
CheckScoreReason
Code-Review🟢 3Found 6/19 approved changesets -- score normalized to 3
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Maintained🟢 1024 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
Binary-Artifacts🟢 10no binaries found in the repo
Token-Permissions🟢 9detected GitHub workflow tokens with excessive permissions
Pinned-Dependencies🟢 10all dependencies are pinned
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Security-Policy⚠️ 0security policy file not detected
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
Signed-Releases⚠️ -1no releases found
Packaging🟢 10packaging workflow detected
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
rubygems/multi_json 1.21.2 UnknownUnknown
rubygems/rubyzip 3.6.0 🟢 4.6
Details
CheckScoreReason
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Packaging⚠️ -1packaging workflow not detected
Code-Review🟢 3Found 6/18 approved changesets -- score normalized to 3
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Binary-Artifacts🟢 10no binaries found in the repo
Maintained🟢 1030 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
Pinned-Dependencies⚠️ 0dependency not pinned by hash detected -- score normalized to 0
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Security-Policy⚠️ 0security policy file not detected
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Signed-Releases⚠️ -1no releases found
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
SAST⚠️ 0SAST tool is not run on all commits -- score normalized to 0
rubygems/security 0.3.0 UnknownUnknown

Scanned Files

  • .github/workflows/ci-go.yml
  • Gemfile.lock

Comment thread fastlane/Fastfile
mokagio and others added 9 commits September 16, 2026 15:32
`abaa9bdb` added a `configure_installer_signing` call inside
`sign_and_notarize_installer` to test whether running `match` there worked
around `setup_ci` keychain behaviour.
It did not: the real cause was the lane fetching the wrong certificate type
entirely, so the call only duplicated the one
`.buildkite/build-macos-installer.sh` already makes before packaging.

---

Generated with the help of Claude Code, https://code.claude.com

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`developer_id_installer` is accepted as match's top-level `type`, but match
never maps it through to the certificate generator: `generate_certificate`
special-cases `developer_id_application` alone, so `Cert::Runner` runs with
`generate_apple_certs: true` and mints an **Apple Distribution** certificate,
which match then files under `certs/developer_id_installer/`.
Readonly runs install that certificate and report success, and the first sign
of trouble is `productsign` failing to find the identity much later.
`additional_cert_types` is the supported route and is what the option exists
for.

Write mode goes with it.
Apple restricts creating Developer ID certificates to the Account Holder, so
the App Store Connect API key cannot produce this certificate anyway — while
`type: 'developer_id'` means a write-mode run could renew the shared Developer
ID Application certificate as a side effect.
The certificate is provisioned out of band with `fastlane match import`.

Verified against live match storage: the lane now installs `Developer ID
Application` rather than `Apple Distribution`, then fails cleanly on the
genuinely absent installer certificate.

---

Generated with the help of Claude Code, https://code.claude.com

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`match` reports "All required keys, certificates and provisioning profiles
are installed" for whatever certificate it finds in storage, without checking
that it is the type that was asked for.
When storage held the wrong certificate the build ran on for another ninety
seconds — downloading artefacts, building both packages — before `productsign`
failed with an error that pointed at the keychain rather than at match.

Checking the identity where it is fetched fails the job in seconds, at the
cause.

---

Generated with the help of Claude Code, https://code.claude.com

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The previous note said the certificate "must be added through the team's
existing certificate provisioning process", which is not a followable
instruction and left the impression a write-mode build could produce it.

Records the two facts that cost a day: creation is Account Holder only, and
`match import` takes `developer_id_installer` as a top-level `--type` while
`match` itself does not.

---

Generated with the help of Claude Code, https://code.claude.com

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
App Store Connect's API does not model `DEVELOPER_ID_INSTALLER`:
`filter[certificateType]` rejects it as an invalid value and names the accepted
set, which has `DEVELOPER_ID_APPLICATION` and `DEVELOPER_ID_KEXT` but no
installer entry.

`match import` looks a certificate up by type to recover its ID, so the recipe
committed in the previous change would have failed on that filter — wasting the
time of the one person able to run it.
`--skip_certificate_matching true` bypasses the lookup.

The same gap means no API query can confirm whether the team already holds this
certificate, so the check belongs on the Developer website rather than in a
script.

---

Generated with the help of Claude Code, https://code.claude.com

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@mokagio

mokagio commented Sep 18, 2026

Copy link
Copy Markdown
Contributor

@rinatkhaziev I just realized I didn't sync with you about pushing to the branch straight instead of having a stacked PR. Sorry for the noise.

Anyway, after a few issues, the signing process succeeds in CI.

Before:

image

After:

image

Handing the ball back to you.

@mokagio
mokagio self-requested a review September 18, 2026 15:40
@sonarqubecloud

Copy link
Copy Markdown

@rinatkhaziev
rinatkhaziev merged commit 81d9b12 into trunk Sep 21, 2026
28 checks passed
@rinatkhaziev
rinatkhaziev deleted the codex/native-installers branch September 21, 2026 21:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants