1

環境

PKG ファイルを作成、署名、公証するための Github Actions ジョブを作成しています。

Apple Id アカウント(ワークフローにはユーザー名とパスワードが必要) と、秘密鍵 (暗号化された) を持つDeveloper Id Installer証明書を使用しています。どちらもシークレット (base64) として保存され、ワー​​クフローで .p12 ファイルに変換されてから、キーチェーンに追加されます。

このジョブは、プライベート リポジトリ内のより大きなワークフローの一部であり、最初にソフトウェアから ( Pyinstallerを使用して) ファイルを生成し、次に PKG を AWS S3 バケットにエクスポートします。

実装

jobs:
  [...]

  pkg:
    needs: [...]
    runs-on: macos-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Download macos bin file
        uses: actions/download-artifact@v2
        with:
          name: macos-bin-files
          path: dist/
      - name:
        run: | 
          ----- Create certificate files from secrets base64 -----
          echo ${{ secrets.DEVELOPER_ID_INSTALLER_CER }} | base64 --decode > certificate_installer.cer
          echo ${{ secrets.DEVELOPER_ID_INSTALLER_KEY }} | base64 --decode > certificate_installer.key

          ----- Create p12 file -----
          openssl pkcs12 -export -name zup -in certificate_installer.cer -inkey certificate_installer.key -passin pass:${{ secrets.KEY_PASSWORD }} -out certificate_installer.p12 -passout pass:${{ secrets.P12_PASSWORD }}

          ----- Configure Keychain -----
          KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
          security create-keychain -p "${{ secrets.KEYCHAIN_PASSWORD }}" $KEYCHAIN_PATH
          security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
          security unlock-keychain -p "${{ secrets.KEYCHAIN_PASSWORD }}" $KEYCHAIN_PATH

          ----- Import certificates on Keychain -----
          security import certificate_installer.p12 -P "${{ secrets.P12_PASSWORD }}" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
          security list-keychain -d user -s $KEYCHAIN_PATH

          ----- Generate PKG from files -----
          use a macos installer script (ref: https://github.com/KosalaHerath/macos-installer-builder/tree/master/macOS-x64)

          ----- Sign PKG file -----
          productsign --sign "${{ secrets.DEVELOPER_ID_INSTALLER_NAME }}" $INPUT_FILE_PATH $OUTPUT_FILE_PATH

          - name: "Notarize Release Build PKG"
            uses: devbotsxyz/xcode-notarize@v1 
            with:
              product-path: $PATH_TO_PKG
              appstore-connect-username: ${{ secrets.APPLE_ACCOUNT_USERNAME }}
              appstore-connect-password: ${{ secrets.APPLE_ACCOUNT_PASSWORD }}
              primary-bundle-id: 'BUNDLE_ID'

          - name: "Staple Release Build"
            uses: devbotsxyz/xcode-staple@v1
            with:
              product-path: $PATH_TO_PKG

  [...]

問題

macOS ランナーに Apple 証明書をインストールするための Github Action の公式ドキュメントに従いましたが、この部分は期待どおりに機能しています。証明書をキーチェーンに追加し、それを使用してコマンドで PKG ファイルに署名できますproductsign

ただし、公証のために PKG を Apple に送信すると、次のエラーが返されます。

Error: Notarization status <invalid> - Package Invalid
Error: Notarization failed

私が試したこと

PKG は配布時に期待どおりに機能しているため (公証されていないため、管理者として開く必要があるだけです)、問題はパッケージの実装に関連していないようです。

さまざまなソースからのリンクに従って、コマンドラインで公証を実行しようとしました。

ただし、これらのコマンド ラインを使用しても (公証アクションを使用せずに)、PKG ファイルを公証できませんでした。

質問

パッケージの公証を試みる前に、ワークフローの何が問題になっていますか?

PS: Github Actions macos ランナーでこれを行う参照が見つかりませんでした...

4

1 に答える 1

1

解決

devbotsxyz/xcode-notarize@v1フィールドを設定した後verbose:true、Apple がパッケージが公証に対して無効である理由を説明する JSON へのリンクを返すことを確認しました。

--onefileこの JSON では、私の PKG を構成するすべてのファイル (私のコンテキストでは Pyinstaller で使用できなかったファイルがたくさんあります) は、署名もタイムスタンプも付けられていないため、無効であることが通知されました。

いくつかの調査の後、Apple Developer Forum でこの投稿を見つけ、 PKG ファイルは INSIDE OUT に署名する必要があることを理解しました。まず、Pyinstaller によって生成された各ファイルに署名し、次にそれらすべてのファイルを集めた PKG に署名します。

これを行うには、コマンドを使用できませんproductsign(.pkg、.zip、および .dmg でのみ機能するため) codesign

ただし、codesignではなく を使用するためDeveloper Id Installer certificateDeveloper Id Application certificateこの新しい証明書もワークフローに追加する必要がありました。

私の PKG は何百ものファイルで構成されるため、codesign を使用してそれぞれのファイルに署名するための bash スクリプトも必要であることに注意してください

私の最終的なワークフローは次のようになります。

```yaml
jobs:
  [...]

  pkg:
    needs: [...]
    runs-on: macos-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Download macos bin file
        uses: actions/download-artifact@v2
        with:
          name: macos-bin-files
          path: dist/
      - name:
        run: | 
          ----- Create certificate files from secrets base64 -----
          echo ${{ secrets.DEVELOPER_ID_INSTALLER_CER }} | base64 --decode > certificate_installer.cer
          echo ${{ secrets.DEVELOPER_ID_INSTALLER_KEY }} | base64 --decode > certificate_installer.key
          echo ${{ secrets.DEVELOPER_ID_APPLICATION_CER }} | base64 --decode > certificate_application.cer
          echo ${{ secrets.DEVELOPER_ID_APPLICATION_KEY }} | base64 --decode > certificate_application.key

          ----- Create p12 file -----
          openssl pkcs12 -export -name zup -in certificate_installer.cer -inkey certificate_installer.key -passin pass:${{ secrets.KEY_PASSWORD }} -out certificate_installer.p12 -passout pass:${{ secrets.P12_PASSWORD }}
          openssl pkcs12 -export -name zup -in certificate_application.cer -inkey certificate_application.key -passin pass:${{ secrets.KEY_PASSWORD }} -out certificate_application.p12 -passout pass:${{ secrets.P12_PASSWORD }}

          ----- Configure Keychain -----
          KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
          security create-keychain -p "${{ secrets.KEYCHAIN_PASSWORD }}" $KEYCHAIN_PATH
          security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
          security unlock-keychain -p "${{ secrets.KEYCHAIN_PASSWORD }}" $KEYCHAIN_PATH

          ----- Import certificates on Keychain -----
          security import certificate_installer.p12 -P "${{ secrets.P12_PASSWORD }}" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
          security import certificate_application.p12 -P "${{ secrets.P12_PASSWORD }}" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
          security list-keychain -d user -s $KEYCHAIN_PATH

          ----- Codesign files with script -----
          use a script to sign each file from the artifact (ref: https://gist.github.com/GuillaumeFalourd/4efc73f1a6014b791c0ef223a023520a)

          ----- Generate PKG from codesigned files -----
          use a macos installer script (ref: https://github.com/KosalaHerath/macos-installer-builder/tree/master/macOS-x64)

          ----- Sign PKG file -----
          productsign --sign "${{ secrets.DEVELOPER_ID_INSTALLER_NAME }}" $INPUT_FILE_PATH $OUTPUT_FILE_PATH

          - name: "Notarize Release Build PKG"
            uses: devbotsxyz/xcode-notarize@v1 
            with:
              product-path: $PATH_TO_PKG
              appstore-connect-username: ${{ secrets.APPLE_ACCOUNT_USERNAME }}
              appstore-connect-password: ${{ secrets.APPLE_ACCOUNT_PASSWORD }}
              primary-bundle-id: 'BUNDLE_ID'

          - name: "Staple Release Build"
            uses: devbotsxyz/xcode-staple@v1
            with:
              product-path: $PATH_TO_PKG

  [...]
于 2022-02-04T18:34:40.663 に答える