CircleCI 2.0 (macOS)でElectronアプリをビルドする

Yu SERIZAWA
All YoU Need Is D*

--

Workflowの様子

最近,仕事でCircleCI 1.0のmacOS上でビルドしてたやつを,2.0のmacOS上に移行するやつをやったのでメモを.

CircleCI2.0のmacOSサポートは,今年の9月から始まったようです.

やったこと

前はテストとdarwin向けのビルドをCI上で行なっていましたが,テストとwin32, darwin, linux向けの並列ビルドと,適切なキャッシュを挟むようにしました.

それぞれの工程に分けてメモしていきます.

テスト

テストするだけならば簡単です.

テストのみを行なうcircle.yml

特に凝ったことはしていません.一つ気をつけなければならないのは,2.0から,

environment:
PATH: "${PATH}:${HOME}/${CIRCLE_PROJECT_REPONAME}/node_modules/.bin"

のような,環境変数を "" 中に埋め込むことができなくなりました.そのため,

- run: echo 'export PATH="/usr/local/opt/node@6/bin:$PATH"' >> ~/.bashrc
- run: source ~/.bashrc

とやっています.

各プラットフォーム向けのビルド

CircleCI 2.0からのWorkflowの機能を使って,3つのプラットフォーム向けに並列にビルドタスクを動かしていくようにします.

先に circle.yml を紹介します.

各プラットフォーム向けのビルドタスクを追加したcircle.yml

最初にbuildtest に変えました. test 中で追加したのは, persist_to_workspace です.ここでインストールした node_modules を次からのジョブに引き継げるように保存しておきます.

ビルドジョブの最初で attatch_workspace で保存した workspace を展開します.それからLinux向けだとそのままビルドできますし,Windowsだと, xquartz , wine をインストールしてからビルドすれば良いです.

厄介なのは, darwin 向けです.署名しなければならないので,Keychain周りのセットアップが必要です.

sudo security authorizationdb write com.apple.trust-settings.user allow
security add-trusted-cert -p ssl -p smime -p eap -p IPSec -p codeSign -p timestamping -k ci.keychain -p basic ./certificates/test.cer
security import ./certificates/test.p12 -k ci.keychain -P "" -A
security find-identity -p codesigning ci.keychain

1.0ではこんな感じでやっていました.しかし,このままでは動きません.

まず, 2.0 は最初から ci.keychain が用意されていないので作成する必用があります.

security create-keychain -p '' ci.keychain # パスワードを空でキーチェーン作成する

このまま, darwin 向けにビルドすると無限にビルドが終わらなくなります.なぜかというと,ビルド途中で electron-osx-signcodesign コマンドを実行するのですが, codesign コマンドが(おそらく) プロンプトを出して止まっているためです.これは, Sierra からの挙動です.

以下のBitriseのOSSの Certificate and Profile Installer に,このコメントがありました.

You need to use “security set-key-partition-list -S apple-tool:,apple: -k keychainPass keychainName” after importing the item and before attempting to use it via codesign.

なので言われる通りに付け加えました.

security set-key-partition-list -S apple-tool:,apple: -k '' ci.keychain

よって,最後にはこのようになります.

sudo security authorizationdb write com.apple.trust-settings.user allow
security create-keychain -p '' ci.keychain
security add-trusted-cert -p ssl -p smime -p eap -p IPSec -p codeSign -p timestamping -k ci.keychain -p basic ./certificates/test.cer
security import ./certificates/test.p12 -k ci.keychain -P "" -A
security find-identity -p codesigning ci.keychain
security set-key-partition-list -S apple-tool:,apple: -k '' ci.keychain

これでようやく, darwin 向けのビルドができました.

そしてそれぞれのジョブで成果物をZIP化して,次のジョブで利用できるようにキャッシュに突っ込みます.あと,save_cachepath 中に変数が利用できないので,そのまま書くようにしましょう.

リリース

release ジョブと workflows の部分が変わったのでそこだけ載せておきます.ここでは,CIの artifacts に保存しているだけですが,タグが付いていたら,GitHubのReleaseに反映するというようなことをやっても良さそうです.

おわりに

以下が全体の circle.yml です.

build_darwin のKeychain周りは本当に嵌りました… BitriseのOSSのコードによって助けられました.ありがとうございます🙏

他に嵌ったところは,ビルドしたアプリケーションを落してきて実行しようとすると Cannot find module となり落ちてしまうようになったことでした.理由としては, electron-package-managerprune を実行して必用の無いモジュールを消してからアプリケーション内にコピーするのですが,何故か必用なモジュールまで消されてコピーされていました. npm のバージョンをローカルと合わせることで解決しましたが,根本的な原因は分かっていません…

まだやっていませんが,YAMLのAnchor/Referenceを利用して重複してるところをまとめていくと良いかなと思います.

--

--