🏭

GitLab-CIでiOSアプリの簡単なCIを作る

2023/04/23に公開

概要

  • GitLab-CIを利用して iOS アプリの簡単なCI環境を構築したので簡単にメモしました。
    1. GitLab Runner 構築
    2. CI スクリプト

GitLab-CIでやりたいこと

ビルド

  1. Merge Request に push されたタイミングでビルドして、ソースコードがビルドできることを確認したい。
  2. xcodebuildコマンドでビルドするため、いくつかの諸問題を回避する必要がある
    • キーチェーンパスワードを求めるポップアップ回避のためのキーチェーンをunlockする。

アーカイブ

  1. develop, masterブランチにfeatureブランチなどがマージされたタイミングで各環境向け(開発、テスト、プレ、本番など)にアーカイブを作成したい
  2. これをGitLabにアーカイブとしてアップロードしたい。

RunnerはXcodeを使うのでshell

  • xcodeを使うのでmacにrunnerを用意する(dockerが使いたい...)

GitLab Runner の構築

  1. メニューから、Settings > CI/CD の Runnersセクションから、urlTokenをコピーしておく
  2. Runnerを構築したいマシンにgitlab-runnerコマンドが動く環境を用意する。
  3. 手順1でコピーしたものを利用してGitLabにRunnerを登録する。
# 登録
gitlab-runner register # あとは誘導に従いデータを入力
# 実行は`shell`で用意した 

# 確認
gitlab-runner verify
  • 成功していれば、ブラウザからGitLabの CI/CDの欄に先ほど登録した Runnerが追加されているはずです。

GitLabリポジトリの変数Variables

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エンジニアでもありませんが、なんかやることになった時に、自動化できると良いなーと思ったので調べました。
  • 知見が全くなかったので一から調べました。
  • なにかもっと考慮した方が良いことがあれば教えていただけますと幸いです。
GitHubで編集を提案

Discussion