heihei blog

Blog icon by Unsplash https://unsplash.com/@virussinside

Affected Module Detectorでコミットの影響を受けるモジュールのUnitテストのみを実行する

f:id:shoheikawano:20211013003728j:plain Photo by Kaleidico on Unsplash

タイトルの内容について紹介します。 Affected Module DetectorのREADMEの内容や、実装コードを読むことで理解できる内容の範囲のことしか書いていません。 AndroidのプロジェクトでUnitTestを実行したいというケースを想定しています。 執筆時点の情報となっているので、最新情報についてはプロジェクトのREADMEなどをご覧ください。

Affected Module Detectorとは

Dropbox社が開発しているGradle Pluginです。

github.com

最新のコミットを取得し、コミットによる影響を受けたモジュール(affected module)を検知するもの(detector)です。 具体的には影響を受けたモジュールの検知と、そのモジュールに依存したグラフまで検知できます。

何が嬉しい?

最後のコミットの影響を受けたモジュール(またはそのモジュールに依存するモジュール)を検知できると、 最後のコミットで影響を受けた可能性のあるテストのみを実行する ことが可能になります。これが実現できると、たとえばCIのテスト実行の時間を短縮できたりすることが可能になります。

利用条件

Affected Module Detectorの利用条件として、利用されるプロジェクトがGit管理されている必要があります。

利用できるオプション

Affected Module Detectorを実行する際に、どの影響範囲までを検知するか指定するオプションが用意されています。

  • Changed Projects: These are projects which had files changed within them – enabled with -Paffected_module_detector.changedProjects)
    • →変更されたプロジェクト
  • Dependent Projects: These are projects which are dependent on projects which had changes within them – enabled with -Paffected_module_detector.dependentProjects)
    • → 変更されたプロジェクトに依存するプロジェクト
  • All Affected Projects: This is the union of Changed Projects and Dependent Projects (this is the default configuration)
    • → 変更されたプロジェクト+変更されたプロジェクトに依存するプロジェクト

プロジェクトのREADMEには、例えばPRが出たことをフックにchanged Projectsのテストを実行、PRがマージされたことをフックにAll Affected Projectsのテストを実行する、などができることが紹介されています。

使ってみる

セットアップ

READMEにある通りにセットアップをします

まずはrootのbuild.gradleに以下のような内容を追記します

buildscript {
  repositories {
    maven()
  }
  dependencies {
    classpath "com.dropbox.affectedmoduledetector:affectedmoduledetector:<LATEST_VERSION>"
  }
}

apply plugin: "com.dropbox.affectedmoduledetector"

affectedModuleDetector {
    baseDir = "${project.rootDir}"
//    logFilename = "output.log"
//    logFolder = "${project.rootDir}/output"
    excludedModules = [
        "sample-util"
    ]
}

affectedModuleDetector { } の中で設定を行います。

ローカルで正しくテストが実行されているかを確認するには logFilenamelogFolder を指定してください。コマンド実行時にどのモジュールが検知されたかなどのログを残してくれます。

excludedModules には検知対象から除外したいモジュールを指定します。適切に指定することで検知処理の時間が短くなると予想しています。(実際に計測などはしていないです)

そしてテストが存在する各モジュールのbuild.gradleに以下を追記します。

affectedTestConfiguration {
  jvmTestTask = "testDebugUnitTest"
}

この記述のみを別のbuild.gradleに切り出して apply を使って適用するようにしています。

コマンドを実行する

以下のコマンドで、detector enableを指定してdetectorを有効にしてテストを実行します。

./gradlew runAffectedUnitTests -Paffected_module_detector.enable

セットアップ後に上記コマンドをローカルで実行すると、一度目はすべてのテストが実行され、そのまま二度目を実行するとスキップされることが確認できました。

感想など

正確な計測などできていないですが、Affected Module Detectorを使って影響ないテストについてはスキップできているため、いくらかCIのテスト時間短縮に貢献してくれています。そこについては便利だなと思っています。

執筆時点ではjvmTestTask についての設定の記述がREADMEになかったため、探すのに時間がかかりました。(Pluginのコードを読みに行ってこれかな?と思って動かしてみたら動いたというラッキーパンチです。)

test coverageツールとの連携まわりがうまくいくかどうかまだ確認できていないため、もし知見のある優しい方いたら教えてもらえたら嬉しいです。 こちらは今後の自分のTODOとなっています。

この記事の内容について間違っている箇所などありましたら、ご指摘いただけたら幸いです🙏

雑ですが、以上です〜〜ズサーッε=ε=ε=c⌒っ゚Д゚)っ

2021年8月を振り返る

また月末になってしまった、、最近は台風とかもあったけど、少しずつ涼しいかんじになってきて秋がやってきている感じありますね。

特段書けることも少なくなって、本当に他愛もないことしか残らなくなってきた笑 でもまあいっかと思って書きます。

かき氷を食べた

