SlideShare una empresa de Scribd logo
1 de 32
コードレビュー改善のために
Jenkinsと IntelliJ IDEAの プラグインを自作
してみた話
2023/6/4 JJUG CCC 2023 Spring
Tasuku Nakagawa (@getupmax)
Leisure Product Department
Rakuten Group, Inc
2
コードレビュー
でどこ(何)を見ていますか?
• 仕様通りか
• コードの質
• テストの質
• カバレッジ
3
Bitbucket Server
には、プルリクエストにカバレッジを表示する機能(API)がある
→ これを使わない手はない
https://ja.confluence.atlassian.com/bitbucketserver/code-insights-966660485.html
4
カバレッジ表示機能
をCIパイプラインに組み込みたい
リポジトリのクローン
コンパイル
テスト
カバレッジ計測
カバレッジ表示
https://www.jenkins.io/
5
カバレッジ表示API
をJenkinsから利用するためには
• 既存のプラグインを利用する
→ 調べた限りなさそう😭
• Jenkinsfileにベタ書きする
→ Jenkinsfileの肥大化 + テストできない🤮
6
Jenkinsの特徴
• Javaで書かれている
• プラグインで拡張可能
→ プラグインもJavaで書ける
カバレッジ表示APIを呼ぶプラグインを自作すれば解決👍
7
Jenkinsプラグインの作り方
1. 雛形を生成する
2. インターフェースを定義する
3. ロジックを書く
4. テストする
5. Jenkinsにデプロイする
8
雛形を生成する (1/5)
MavenのArchetypeプラグインから生成できる
$ mvn -U archetype:generate 
-Dfilter=io.jenkins.archetypes:hello-world-plugin
9
インターフェースを定義する (2/5)
Jenkinsには2種類の入力がある
1. ジョブごとの設定値
/job/{name}/configure から設定する
2. Jenkins全体の設定値
全てのジョブで共有される
/manage/configure から設定する
10
インターフェースを定義する – ジョブごとの設定
コンストラクタとセッターを
介して取得
11
インターフェースを定義する – Jenkins全体の設定
シリアライズされているので、ヘルパーを介して取得
12
ロジックを書く (3/5)
perform メソッドがエントリーポイント
13
(マニュアル)テストする (4/5)
1. mvn hpi:run
2. localhost:8080/jenkins にアクセス
3. 開発中のプラグインを含んだJenkinsを
利用できる
mvn clean で全てのデータが飛ぶので注意(n敗)
14
デプロイする
1. mvn hpi:hpi でhpiファイル(アーカイブ)を生成
2. Jenkins の /manage/pluginManager/advanced にアクセス
3. hpi ファイルをアップロード
15
出来上がったもの
https://github.com/T45K/Bitbucket-Server-Code-Insights-plugin
16
やってみた結果
チームでは…
• JaCoCoが出力したHTMLを確認する必要がなくなった
• 不足しているテストをレビューで指摘しやすくなった
• テストをしやすくするためのリファクタリングに繋がった
個人では…
• 普段何となく使っているJenkinsをより深く理解できた
• 新しいことを学びたい欲を満たせた
17
一方で…
同僚
• カバレッジ表示機能に興味がある
• しかし、チームでJaCoCoも
Jenkinsも使っていない
https://irasutoya.com/
18
なので
同僚
IntelliJで計測したカバレッジを
送信できるようにしてほしい
19
つまり
コードとテストを書く
テストを実行してカバレッジを取る
得られたカバレッジを変換し
Bitbucket Server API を呼ぶ
Copyright © 2023 JetBrains s.r.o. IntelliJ IDEA and the IntelliJ IDEA logo are registered trademarks of JetBrains s.r.o.
20
IntelliJ IDEAの特徴
• Javaで書かれている
• プラグインで拡張可能
→ プラグインもJavaで書ける!
IntelliJ IDEA のプラグインを自分で書けば解決👍
21
IntelliJプラグインの作り方
1. 雛形を生成する
2. インターフェースを定義する
3. ロジックを書く
4. テストする
5. IntelliJにインストールする
6. 公開する
22
雛形を生成する (1/6)
IntelliJの "New Project" から生成する
23
インターフェースを定義する (2/6)
ビューはSwingを使って定義する(KotlinだとDSLが使える)
24
ロジックを書く (3/6)
AnAction#actionPerformed がエントリーポイント
25
(マニュアル)テストする (4/6)
1. ./gradlew runIde
2. 開発中のプラグインが入った
IntelliJが立ち上がる
./gradlew cleanすると全てのデータが(ry
26
IntelliJにインストールする (5/6)
1. ./gradlew buildPlugin
2. build/libs 下にjarファイルが生成される
3. Preferences > Plugins からインストールする
27
公開する (6/6)
JetBrainsのプラグインマーケットから公開できる
28
出来上がったもの
https://plugins.jetbrains.com/plugin/20589-coverage-uploader-for-bitbucket-server
29
学び
• 色々な設計方針を知った
• Jenkinsでは特定の命名規則に従わないといけない(e.g., doFillXXXItems)
• IntelliJではサービスロケータを多用する
• 普段はWeb一辺倒なので新鮮だった
• 普段自分が使っているツールをより理解できた
• ファイルの抽象化、機密情報の持ち方、etc.
30
苦労した点
• 機能の実現方法が全然分からない時がある
• 周りに知っている人がいない
• ニッチな機能だと記事が全然ない
• ドキュメントが多すぎてどこを見れば良いか分からない
• やっぱりドキュメントが壊れている
• 壊れているのを報告することが大事
31
まとめ
• JenkinsとIntelliJ IDEAのプラグインを自作した
• どちらのツールもJavaで作られている
• プラグインもJavaで書ける
• 「ないのなら作れば良い」という考えが身についた
みなさんも是非プラグインを自作してみてください!
コードレビュー改善のためにJenkinsとIntelliJ IDEAのプラグインを自作してみた話

Más contenido relacionado

La actualidad más candente

より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)NTT DATA Technology & Innovation
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?Yoshitaka Kawashima
 
コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話Yuta Shimada
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)NTT DATA Technology & Innovation
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)NTT DATA Technology & Innovation
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門Kohei Tokunaga
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門泰 増田
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)mosa siru
 
Introduction to JIT Compiler in JVM
Introduction to JIT Compiler in JVMIntroduction to JIT Compiler in JVM
Introduction to JIT Compiler in JVMKoichi Sakata
 
アプリを成長させるためのログ取りとログ解析に必要なこと
アプリを成長させるためのログ取りとログ解析に必要なことアプリを成長させるためのログ取りとログ解析に必要なこと
アプリを成長させるためのログ取りとログ解析に必要なことTakao Sumitomo
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021Hiroshi Tokumaru
 
モダンフロントエンド開発者に求められるスキルとは
モダンフロントエンド開発者に求められるスキルとはモダンフロントエンド開発者に求められるスキルとは
モダンフロントエンド開発者に求められるスキルとはTakuya Tejima
 
さくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みさくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みTakeshi Ogawa
 
BuildKitの概要と最近の機能
BuildKitの概要と最近の機能BuildKitの概要と最近の機能
BuildKitの概要と最近の機能Kohei Tokunaga
 
ソフトウェアでのパケット処理あれこれ〜何故我々はロードバランサを自作するに至ったのか〜
ソフトウェアでのパケット処理あれこれ〜何故我々はロードバランサを自作するに至ったのか〜ソフトウェアでのパケット処理あれこれ〜何故我々はロードバランサを自作するに至ったのか〜
ソフトウェアでのパケット処理あれこれ〜何故我々はロードバランサを自作するに至ったのか〜LINE Corporation
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugMasatoshi Tada
 
アジャイル開発とメトリクス
アジャイル開発とメトリクスアジャイル開発とメトリクス
アジャイル開発とメトリクスRakuten Group, Inc.
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -onozaty
 
怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション土岐 孝平
 

La actualidad más candente (20)

より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
 
Introduction to JIT Compiler in JVM
Introduction to JIT Compiler in JVMIntroduction to JIT Compiler in JVM
Introduction to JIT Compiler in JVM
 
アプリを成長させるためのログ取りとログ解析に必要なこと
アプリを成長させるためのログ取りとログ解析に必要なことアプリを成長させるためのログ取りとログ解析に必要なこと
アプリを成長させるためのログ取りとログ解析に必要なこと
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
モダンフロントエンド開発者に求められるスキルとは
モダンフロントエンド開発者に求められるスキルとはモダンフロントエンド開発者に求められるスキルとは
モダンフロントエンド開発者に求められるスキルとは
 
さくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みさくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組み
 
BuildKitの概要と最近の機能
BuildKitの概要と最近の機能BuildKitの概要と最近の機能
BuildKitの概要と最近の機能
 
ソフトウェアでのパケット処理あれこれ〜何故我々はロードバランサを自作するに至ったのか〜
ソフトウェアでのパケット処理あれこれ〜何故我々はロードバランサを自作するに至ったのか〜ソフトウェアでのパケット処理あれこれ〜何故我々はロードバランサを自作するに至ったのか〜
ソフトウェアでのパケット処理あれこれ〜何故我々はロードバランサを自作するに至ったのか〜
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
アジャイル開発とメトリクス
アジャイル開発とメトリクスアジャイル開発とメトリクス
アジャイル開発とメトリクス
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
 
Oss貢献超入門
Oss貢献超入門Oss貢献超入門
Oss貢献超入門
 
怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション
 

Similar a コードレビュー改善のためにJenkinsとIntelliJ IDEAのプラグインを自作してみた話

日々の開発フローにプラスする GitHub Actions ~ セキュリティ対策を取り込む
日々の開発フローにプラスする GitHub Actions ~ セキュリティ対策を取り込む日々の開発フローにプラスする GitHub Actions ~ セキュリティ対策を取り込む
日々の開発フローにプラスする GitHub Actions ~ セキュリティ対策を取り込むKazumi IWANAGA
 
Microsoft DevOps Hackathon (Sep 2015) Team 4 Presentation
Microsoft DevOps Hackathon (Sep 2015) Team 4 PresentationMicrosoft DevOps Hackathon (Sep 2015) Team 4 Presentation
Microsoft DevOps Hackathon (Sep 2015) Team 4 PresentationYuichiro Saito
 
静的解析Klocwork とJenkins CIの連携
静的解析Klocwork とJenkins CIの連携静的解析Klocwork とJenkins CIの連携
静的解析Klocwork とJenkins CIの連携Masaru Horioka
 
JenkinsとCodeBuildとCloud Buildと私
JenkinsとCodeBuildとCloud Buildと私JenkinsとCodeBuildとCloud Buildと私
JenkinsとCodeBuildとCloud Buildと私Shoji Shirotori
 
GitHub Actions と Azure PaaS でプルリクエストごとに環境を ~ Azure Static Web Apps と Containe...
GitHub Actions と Azure PaaS でプルリクエストごとに環境を ~ Azure Static Web Apps と Containe...GitHub Actions と Azure PaaS でプルリクエストごとに環境を ~ Azure Static Web Apps と Containe...
GitHub Actions と Azure PaaS でプルリクエストごとに環境を ~ Azure Static Web Apps と Containe...Kazumi IWANAGA
 
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50Preferred Networks
 
Jenkins勉強会 in 札幌 第二部
Jenkins勉強会 in 札幌 第二部Jenkins勉強会 in 札幌 第二部
Jenkins勉強会 in 札幌 第二部cactusman
 
自動化ーニバルだよ!GDC16に見る自動化技術とテストのトレンド
自動化ーニバルだよ!GDC16に見る自動化技術とテストのトレンド自動化ーニバルだよ!GDC16に見る自動化技術とテストのトレンド
自動化ーニバルだよ!GDC16に見る自動化技術とテストのトレンドTakehara Ryo
 
DevOps with Dynatrace
DevOps with DynatraceDevOps with Dynatrace
DevOps with DynatraceHarry Hiyoshi
 
Sansan における Android アプリ自動テスト導入事例
Sansan における Android アプリ自動テスト導入事例Sansan における Android アプリ自動テスト導入事例
Sansan における Android アプリ自動テスト導入事例健一 辰濱
 
Isomorphic web development with scala and scala.js
Isomorphic web development  with scala and scala.jsIsomorphic web development  with scala and scala.js
Isomorphic web development with scala and scala.jsTanUkkii
 
Smart Store サーバーレスアーキテクチャ編
Smart Store サーバーレスアーキテクチャ編Smart Store サーバーレスアーキテクチャ編
Smart Store サーバーレスアーキテクチャ編Microsoft Azure Japan
 
