CircleCI 2.0 (macOS)でElectronアプリをビルドする
最近,仕事でCircleCI 1.0のmacOS上でビルドしてたやつを,2.0のmacOS上に移行するやつをやったのでメモを.
CircleCI2.0のmacOSサポートは,今年の9月から始まったようです.
UPDATE: We are actively working on adding support for CircleCI 2.0 for macOS. Please reach out to beta+macos@circleci…discuss.circleci.com
やったこと
前はテストとdarwin向けのビルドをCI上で行なっていましたが,テストとwin32, darwin, linux向けの並列ビルドと,適切なキャッシュを挟むようにしました.
それぞれの工程に分けてメモしていきます.
テスト
テストするだけならば簡単です.
特に凝ったことはしていません.一つ気をつけなければならないのは,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
とやっています.
I used to do this in Circle v1: environment: PATH: "${PATH}:${HOME}/${CIRCLE_PROJECT_REPONAME}/node_modules/.bin" But…discuss.circleci.com
各プラットフォーム向けのビルド
CircleCI 2.0からのWorkflowの機能を使って,3つのプラットフォーム向けに並列にビルドタスクを動かしていくようにします.
先に circle.yml
を紹介します.
最初にbuild
を test
に変えました. 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-sign
が codesign
コマンドを実行するのですが, 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_cache
のpath
中に変数が利用できないので,そのまま書くようにしましょう.
Using yarnpkg, I want to save the yarn's cache dir. The path depends on the environment (~/.cache/yarn, ~/.yarn-cache…discuss.circleci.com
リリース
release
ジョブと workflows
の部分が変わったのでそこだけ載せておきます.ここでは,CIの artifacts
に保存しているだけですが,タグが付いていたら,GitHubのReleaseに反映するというようなことをやっても良さそうです.
おわりに
以下が全体の circle.yml
です.
build_darwin
のKeychain周りは本当に嵌りました… BitriseのOSSのコードによって助けられました.ありがとうございます🙏
他に嵌ったところは,ビルドしたアプリケーションを落してきて実行しようとすると Cannot find module
となり落ちてしまうようになったことでした.理由としては, electron-package-manager
が prune
を実行して必用の無いモジュールを消してからアプリケーション内にコピーするのですが,何故か必用なモジュールまで消されてコピーされていました. npm
のバージョンをローカルと合わせることで解決しましたが,根本的な原因は分かっていません…
まだやっていませんが,YAMLのAnchor/Referenceを利用して重複してるところをまとめていくと良いかなと思います.