Androidプロジェクトの未使用のリソースを定期的に削除する

Kyashでクライアントアプリを開発している@konifarです。

KyashのAndroidプロジェクトでは日々の開発に集中できるよう色々と自動化しているのですが、今回はその中の『使っていない画像や文言を定期的に削除してPull Requestを出してくれるCIジョブ』の話をしようと思います。小ネタなんですが、たぶん他の会社でも使える話だと思います。

解決したい課題

新機能開発中にとりあえず入れた画像や、今はなき古い機能の消し忘れた文言など、アプリ内の不要な画像や文言っていつのまにか溜まりがちですよね。
そういった消し忘れはPull Requestのレビューでも気づきにくいし、そもそも消し忘れを気にしながら開発するのもちょっとだるいです。そこで、CIのジョブで自動で消すことで解決しようとしたわけです。

大まかな処理の流れ

こんな感じです。

1. 0時にBitriseの定期ジョブが走る
2. gradle-unused-resources-remover-plugin*1を実行し不要なリソースを消す
3. diffがあったらcommitしてPull Requestする

1でBitriseにした理由は、定期実行の設定が簡単だったことと、CircleCIだとサーバーサイドのジョブの邪魔になることの2点でした。CIは何でもいいと思います。 2と3については、簡単なShell scriptを書いて実現しているだけなのでそんなに難しいことはしていません。

実行スクリプト

実際に実行しているShell scriptはこんな感じです。

#!/bin/bash -xe
# Usage:
#   ./scripts/unused_resources/execute.sh {GitHubトークン}

readonly GITHUB_TOKEN=${1}

readonly ROOT_DIR=$PWD

readonly SRC_DIR="app/src"

readonly COMPARE_BRANCH="unused_resources"

function removeUnusedResources {
  git branch -D ${COMPARE_BRANCH} || true
  git checkout -b ${COMPARE_BRANCH}

  # 未使用のリソースを削除
  ./gradlew removeUnusedResources

  if [[ -n "`git diff | grep ${SRC_DIR}`" ]]; then
    # diffがあればcommit
    git add ${SRC_DIR}
    git commit -m 'Removed unused resources'
  else
    echo "Nothing is changed."
    exit 0
  fi
}

function sendPullRequest() {
  if [[ -z ${GITHUB_TOKEN} ]] ; then
    echo "github token is not set."
    exit 1
  fi

  git push -f "https://${GITHUB_TOKEN}@github.com/{ユーザー}/{リポジトリ}.git" ${COMPARE_BRANCH}:${COMPARE_BRANCH}
  curl -s -X POST -H "Authorization: token $GITHUB_TOKEN" -d @- https://api.github.com/repos/{ユーザー}/{リポジトリ}/pulls <<EOF
{
    "title":"Automatically removed unused resources",
    "head":"${COMPARE_BRANCH}",
    "base":"master"
}
EOF
  echo "Sent PullRequest."
}

removeUnusedResources
sendPullRequest

gradle-pullrequest-builderのようにPull Requestを作るgradleプラグインを使わずにShell scriptで書いてしまったのは、特定のディレクトリにdiffがあった時にだけPull Requestを出すみたいなかゆいところに手が届かなかったからです。大した処理じゃないのでShell scriptの方が楽ですしね。

CIの定期実行設定

一応Bitriseの設定も載せておきます。

f:id:konifar:20190827164453p:plain

f:id:konifar:20190827164722p:plain:w600

こういうちょっとしたジョブはBitriseだと楽ですね。ちなみに、KyashではEspressoを使ったUIテストもBitriseで動かしています。興味があれば、Kyash Android で UIテストを導入した時の方針を見てみてください。

実行結果

こんな感じでPull Requestが自動的に作られます。

f:id:konifar:20190827165123p:plain

ヤッタネ!! あとはサッと確認してマージするだけです。


導入してみるとかなり便利で、日々の開発やレビュー中に考えることが減ったと感じます。新機能を作る時、古い機能を消す時など「あとでアレが勝手に消してくれる」と考えてコード部分に集中して修正できます。

よさそうだと感じたら導入してみてください。Shell scriptを置いて実行するくらいなので簡単に導入できるとは思いますが、そのうちBitriseのStepやCircleCIのOrbsなど何かしらの形でパッケージングしてより導入しやすい形にしたいですね。

それでは最後にお決まりの自分のQRコードを貼っておきます。役に立ちそうと感じたら適当に39円送金してみてください!

kyash id: konifar

f:id:konifar:20190419175726p:plain:w300

*1:gradle-unused-resources-remover-pluginの説明はこちらの記事を参照してください。http://konifar.hatenablog.com/entry/2018/05/13/125311 Issueを放置気味ですみません :bow: やっていくぞという気持ちを高めるために今この記事を書いています。