20190514 Smart Store - Azure servlerless architecture
20190514 Smart Store - Azure servlerless architecture20190514 Smart Store - Azure servlerless architecture
20190514 Smart Store - Azure servlerless architectureIssei Hiraoka
 
JaSST Niigata'20
JaSST Niigata'20JaSST Niigata'20
JaSST Niigata'20JumpeiIto2
 
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話JustSystems Corporation
 
品質を落とさずにウォーターフォール開発から徐々にアジャイル開発へとシフトしてみる
品質を落とさずにウォーターフォール開発から徐々にアジャイル開発へとシフトしてみる品質を落とさずにウォーターフォール開発から徐々にアジャイル開発へとシフトしてみる
品質を落とさずにウォーターフォール開発から徐々にアジャイル開発へとシフトしてみるJumpeiIto2
 
SharePoint 2013 Preview レビュー
SharePoint 2013 Preview レビューSharePoint 2013 Preview レビュー
SharePoint 2013 Preview レビューHirofumi Ota
 
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」Kazumi IWANAGA
 

Similar a コードレビュー改善のためにJenkinsとIntelliJ IDEAのプラグインを自作してみた話 (20)

日々の開発フローにプラスする GitHub Actions ~ セキュリティ対策を取り込む
日々の開発フローにプラスする GitHub Actions ~ セキュリティ対策を取り込む日々の開発フローにプラスする GitHub Actions ~ セキュリティ対策を取り込む
日々の開発フローにプラスする GitHub Actions ~ セキュリティ対策を取り込む
 
Microsoft DevOps Hackathon (Sep 2015) Team 4 Presentation
Microsoft DevOps Hackathon (Sep 2015) Team 4 PresentationMicrosoft DevOps Hackathon (Sep 2015) Team 4 Presentation
Microsoft DevOps Hackathon (Sep 2015) Team 4 Presentation
 
静的解析Klocwork とJenkins CIの連携
静的解析Klocwork とJenkins CIの連携静的解析Klocwork とJenkins CIの連携
静的解析Klocwork とJenkins CIの連携
 
JenkinsとCodeBuildとCloud Buildと私
JenkinsとCodeBuildとCloud Buildと私JenkinsとCodeBuildとCloud Buildと私
JenkinsとCodeBuildとCloud Buildと私
 
GitHub Actions と Azure PaaS でプルリクエストごとに環境を ~ Azure Static Web Apps と Containe...
GitHub Actions と Azure PaaS でプルリクエストごとに環境を ~ Azure Static Web Apps と Containe...GitHub Actions と Azure PaaS でプルリクエストごとに環境を ~ Azure Static Web Apps と Containe...
GitHub Actions と Azure PaaS でプルリクエストごとに環境を ~ Azure Static Web Apps と Containe...
 
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
 
Jenkins勉強会 in 札幌 第二部
Jenkins勉強会 in 札幌 第二部Jenkins勉強会 in 札幌 第二部
Jenkins勉強会 in 札幌 第二部
 
自動化ーニバルだよ!GDC16に見る自動化技術とテストのトレンド
自動化ーニバルだよ!GDC16に見る自動化技術とテストのトレンド自動化ーニバルだよ!GDC16に見る自動化技術とテストのトレンド
自動化ーニバルだよ!GDC16に見る自動化技術とテストのトレンド
 
DevOps with Dynatrace
DevOps with DynatraceDevOps with Dynatrace
DevOps with Dynatrace
 
Sansan における Android アプリ自動テスト導入事例
Sansan における Android アプリ自動テスト導入事例Sansan における Android アプリ自動テスト導入事例
Sansan における Android アプリ自動テスト導入事例
 
Isomorphic web development with scala and scala.js
Isomorphic web development  with scala and scala.jsIsomorphic web development  with scala and scala.js
Isomorphic web development with scala and scala.js
 
Smart Store サーバーレスアーキテクチャ編
Smart Store サーバーレスアーキテクチャ編Smart Store サーバーレスアーキテクチャ編
Smart Store サーバーレスアーキテクチャ編
 
20190514 Smart Store - Azure servlerless architecture
20190514 Smart Store - Azure servlerless architecture20190514 Smart Store - Azure servlerless architecture
20190514 Smart Store - Azure servlerless architecture
 
JaSST Niigata'20
JaSST Niigata'20JaSST Niigata'20
JaSST Niigata'20
 
