takemikamiʼs note ‒ http://takemikami.com/
CircleCIを使った
SpringBoot/GAEアプリ開発の効率化ノウハウ
Copyright (C) Takeshi Mikami. All rights reserved. 1
三上 威 - @takemikami
アーリース情報技術株式会社 代表取締役 社⻑
CircleCI ユーザーコミュニティミートアップ #5
2019.6.28 @株式会社ビズリーチ
takemikamiʼs note ‒ http://takemikami.com/
はじめに
•テーマ
CircleCIを使った
SpringBoot/GAEアプリ開発の効率化ノウハウ
•内容
• GitHub Flowによる開発プロセス
• コードレビューの効率化
Copyright (C) Takeshi Mikami. All rights reserved. 2
本⽇のセッションでお話しする内容について⽰します
※ Spring Boot, Google App Engineを例に話しますが、
他のFrameworkや環境にも応⽤可能な内容です
※参考ソースコード: https://github.com/takemikami/circlecijp-20190628
takemikamiʼs note ‒ http://takemikami.com/
⾃⼰紹介
• 三上威 (@takemikami)
• データエンジニア・サイエンティスト
• タスク: 分析・予測モデル開発・基盤構築 etc
• 対象: マーケティングデータ etc
• 略歴
• 甲南⼤学理学部応⽤数学科 卒
• EC, CRM等のシステム構築 @ NEC系SIer
• ECサイトのマーケティングデータ分析 @ DeNA
• データ分析・予測モデル開発・基盤構築 @アーリース情報技術(株)
Copyright (C) Takeshi Mikami. All rights reserved. 3
発表者のプロフィールを紹介します
※フリーランスの法⼈成り
takemikamiʼs note ‒ http://takemikami.com/
⾃⼰紹介 開発プロダクト
• objectify-appengine-memcacheclient
• Google Cloud DatastoreのJava⽤ライブラリ「Objectify」(v6以降)で、
Google AppEngine Memcache のキャッシュを利⽤するためのサービス
• https://github.com/takemikami/objectify-appengine-memcacheclient
• digdag-plugin-shresult
• ワークフローエンジン「Digdag」のプラグイン
• シェルスクリプトを実⾏し、標準出⼒をDigdagの変数に格納するオペレータ
• https://github.com/takemikami/digdag-plugin-shresult
Copyright (C) Takeshi Mikami. All rights reserved. 4
発表者が作ったプロダクトを紹介します
etc
takemikamiʼs note ‒ http://takemikami.com/
⾃⼰紹介 技術同⼈誌
• Apache Hadoop & Sparkビッグデータプログラミング⼊⾨
• ビッグデータの加⼯や機械学習のためのプログラミングガイド
• 2019.4.14 技術書典6 @ 池袋サンシャインシティ2F 展⽰ホールD
Copyright (C) Takeshi Mikami. All rights reserved. 5
発表者が執筆した同⼈誌を紹介します
https://takemikami.booth.pm/
takemikamiʼs note ‒ http://takemikami.com/
GitHub Flowによる開発プロセス
Copyright (C) Takeshi Mikami. All rights reserved. 6
takemikamiʼs note ‒ http://takemikami.com/
効率化ノウハウの想定環境
• 想定環境
• ソースコード管理: GitHub
• 開発プロセス: GitHub Flow
• デプロイ先: Google App Engine Standard Environment
• フレームワーク: Spring Boot
• ビルドツール: Gradle
• IDE: IntelliJ IDEA
• CI/CDツール: CircleCI
→ 次ページ以降のスライドで、
GitHub Flow, Google App Engine について説明します
Copyright (C) Takeshi Mikami. All rights reserved. 7
紹介する効率化ノウハウで想定する環境を⽰します
takemikamiʼs note ‒ http://takemikami.com/
GitHub Flowとは
• 次のフローで運⽤
• masterブランチは常にデプロイ可能な状態であること
• 開発を始める時は、masterからブランチを切り、開発内容がわかるようにブラン
チ名をつける
• ローカルPCの作業は、同じブランチ名でサーバ(GitHub)にpushする
• 意⾒を求めたり、教えて欲しいことがある場合は、Pull Requestを使う
• 開発ブランチは、誰かにレビューを依頼して承認をもらったら、masterにマージ
できる
• masterにマージしたら、直ちにデプロイする
Copyright (C) Takeshi Mikami. All rights reserved. 8
GitHub Flowを紹介します
「シンプルさ」に特徴がある
Gitによる開発ワークフローのモデル
takemikamiʼs note ‒ http://takemikami.com/
GitHub Flowのブランチモデル
• GitHub Flowのブランチモデルは以下のようになります
Copyright (C) Takeshi Mikami. All rights reserved. 9
GitHub Flowのブランチモデルを⽰します
commit
branch
branch
commit
merge
merge
(rebase) merge
commit
master branch
descriptive branch
descriptive branch
開発を始める時は
masterからブランチを切る
masterにマージしたら
直ちにデプロイ
レビュー承認をもらったら
masterにマージできる
masterは常に
デプロイ可能な状態に
開発中はPullRequestを使って相談
takemikamiʼs note ‒ http://takemikami.com/
GitHub FlowとCI・レビュー・デプロイの関連
Copyright (C) Takeshi Mikami. All rights reserved. 10
GitHub FlowとCI・レビュー・デプロイの関連を図に⽰します
Developer GitHub Reviewer CI
development
environment
staging
environment
clone/pull (master branch)
branch
commit
push (descriptive branch)
clone
send status(OK/NG)
auto test
deploy
review request
check check
approve
merge deploy
pull request
(⼈による)レビュー
CIによるチェック
takemikamiʼs note ‒ http://takemikami.com/
Google App EngineのVersionとDeployment
• Google App Engineでは、Versionを作ってサービスを管理できる
Copyright (C) Takeshi Mikami. All rights reserved. 11
Google App EngineのVersionとDeploymentについて説明します
20190629t101010
20190628t170812
20190628t131110
20190627t153324
endpoint
修正単位(機能追加や不具合修正)の単位Versionを作成可能
① 修正後、DeployしてVersionを作る
・・・
② Deploy後に、Versionを切り替え(promote)
新Versionでのサービスを公開する
takemikamiʼs note ‒ http://takemikami.com/
コードレビューの効率化
Copyright (C) Takeshi Mikami. All rights reserved. 12
takemikamiʼs note ‒ http://takemikami.com/
コードレビューの⾯倒さ
• 他のブランチをチェックアウトするのが⾯倒
• IDEに取り込みInspectorでチェックしたいが、⾃分の作業を⼀段落させてブラン
チ切り替えるのは⾯倒
• 修正の差分のみに着⽬してレビューしにくい
• GitHubのPullRequestではコード差分をチェックできるが、Inspectorの指摘と紐
付けて確認したい
• 動作確認環境を作るのが⾯倒
• 簡単に動作確認したいが、PullRequestごと切り替えて環境を⽤意するのは⾯倒
→これらの課題に対する対処ノウハウを考えていきます
Copyright (C) Takeshi Mikami. All rights reserved. 13
コードレビューの⾯倒さについて⽰します
takemikamiʼs note ‒ http://takemikami.com/
GitHub FlowとCI・レビュー・デプロイの関連
Copyright (C) Takeshi Mikami. All rights reserved. 14
GitHub FlowとCI・レビュー・デプロイの関連を図に⽰します
Developer GitHub Reviewer CI
development
environment
staging
environment
clone/pull (master branch)
branch
commit
push (descriptive branch)
clone
send status(OK/NG)
auto test
deploy
review request
check check
approve
merge deploy
pull request
(⼈による)レビュー
CIによるチェック
CIによって
レビューを⽀援
takemikamiʼs note ‒ http://takemikami.com/
コードチェックの⾃動化
Copyright (C) Takeshi Mikami. All rights reserved. 15
CIによるコードチェックの⾃動化イメージを⽰します
Developer GitHub Reviewer CI
development
environment
staging
environment
clone/pull (master branch)
branch
commit
push (descriptive branch)
clone
send status(OK/NG)
auto test
deploy
review request
check check
approve
merge deploy
pull request
CIでチェックツールを動かす
takemikamiʼs note ‒ http://takemikami.com/
コードチェックの⾃動化 .circleci/config.yml
• CIでのコードチェックの⾃動化の流れ (.circleci/config.yml)
Copyright (C) Takeshi Mikami. All rights reserved. 16
CIによるコードチェックの⾃動化イメージを⽰します
steps:
- run:
name:
command: |
./gradlew check
- store_artifacts:
path: ~/repo/build/reports
- run:
name: report
when: always
command: |
.circleci/report.sh
Gradleからチェックツールを実⾏
結果レポートをArtifactに保存
レポートへのリンクをPullRequestにコメント
(シェルスクリプトで実装)
※失敗時も実⾏するので「when: always」に
takemikamiʼs note ‒ http://takemikami.com/
コードチェックの⾃動化 レポートへのリンク
• Artifactのリンクがやや深い → botでPullRequestにリンクをコメント
Copyright (C) Takeshi Mikami. All rights reserved. 17
CIによるコードチェックの⾃動化イメージを⽰します
リンクがやや深い
リンクをコメント
takemikamiʼs note ‒ http://takemikami.com/
コードチェックの⾃動化 Artifactのリンク取得
• ArtifactのリンクURL⼀覧は以下コマンドで取得
※環境変数「CIRCLE_TOKEN」にtokenの設定要
• 例) PMDのレポートのURL取得
Copyright (C) Takeshi Mikami. All rights reserved. 18
CIによるコードチェックの⾃動化イメージを⽰します
$ curl
https://circleci.com/api/v1.1/project/github/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJE
CT_REPONAME/$CIRCLE_BUILD_NUM/artifacts?circle-token=$CIRCLE_TOKEN | jq -r '.[].url'
URL_LIST=$(curl
https://circleci.com/api/v1.1/project/github/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJE
CT_REPONAME/$CIRCLE_BUILD_NUM/artifacts?circle-token=$CIRCLE_TOKEN | jq -r '.[].urlʼ)
URL_PMD=$(echo "$URL_LIST" | grep "pmd/main.html$")
後⽅⼀致でGrepすればOK
takemikamiʼs note ‒ http://takemikami.com/
コードチェックの⾃動化 PullRequestにコメント
• GitHubのPullRequestへのコメントは以下のコマンドで可能
※環境変数「GITHUB_ACCESS_TOKEN」にtokenの設定要
Copyright (C) Takeshi Mikami. All rights reserved. 19
CIによるコードチェックの⾃動化イメージを⽰します
GH_COMMENT_BODY="※コメント内容※"
CIRCLE_REPO=$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME
CIRCLE_PR_NUM="${CIRCLE_PR_NUMBER:-${CIRCLE_PULL_REQUEST##*/}}”
curl -s -u $GITHUB_ACCESS_TOKEN 
-X POST 
--data "{"body":"$GH_COMMENT_BODY"}" 
https://api.github.com/repos/$CIRCLE_REPO/issues/$CIRCLE_PR_NUM/comments
takemikamiʼs note ‒ http://takemikami.com/
補遺: CircleCIでIntelliJ IDEA のInspector実⾏
• IntelliJ IDEAのInspectionはバッチ実⾏が可能
• プロジェクト内で使⽤するIDEを統⼀出来る場合、
以下のような理由で、運⽤しやすい
• 指摘項⽬を各⾃PCとCIで統⼀出来る
• 指摘項⽬の設定をIntelliJ IDEAのGUIで設定できる
• レポートはxml形式なので、xmllintなどで加⼯すると⾒やすい
Copyright (C) Takeshi Mikami. All rights reserved. 20
CircleCIでIntelliJ IDEAのInspectorを実⾏する参考情報を⽰します
(参考)
CircleCIでIntelliJ IDEAのInspection機能による静的テストを実⾏する | takemikami.com
https://takemikami.com/2018/12/08/CircleCIIntelliJ-IDEAInspection.html
takemikamiʼs note ‒ http://takemikami.com/
修正差分に対するコードチェック
• PullRequestのコード差分箇所に対する
「チェックツールの指摘項⽬」に注⽬してレビューしたい
→各チェックツールの指摘項⽬を、コード差分箇所に絞り込み
PullRequestにbotでコメントする
Copyright (C) Takeshi Mikami. All rights reserved. 21
修正差分に対するコードチェックの対応イメージを⽰します
絞り込んだ指摘項⽬を
コメント
takemikamiʼs note ‒ http://takemikami.com/
修正差分に対するコードチェック
• 修正差分箇所のファイル名・⾏番号は、gitコマンドで取得
• masterブランチに対する未マージコミット⼀覧を表⽰
• ⾏ごとに最終変更コミットを表⽰
→これらの結果から、指摘項⽬をフィルタ
Copyright (C) Takeshi Mikami. All rights reserved. 22
修正差分に対するコードチェックの対応イメージを⽰します
git --no-pager log --no-merges origin/master...HEAD | grep -e '^commit'
git --no-pager blame (対象ファイル)
takemikamiʼs note ‒ http://takemikami.com/
動作確認⽤のデプロイ
Copyright (C) Takeshi Mikami. All rights reserved. 23
動作確認⽤デプロイの対応イメージを⽰します
Developer GitHub Reviewer CI
development
environment
staging
environment
clone/pull (master branch)
branch
commit
push (descriptive branch)
clone
send status(OK/NG)
auto test
deploy
review request
check check
approve
merge deploy
pull request 開発中のモジュールを
動作確認⽤のVersionにデプロイ
takemikamiʼs note ‒ http://takemikami.com/
動作確認⽤のデプロイ
• Google App EngineのVersion・PullRequestを対応づけてデプロイ
Copyright (C) Takeshi Mikami. All rights reserved. 24
動作確認⽤デプロイの対応イメージを⽰します
4
3
2
1
・・・
4
3
2
1
・・・
GitHub
PullRequest
App Engine
Version
PullRequest番号をVersionとして
デプロイする
takemikamiʼs note ‒ http://takemikami.com/
動作確認⽤のデプロイ
• デプロイ時のVersion指定⽅法 (build.gradle)
Copyright (C) Takeshi Mikami. All rights reserved. 25
動作確認⽤デプロイの対応イメージを⽰します
// appengine deployment settings
appengine {
deploy {
projectId = System.getenv("GOOGLE_PROJECT_ID")
version = System.getenv("CIRCLE_PR_NUM") ?: (new Date()).format("yyyyMMdd't'HHmmss")
promote = "master" == System.getenv("CIRCLE_BRANCH")
}
}
PullRequestの番号をVersionに
masterへのマージ時以外は
切り替えない(promoteしない)
takemikamiʼs note ‒ http://takemikami.com/
動作確認⽤のデプロイ
• Google App EngineのVersion・PullRequest番号を揃えてあるので、
次のリンクをPullRequestにbotで簡単にコメントできる
• アプリケーションへのリンク
• App Engine Dashboardへのリンク
• Stackdriver Loggingのログへのリンク
Copyright (C) Takeshi Mikami. All rights reserved. 26
動作確認⽤デプロイの対応イメージを⽰します
対象Versionの
各種リンクをコメント
takemikamiʼs note ‒ http://takemikami.com/
動作確認⽤のデプロイ
• サービスのリンク:
• https://${CIRCLE_PR_NUM}-dot-default-dot-
${GOOGLE_PROJECT_ID}.appspot.com/
• Dashboardへのリンク:
• https://console.cloud.google.com/appengine?hl=ja&project=${GOOGLE_PROJ
ECT_ID}&serviceId=default&duration=PT1H&versionId=${CIRCLE_PR_NUM}
• Loggingへのリンク:
• https://console.cloud.google.com/logs/viewer?project=${GOOGLE_PROJECT_
ID}&hl=ja&resource=gae_app%2Fmodule_id%2Fdefault%2Fversion_id%2F${CI
RCLE_PR_NUM}&minLogLevel=0&expandAll=false
※ Version・PullRequest番号を揃えておくとリンクを⽣成しやすい
Copyright (C) Takeshi Mikami. All rights reserved. 27
動作確認⽤デプロイの対応イメージを⽰します
takemikamiʼs note ‒ http://takemikami.com/
botによるPull Requestへのコメント
Copyright (C) Takeshi Mikami. All rights reserved. 28
botによるPullRequestへのコメントのイメージ全体を⽰します
動作確認⽤
アプリケーションへ
Dashboard Logging
PMD Report
Checkstyle Report 指摘事項のコード
コメントを
レビュー⽤ポータルに
takemikamiʼs note ‒ http://takemikami.com/
まとめ
• コードレビューには、次のような⾯倒さが伴う
• 他のブランチをチェックアウトするのが⾯倒
• 修正の差分のみに着⽬してレビューしにくい
• 動作確認環境を作るのが⾯倒
• コードレビューの⾯倒さをCI/CDによる⽀援で軽減できる
• レビュー担当者が⼿元に開発環境を⽤意せずレビュー可能
• PullRequestコメントをレビュー⽤ポータルにすると便利
Copyright (C) Takeshi Mikami. All rights reserved. 29
本セッションのまとめです
takemikamiʼs note ‒ http://takemikami.com/
参考情報
Copyright (C) Takeshi Mikami. All rights reserved. 30
takemikamiʼs note ‒ http://takemikami.com/
その他のCI関連ノウハウ
• GitHubのPullRequestでデプロイ先環境を切り替える運⽤⽅法
https://takemikami.com/2018/12/04/GitHubPullRequest.html
• groovyとcheckstyleによるプロジェクト固有のコーディングルールの
チェック⼿順
https://takemikami.com/2018/08/31/groovycheckstyle.html
• GitHubのPullRequestを⽤いた暫定対処コードのコントロール⼿法の提
案
https://takemikami.com/2019/06/02/GitHubPullRequest.html
• RubocopでPullRequestの変更箇所で問題があった場合のみCIを失敗さ
せる
https://takemikami.com/2018/01/30/RubocopPullRequestCI.html
Copyright (C) Takeshi Mikami. All rights reserved. 31
その他のCI関連ノウハウの情報を⽰します
takemikamiʼs note ‒ http://takemikami.com/
参考Webサイトリスト
• Built-in Environment Variables | circleci Docs
https://circleci.com/docs/2.0/env-vars/#built-in-environment-
variables
• Download an artifact file | circleci Docs
https://circleci.com/docs/api/#download-an-artifact-file
• Comments | GitHub REST API v3
https://developer.github.com/v3/issues/comments/
• Gradle と App Engine プラグインを使⽤する | Google App Engine
https://cloud.google.com/appengine/docs/standard/java/tools/gradl
e
Copyright (C) Takeshi Mikami. All rights reserved. 32
本資料作成にあたって参考にしたWebサイトのリストです

