株式会社クリアコード > ククログ

ククログ


MacOSのインストーラーを作成するには

はじめに

クリアコードはFluentdの開発に参加しています。

Fluentdにはtd-agentというディストリビューションがあり、Treasure Dataというサービスにすぐに接続しに行けるプラグインをまとめてくれているパッケージやインストーラーが提供されています。
td-agentでは、td-agent 3からmacOS向けのインストーラーを試験的に提供しており、macOSへもインストールできます。
ただし、macOSでのtd-agentのインストーラーの提供はmacOSでのtd-agentのユーザーが少ないと言うこともあり、
提供が滞っていました。

今回は筆者畑ケがtd-agent4においてmacOS向けのインストーラーを作成した時の状況をもとに解説します。

macOSのインストーラー

macOSではインストーラーと呼ばれるものは、形式がいくつかあります。

  1. distribution形式の.pkg単体で配布する場合
  2. distribution形式の.pkgをさらにディスクイメージに同梱して配布する場合
  3. macOSのアプリケーション形式(.app)のアプリケーションを同県してディスクイメージで配布する場合

この3種類があります。また、macOSのインストーラーの.pkgはアンインストール機能はありません。代わりにインストールされたファイルはpkgutil --files <com.distributor.app.identifier>の形式でインストーラーが登録している識別子に紐づいているファイルを取得することができます。このコマンドを使用してmacOSのインストーラー形式である.pkgがインストールしたファイルをシェルスクリプトなどの手段で削除できます。

td-agent4のmacOS向けのインストーラーを作成する

td-agent4はchefが作成しているパッケージ作成システムのomnibusには依存しておらず、Apache Arrowのパッケージビルドシステムをもとに独自で開発したものになっています。
macOSは公式にはDockerコンテナ化されていないためmacOS向けのインストーラーはDockerコンテナでは行わず、macOSの環境が必要です。

macOSのインストーラーの原型を作成する。

macOS向けのtd-agent4のインストーラーを作成するにあたって、適切なインストーラーの形式を選択します。
まず、macOSのアプリケーションの形式(.app)としてtd-agentのアプリケーションを作成すると、td-agentをlaunchctl*1を使ってサービス化を行いたいと言う要求を満たすことはできません。launchctlでサービス定義*2を提供するのに、/Application配下の.app内のlaunchctl用のサービス定義は読み込んでくれないからです。

この要件から、3.のdmgに.app形式で作成したアプリケーションを同梱して配布すると言う形態は取ることができず、1.または2.の形態でインストーラーを配布することを選択することになります。

macOSの暗黙的な慣習ではdistribution形式のpkg単体で配布するよりも、distribution形式のpkgをディスクイメージにさらに同梱して配布することが好まれます。
これは、pkg単体では背景画像を設定したり、見栄えをよくしたり、最初に説明書を提示したりするカスタマイズ性が弱いことだろうと筆者は考えています。 *3

そこで、この記事では2.の「distribution形式の.pkgをさらにディスクイメージに同梱して配布する」と言う方式を選択することとします。これはomnibusのmacOS向けのパッケージングでも採用されている形式です。

基礎的なpkgを作成する

pkgutilでdistribution形式のpkgへ同梱する.pkgを作成しましょう。

pkgutilでインストーラーの機能のみを持つ定義ファイル(.plist)を作成します。定義を作成するには以下のコマンドを実行します。

$ pkgbuild --analyze --root /path/to/staging-path td-agent.plist

td-agent-builderの状況に当てはめるなら、

$ pkgbuild --analyze --root td-agent/staging td-agent.plist
pkgbuild: Inferring bundle components from contents of td-agent/staging
pkgbuild: Writing new component property list to td-agent.plist

となります。今回はtd-agent/stagingと言うディレクトリに必要なファイルが入っており、ディレクトリの階層構造をいじる必要がないためこの定義ファイルはそのまま使用します。

pkgbuildコマンドを使用して、td-agent4のインストールの機能のみを持つインストーラーを作成します。

$ pkgbuild --root /path/to/rootDir --component-plist /path/to/plist --scripts /path/to/scriptDir --identifier com.distributor.app.identifier --version version --install-location location PckageName.pkg

td-agent-builderの状況に当てはめるなら、

$ pkgbuild --root td-agent/staging --component-plist td-agent.plist --identifier com.treasuredata.tdagent --version 4.0.1 --install-location / td-agent.pkg [--scripts /path/to/installation-scripts-dir]
pkgbuild: Reading components from td-agent.plist
pkgbuild: Wrote package to td-agent.pkg

となります。

これで、td-agent4に最低限必要なファイル群をtd-agent.pkgに固めることができました。
実際にはtd-agent4のインストール時に作成することが必要なディレクトリがあるため、--scriptsにはpostinstallが入ったディレクトリを指定しています。
指定がない場合にはインストーラーを実行した際にインストールスクリプトの実行する候補がないため、インストールスクリプトは実行されません。

distribution形式のpkgを作成する