研究紹介スライド
研究紹介スライド研究紹介スライド
研究紹介スライド
 
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
 
品質を落とさずにウォーターフォール開発から徐々にアジャイル開発へとシフトしてみる
品質を落とさずにウォーターフォール開発から徐々にアジャイル開発へとシフトしてみる品質を落とさずにウォーターフォール開発から徐々にアジャイル開発へとシフトしてみる
品質を落とさずにウォーターフォール開発から徐々にアジャイル開発へとシフトしてみる
 
SharePoint 2013 Preview レビュー
SharePoint 2013 Preview レビューSharePoint 2013 Preview レビュー
SharePoint 2013 Preview レビュー
 
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」
 
Jenkinsstudy#4kokawa
Jenkinsstudy#4kokawaJenkinsstudy#4kokawa
Jenkinsstudy#4kokawa
 

Más de Rakuten Group, Inc.

楽天における安全な秘匿情報管理への道のり
楽天における安全な秘匿情報管理への道のり楽天における安全な秘匿情報管理への道のり
楽天における安全な秘匿情報管理への道のりRakuten Group, Inc.
 
Simple and Effective Knowledge-Driven Query Expansion for QA-Based Product At...
Simple and Effective Knowledge-Driven Query Expansion for QA-Based Product At...Simple and Effective Knowledge-Driven Query Expansion for QA-Based Product At...
Simple and Effective Knowledge-Driven Query Expansion for QA-Based Product At...Rakuten Group, Inc.
 
DataSkillCultureを浸透させる楽天の取り組み
DataSkillCultureを浸透させる楽天の取り組みDataSkillCultureを浸透させる楽天の取り組み
DataSkillCultureを浸透させる楽天の取り組みRakuten Group, Inc.
 
大規模なリアルタイム監視の導入と展開
大規模なリアルタイム監視の導入と展開大規模なリアルタイム監視の導入と展開
大規模なリアルタイム監視の導入と展開Rakuten Group, Inc.
 
楽天における大規模データベースの運用
楽天における大規模データベースの運用楽天における大規模データベースの運用
楽天における大規模データベースの運用Rakuten Group, Inc.
 
楽天サービスを支えるネットワークインフラストラクチャー
楽天サービスを支えるネットワークインフラストラクチャー楽天サービスを支えるネットワークインフラストラクチャー
楽天サービスを支えるネットワークインフラストラクチャーRakuten Group, Inc.
 
楽天の規模とクラウドプラットフォーム統括部の役割
楽天の規模とクラウドプラットフォーム統括部の役割楽天の規模とクラウドプラットフォーム統括部の役割
楽天の規模とクラウドプラットフォーム統括部の役割Rakuten Group, Inc.
 
Rakuten Services and Infrastructure Team.pdf
Rakuten Services and Infrastructure Team.pdfRakuten Services and Infrastructure Team.pdf
Rakuten Services and Infrastructure Team.pdfRakuten Group, Inc.
 
The Data Platform Administration Handling the 100 PB.pdf
The Data Platform Administration Handling the 100 PB.pdfThe Data Platform Administration Handling the 100 PB.pdf
The Data Platform Administration Handling the 100 PB.pdfRakuten Group, Inc.
 
Supporting Internal Customers as Technical Account Managers.pdf
Supporting Internal Customers as Technical Account Managers.pdfSupporting Internal Customers as Technical Account Managers.pdf
Supporting Internal Customers as Technical Account Managers.pdfRakuten Group, Inc.
 
Making Cloud Native CI_CD Services.pdf
Making Cloud Native CI_CD Services.pdfMaking Cloud Native CI_CD Services.pdf
Making Cloud Native CI_CD Services.pdfRakuten Group, Inc.
 
How We Defined Our Own Cloud.pdf
How We Defined Our Own Cloud.pdfHow We Defined Our Own Cloud.pdf
How We Defined Our Own Cloud.pdfRakuten Group, Inc.
 
Travel & Leisure Platform Department's tech info
Travel & Leisure Platform Department's tech infoTravel & Leisure Platform Department's tech info
Travel & Leisure Platform Department's tech infoRakuten Group, Inc.
 
Travel & Leisure Platform Department's tech info
Travel & Leisure Platform Department's tech infoTravel & Leisure Platform Department's tech info
Travel & Leisure Platform Department's tech infoRakuten Group, Inc.
 
