Electron ForgeでmacOS版の署名してパッケージ

Electronのビルド&署名システムが一新され、Electron Forgeというものになりました。

https://www.electronjs.org/ja/docs/latest/tutorial/tutorial-packaging#%E9%87%8D%E8%A6%81-%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AB%E7%BD%B2%E5%90%8D%E3%81%99%E3%82%8B

macOSならzip/dmg/pkgなどにもしてくれつつ、Appleのコードサインと認証もワンコマンドでしてくれるようです。

コマンドはこちら。

~~~
npm run make
~~~

設定はforge.config.jsに集約されまる。コードサインと認証（notarization=Appleのサーバーにアップしてマルウェアの混入チェックなどを受けるプロセスと理解）は、

https://www.electronforge.io/guides/code-signing/code-signing-macos

に詳細が書かれています。macOSではAppleのDeveloper Programを使って署名しますが、指定方法は

- Option1: AppleIDとアプリ固有パスワード
- Option2: App Store Connect API key
- Option3: キーチェーン内の証明書

の三種類があります。どれもハマりました。1と2は、
~~~
An unhandled rejection has occurred inside Forge:
Error: No authentication properties provided (e.g. appleId, appleApiKey, keychain)
~~~
というエラー。どうも.envファイルに書いた情報が読めてない？？

最終的に3の「キーチェーン」を使う方法で通ったんですが、これもハマったのでメモしておきます。
# ■「キーチェーン」を使う方法

解説ページのテンプレは以下のようになっています（カンマは補完済み）。

~~~
module.exports = {
  packagerConfig: {
    icon: 'build/icon',
    osxSign: {},
    osxNotarize: {
      tool: 'notarytool',
      keychain: 'my-keychain',
      keychainProfile: 'my-keychain-profile'
    }
  },
~~~

自身で書き換えるパラメーターは、keychainとkeychainProfileです。うちkeychainは不要でした。「キーチェーン」内のどの鍵束を使うかを指定するかの項目ですが、これを無しにすることで自動的にiCloudキーチェーンが使われるぽい。

:::note info
ここで「この項目なくてよくね？」という議論もされています。
https://github.com/electron/notarize/pull/94
ここを読んで「無しでいいんだ」と知るまで色々試してハマりました。
:::

では、以下で残る①keychainProfileに指定する内容を準備します。
こちらを参考にさせていただきました。
https://qiita.com/hibara/items/672d386caf5d14346d68

## アプリ用パスワードを準備する
開発に使っているAppleIDで https://appleid.apple.com/ にログインし、App用パスワードを発行します。通常のAppleIDのパスワードとは別に用途別のパスワードを作るわけです。こうしておけば万一漏洩してもその用途以外に悪用されることを防げるというわけです。
ここで聞かれる「パスワードのラベル」が後の①keychainProfileになりますので、アプリ名などを指定しておきます。そして②発行されるパスワードも記録しておきます。

## キーチェーン内に証明書をインストールする
Appleて提供するnotarytoolを使います。たぶんXcodeについてくるんじゃないかと思います。ウチでは普通に入ってました。

~~~
% xcrun notarytool --apple-id "開発者AppleID（メアド）" --team-id "XXXXXXXXXX"
~~~

TeamIDはDeveloper登録すれば得られると思います。プロンプトで①と②を聞かれるので入力。これで「キーチェーン」に「com.apple.gke.notary.tool」という項目が作られていると思います（検索欄で探して確認できます）。

:::note warn
この時のエラー例をいくつか。

```
Error: HTTP status code: 401. Invalid credentials. Username or password is incorrect. Use the app-specific password generated at appleid.apple.com. Ensure that all authentication arguments are correct.
```
単純にAppleIDかパスワードが違っている。

```
Error: HTTP status code: 403. A required agreement is missing or has expired. This request requires an in-effect agreement that has not been signed or has expired. Ensure your team has signed the necessary legal agreements and that they are not expired.
```
Developerサイトにログインして更新された利用規約に同意する。この時、Option2の試行の中で生成したAPIキーを削除（revoke）したら通った気がします。
:::

これで、`npm run make`すればout/makeディレクトリ下にdmgができてると思います。

Electron Forgeでパッケージプロセスがかなりシンプルになったと思います。が、今までのモジュールや設定ファイルの依存がよくわからず放置中。追々削除しておきたいところです。

***
:::note info
# ■オマケメモ1
久しぶりにパッケージをビルドしようとしたら、macOS用のアイコンファイルは.icnsという、Windowsの.icoみたいな複数サイズを内包する形式になってました。
作成にはiconutilというのを使い、こちらを参考にさせていただきました。
https://wakabamac.hatenablog.com/entry/2017/04/02/034254
:::
:::note info
# ■オマケメモ2
Electron ForgeのデフォルトではmacOS向けのパッケージはzip形式のみでした。.dmgにするには、forge.config.jsでplatformsにdarwinを指定しているmakerのzipをdmgに変更します（または複製して両方も指定できます）。

### 変更前
~~~
    {
      name: '@electron-forge/maker-zip',
      platforms: ['darwin'],
    },
~~~
### 変更後：
```
    {
      name: '@electron-forge/**maker-dmg',
      platforms: ['darwin'],
    },
```
その上で、@electron/maker-dmgを手動インストールする必要がありました。
```
% npm install --save-dev @electron-forge/maker-dmg
```
:::