🏭
GitLab-CIでAndroidアプリの簡単なCIを作る
概要
- GitLab-CIを利用して Android アプリの簡単なCI環境を構築したので簡単にメモしました。
- GitLab Runner 構築
- CI スクリプト
GitLab-CIでやりたいこと
ビルド
- Merge Request に push されたタイミングでビルドして、ソースコードがビルドできることを確認したい
アーカイブ
- develop, masterブランチにfeatureブランチなどがマージされたタイミングで各環境向け(開発、テスト、プレ、本番など)にアーカイブを作成したい
- これをGitLabにアーカイブとしてアップロードしたい。
Runnerの環境はDockerが良い
-
Runnerを動かすサーバーを以降する際に、その都度その都度環境構築したくない
-
利用するイメージの条件
- AndroidSDKが入っている
- targetSdk がGoogle Playの要件 に対応していること
- その当時は
androidsdk/android-31
を使用しました。
SonarQubeによる静的解析とレビューをしたい
-
SonarQubeでは次のことなどをしてくれます
- 重複コードの検出
- 脆弱性のあるコード検出
- バグを誘発しそうなコードの検出
- サイクロマティック複雑度(循環的複雑度)の検出
- どれくらいソースコードが複雑であるかをメソッド単位で数値化
- 閾値を超えれば指摘する
-
今回はリポジトリをSonarQubeに登録する作業については省略します。
やりたいことが決まれば、実際に環境を作っていきましょう。
GitLab Runnerの構築
- メニューから、Settings > CI/CD の
Runners
セクションから、url
とToken
をコピーしておく - Runnerを構築したいマシンに
gitlab-runner
コマンドが動く環境を用意する。 - 手順1でコピーしたものを利用してGitLabにRunnerを登録する。
# 登録
gitlab-runner register # あとは誘導に従いデータを入力
# 実行は`docker`で用意した image:androidsdk/android-31
# 確認
gitlab-runner verify
- 成功していれば、ブラウザからGitLabの CI/CDの欄に先ほど登録した Runnerが追加されているはずです。
.gitlab-ci.yml
リポジトリにymlファイルに追加してCIスクリプトを書いていきます。
※ Documentを参考にしながら記述しているのでより良い提案があれば教えてください
default
- CIの全体設定をします。
default:
image:
name: androidsdk:android-31
entrypoint: [""]
interruptble: true
-
interruptble
は新しいパイプラインが開始されたときにジョブをキャンセルする必要がある場合に設定します。
stages
- パイプラインのステージを記述します。
- build: ビルドするステージ
- after-test: 静的解析のステージ
- buildAPK: 各環境向けのアーカイブ作成のステージ
stages:
- build
- after-test
- buildAPK
build
- buildコマンドを書きます。
- テストコードがある場合は実行されるはずです...
- テスト実行を避けたい場合は
-x test
をオプションで追加
-
rules
でいつこのステージを実行するかを管理できます。- 詳しい設定は公式Docを探してください。
build:
stage: build
script:
- ./gradlew build
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
buildDev
開発環境向けにビルドしてアーカイブをアップロードします。
-
rules
: master、developにコミットされたタイミングで実施 -
artifacts
:- ファイル名はjob名(一番上の階層)にする
buildAPK dev
としてzipファイルでDLできる - 保存期間は、最新の成果物でないものに対して設定するものである。今回はとりあえず10分にした。
- ファイル名はjob名(一番上の階層)にする
buildAPK dev:
stage: buildAPK
script:
- ./gradlew assembleDevRelease --no-deamon --stacktrace
- ./gradlew assembleDevDebug --no-deamon --stacktrace
rules:
- if: '$CI_COMMIT_BRANCH == "develop"'
- if: '$CI_COMMIT_BRANCH == "master"'
artifacts:
name: "$CI_JOB_NAME"
expire_in: 10mins
paths:
- app/build/outputs/apk/dev/*/*.apk
buildTest
buildPre
buildProd
- 各環境向けにビルドコマンドを変えるだけでほぼ一緒です。
sonarqube-check
- SonarQubeをプロジェクトに適応する際に、GitLab連携の場合は、ymlもコピペできるようにもらえるのでこれを貼り付けました。
- (ruleもここを参考にして実装しました。)
- 他にも設定すればMerge Requetにレビューコメントを描いてくれるようになります。
最後に
-
.gitlab-ci.yml
はここまでのコードをコピペすれば全文が完成します。 - あとは実際にpushなりmergeなりしてみて、動作確認できればOKです。
- jenkinsなどでCI環境を構築するのも良いですが、GitLab上で完結したほうが楽だと思ったので作成しました。
- 静的解析ツールの導入やpushされたらビルドして都度ミスを減らす試みは開発者の心理的安全性を支える大事なものですので、積極的にやりたいですね・・・(時間があれば・・・😢なくても・・・😭)
Discussion