CircleCIを使ったSpringBoot/GAEアプリ開発の効率化ノウハウ

  • 1.
    takemikamiʼs note ‒http://takemikami.com/ CircleCIを使った SpringBoot/GAEアプリ開発の効率化ノウハウ Copyright (C) Takeshi Mikami. All rights reserved. 1 三上 威 - @takemikami アーリース情報技術株式会社 代表取締役 社⻑ CircleCI ユーザーコミュニティミートアップ #5 2019.6.28 @株式会社ビズリーチ
  • 2.
    takemikamiʼs note ‒http://takemikami.com/ はじめに •テーマ CircleCIを使った SpringBoot/GAEアプリ開発の効率化ノウハウ •内容 • GitHub Flowによる開発プロセス • コードレビューの効率化 Copyright (C) Takeshi Mikami. All rights reserved. 2 本⽇のセッションでお話しする内容について⽰します ※ Spring Boot, Google App Engineを例に話しますが、 他のFrameworkや環境にも応⽤可能な内容です ※参考ソースコード: https://github.com/takemikami/circlecijp-20190628
  • 3.
    takemikamiʼs note ‒http://takemikami.com/ ⾃⼰紹介 • 三上威 (@takemikami) • データエンジニア・サイエンティスト • タスク: 分析・予測モデル開発・基盤構築 etc • 対象: マーケティングデータ etc • 略歴 • 甲南⼤学理学部応⽤数学科 卒 • EC, CRM等のシステム構築 @ NEC系SIer • ECサイトのマーケティングデータ分析 @ DeNA • データ分析・予測モデル開発・基盤構築 @アーリース情報技術(株) Copyright (C) Takeshi Mikami. All rights reserved. 3 発表者のプロフィールを紹介します ※フリーランスの法⼈成り
  • 4.
    takemikamiʼs note ‒http://takemikami.com/ ⾃⼰紹介 開発プロダクト • objectify-appengine-memcacheclient • Google Cloud DatastoreのJava⽤ライブラリ「Objectify」(v6以降)で、 Google AppEngine Memcache のキャッシュを利⽤するためのサービス • https://github.com/takemikami/objectify-appengine-memcacheclient • digdag-plugin-shresult • ワークフローエンジン「Digdag」のプラグイン • シェルスクリプトを実⾏し、標準出⼒をDigdagの変数に格納するオペレータ • https://github.com/takemikami/digdag-plugin-shresult Copyright (C) Takeshi Mikami. All rights reserved. 4 発表者が作ったプロダクトを紹介します etc
  • 5.
    takemikamiʼs note ‒http://takemikami.com/ ⾃⼰紹介 技術同⼈誌 • Apache Hadoop & Sparkビッグデータプログラミング⼊⾨ • ビッグデータの加⼯や機械学習のためのプログラミングガイド • 2019.4.14 技術書典6 @ 池袋サンシャインシティ2F 展⽰ホールD Copyright (C) Takeshi Mikami. All rights reserved. 5 発表者が執筆した同⼈誌を紹介します https://takemikami.booth.pm/
  • 6.
    takemikamiʼs note ‒http://takemikami.com/ GitHub Flowによる開発プロセス Copyright (C) Takeshi Mikami. All rights reserved. 6
  • 7.
    takemikamiʼs note ‒http://takemikami.com/ 効率化ノウハウの想定環境 • 想定環境 • ソースコード管理: GitHub • 開発プロセス: GitHub Flow • デプロイ先: Google App Engine Standard Environment • フレームワーク: Spring Boot • ビルドツール: Gradle • IDE: IntelliJ IDEA • CI/CDツール: CircleCI → 次ページ以降のスライドで、 GitHub Flow, Google App Engine について説明します Copyright (C) Takeshi Mikami. All rights reserved. 7 紹介する効率化ノウハウで想定する環境を⽰します
  • 8.
    takemikamiʼs note ‒http://takemikami.com/ GitHub Flowとは • 次のフローで運⽤ • masterブランチは常にデプロイ可能な状態であること • 開発を始める時は、masterからブランチを切り、開発内容がわかるようにブラン チ名をつける • ローカルPCの作業は、同じブランチ名でサーバ(GitHub)にpushする • 意⾒を求めたり、教えて欲しいことがある場合は、Pull Requestを使う • 開発ブランチは、誰かにレビューを依頼して承認をもらったら、masterにマージ できる • masterにマージしたら、直ちにデプロイする Copyright (C) Takeshi Mikami. All rights reserved. 8 GitHub Flowを紹介します 「シンプルさ」に特徴がある Gitによる開発ワークフローのモデル
  • 9.
    takemikamiʼs note ‒http://takemikami.com/ GitHub Flowのブランチモデル • GitHub Flowのブランチモデルは以下のようになります Copyright (C) Takeshi Mikami. All rights reserved. 9 GitHub Flowのブランチモデルを⽰します commit branch branch commit merge merge (rebase) merge commit master branch descriptive branch descriptive branch 開発を始める時は masterからブランチを切る masterにマージしたら 直ちにデプロイ レビュー承認をもらったら masterにマージできる masterは常に デプロイ可能な状態に 開発中はPullRequestを使って相談
  • 10.
    takemikamiʼs note ‒http://takemikami.com/ GitHub FlowとCI・レビュー・デプロイの関連 Copyright (C) Takeshi Mikami. All rights reserved. 10 GitHub FlowとCI・レビュー・デプロイの関連を図に⽰します Developer GitHub Reviewer CI development environment staging environment clone/pull (master branch) branch commit push (descriptive branch) clone send status(OK/NG) auto test deploy review request check check approve merge deploy pull request (⼈による)レビュー CIによるチェック
  • 11.
    takemikamiʼs note ‒http://takemikami.com/ Google App EngineのVersionとDeployment • Google App Engineでは、Versionを作ってサービスを管理できる Copyright (C) Takeshi Mikami. All rights reserved. 11 Google App EngineのVersionとDeploymentについて説明します 20190629t101010 20190628t170812 20190628t131110 20190627t153324 endpoint 修正単位(機能追加や不具合修正)の単位Versionを作成可能 ① 修正後、DeployしてVersionを作る ・・・ ② Deploy後に、Versionを切り替え(promote) 新Versionでのサービスを公開する
  • 12.
    takemikamiʼs note ‒http://takemikami.com/ コードレビューの効率化 Copyright (C) Takeshi Mikami. All rights reserved. 12
  • 13.
    takemikamiʼs note ‒http://takemikami.com/ コードレビューの⾯倒さ • 他のブランチをチェックアウトするのが⾯倒 • IDEに取り込みInspectorでチェックしたいが、⾃分の作業を⼀段落させてブラン チ切り替えるのは⾯倒 • 修正の差分のみに着⽬してレビューしにくい • GitHubのPullRequestではコード差分をチェックできるが、Inspectorの指摘と紐 付けて確認したい • 動作確認環境を作るのが⾯倒 • 簡単に動作確認したいが、PullRequestごと切り替えて環境を⽤意するのは⾯倒 →これらの課題に対する対処ノウハウを考えていきます Copyright (C) Takeshi Mikami. All rights reserved. 13 コードレビューの⾯倒さについて⽰します
  • 14.
    takemikamiʼs note ‒http://takemikami.com/ GitHub FlowとCI・レビュー・デプロイの関連 Copyright (C) Takeshi Mikami. All rights reserved. 14 GitHub FlowとCI・レビュー・デプロイの関連を図に⽰します Developer GitHub Reviewer CI development environment staging environment clone/pull (master branch) branch commit push (descriptive branch) clone send status(OK/NG) auto test deploy review request check check approve merge deploy pull request (⼈による)レビュー CIによるチェック CIによって レビューを⽀援
  • 15.
    takemikamiʼs note ‒http://takemikami.com/ コードチェックの⾃動化 Copyright (C) Takeshi Mikami. All rights reserved. 15 CIによるコードチェックの⾃動化イメージを⽰します Developer GitHub Reviewer CI development environment staging environment clone/pull (master branch) branch commit push (descriptive branch) clone send status(OK/NG) auto test deploy review request check check approve merge deploy pull request CIでチェックツールを動かす
  • 16.
    takemikamiʼs note ‒http://takemikami.com/ コードチェックの⾃動化 .circleci/config.yml • CIでのコードチェックの⾃動化の流れ (.circleci/config.yml) Copyright (C) Takeshi Mikami. All rights reserved. 16 CIによるコードチェックの⾃動化イメージを⽰します steps: - run: name: command: | ./gradlew check - store_artifacts: path: ~/repo/build/reports - run: name: report when: always command: | .circleci/report.sh Gradleからチェックツールを実⾏ 結果レポートをArtifactに保存 レポートへのリンクをPullRequestにコメント (シェルスクリプトで実装) ※失敗時も実⾏するので「when: always」に
  • 17.
    takemikamiʼs note ‒http://takemikami.com/ コードチェックの⾃動化 レポートへのリンク • Artifactのリンクがやや深い → botでPullRequestにリンクをコメント Copyright (C) Takeshi Mikami. All rights reserved. 17 CIによるコードチェックの⾃動化イメージを⽰します リンクがやや深い リンクをコメント
  • 18.
    takemikamiʼs note ‒http://takemikami.com/ コードチェックの⾃動化 Artifactのリンク取得 • ArtifactのリンクURL⼀覧は以下コマンドで取得 ※環境変数「CIRCLE_TOKEN」にtokenの設定要 • 例) PMDのレポートのURL取得 Copyright (C) Takeshi Mikami. All rights reserved. 18 CIによるコードチェックの⾃動化イメージを⽰します $ curl https://circleci.com/api/v1.1/project/github/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJE CT_REPONAME/$CIRCLE_BUILD_NUM/artifacts?circle-token=$CIRCLE_TOKEN | jq -r '.[].url' URL_LIST=$(curl https://circleci.com/api/v1.1/project/github/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJE CT_REPONAME/$CIRCLE_BUILD_NUM/artifacts?circle-token=$CIRCLE_TOKEN | jq -r '.[].urlʼ) URL_PMD=$(echo "$URL_LIST" | grep "pmd/main.html$") 後⽅⼀致でGrepすればOK
  • 19.
    takemikamiʼs note ‒http://takemikami.com/ コードチェックの⾃動化 PullRequestにコメント • GitHubのPullRequestへのコメントは以下のコマンドで可能 ※環境変数「GITHUB_ACCESS_TOKEN」にtokenの設定要 Copyright (C) Takeshi Mikami. All rights reserved. 19 CIによるコードチェックの⾃動化イメージを⽰します GH_COMMENT_BODY="※コメント内容※" CIRCLE_REPO=$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME CIRCLE_PR_NUM="${CIRCLE_PR_NUMBER:-${CIRCLE_PULL_REQUEST##*/}}” curl -s -u $GITHUB_ACCESS_TOKEN -X POST --data "{"body":"$GH_COMMENT_BODY"}" https://api.github.com/repos/$CIRCLE_REPO/issues/$CIRCLE_PR_NUM/comments
  • 20.
    takemikamiʼs note ‒http://takemikami.com/ 補遺: CircleCIでIntelliJ IDEA のInspector実⾏ • IntelliJ IDEAのInspectionはバッチ実⾏が可能 • プロジェクト内で使⽤するIDEを統⼀出来る場合、 以下のような理由で、運⽤しやすい • 指摘項⽬を各⾃PCとCIで統⼀出来る • 指摘項⽬の設定をIntelliJ IDEAのGUIで設定できる • レポートはxml形式なので、xmllintなどで加⼯すると⾒やすい Copyright (C) Takeshi Mikami. All rights reserved. 20 CircleCIでIntelliJ IDEAのInspectorを実⾏する参考情報を⽰します (参考) CircleCIでIntelliJ IDEAのInspection機能による静的テストを実⾏する | takemikami.com https://takemikami.com/2018/12/08/CircleCIIntelliJ-IDEAInspection.html
  • 21.
    takemikamiʼs note ‒http://takemikami.com/ 修正差分に対するコードチェック • PullRequestのコード差分箇所に対する 「チェックツールの指摘項⽬」に注⽬してレビューしたい →各チェックツールの指摘項⽬を、コード差分箇所に絞り込み PullRequestにbotでコメントする Copyright (C) Takeshi Mikami. All rights reserved. 21 修正差分に対するコードチェックの対応イメージを⽰します 絞り込んだ指摘項⽬を コメント
  • 22.
    takemikamiʼs note ‒http://takemikami.com/ 修正差分に対するコードチェック • 修正差分箇所のファイル名・⾏番号は、gitコマンドで取得 • masterブランチに対する未マージコミット⼀覧を表⽰ • ⾏ごとに最終変更コミットを表⽰ →これらの結果から、指摘項⽬をフィルタ Copyright (C) Takeshi Mikami. All rights reserved. 22 修正差分に対するコードチェックの対応イメージを⽰します git --no-pager log --no-merges origin/master...HEAD | grep -e '^commit' git --no-pager blame (対象ファイル)
  • 23.
    takemikamiʼs note ‒http://takemikami.com/ 動作確認⽤のデプロイ Copyright (C) Takeshi Mikami. All rights reserved. 23 動作確認⽤デプロイの対応イメージを⽰します Developer GitHub Reviewer CI development environment staging environment clone/pull (master branch) branch commit push (descriptive branch) clone send status(OK/NG) auto test deploy review request check check approve merge deploy pull request 開発中のモジュールを 動作確認⽤のVersionにデプロイ
  • 24.
    takemikamiʼs note ‒http://takemikami.com/ 動作確認⽤のデプロイ • Google App EngineのVersion・PullRequestを対応づけてデプロイ Copyright (C) Takeshi Mikami. All rights reserved. 24 動作確認⽤デプロイの対応イメージを⽰します 4 3 2 1 ・・・ 4 3 2 1 ・・・ GitHub PullRequest App Engine Version PullRequest番号をVersionとして デプロイする
  • 25.
    takemikamiʼs note ‒http://takemikami.com/ 動作確認⽤のデプロイ • デプロイ時のVersion指定⽅法 (build.gradle) Copyright (C) Takeshi Mikami. All rights reserved. 25 動作確認⽤デプロイの対応イメージを⽰します // appengine deployment settings appengine { deploy { projectId = System.getenv("GOOGLE_PROJECT_ID") version = System.getenv("CIRCLE_PR_NUM") ?: (new Date()).format("yyyyMMdd't'HHmmss") promote = "master" == System.getenv("CIRCLE_BRANCH") } } PullRequestの番号をVersionに masterへのマージ時以外は 切り替えない(promoteしない)
  • 26.
    takemikamiʼs note ‒http://takemikami.com/ 動作確認⽤のデプロイ • Google App EngineのVersion・PullRequest番号を揃えてあるので、 次のリンクをPullRequestにbotで簡単にコメントできる • アプリケーションへのリンク • App Engine Dashboardへのリンク • Stackdriver Loggingのログへのリンク Copyright (C) Takeshi Mikami. All rights reserved. 26 動作確認⽤デプロイの対応イメージを⽰します 対象Versionの 各種リンクをコメント
  • 27.
    takemikamiʼs note ‒http://takemikami.com/ 動作確認⽤のデプロイ • サービスのリンク: • https://${CIRCLE_PR_NUM}-dot-default-dot- ${GOOGLE_PROJECT_ID}.appspot.com/ • Dashboardへのリンク: • https://console.cloud.google.com/appengine?hl=ja&project=${GOOGLE_PROJ ECT_ID}&serviceId=default&duration=PT1H&versionId=${CIRCLE_PR_NUM} • Loggingへのリンク: • https://console.cloud.google.com/logs/viewer?project=${GOOGLE_PROJECT_ ID}&hl=ja&resource=gae_app%2Fmodule_id%2Fdefault%2Fversion_id%2F${CI RCLE_PR_NUM}&minLogLevel=0&expandAll=false ※ Version・PullRequest番号を揃えておくとリンクを⽣成しやすい Copyright (C) Takeshi Mikami. All rights reserved. 27 動作確認⽤デプロイの対応イメージを⽰します
  • 28.
    takemikamiʼs note ‒http://takemikami.com/ botによるPull Requestへのコメント Copyright (C) Takeshi Mikami. All rights reserved. 28 botによるPullRequestへのコメントのイメージ全体を⽰します 動作確認⽤ アプリケーションへ Dashboard Logging PMD Report Checkstyle Report 指摘事項のコード コメントを レビュー⽤ポータルに
  • 29.
    takemikamiʼs note ‒http://takemikami.com/ まとめ • コードレビューには、次のような⾯倒さが伴う • 他のブランチをチェックアウトするのが⾯倒 • 修正の差分のみに着⽬してレビューしにくい • 動作確認環境を作るのが⾯倒 • コードレビューの⾯倒さをCI/CDによる⽀援で軽減できる • レビュー担当者が⼿元に開発環境を⽤意せずレビュー可能 • PullRequestコメントをレビュー⽤ポータルにすると便利 Copyright (C) Takeshi Mikami. All rights reserved. 29 本セッションのまとめです
  • 30.
    takemikamiʼs note ‒http://takemikami.com/ 参考情報 Copyright (C) Takeshi Mikami. All rights reserved. 30
  • 31.
    takemikamiʼs note ‒http://takemikami.com/ その他のCI関連ノウハウ • GitHubのPullRequestでデプロイ先環境を切り替える運⽤⽅法 https://takemikami.com/2018/12/04/GitHubPullRequest.html • groovyとcheckstyleによるプロジェクト固有のコーディングルールの チェック⼿順 https://takemikami.com/2018/08/31/groovycheckstyle.html • GitHubのPullRequestを⽤いた暫定対処コードのコントロール⼿法の提 案 https://takemikami.com/2019/06/02/GitHubPullRequest.html • RubocopでPullRequestの変更箇所で問題があった場合のみCIを失敗さ せる https://takemikami.com/2018/01/30/RubocopPullRequestCI.html Copyright (C) Takeshi Mikami. All rights reserved. 31 その他のCI関連ノウハウの情報を⽰します
  • 32.
    takemikamiʼs note ‒http://takemikami.com/ 参考Webサイトリスト • Built-in Environment Variables | circleci Docs https://circleci.com/docs/2.0/env-vars/#built-in-environment- variables • Download an artifact file | circleci Docs https://circleci.com/docs/api/#download-an-artifact-file • Comments | GitHub REST API v3 https://developer.github.com/v3/issues/comments/ • Gradle と App Engine プラグインを使⽤する | Google App Engine https://cloud.google.com/appengine/docs/standard/java/tools/gradl e Copyright (C) Takeshi Mikami. All rights reserved. 32 本資料作成にあたって参考にしたWebサイトのリストです