この記事はAndroidのCI環境をCircleCIからWerckerにした話に関連した投稿です。
AndroidアプリのCI/CDをどう行うのかを考えるとkeystoreやkey.p12などのファイルを何処に置くか?が問題になることがあります。Androidプロジェクトのリポジトリに含めてしまう事もできますが、セキュリティの観点からできるだけ避けたいです。
今回試してみたのは、keystoreなどのファイルをIP制限をかけたs3のバケットに置き、それをWerckerから取得する方法です。
keystoreをs3から取得し./gradlew assembleReleaseを実行するwercker.ymlを作成してAndroidプロジェクトのビルドを実行してみます。
s3のバケットにIP制限をかける
IP制限のかけかたはこちらの記事が参考になります。実際にAWS Policy Generatorで作成したポリシーは以下のようになり、IPアドレス192.168.1.1からのアクセスのみを受けつけます。
{
	"Version": "2012-10-17",
	"Id": "Policy***********",
	"Statement": [
		{
			"Sid": "Stmt**********",
			"Effect": "Allow",
			"Principal": "*",
			"Action": "s3:*",
			"Resource": "arn:aws:s3:::android/*",
			"Condition": {
				"IpAddress": {
					"aws:SourceIp": [
						"192.168.1.1"
					]
				}
			}
		}
	]
}
Werckerが使用するIPアドレスをWhitelistとして登録
Werckerのコンテナが使用するIPのリストは以下のページから確認できます。
IPリストは以下のファイルを参照することで確認できます。WerckerがDockerコンテナを利用位してる関係上、このドキュメントに記載されているIPアドレスは予告なしに変更される可能性があります。
- https://s3.amazonaws.com/status.wercker.com/worker_ips/production/public
- https://s3.amazonaws.com/status.wercker.com/worker_ips/production/public.json
このIPリストをポリシーに追加し、バケットのバケットポリシーの編集をクリックすると開くバケットポリシーエディタに貼り付けて保存します。
{
	"Version": "2012-10-17",
	"Id": "Policy***********",
	"Statement": [
		{
			"Sid": "Stmt**********",
			"Effect": "Allow",
			"Principal": "*",
			"Action": "s3:*",
			"Resource": "arn:aws:s3:::android/*",
			"Condition": {
				"IpAddress": {
					"aws:SourceIp": [
						"54.197.9.30",
						"54.82.165.74",
						"54.175.16.217",
						"52.91.36.246",
						"52.23.225.139",
						"54.174.181.26",
						"54.174.253.237",
						"52.90.118.64",
						"54.89.129.133",
						"52.90.236.213",
						"52.23.211.102",
						"54.236.255.39",
						"54.237.192.172",
						"54.173.172.47",
						"52.87.170.39"
					]
				}
			}
		}
	]
}
s3からkeystoreを取得しassembleReleaseを実行するwercker.ymlの作成
これでIP制限をかけたs3にkeystoreを置いておけばWerckerのビルド環境から取得することができます。実際にkeystoreを取得してビルドすることが可能か確認するために以下のようなwercker.ymlを用意します。kestoreのパスはWerckerの環境変数に登録しておきます。boxにはAndroidのビルドが可能なDocker Imageとして予め用意したhorie1024/wercker-android-buildを使用しています。
box: horie1024/wercker-android-build:0.1
build:
  steps:
    - script:
        name: fetch file from s3
        code: |
          wget <s3に配置したkeystoreのパス> -P app/
    - script:
        name: assembleRelese
        code: |
          ./gradlew assembleRelease
このwercker.ymlで定義した処理の流れは以下のようになります。
- wgetでs3からkeystoreを取得
- assembleReleaseを実行
アプリ側のbuild.gradleには署名の設定を以下のように設定しておきます。
android {
    signingConfigs {
        release {
            storeFile file('keystore')
            storePassword YOUR_STORE_PASSWORD
            keyAlias YOUR_KEY_ALIAS
            keyPassword YOUR_KEY_PASSWORD
        }
    }
}
Androidプロジェクトのビルド
wercker.yamlをAndroidプロジェクトのトップに置きGitHubにプッシュするとWerckerでビルドが開始されます。そして以下のようにkeystoreがs3からダウンロード後Androidプロジェクトに配置され、./gradlew assembleReleaseでのビルドも問題なく実行できました。