Introduction of GORA API Group technology
Introduction of GORA API Group technologyIntroduction of GORA API Group technology
Introduction of GORA API Group technologyRakuten Group, Inc.
 
100PBを越えるデータプラットフォームの実情
100PBを越えるデータプラットフォームの実情100PBを越えるデータプラットフォームの実情
100PBを越えるデータプラットフォームの実情Rakuten Group, Inc.
 
社内エンジニアを支えるテクニカルアカウントマネージャー
社内エンジニアを支えるテクニカルアカウントマネージャー社内エンジニアを支えるテクニカルアカウントマネージャー
社内エンジニアを支えるテクニカルアカウントマネージャーRakuten Group, Inc.
 
モニタリングプラットフォーム開発の裏側
モニタリングプラットフォーム開発の裏側モニタリングプラットフォーム開発の裏側
モニタリングプラットフォーム開発の裏側Rakuten Group, Inc.
 

Más de Rakuten Group, Inc. (20)

楽天における安全な秘匿情報管理への道のり
楽天における安全な秘匿情報管理への道のり楽天における安全な秘匿情報管理への道のり
楽天における安全な秘匿情報管理への道のり
 
What Makes Software Green?
What Makes Software Green?What Makes Software Green?
What Makes Software Green?
 
Simple and Effective Knowledge-Driven Query Expansion for QA-Based Product At...
Simple and Effective Knowledge-Driven Query Expansion for QA-Based Product At...Simple and Effective Knowledge-Driven Query Expansion for QA-Based Product At...
Simple and Effective Knowledge-Driven Query Expansion for QA-Based Product At...
 
DataSkillCultureを浸透させる楽天の取り組み
DataSkillCultureを浸透させる楽天の取り組みDataSkillCultureを浸透させる楽天の取り組み
DataSkillCultureを浸透させる楽天の取り組み
 
大規模なリアルタイム監視の導入と展開
大規模なリアルタイム監視の導入と展開大規模なリアルタイム監視の導入と展開
大規模なリアルタイム監視の導入と展開
 
楽天における大規模データベースの運用
楽天における大規模データベースの運用楽天における大規模データベースの運用
楽天における大規模データベースの運用
 
楽天サービスを支えるネットワークインフラストラクチャー
楽天サービスを支えるネットワークインフラストラクチャー楽天サービスを支えるネットワークインフラストラクチャー
楽天サービスを支えるネットワークインフラストラクチャー
 
楽天の規模とクラウドプラットフォーム統括部の役割
楽天の規模とクラウドプラットフォーム統括部の役割楽天の規模とクラウドプラットフォーム統括部の役割
楽天の規模とクラウドプラットフォーム統括部の役割
 
Rakuten Services and Infrastructure Team.pdf
Rakuten Services and Infrastructure Team.pdfRakuten Services and Infrastructure Team.pdf
Rakuten Services and Infrastructure Team.pdf
 
The Data Platform Administration Handling the 100 PB.pdf
The Data Platform Administration Handling the 100 PB.pdfThe Data Platform Administration Handling the 100 PB.pdf
The Data Platform Administration Handling the 100 PB.pdf
 
Supporting Internal Customers as Technical Account Managers.pdf
Supporting Internal Customers as Technical Account Managers.pdfSupporting Internal Customers as Technical Account Managers.pdf
Supporting Internal Customers as Technical Account Managers.pdf
 
Making Cloud Native CI_CD Services.pdf
Making Cloud Native CI_CD Services.pdfMaking Cloud Native CI_CD Services.pdf
Making Cloud Native CI_CD Services.pdf
 
How We Defined Our Own Cloud.pdf
How We Defined Our Own Cloud.pdfHow We Defined Our Own Cloud.pdf
How We Defined Our Own Cloud.pdf
 
Travel & Leisure Platform Department's tech info
Travel & Leisure Platform Department's tech infoTravel & Leisure Platform Department's tech info
Travel & Leisure Platform Department's tech info
 
Travel & Leisure Platform Department's tech info
Travel & Leisure Platform Department's tech infoTravel & Leisure Platform Department's tech info
Travel & Leisure Platform Department's tech info
 
OWASPTop10_Introduction
OWASPTop10_IntroductionOWASPTop10_Introduction
OWASPTop10_Introduction
 