f:id:shoheikawano:20210912102205j:plain

8月、夏っぽいものといえばこれ! 大濠公園にあるお茶屋さんで食べれる。デザート系は特に和の食べ物が好きなので、小豆と白玉もあって最高だった。

水族館行った

f:id:shoheikawano:20210912102209j:plain

マリンワールド海の中道っていうところです。水族館自体かなり久しぶりでした。イルカのショーとかもみれて楽しかったです。

その他

DroidKaigiのプロポーザルは落ちたのでオンラインで周りの登壇する方の応援をしにいきます

あとは個人アプリのUIをJetpack Compose化したり、

家で☕淹れるための測りとか買ってみたり大きめのケトル買ってみたりとかをしていました。

あっという間に10月に入って寒くなったりするとすぐ年末になりそうですね、、体に気をつけながら過ごしていきまっしょー

2021年7月を振り返る

暑い日々がちょっとずつ?落ち着いてきて、雨も降って天気の変化が激しいですね。 もう8月も終わりに差し掛かっておりますが、、7月を振り返ります。

山口に行った

7月頭のコロナが少し落ち着いていたころ、レンタカーで行ってきた。いっぱい運転した。 フグ食べたり、写真の元乃隅稲成神社に行ったりした。 メインは長門で、温泉行った。最高だった。

途中で天気が崩れたりしたけどなんとか保ってくれた。

f:id:shoheikawano:20210821091906p:plain

ガラスペンを買った

文房具好きの妻の後ろをついていった。普段、最近はとくに手書きの日記を書いていないので文字もあんまり書かなくなってしまったけど、お店で試し書きさせてもらい話を聞いて、買ってしまった。数千円だったけど、万年筆と比べても、書いていてインクがなかなか薄れない・さらに水洗いでさっと洗い流して再度使えて再利用性が髙いということを聞いて購入した。

f:id:shoheikawano:20210821091917p:plain

iMacがうちにやってきた

自分のではないが。妻が購入した。色と音が良い感じ。

f:id:shoheikawano:20210821091921p:plain

その他

「竜とそばかすの姫」を観た

よかった。やっぱり音楽がよかった。再度映画館でみたいな〜という映画。

www.youtube.com

その他

あとはDX Criteria (v202104)をツールとして組織課題の認識合わせをしたり、Composeやったり散歩中に眉間にシワを寄せたネコに遭遇したりした。落ちたがDroidKaigiのCfSを提出したりした。応援頑張るぞい。

f:id:shoheikawano:20210821091911p:plain

2021年6月を振り返る

セミの声きこえてきましたねーー 30度超える日もでてきて、暑くなりました。適度に水分と塩分補給しながらやっていきましょう。 6月を振り返ります。

太宰府天満宮に行った

久しぶりに。お店も開いていて楽しめた。食べ物は、「寺子屋太宰府本舗 太宰府煎餅」というところの串ぬれおかきが最高。梅ヶ枝餅というのが太宰府は有名らしいのですが、それはまだ食べていません。汗

写真は立派な紫陽花。 f:id:shoheikawano:20210719094435j:plain

そして太宰府からバスで山の方へと登って「山蔵」という焼き鳥屋さんに。カウンター席しかないけど大丈夫かと聞かれたけどカウンター席が一番あたりだった。店長さんが全部焼いてくれて、話も面白かったし、オススメのお酒とかも教えてくれたり飲ませてくれたりした。写真にあるのはめちゃおいしかった10年漬けてある梅酒。2年だけ漬けたものと飲み比べさせていただいたが全然味が違って年数長いほうが圧倒的に美味しかった。

f:id:shoheikawano:20210719100010j:plain

ヨシネコゲットした

f:id:shoheikawano:20210719094432j:plain

ヽ(゚∀゚)ノ うぇ───ぃ♪

MIDIキーボード買った

f:id:shoheikawano:20210719094429j:plain

DTMが面白いと思えるくらいにはYouTube動画みたりしながら音が作れるようになってきたので購入。 DAWはAbleton Liveを使っています。(まだ無料トライアル期間)

そんなかんじでした!6月もお疲れさまでした!

2021年5月を振り返る

梅雨が猛威を振るっていますね。ムシムシムシムシ。 5月を振り返ります。

TOHO OFFICEに行った

f:id:shoheikawano:20210613222912j:plain

写真のようなコワーキングスペース。グランドピアノがあったり軽いジムがあったりする。休日に「家じゃなくどこか別の場所で作業したいよねー」ということで行ってみた。

一日体験無料だったので行ってみたけど、広さがあるのがまず良いと感じた。あとはソフトドリンク飲み放題、電源タップなどももちろんありよかった。

詳細はこちら:東邦オフィス | TOHO OFFICE | 福岡市のコワーキングスペース

みた映画

「グランパ・ウォーズ おじいちゃんと僕の宣戦布告」

とにかく笑ったw

「Brittany Runs A Marathon」