前段で、td-agent.pkgを作成しました。これは、背景画像や、welcomeテキストや、使用許諾表示を行うことができないインストーラーです。
distribution形式のpkgはこれらの機能を備えているインストーラー形式です。また、この形式のインストーラーは複数のインストーラー(.pkg)を内包できます。

前段のtd-agent.pkgを用いてdistribution形式のpkgの定義の雛形を作成します。

$ productbuild --synthesize --package td-agent.pkg Distribution.xml 
productbuild: Wrote synthesized distribution to Distribution.xml

これにてproductbuildコマンドで使用する定義ファイルのDistribution.xmlが作成できました。

<?xml version="1.0" encoding="utf-8"?>
<installer-gui-script minSpecVersion="1">
    <pkg-ref id="com.treasuredata.tdagent"/>
    <options customize="never" require-scripts="false"/>
    <choices-outline>
        <line choice="default">
            <line choice="com.treasuredata.tdagent"/>
        </line>
    </choices-outline>
    <choice id="default"/>
    <choice id="com.treasuredata.tdagent" visible="false">
        <pkg-ref id="com.treasuredata.tdagent"/>
    </choice>
    <pkg-ref id="com.treasuredata.tdagent" version="4.0.1" onConclusion="none">td-agent.pkg</pkg-ref>
</installer-gui-script>

インストーラーのタイトルを変更するには<title>要素、背景画像の変更には<background>要素、使用許諾表示には<license>要素、welcomeテキスト表示には<welcome>要素を指定します。

この記事ではこれらの要素は説明するには重要な箇所ではないため、省いてインストーラーを作成していきます。
productbuildを実行します。

$ productbuild  --distribution "Distribution.xml" --package-path /path/to/pkgDir --resources "/path/to/resourceDir" PackageName.pkg

td-agent-builderの状況に当てはめるなら、

$ productbuild --distribution Distribution.xml --package-path td-agent.pkg [--resources /path/to/resources such as welcome.html and license.html etc.] td-agent-4.0.1.pkg
productbuild: Wrote product to td-agent-4.0.1.pkg

これで、distribution形式となったインストーラー(.pkg)が作成できました。

ディスクイメージ(.dmg)を作成する

macOSでは、distribution形式のインストーラーを更にディスクイメージ(.dmg)に包んで配布することが多く見かけられます。

ディスクイメージを作成するには、同梱したいファイルを格納するディレクトリを作成し、同梱したいファイルを配置します。

$ mkdir dmg
$ cp td-agent-4.0.1.pkg dmg
$ hdiutil create -srcfolder dmg -fs HFS+ -format UDZO -volname Td-Agent td-agent-4.0.1.dmg
.......................................................................................................................................................
created: ~/GitHub/td-agent-builder/td-agent-4.0.1.dmg

となります。

これにてdistribution形式のインストーラー(.pkg)を同梱したディスクイメージ(.dmg)が作成できました。

余談

td-agent4のmacOSのインストーラーは単純にディスクイメージを作成しておしまい、ではなく、書き込みと読み込み可能な一時ディスクイメージを作成してディスクイメージの見た目と、Finderで開いた時のサイズ調整を行っています。
td-agent4におけるmacOS向けのインストーラーを作成する作業は fluent-plugins-nursery/td-agent-builder#192 にて実施しましたので、この記事では解説されなかった細かな箇所に関してはリンク先のpull requestをご覧ください。

まとめ

macOS向けのインストーラーの作成のやりかたを解説しました。筆者は別の案件でdistribution形式のmacOSのインストーラーの作成を実施したことがありました。
td-agent3ではインストーラーを更にディスクイメージに同梱しているやりかたでインストーラーを作成していたため、調査をしながらこの作業を実施しました。
ディスクイメージをhdiutil create -fs HFS+ -format UDZO ...で作成してしまうと読み込みのみ可能なディスクイメージとなってしまいます。読み込みと書き込みが可能なディスクイメージの作成が必要ということに中々気付けず、ディスクイメージのカスタマイズに難航しました。また、ディスクイメージのカスタマイズは基本的にGUI経由で行われる操作ですが、macOSはGUI Scripting環境(AppleScrtipt)も提供しており、CI環境でもディスクイメージのカスタマイズを実施することができました。

当社では、お客さまからの技術的なご質問・ご依頼に有償にて対応するFluentdサポートサービスを提供しています。Fluentd/Fluent Bitをエンタープライズ環境において導入/運用されるSIer様、サービス提供事業者様は、お問い合わせフォームよりお問い合わせください。

*1 macOSではlaunchctl/launchdを用いてサービスの起動・終了を行うことが推奨されます。

*2 launchctl向けのサービス定義は.plistと言う拡張子で、`/Library/LaunchDaemons`配下に置くことが推奨されます。

*3 筆者は実際のところどうなんだろう?と長年疑問に感じています。

タグ: Fluentd
2020-09-08

«前の記事: リンカーフラグ -E の意味と使い方 最新記事 次の記事: Apache Arrowコンサルティングサポートを開始 »
タグ:
年・日ごとに見る
2008|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|