首页 > 解决方案 > GitHub Actions:productsign 挂起

问题描述

我在使用 GitHub Actions 时遇到问题。当我打电话时productsign,工作就挂了。在搜索互联网时,该工作似乎试图向用户询问密码,但我没有从日志中得到任何错误或反馈。这项工作永远挂起。在我自己的计算机上运行时,一切都按预期工作,并且 .pkg 已签名。

我在工作流程中的步骤如下

  - name: Build & Sign Installer
    run: |
      export LC_ALL=en_US.UTF-8
      export LANG=en_US.UTF-8
      (cd fastlane && ./decrypt_secret.sh)
      carthage update --use-xcframeworks --platform macOS
      bundle exec fastlane set_release_version
      bundle exec fastlane mac install_certificates
      bundle exec fastlane mac build_main_app
      bundle exec fastlane mac build_updater
      bundle exec fastlane mac build_installer
      (cd installer && productsign --sign <identity> app-1.0.0.pkg app-1.0.0-signed.pkg)

我尝试了很多不同的解决方案,但没有任何效果

  1. security import ${P12_FILE} -k ${KEYCHAIN_PATH} -P ${P12_PASSWORD} -A
  2. security import ${P12_FILE} -k ${KEYCHAIN_PATH} -P ${P12_PASSWORD} -T /usr/bin/productsign
  3. 使用设置分区列表security set-key-partition-list
  4. 创建一个新的钥匙串/解锁钥匙串
  5. 切换到使用 --sign 参数productbuild(添加 --sign 时也会挂起)
  6. fastlane match完全没有手动导入证书
  7. 我认为在谷歌上找到的任何其他解决方案

有任何想法吗?这是 GitHub Actions 中的错误吗?

标签: macosgithub-actionscode-signingfastlaneproductsign

解决方案


好的,我们终于想通了。解决方案是创建 tmp 钥匙串,将其设置为默认值并配置一些属性。这样可以确保codesign并且productsign可以在不提示输入密码的情况下访问它。

设置 Tmp 钥匙串

# default again user login keychain
security list-keychains -d user -s login.keychain

# Create temp keychain
security create-keychain -p "$MY_KEYCHAIN_PASSWORD" "$MY_KEYCHAIN"

# Append temp keychain to the user domain
security list-keychains -d user -s "$MY_KEYCHAIN" $(security list-keychains -d user | sed s/\"//g)

# Remove relock timeout
security set-keychain-settings "$MY_KEYCHAIN"

# Unlock keychain
security unlock-keychain -p "$MY_KEYCHAIN_PASSWORD" "$MY_KEYCHAIN"

# Add certificate to keychain
security import $CERT -k "$MY_KEYCHAIN" -P "$CERT_PASSWORD" -A -T "/usr/bin/codesign" -T "/usr/bin/productsign"

# Enable codesigning from a non user interactive shell
security set-key-partition-list -S apple-tool:,apple:, -s -k $MY_KEYCHAIN_PASSWORD -D "${IDENTITY_CERTIFICATE}" -t private $MY_KEYCHAIN

清理钥匙串

# Delete temporary keychain
security delete-keychain "$MY_KEYCHAIN"

# default again user login keychain
security list-keychains -d user -s login.keychain

推荐阅读