Amazon Original初めてみた。やる気がでる系の映画だった。

www.youtube.com

その他

本業では大きな開発が終わり、いまは施策チームも変わって新しいことを行っている感じ。

それ以外では個人アプリを通して技術試すのを引き続きやっている。SqlDelight + Paging 3できて、いまは粛々とJetpack Compose化をしている。

以上です!5月もお疲れ様でした!

f:id:shoheikawano:20210613222915j:plain

(↑は夜のきれいだった大濠公園。Pixel 5で撮影。)

「いま生きる『資本論』」を読んだ

高校時代からの友人に勧められて読んだ本です。

感想

私達がいま生きるこの資本主義の世界では、育つ過程で身につけた知識や物事の考え方など、すべてが資本主義の影響を受けていて、そのため資本主義を理解し、当たり前だと思い込んでいることを「資本主義のもつ性質」であると客観的に捉えることで、新しい選択肢であったり柔軟な考えを持つことができるのではないか、という問いかけがあると解釈しました。

資本家は利潤を生み出すことを目指し、利益の極大化を求められているということや、労働者への対価というものはその人の能力に関わらず、価値を生産する段階である程度がすでに決まっているということなど、なるほど改めて考えるとあまり疑問視してこなかったがたしかにそうかも、と思えることがいくつも書いてありました。疑問視したりすることをせずに現状の世界を現状のままに捉えるだけではなくてどういう仕組の中で自分たちは生きているのだっけ?ということを教えてくれるような本でした。

「資本論」の内容の解説をしながら資本主義について教えたあとは、資本主義が入り浸るこの世の中であえてその枠組から外れた動きをしてみることなどを勧めている。それはたとえば利益・見返りを求めない友人とのつながりであったりご近所さんとの会話など、些細なことなど。

あえて資本主義の枠組みから離れてみることは、人との関わりがより重要になっているこのコロナ渦中においてはより一層大事なことかも、と思いました。(ふんわり)

もし興味が湧いた方がいたらこちらからどうぞ(※アフィリエイトリンクになっています)

build.gradle + コード補完機能を利用する

GradleでGradle Groovy DSLを用いて依存定義などを行っていると、「コードの補完機能あったらいいな〜」と思ったりします。Gradle Groovy DSLではなく、Kotlin DSLを利用することで、補完機能を利用することができます。

Kotlin DSLを利用して補完機能の恩恵を得るためには既存のbuild.gradleファイルをbuild.gradle.ktsに置き換える必要があると認識していたのですが、実際にはbuild.gradleファイルであっても、buildSrc + import文を利用することで、補完の恩恵を得られると知ったので記載します。

なお、build.gradle.ktsファイルの定義手法は今後主流になっていく可能性もあるため、そういう意味ではこの記事は今後のためになる・有用記事ではないかもしれないですので、そこだけはご注意ください。

buildSrcディレクトリを作成する

手始めにbuldSrcディレクトリを作成します。 プロジェクトのroot配下に buildSrc/を作成します。 例)your-project/buildSrc

Kotlin DSLのセットアップを行う

次に、buildSrcディレクトリ内にbuild.gradle.ktsファイルを配置します。 例)your-project/buildSrc/build.gradle.kts

このktsファイルの中に、Kotlin DSL Pluginの依存を指定します。

plugins {
    `kotlin-dsl`
}

repositories {
    mavenCentral()
}

Dependencies.ktファイルに依存を定義する

次に、Dependencies.ktファイルを作成し、依存を定義します。 例) buildSrc/src/main/kotlin/dependnecies/Dependencies.kt

パッケージ名は dependencies となっているので、.ktファイル内でもそのように指定します。

package dependencies

object Depts {
    private const val VKOTLIN = "1.5.0"
    ...

    const val PLUGIN_KOTLIN = "org.jetbrains.kotlin:kotlin-gradle-plugin:$VKOTLIN"
    ...
}

これで定義まわりは完了です。

定義を利用する

最後にbuild.gradleファイルからこれらの定義を参照します。たとえば以下のように参照することで、Depts.~ の部分について、補完が利用できるようになります。

import dependencies.Depts // import文を追加します

buildscript {
    repositories {
        google()
        mavenCentral()
        ...
    }
    dependencies {
        classpath Depts.PLUGIN_KOTLIN // ここで補完が利用できます
    }
}

ちなみに上記 buildscript を用いた書き方はいまでは古い書き方として扱われているらしいです。 参考: GitHub - Kotlin/kotlinx.serialization: Kotlin multiplatform / multi-format serialization

既存プロジェクトではbuild.gradleばかり使っているよという場合に、自動補完機能をどうしても利用したい!と思った方はぜひ参考にしてみてください。

間違いなどを見つけた方はお手数ですがコメントなどで教えていただけたら嬉しいです!

参考

【Android】buildSrcを使ってライブラリの定義をまとめる | ITcowork Staff Blog