1. 前提
a) develop ブランチへプルリクエストをマージすると、fabricで開発環境にビルドしてテスターに渡します
b) developをmasterにマージするとステージングにビルドしてからプロダクトオーナー/お客さんに渡します。
c) release/* ブランチを作成するとき、(例えば: release/build) 、本番の*.ipaファイルをビルドします(配信なし)
(Fabricにはテスターとプロダクトオーナーのグループが作成しておきます)
1.1. 要件を分析
- 3設定の3ビルドバージョンがあります。
- 開発
- ステージング
- 本番
- CIで下記のGitHubアクティビティを追跡する
- プルリクエスト
- コミット
- ブッシュブランチ
- それぞれの環境のブランチ名を決める
- ステージング用のmasterブランチ
- 開発のdevelopブランチ
- 本番用のrelease/* ブランチ
1.2. 必要な作業は:
- こちらに作成された下記の設定でビルドできるには project と lane を再度編集します
- 開発
- ステージング
- リリース
- Travis CIの トリガー を受け取って該当のfastlaneビルドを選択します
- トリガーを処理するコード
2. Project と Fastlaneの設定
2.1. Project
- Xcodeでのprojectに対して設定する値を編集することが必要です。
- 開発 : 自動でsigningしてビルドします
- ステージング : 手動でビルドし、XcodeがCertificateとProvisioningを自動的に選択します
- 本番 : ステージングと同様にします
- #1には設定ファイルを作成方法を説明しただけですので、これから各環境の設定を説明します。下記はサンプルになります。
- 説明
- 開発(Debug) :iOS開発者により自動になり、CertificateとProvisioningはXcodeでの設定から受け取ります。
- ステージング(Staging): iOS Distributionにより手動になり、provisioningはAdHocを指定します、Certificateが外部からインポートされます。
- ローカルには手動でクリックすると、key chainに入れます。
- Travisマシンには手動で作成した key chainを通してコマンドでインポートします。
- リリース にはステージングと同様にします。もしくはリリースの要望によってAppStoreの設定が必要の場合もあります。
2.2. Fastlane
- まず、fastlaneがローカルで正常に動いているかどうかを確認します。
- 注意点:
- スキーム
- 設定する値
- エクスポート方法
- app-store
- ad-hoc
- package
- enterprise
- development
- developer-id
desc "Build App AdHoc Local"
lane :build_adhoc_local do
make_build_folder
build_ios_app(
scheme: "TheLastProject_Staging",
workspace: "TheLastProject.xcworkspace",
configuration: "Staging",
export_method: "ad-hoc",
output_directory: "./build",
output_name: "TheLastProject_Staging.ipa",
silent: true,
clean: true
)
end
- これからローカルにビルドしましょう。エラーとなる場合はXcodeの設定を確認してから修正してください。
bundle exec fastlane build_adhoc_local
- Certificate(development & distribution) を端末にインポートすることが必要になります。ターミナルは下記のように表示されたら設定が正しいです。
- 他の設定にも導入します。
- CIマシンのビルドをFastlane にします。下記のコードを参考して自分の設定を確認してください。
- ステージングビルド
desc "Build Staging"
lane :build_staging do
make_build_folder
disable_automatic_code_signing(
path: "TheLastProject.xcodeproj"
)
import_certificate(
keychain_name: "ios-build.keychain",
keychain_password: ENV["KEYCHAIN_PASS"],
certificate_path: "./scripts/certs/dis.p12",
certificate_password: ENV["CERT_PASS"]
)
update_project_provisioning(
xcodeproj: "TheLastProject.xcodeproj",
profile: "./scripts/profiles/TheLastProject_AdHoc.mobileprovision",
target_filter: "TheLastProject",
build_configuration: "Staging",
)
build_ios_app(
scheme: "TheLastProject_Staging",
workspace: "TheLastProject.xcworkspace",
configuration: "Staging",
export_method: "ad-hoc",
output_directory: "./build",
silent: true,
clean: true,
skip_profile_detection: true,
export_options: {
provisioningProfiles: { "com.fx.thelastproject": "TheLastProject_AdHoc" }
}
)
create_release_notes(format: 'Appstore: %h %s')
upload_fabric(groups: "staging")
enable_automatic_code_signing(
path: "TheLastProject.xcodeproj"
)
end
- リリースビルド
desc "Build Release"
lane :build_release do
make_build_folder
disable_automatic_code_signing(
path: "TheLastProject.xcodeproj"
)
import_certificate(
keychain_name: "ios-build.keychain",
keychain_password: ENV["KEYCHAIN_PASS"],
certificate_path: "./scripts/certs/dis.p12",
certificate_password: ENV["CERT_PASS"]
)
update_project_provisioning(
xcodeproj: "TheLastProject.xcodeproj",
profile: "./scripts/profiles/TheLastProject_AdHoc.mobileprovision",
target_filter: "TheLastProject",
build_configuration: "Release",
)
build_ios_app(
scheme: "TheLastProject_Release",
workspace: "TheLastProject.xcworkspace",
configuration: "Release",
export_method: "ad-hoc",
output_directory: "./build",
silent: true,
clean: true,
skip_profile_detection: true,
export_options: {
provisioningProfiles: { "com.fx.thelastproject": "TheLastProject_AdHoc" }
}
)
create_release_notes(format: 'Appstore: %h %s')
upload_fabric(groups: "release")
enable_automatic_code_signing(
path: "TheLastProject.xcodeproj"
)
end
CIマシンに正しく実行しなくても大丈夫です。エラーを一つずつ修正します。全部OKになってから次にしましょう。
3. ビルドトリガー
- CIマシンがビルド設定を自動的に洗濯してビルドできるために、下記の情報が処理する必要があります。
- ブランチ名
- インタラクティブタイプ
- コミット
- プッシュ
- プルリクエスト
- マージ
- これらの情報はTravisが環境変数(environment-variables)で共有しています。こちらに参照してください。
- Travisの設定する値を確認します。
- Build pushed branches : on
- Build pushed pull requests : on
- ブランチに正しくプルリクエストして、確認しましょう。
- developは開発環境のためにビルドする
- master はステージング環境のためにビルドする
- .travis.yml ファイルを開いて下記のスクリプトを編集します。
script:
- ./scripts/lint
- if [[ "$TRAVIS_BRANCH" == "develop" ]]; then bundle exec fastlane build_dev; fi
- develop ブランチを作成し、コードをコミットします
- 上記のスクリプトは:
- 環境変数を使用します
- if で条件確認します。
- masterブランチでも同様で使えます。
- ただ、リリース環境用のビルドの場合はrelease/* ブランチを作成するときに Travisが自動に実行し、ビルドします。下記の作業が必要です。
- ブランチ名を正しく認証します
- 文字列の処理でreleaseの単語があるか確認します。
- 参照 : https://stackoverflow.com/questions/2172352/in-bash-how-can-i-check-if-a-string-begins-with-some-value
- 現状のブランチ名をとるにはのBashを使ってもいいと思います・
script:
- export BRANCH=$(if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then echo $TRAVIS_BRANCH; else echo $TRAVIS_PULL_REQUEST_BRANCH; fi)
- echo "TRAVIS_BRANCH=$TRAVIS_BRANCH, PR=$PR, BRANCH=$BRANCH"
- 条件や変数が揃ったらアプリビルド用のスクリプトを書きましょう。下記は参照のコードです。こちらは runを名称としてBashシェルファイルを作成します。
- current branchを取得
- 文字列を処理
- 念のため、このスクリプトをローカルで実行して見た方がいいと思いますす。(ビルドのコマンドを決してechoのコマンドを残します)
#Log debug branch
BRANCH=$(if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then echo $TRAVIS_BRANCH; else echo $TRAVIS_PULL_REQUEST_BRANCH; fi)
echo "TRAVIS_BRANCH=$TRAVIS_BRANCH, PR=$PR, BRANCH=$BRANCH"
if [ "$TRAVIS_BRANCH" == "develop" ]
then
echo "********** BUILD DEV **********"
bundle exec fastlane build_dev
elif [ "$TRAVIS_BRANCH" == "master" ]
then
echo "********** BUILD STAGING **********"
bundle exec fastlane build_staging
elif [[ "$TRAVIS_BRANCH" == "release"* ]]
then
echo "********** BUILD RELEASE **********"
bundle exec fastlane build_release
else
echo "NOTHING"
fi
- OKになったらコードをコミットし、最初の要件の通りに実施して見ましょう。
- develop ブランチを作成、これから子ブランチを作成、編集してからプルリクエストを実行します
- Develop をmasterにマージします
- masterからrelease/* ブランチを作成します
- Fabricに該当のビルドバージョンがアップロードされたかどうかを確認します。エラーがある場合はまた順番に修正しましょう。
- 次にやって見たい作業はいくつがあります:
- コードをキレイにします
- マトリクスビルド
- 他のCIサービスを設定します
まとめ
- iOSプロジェクトの様々な設定に応じて fastlaneがビルドできるように仕組みを作ります。
- Travis CIがビルドタイミングとどの環境にビルドが必要かを判断できるには該当なトリガーを作成します。
- 該当の環境に自動的にビルドするようにCIを設定します。