🏭

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

2023/04/22に公開

概要

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

GitLab-CIでやりたいこと

ビルド

  1. Merge Request に push されたタイミングでビルドして、ソースコードがビルドできることを確認したい

アーカイブ

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

Runnerの環境はDockerが良い

SonarQubeによる静的解析とレビューをしたい

  • SonarQubeでは次のことなどをしてくれます

    • 重複コードの検出
    • 脆弱性のあるコード検出
    • バグを誘発しそうなコードの検出
    • サイクロマティック複雑度(循環的複雑度)の検出
      • どれくらいソースコードが複雑であるかをメソッド単位で数値化
      • 閾値を超えれば指摘する
  • 今回はリポジトリをSonarQubeに登録する作業については省略します。

やりたいことが決まれば、実際に環境を作っていきましょう。

GitLab Runnerの構築

  1. メニューから、Settings > CI/CD の Runnersセクションから、urlTokenをコピーしておく
  2. Runnerを構築したいマシンにgitlab-runnerコマンドが動く環境を用意する。
  3. 手順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分にした。
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されたらビルドして都度ミスを減らす試みは開発者の心理的安全性を支える大事なものですので、積極的にやりたいですね・・・(時間があれば・・・😢なくても・・・😭)
GitHubで編集を提案

Discussion