Introduction of GORA API Group technology
Introduction of GORA API Group technologyIntroduction of GORA API Group technology
Introduction of GORA API Group technology
 
100PBを越えるデータプラットフォームの実情
100PBを越えるデータプラットフォームの実情100PBを越えるデータプラットフォームの実情
100PBを越えるデータプラットフォームの実情
 
社内エンジニアを支えるテクニカルアカウントマネージャー
社内エンジニアを支えるテクニカルアカウントマネージャー社内エンジニアを支えるテクニカルアカウントマネージャー
社内エンジニアを支えるテクニカルアカウントマネージャー
 
モニタリングプラットフォーム開発の裏側
モニタリングプラットフォーム開発の裏側モニタリングプラットフォーム開発の裏側
モニタリングプラットフォーム開発の裏側
 

コードレビュー改善のためにJenkinsとIntelliJ IDEAのプラグインを自作してみた話

Notas del editor

  1. こんにちは、楽天の中川と申します。 今回は「コードレビュー改善のためにJenkinsとIntelliJ IDEAのプラグインを自作してみた話」というタイトルで発表させていただきます。 ぜひ楽しんでいただければと思います。よろしくお願いします。
  2. まずはコードレビューについて、質問させてください。 みなさんはコードレビューの際に、どんなことを確認しますか。 コードが仕様通りというのはとても重要なポイントですね。 他にも、コードの質やテストの質、また、テストの質の一環として、カバレッジを確認する方も多いと思います。
  3. 弊社では、GitリポジトリのホスティングにAttlasianのBitbucket Serverを使っています。 このシステムには、プルリクエストのdiff画面にカバレッジを視覚的に表示する機能があり、この機能を利用するためのAPIが提供されています。 社内では僕が知る限りこの機能を使っているチームはいなくて、知ってる人も少ないと思うんですけど、 僕が初めてこの機能を知った時相当便利だなと感じて、これを利用したらコードレビューのプロセスを改善できるんじゃないかと感じました。
  4. 私たちは、CIツールとしてJenkinsを使っています。 CIパイプラインとして、今まではプルリクエストを作成するたびにリポジトリのクローンから、コンパイル、テスト、カバレッジ計測までを行なっていました。 ここに、先ほど紹介したカバレッジ表示を組み込みたいと考えました。
  5. 先ほど、カバレッジ表示機能を利用するためのAPIがあると説明しました。 なので、Jenkins内でJaCoCoのカバレッジ計測結果をAPIのリクエストボディに変換して、APIを呼び出せば良さそうです。 通常、Jenkinsで何らかの処理を行う場合、プラグインを利用するか、Jenkinsfileというジョブを定義するファイルに処理をベタ書きするかの二択だと思います。 しかし、問題点として、今回の目的に合致するプラグインは残念ながら見つかりませんでした。 Jenkinsfileにベタ書きする方法は、Jenkinsfileが肥大化するうえに、書いた処理をテストできないという理由があるため、あまり取りたくありません。
  6. ここでJenkinsの知っておいてほしい特徴が二つあります。 まず、Jenkins自体はJavaで書かれています。 また、Jenkinsはプラグインを用いて簡単に拡張できます。 JenkinsはJavaで書かれているため、プラグイン自体もJavaで書けます。 そこで、カバレッジ表示APIを呼ぶプラグインを自分で作ろうという結論に至りました。
  7. 次に、Jenkinsプラグインの作り方について軽く触れたいと思います。 僕は今回のJenkinsプラグインを次の5つのステップで作りました。
  8. まずはJenkinsプラグインの雛形を生成します。 今回はプラグイン作りが初めてだったので、動く雛形を生成し、そこからインクリメンタルに自分の実装を入れていく方法を取りました。 Jenkinsプラグインの雛形はMavenのarchtypeプラグインから生成できます。 次のコマンドは、Hello Worldを出力するJenkinsプラグインを生成します。
  9. 次にインターフェースを定義します。 ここでいうインターフェースとは、ユーザの入力をプログラム側で受け取る方法を指します。 Jenkinsには2種類の入力方法があります。 1つめはジョブごとの設定値です。 2つめは、Jenkins全体での設定値です。 ここで設定した値は、作成したプラグインを利用するすべてのジョブで共有されます。
  10. ジョブごとの設定値は、プラグインのエントリーポイントとなるクラスのフィールド変数として、Jenkinsがコンストラクタやセッターなどから注入します。
  11. 一方で、Jenkins全体の設定値は、JenkinsのローカルにXMLとして保存されているので、ジョブの実行時にヘルパーを介して取得しに行く必要があります。
  12. インターフェースを定義したら、そこからゴリゴリロジックを書いていきます。 performメソッドがエントリポイントなので、そこからメソッドやクラスを呼び出すという形で開発していきます。
  13. 開発が一通り済んだら、動くものを手で確認します。 Jenkinsのプラグイン開発には、サンドボックスを立ち上げるコマンドが用意されています。 この時に注意なのが、サンドボックス環境で使ったデータは全てtargetディレクトリ下に置かれるため、…
  14. プラグインのアーカイブであるhpiファイルが生成される Jenkinsのプラグイン管理画面 プラグインを直接デプロイするという項目があるので、 こうすることで、最終的に作ったプラグインを実際のJenkinsで利用することができます。
  15. 今回作成したプラグインはGitHubで公開しています。 興味があったら、ぜひコードを見に行ってみてください。
  16. Jenkinsのプラグインを自作して、先ほど説明したカバレッジ表示機能をチームで使えるようにしました。 その結果として、まずチームとしては、プルリクエストでのカバレッジの確認が圧倒的に楽になりました。 これまで、カバレッジを視覚的に確認したい場合、JaCoCoのHTMLを確認しにいく必要がありましたが、それがなくなりました。 その結果、不足しているテストをレビューで指摘しやすくなりました。 また、テストを足しやすくするためにリファクタリングしようという意見が出ることもありました。 コードレビュープロセスを改善できたかなぁと感じています。 また、個人としては、 普段何となく使っているJenkinsを深く理解できたのと、新しいことを学びたい欲が満たせたので、やって良かったなぁと思っています。
  17. これで僕達のチームのコードレビュー改善は完了したんですが、この話を聞いた隣のチームのメンバにこういう相談を持ちかけられました。 その人曰く、その人を含めたチームメンバーも、Bitbucketのカバレッジ表示機能に興味がある。 そのチームの開発にはJaCoCoもJenkinsも使っていないので、今回僕が作ったプラグインを利用できない。
  18. そこで、IntteliJでカバレッジを計測して、その結果をBitbucketに送信できたりしないかなぁという話をしました。
  19. つまり、コードとテストを書く、カバレッジを計測する、その結果をAPIのリクエストボディに変換してAPIを呼ぶ、 この一連の流れをIntelliJ上で完結するようにしたいとのことでした
  20. ここで、IntelliJの特徴について紹介します。 IntelliJはJavaで作られています。また、プラグインを用いて機能を拡張できます。 つまり、Jenkinsと一緒で、プラグインもJavaで書けるので、IntelliJのプラグインを自作しよう、という発想に至りました。
  21. IntelliJのプラグイン開発ですが、Jenkinsの時と同じように、雛形を作るところからIntelliJにインストールするところまで、それに加えて、公開する方法について紹介したいと思います。
  22. まずは雛形を生成します。 IntelliJプラグインの生成はIntelliJ自体から行うことができます。 New Projectの画面から"IDE Plugin"を選択してください。
  23. 次にインターフェースを定義します。 IntelliJでは、UIと入力値の取得はSwingを用いて書きます また、JetBrainsはSwing用のKotlinのDSLを提供しているので、Javaで生のSwingを書くのに比べて、すっきりしたコードを書けます。
  24. 次にロジックを書いていきます。 エントリーポイントは、AnActionクラスを継承したクラスのactionPerformedメソッドです。
  25. ロジックを書いたらテストをします。 runIdeコマンドを実行すると、サンドボックス環境が立ち上がります。 注意点としては、こちらもbuildディレクトリの下にすべてのデータが格納されるため、cleanを実行するとデータが飛びます。
  26. buildPluginコマンドでjarファイルを生成できる
  27. 最後に出来上がったものを公開しましょう。 IntelliJのプラグインは非常に簡単に公開できます。 JetBrainsのプラグインマーケットに"Upload plugin"という項目があるので、そこにアクセスして、アーカイブファイルと必要な情報を登録することで公開できます
  28. IntelliJのプラグインの開発方法の説明は以上です。 まとめに入っていきたいと思います