🏭
GitLab-CIでiOSアプリの簡単なCIを作る
概要
- GitLab-CIを利用して iOS アプリの簡単なCI環境を構築したので簡単にメモしました。
- GitLab Runner 構築
- CI スクリプト
GitLab-CIでやりたいこと
ビルド
- Merge Request に push されたタイミングでビルドして、ソースコードがビルドできることを確認したい。
-
xcodebuild
コマンドでビルドするため、いくつかの諸問題を回避する必要がある- キーチェーンパスワードを求めるポップアップ回避のためのキーチェーンをunlockする。
アーカイブ
- develop, masterブランチにfeatureブランチなどがマージされたタイミングで各環境向け(開発、テスト、プレ、本番など)にアーカイブを作成したい
- これをGitLabにアーカイブとしてアップロードしたい。
RunnerはXcodeを使うのでshell
- xcodeを使うのでmacにrunnerを用意する(dockerが使いたい...)
GitLab Runner の構築
- メニューから、Settings > CI/CD の
Runners
セクションから、url
とToken
をコピーしておく - Runnerを構築したいマシンに
gitlab-runner
コマンドが動く環境を用意する。 - 手順1でコピーしたものを利用してGitLabにRunnerを登録する。
# 登録
gitlab-runner register # あとは誘導に従いデータを入力
# 実行は`shell`で用意した
# 確認
gitlab-runner verify
- 成功していれば、ブラウザからGitLabの CI/CDの欄に先ほど登録した Runnerが追加されているはずです。
Variables
GitLabリポジトリの変数runnerをinstallしたmacを扱うための設定をしていきます。
- passwordは
.gitlab-ci.yml
に直接書きたくないので GitLabリポジトリの権限のあるユーザのみが閲覧できるようにするため、Variablesに設定する- passwordはMaskedにする
Type | Key | Value | Options | Environments |
---|---|---|---|---|
Variable | BUILD_MACHINE_PASSWORD | *** | Masked | All (default) |
- ymlではこのように記述する
variables:
PASSWORD: "$BUILD_MACHINE_PASSWORD"
script:
- security unlock-keychain -p ${PASSWORD}
.gitlab-ci.yml
リポジトリにymlファイルに追加してCIスクリプトを書いていきます。
※ Documentを参考にしながら記述しているのでより良い提案があれば教えてください
default
- CIの全体設定をします。
default:
interruptble: true
-
interruptble
は新しいパイプラインが開始されたときにジョブをキャンセルする必要がある場合に設定します。
stages
- パイプラインのステージを記述します。
- build: ビルドするステージ
- archive: 各環境向けのアーカイブ作成のステージ
stages:
- build
- archive
build
- buildするだけのコマンドを書きます。
- 今回は開発環境向けにビルドするようにしています。
-
security
コマンドを実行するために、GitLabに設定した変数を使います。
build_project:
stage: build
variables:
SCHEME: "Dev"
ARCHIVE_PATH: "buildDev"
EXPORT_PATH: "buildDev"
MAKE_PLIST: "true"
PASSWORD: "$BUILD_MACHINE_PASSWORD"
script:
# キーチェーンパスワードを求めるポップアップ回避のためキーチェーンをunlockする
- security unlock-keychain -p ${PASSWORD}
# clean build
- xcodebuild clean -project APP_NAME.xcodeproj
# .xcarchive ファイルを生成する
- xcodebuild -workspace APP_NAME.xcworkspace -scheme APP_NAME\ Release\ ${SCHEME} archive -archivePath ${ARCHIVE_PATH}
rules:
- if: '$CI_PIPELINE_SOUIRCE == "merge_request_event"'
archive_dev
開発環境向けのアーカイブ作成ジョブを作成します。
archive_dev:
stage: archive
variables:
SCHEME: "Dev"
ARCHIVE_PATH: "buildDev"
EXPORT_PATH: "buildDev"
MAKE_PLIST: "true"
PASSWORD: "$BUILD_MACHINE_PASSWORD"
script:
- security unlock-keychain -p ${PASSWORD}
- xcodebuild clean -project APP_NAME.xcodeproj
- xcodebuild -workspace APP_NAME.xcworkspace -scheme APP_NAME\ Release\ ${SCHEME} archive -archivePath ${ARCHIVE_PATH}
# .ipaファイルを生成
- xcodebuild -exportArchive -archivePath ${EXPORT_PATH}.xcarchive -exportOptionsPlist ./exportOptions/exportOptions${SCHEME}.plist -exportPath ./${EXPORT_PATH} -allowProvisioningUpdates
artifacts:
paths:
- ${PARCHIVE_PATH}/APP_NAME.ipa
rules:
- if: '$CI_COMMIT_BRANCH == "develop"'
- if: '$CI_COMMIT_BRANCH == "master"'
test, pre, prod
- ほぼ似ているので省略する。
失敗したこと
xcodebuildのコマンドが動かない
- Xcodeのバージョンに合わせて、Xcode Command Line Toolを再インストールする必要があった。
- 公式サイトから、適切なものを選択してアップデートしてください
証明書の期限切れ
-
Key Chain Access
からアプリの証明書を見てみると、「信頼されていない」と表記されていた - CA発行者に記載されていたURIから中間証明書をDLしてインストールする
- Xcodeから、signing & Capabilities から証明書を執行させてから、新たに証明書を有効にさせた
その証明書、本当に正しいですか?
- 環境ごとの証明書の運用はきちんと把握しておきましょう
最後に
- 僕はAndroidエンジニアでも、iOSエンジニアでもありませんが、なんかやることになった時に、自動化できると良いなーと思ったので調べました。
- 知見が全くなかったので一から調べました。
- なにかもっと考慮した方が良いことがあれば教えていただけますと幸いです。
Discussion