Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
15年続くWebサービスへのCI/CDとテストコードの導入
Search
Yuto Kubo
December 01, 2019
Technology
2
1.8k
15年続くWebサービスへのCI/CDとテストコードの導入
PHP Conference Japan 2019
Yuto Kubo
December 01, 2019
Tweet
Share
Other Decks in Technology
See All in Technology
Making your applications cross-environment - OSCG 2024 NA
salaboy
0
190
Evangelismo técnico: ¿qué, cómo y por qué?
trishagee
0
360
Terraform未経験の御様に対してどの ように導⼊を進めていったか
tkikuchi
2
440
10XにおけるData Contractの導入について: Data Contract事例共有会
10xinc
6
650
生成AIが変えるデータ分析の全体像
ishikawa_satoru
0
150
Why App Signing Matters for Your Android Apps - Android Bangkok Conference 2024
akexorcist
0
130
VideoMamba: State Space Model for Efficient Video Understanding
chou500
0
190
エンジニア人生の拡張性を高める 「探索型キャリア設計」の提案
tenshoku_draft
1
130
いざ、BSC討伐の旅
nikinusu
2
780
Terraform CI/CD パイプラインにおける AWS CodeCommit の代替手段
hiyanger
1
240
【若手エンジニア応援LT会】ソフトウェアを学んできた私がインフラエンジニアを目指した理由
kazushi_ohata
0
150
OS 標準のデザインシステムを超えて - より柔軟な Flutter テーマ管理 | FlutterKaigi 2024
ronnnnn
0
140
Featured
See All Featured
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
Code Reviewing Like a Champion
maltzj
520
39k
Unsuck your backbone
ammeep
668
57k
Speed Design
sergeychernyshev
25
620
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
131
33k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
16
2.1k
Visualization
eitanlees
145
15k
Agile that works and the tools we love
rasmusluckow
327
21k
What's in a price? How to price your products and services
michaelherold
243
12k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
GitHub's CSS Performance
jonrohan
1030
460k
Transcript
15年続くWebサービスへの CI/CDとテストコードの導入 久保 雄登 /9bo9bo 株式会社ウエディングパーク
• 久保 雄登(9bo9bo) – 株式会社ウエディングパーク – メディア開発本部 チーフエンジニア • 業務
– クライアント向け管理画面の運用・開発 – データ活用基盤の開発 • その他 – カレーライスを作る – 社内Hack(お困りごと解決) – ミュージカル観劇(家族の影響) – 群馬県(出身は埼玉) 自己紹介 2
Wedding Park について 3
• 式場探しの決め手が見つかるクチコミサイト • 2004年にオープン。今年で15周年 Wedding Park 4
• 結婚に関連するサービスを展開 姉妹サービス 5
ところで、 6
• Q. どんな印象を持たれますか? – 独自フレームワーク? – PHP5を使い続けている? – 闇が広がる? 15周年を迎えるWebサービスって……
7
安心してください 8
• 2016年〜システムリプレイスを実施 – PHP7 + Laravel を基盤としたシステムに入替 – 2019年にPHP5系システムは全廃 •
だけど、つらい部分もある… – 複雑化した仕様、依存関係の多いシステム、 etc – 今日はこのあたりをお話しします 現行システムはすべてPHP7で稼働 9
• Wedding Parkを支えるシステムのこれまで • CIの導入に至った経緯 • CIの導入 • レガシーシステムにテストを入れる •
現在のCI/CDの設定 • まとめ 今日お話しすること 10
• Wedding Parkを支えるシステムのこれまで • CIの導入に至った経緯 • CIの導入 • レガシーシステムにテストを入れる •
現在のCI/CDの設定 • まとめ 今日お話しすること 11
Wedding Parkを支える システムのこれまで 12
システムのリプレイスは積極的 • アプリケーションの歴史 〜2012年:PHP5 + Ethna 〜2017年:PHP5 + ZendFramework 1
2017年〜:PHP7 + Laravel 5 [現行] • DBの歴史 – 2012年に整理したテーブルを継続して利用 Wedding Parkを支えるシステム 13
• 増え続ける機能 • 陳腐化していく仕様書マスター • 開発時は「今までの仕様」に「この機能を追加」 – 今までの仕様の記録がない…… – 把握していない仕様があって障害発生
• サービスが成長すれば、DBも成長する – 約700テーブル – 今は使っていないテーブルやカラムが混在 長寿命システムの悩み 14
• 歴史を感じるモノリシックな構成 システム構成 ユーザ 社内 管理 法人 管理 バッチ ……
15
• Modelやシステムのコアに関する処理は git subtree で共有 – 実装箇所の一元管理、開発作業の効率化が目的 開発を効率的に行うアーキテクチャ ユーザ 社内
管理 法人 管理 バッチ git subtree 16
• Wedding Parkを支えるシステムのこれまで • CIの導入に至った経緯 • CIの導入 • レガシーシステムにテストを入れる •
現在のCI/CDの設定 • まとめ 今日お話しすること 17
CIの導入に至った経緯 18
• Modelやシステムのコアに関する処理は git subtree で共有 – 実装箇所の一元管理、開発作業の効率化が目的 再掲: 開発を効率的に行うアーキテクチャ ユーザ
社内 管理 法人 管理 バッチ git subtree 19
事件は起きた! 20
• 十分にテストされないままリリース あるプロジェクトでコアに関する処理を 変更 ユーザ 法人 管理 バッチ git subtree
社内 管理 21
• 十分にテストされないままリリース – バグの含まれる処理がシステム全体に配布される あるプロジェクトでコアに関する処理を 変更 git subtree ユーザ 社内
管理 法人 管理 バッチ 22
そのまま障害へ! 23
• コアプログラムに関するテストコードは実装 してあった – テストも失敗していた • テストの実行は開発者に委ねられていた • リリース前に自動的に検証される仕組みは なかった
障害のふりかえり 24
CI入れたい…! 25
• Wedding Parkを支えるシステムのこれまで • CIの導入に至った経緯 • CIの導入 • レガシーシステムにテストを入れる •
現在のCI/CDの設定 • まとめ 今日お話しすること 26
• 開発時の自動テストやコード解析は一切行っ ていなかった – 頼りになるのはIDE(PhpStorm)の解析のみ • 一度も呼び出されないprivate関数がちらほら • コードレビュー時に気がつかなければ そのままリリースされてしまう
27 CIが一切ない開発環境
• CI: Continuous Integration – いつでも正しく動くようにする仕組み • 例: Unitテスト、E2Eテスト、コード解析 •
CD: Continuous Delivery – いつでもリリースできるようにする仕組み • 例: 自動デプロイ CI / CD 28
• 当初はデプロイサーバのJenkinsで実行 – デプロイサーバとアプリケーションサーバの環境 を揃えておく必要があった – 異なるPHPバージョンを共存させられないため、 一部のアプリのみの導入にとどまっていた • GitLab
CIの検討 – Dockerコンテナ上で動作するため、複数のPHP バージョンを用意できる – すべてのアプリでテストが実施可能 29 CIの導入
• git push をトリガーに各種テストを行う CIの流れ 開発者 git push GitLab CI
テスト Merge Request / Merge 次の開発へ 30 GitLab
• デプロイの仕組みは既に導入済み – 今回はGitLab CIに移行せずそのまま CDの流れ Capistrano デプロイサーバ 対象サーバ git
clone deploy 31
• Wedding Parkを支えるシステムのこれまで • CIの導入に至った経緯 • CIの導入 • レガシーシステムにテストを入れる •
現在のCI/CDの設定 • まとめ 今日お話しすること 32
レガシーシステムで テストを書く悩み 33
DBマイグレーションがない! 34
• Unitテストは既に実装されつつあった • DBを使ったFeatureテストは未実装 – DBのスキーマは日々変わる – マイグレーションがないためDBの状態を管理でき ない –
テストのたびにDBからdumpする必要がある DBマイグレーションがない 35 マイグレーションの検討
• Laravel Migration Exporter for Sequel Pro – 既存のDBからLaravel用のマイグレーションファイ ルを作成してくれるツール
– Sequel Pro のプラグインとして動作 マイグレーションファイルを作成する 試してみたところ… 36
テーブル数が多すぎて フリーズ! 37
• mysqldump で定期的にスキーマ情報を dump – Git Repository に push •
テストの際に、git clone して DB へ import ならば、昔ながらの方法で 38
.gitlab-ci.yml の例 GitLab CI で mysqldump と git push dump:
variables: GIT_STRATEGY: clone script: - git config user.name $GITLAB_USER_NAME && git config user.email $GITLAB_USER_EMAIL - git remote set-url origin https://gitlab-ci-token:$API_TOKEN@${CI_REPOSITORY_URL##*@} - git checkout $CI_COMMIT_REF_NAME # DB のダンプ - mysqldump -hDB -uUSER -p$PASS --single-transaction --skip-dump-date --no-data -- databases yourDB > yourDB.sql # 差分があるときはコミット - git add -u - |- if [ `git status -s | wc -l` -gt 0 ]; then git commit -m "updated at `date +%Y/%m/%d-%H:%M`" git push --push-option=ci.skip origin $CI_COMMIT_REF_NAME fi 39
ひととおりのテストが 書けるように! 40
• Wedding Parkを支えるシステムのこれまで • CIの導入に至った経緯 • CIの導入 • レガシーシステムにテストを入れる •
現在のCI/CDの設定 • まとめ 今日お話しすること 41
• ビルドテスト – Sass, JavaScript • PHPUnit • 静的解析 –
PHPStan(Larastan) – ESLint • コード整形 – PHP-CS-Fixer – prettier • 脆弱性診断 現在のCIの設定 42
• ビルドテスト – Sass, JavaScript • PHPUnit • 静的解析 –
PHPStan(Larastan) – ESLint • コード整形 – PHP-CS-Fixer – prettier • 脆弱性診断 現在のCIの設定 今回はこちらを詳しく説明 43
• ビルドテスト – Sass, JavaScript • PHPUnit • 静的解析 –
PHPStan(Larastan) – ESLint • コード整形 – PHP-CS-Fixer – prettier • 脆弱性診断 現在のCIの設定 44
• 社内のコーディング規約はPSRに準拠 • PHP-CS-Fixer でコード整形を実施 PHP Coding Standards Fixer での整形
45
• コード整形の実行は開発者に委ねられている – よく忘れる – コードレビューでの指摘はお互い気をつかう • コード整形の自動化 – php-cs-fixer-commit
を使うと、GitLab CI 上で コード整形 & git push してくれる コード整形を自動化したい composer require --dev enomotodev/php-cs-fixer-commit 46
• ビルドテスト – Sass, JavaScript • PHPUnit • 静的解析 –
PHPStan(Larastan) – ESLint • コード整形 – PHP-CS-Fixer – prettier • 脆弱性診断 現在のCIの設定 47
• 定期的に利用しているパッケージに脆弱性が 含まれていないか確認する – npm audit – SensioLabs Security Checker
• 継続的なcomposerアップデート – gitlabci-composer-update-mr 脆弱性診断 48
• 定期的に利用しているパッケージに脆弱性が 含まれていないか確認する – npm audit – SensioLabs Security Checker
• 継続的なcomposerアップデート – gitlabci-composer-update-mr 脆弱性診断 49
• composer.lock の内容に脆弱性が報告されて いるパッケージがない存在しないか確認 – composer版はAPIとの通信が必要 – Symfony CLI を使うとオフラインで実行可能
SensioLabs Security Checker curl -sS https://get.symfony.com/cli/installer | bash $HOME/.symfony/bin/symfony security:check 50
• composer パッケージの更新は放置されがち – 差分の確認が大変 – composer update して git
commit するのが面倒 • gitlabci-composer-update-mr – composer update して更新があった場合は マージリクエストを作成してくれる 継続的な composer アップデート composer global require enomotodev/gitlabci-composer-update-mr $COMPOSER_HOME/vendor/bin/gitlabci-composer-update-mr master 51
最終的なワークフロー composer install npm install npm run build phpunit larastan
eslint + Prettier php-cs-fixer deploy npm audit symfony security:check Preparation Test Deploy Security Check ※ 定期実行 52 composer update
• Wedding Parkを支えるシステムのこれまで • CIの導入に至った経緯 • CIの導入 • レガシーシステムにテストを入れる •
現在のCI/CDの設定 • まとめ 今日お話しすること 53
CIを入れて良かったこと 54
• デプロイ不可能なコードの混入を防げるように – 開発の段階で未然に気がつける • レビュー時の指摘事項の軽減 – 「空白入れて」「PHPDoc直して」などのピリッとする 指摘を減らせた –
本質的なレビューが行えるようになった • 後回ししがちなパッケージアップデートが前向き になった CIを入れて良かったこと 55
CIを入れても変わらなかった こと 56
• コードカバレッジは一向に増えない – 一部の開発者だけに普及 – まだまだ温かみのある手動テストが主流 • 開発フローはいつもと同じ – 良い意味で、CIの存在を意識せずに開発を行える
– 各種チェックで指摘されなければこれまでと同じ 開発 – CIは心の支え CIを入れても変わらなかったこと 57
最後に 58
15年続くサービスの開発は 困難なことが多いけれど、 歴史があるぶん出来ることも 多くて楽しい 59
• 15年続くWebサービスのCI環境を整備 – 不完全なコードの混入を防げるように – コード自動整形・静的解析でコードレビューの負 荷軽減 • テストを書くための基盤を構築 –
DBマイグレーションのない環境でのテストの実施 まとめ 60