Github 动作 macos 钥匙串访问

Github action macos keychain access

我正在尝试将我们的 iOS CI 转移到 github 操作,但我 运行 遇到了一些构建问题。使用 match 时似乎会出现这些问题(fastlane 在 gym 运行时挂起)。

这是让我认为它与钥匙串相关的日志

WARN [2019-09-26 13:46:14.52]: Could not configure imported keychain item (certificate) to prevent UI permission popup when code signing
Check if you supplied the correct `keychain_password` for keychain: `/Users/runner/Library/Keychains/login.keychain-db`
security: SecKeychainItemSetAccessWithPassword: The user name or passphrase you entered is not correct.

文档说 sudo 是无密码的,所以我假设钥匙串也是如此。我似乎错了,但我在文档中找不到任何内容。任何帮助将不胜感激。

编辑

Lyndsey Ferguson 下面的评论主要是解决方案。他们是使用 create_keychain 然后匹配的方法我只能指定钥匙串和它的密码所以我能够避免 import_certificate

编辑 2

这是我在 fastlane 中为解决这个问题所做的事情

create_keychain(
        name: "actiontest_keychain",
        password: "meow",
        default_keychain: true,
        unlock: true,
        timeout: 3600,
        lock_when_sleeps: false
    )

    match(
        type: "appstore",
        readonly: is_ci,
        keychain_name: "actiontest_keychain",
        keychain_password: "meow"
    )

您可以尝试创建一个新的钥匙串并将其设置为默认值。

- name: Set up keychain
    run: |
      security create-keychain -p <password> build.keychain
      security default-keychain -s build.keychain
      security unlock-keychain -p <password> build.keychain
      security set-key-partition-list -S apple-tool:,apple: -s -k actions build.keychain

这是一个可以接受的答案,但我想了解证书和私钥是如何进入钥匙串的。

试试这个:

- name: Set up keychain
    run: fastlane run create_keychain name:name_of_keychain password:chosen_password 

这将创建钥匙串,然后当您想要使用它时,您可以再次提供 chosen_password 无论您有什么。可能是 GITHUB_X 环境变量?

我无法使用 Fastlane,因为我正在尝试使用钥匙串来处理 Java 14 的新 jpackage tool in GitHub Actions to build and code sign a Java application native bundle, so I was excited to see Yakuhzi’s answer. It almost worked for me, but there were a couple of errors I had to sort out, which were very difficult because there were no error messages: my workflow just hung on the jpackage command,而我假设构建 Mac 虚拟机无形地提示虚拟帧缓冲区中要解锁的钥匙串。

这是对我有用的变体。前三个步骤没问题(我是 passing my signing certificate and its decryption passphrase to the script as environment variables extracted from Github Action secrets,并使用相同的密码来创建构建钥匙串):

security create-keychain -p "$IDENTITY_PASSPHRASE" build.keychain
security default-keychain -s build.keychain
security unlock-keychain -p "$IDENTITY_PASSPHRASE" build.keychain

但是此时尝试 运行 他的第四行会失败并出现此错误:

security: SecItemCopyMatching: The specified item could not be found in the keychain.

最终,在研究了 security set-key-partition-list 的文档后,我意识到第一个问题是 -k 参数需要钥匙串密码,在他的情况下一定是 actions!所以我的下一步是将第 4 行修复为如下所示:

security set-key-partition-list -S apple-tool:,apple: -s -k "$IDENTITY_PASSPHRASE" build.keychain

虽然我仍然遇到错误,所以我进一步研究了文档,并在登录钥匙串中没有我的签名身份的备用 Mac mini 上试验了该命令。最终我发现该命令试图对钥匙串中尚不存在的签名密钥执行操作。所以我在该行之前移动了导入我的签名密钥的步骤,它开始工作了。这是它运行后的完整部分,您可以看到整个 script on GitHub:

security create-keychain -p "$IDENTITY_PASSPHRASE" build.keychain
security default-keychain -s build.keychain
security unlock-keychain -p "$IDENTITY_PASSPHRASE" build.keychain

echo "$IDENTITY_P12_B64" > DS_ID_App.p12.txt
openssl base64 -d -in DS_ID_App.p12.txt -out DS_ID_App.p12
security import DS_ID_App.p12 -A -P "$IDENTITY_PASSPHRASE"

security set-key-partition-list -S apple-tool:,apple: -s -k "$IDENTITY_PASSPHRASE" build.keychain

也许有点晚了,但我认为值得一提的是有一个方便的 fastlane 动作 setup_ci 为此目的:

描述

Setup the keychain and match to work with CI

  • Creates a new temporary keychain for use with match
  • Switches match to readonly mode to not create new profiles/cert on CI
  • Sets up log and test result paths to be easily collectible

如果您使用 CI,只需将其添加到您的 Fastfile 的顶部或特定通道内。

Fastfile 通道示例

lane :build_release do
    setup_ci

    sync_code_signing(  
      type: "appstore",
      readonly: is_ci
    )

    build_app
end

还要确保您的 配置文件 证书 在您的 match 存储中是最新的并且您配置了 手动签名 发布版本。否则 match 可能会尝试使用错误的签名身份对您的应用进行签名,这将失败 ;)