【问题标题】:Github action macos keychain accessGithub action macos 钥匙串访问
【发布时间】:2020-01-26 19:50:22
【问题描述】:

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

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

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 是无密码的,所以我假设钥匙串也是如此。我似乎错了,但我在文档中找不到任何东西。任何帮助将不胜感激。

编辑

下面林赛弗格森的评论主要是解决方案。他们是使用 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"
    )

【问题讨论】:

    标签: ios continuous-integration fastlane github-actions


    【解决方案1】:

    可能有点晚了,不过我觉得值得一提的是有一个方便的快车道动作setup_ci就是为了这个目的:

    说明

    设置钥匙串并匹配以使用 CI

    • 创建一个新的临时钥匙串以用于匹配
    • 切换到只读模式以不在 CI 上创建新的配置文件/证书
    • 设置日志和测试结果路径以便于收集

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

    Fastfile 通道示例

    lane :build_release do
        setup_ci
    
        sync_code_signing(  
          type: "appstore",
          readonly: is_ci
        )
    
        build_app
    end
    

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

    【讨论】:

      【解决方案2】:

      我不能使用 Fastlane,因为我正在尝试使用钥匙串来使用 GitHub Actions 中的 Java 14 新的 jpackage 工具来构建和代码签名 Java 应用程序原生包,所以我很高兴看到 Yakuhzi 的回答。它几乎对我有用,但是我必须解决几个错误,这非常困难,因为没有错误消息:我的 workflow 刚刚挂在 jpackage command 上,而我假设构建 Mac 虚拟机在虚拟帧缓冲区中不可见地提示要解锁钥匙串。

      这是对我有用的变化。前三个步骤很好(我是passing,我的签名证书和脚本的解密密码作为从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
      

      【讨论】:

      • 值得一提的是,我有一个从 CI 命令行运行时可以工作的 Fastfile,但不能通过 CI Web 界面运行。 fastlane 会从自己的命令等创建和导入证书,但找不到 WWDR(错误 65)。关键是在 shell 脚本中调用security set-key-partition-list,这神奇地使它工作。
      【解决方案3】:

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

      试试这个:

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

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

      【讨论】:

      • 好的,那么您可以创建一个 Fastfile 并设置一个通道,然后从您的操作中调用它:
      • 这正是我所做的。奇迹般有效!感谢您的帮助
      【解决方案4】:

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

      - 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
      

      【讨论】:

      • 我还不太了解 github 操作,但由于 TJ 使用的是 fastlane,也许他可以使用 create_keychainimport_certificate 操作(通过 fastlane run &lt;action name&gt; parameter:param1 从命令行运行它.
      • @LyndseyFerguson 您使用 create_keychain 的方法非常适合我,并且在匹配中我能够指定钥匙串及其密码,因此我能够避免 import_certificate。我现在已经成功地看到我们的 CI 创建和部署构建。我可以接受评论作为答案吗?
      • 我会创建一个您可以接受的答案,但我看不到钥匙串如何拥有证书和私钥,除非您调用某些东西将这些资产放入钥匙串中?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多