Upgrade to Pro — share decks privately, control downloads, hide ads and more …

15年続くWebサービスへのCI/CDとテストコードの導入

Yuto Kubo
December 01, 2019

 15年続くWebサービスへのCI/CDとテストコードの導入

PHP Conference Japan 2019

Yuto Kubo

December 01, 2019
Tweet

Other Decks in Technology

Transcript

  1. • 久保 雄登(9bo9bo) – 株式会社ウエディングパーク – メディア開発本部 チーフエンジニア • 業務

    – クライアント向け管理画面の運用・開発 – データ活用基盤の開発 • その他 – カレーライスを作る – 社内Hack(お困りごと解決) – ミュージカル観劇(家族の影響) – 群馬県(出身は埼玉) 自己紹介 2
  2. • 2016年〜システムリプレイスを実施 – PHP7 + Laravel を基盤としたシステムに入替 – 2019年にPHP5系システムは全廃 •

    だけど、つらい部分もある… – 複雑化した仕様、依存関係の多いシステム、 etc – 今日はこのあたりをお話しします 現行システムはすべてPHP7で稼働 9
  3. システムのリプレイスは積極的 • アプリケーションの歴史 〜2012年:PHP5 + Ethna 〜2017年:PHP5 + ZendFramework 1

    2017年〜:PHP7 + Laravel 5 [現行] • DBの歴史 – 2012年に整理したテーブルを継続して利用 Wedding Parkを支えるシステム 13
  4. • 増え続ける機能 • 陳腐化していく仕様書マスター • 開発時は「今までの仕様」に「この機能を追加」 – 今までの仕様の記録がない…… – 把握していない仕様があって障害発生

    • サービスが成長すれば、DBも成長する – 約700テーブル – 今は使っていないテーブルやカラムが混在 長寿命システムの悩み 14
  5. • CI: Continuous Integration – いつでも正しく動くようにする仕組み • 例: Unitテスト、E2Eテスト、コード解析 •

    CD: Continuous Delivery – いつでもリリースできるようにする仕組み • 例: 自動デプロイ CI / CD 28
  6. • Laravel Migration Exporter for Sequel Pro – 既存のDBからLaravel用のマイグレーションファイ ルを作成してくれるツール

    – Sequel Pro のプラグインとして動作 マイグレーションファイルを作成する 試してみたところ… 36
  7. • mysqldump で定期的にスキーマ情報を dump – Git Repository に push •

    テストの際に、git clone して DB へ import ならば、昔ながらの方法で 38
  8. .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
  9. • ビルドテスト – Sass, JavaScript • PHPUnit • 静的解析 –

    PHPStan(Larastan) – ESLint • コード整形 – PHP-CS-Fixer – prettier • 脆弱性診断 現在のCIの設定 42
  10. • ビルドテスト – Sass, JavaScript • PHPUnit • 静的解析 –

    PHPStan(Larastan) – ESLint • コード整形 – PHP-CS-Fixer – prettier • 脆弱性診断 現在のCIの設定 今回はこちらを詳しく説明 43
  11. • ビルドテスト – Sass, JavaScript • PHPUnit • 静的解析 –

    PHPStan(Larastan) – ESLint • コード整形 – PHP-CS-Fixer – prettier • 脆弱性診断 現在のCIの設定 44
  12. • コード整形の実行は開発者に委ねられている – よく忘れる – コードレビューでの指摘はお互い気をつかう • コード整形の自動化 – php-cs-fixer-commit

    を使うと、GitLab CI 上で コード整形 & git push してくれる コード整形を自動化したい composer require --dev enomotodev/php-cs-fixer-commit 46
  13. • ビルドテスト – Sass, JavaScript • PHPUnit • 静的解析 –

    PHPStan(Larastan) – ESLint • コード整形 – PHP-CS-Fixer – prettier • 脆弱性診断 現在のCIの設定 47
  14. • 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
  15. 最終的なワークフロー 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
  16. • デプロイ不可能なコードの混入を防げるように – 開発の段階で未然に気がつける • レビュー時の指摘事項の軽減 – 「空白入れて」「PHPDoc直して」などのピリッとする 指摘を減らせた –

    本質的なレビューが行えるようになった • 後回ししがちなパッケージアップデートが前向き になった CIを入れて良かったこと 55