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

依存ライブラリの定期的な更新のためにRenovateを導入・運用する / phperkaigi2022

依存ライブラリの定期的な更新のためにRenovateを導入・運用する / phperkaigi2022

PHPerKaigi 2022の登壇資料です。
https://phperkaigi.jp/2022/

Ca2756275664f26f2310119d779ab43b?s=128

blue_goheimochi

April 10, 2022
Tweet

More Decks by blue_goheimochi

Other Decks in Technology

Transcript

  1. 依存ライブラリの定期的な更新のために Renovateを導⼊‧運⽤する PHPerKaigi 2022 2022.04.10 Yuta Ohashi

  2. 依存ライブラリの 定期的な更新できてますか??

  3. composer outdated そっと実⾏してみましょう

  4. None
  5. パッチ or マイナー リリースが利⽤可能です ‒ 更新が推奨されます メジャーリリースが利⽤可能です ‒ 更新が可能です

  6. mockery/mockeryは現在1.3.3を利⽤しており、1.5.0に更新することができます。 パッチ or マイナー リリースが利⽤可能です ‒ 更新が推奨されます メジャーリリースが利⽤可能です ‒ 更新が可能です

  7. Laravel/frameworkは現在v6.20.41を利⽤しており、v8.83.5に更新することができます。 パッチ or マイナー リリースが利⽤可能です ‒ 更新が推奨されます メジャーリリースが利⽤可能です ‒ 更新が可能です

    mockery/mockeryは現在1.3.3を利⽤しており、1.5.0に更新することができます。
  8. fzaninotto/faker はメンテナンスされなくなりました。このライブラリの利⽤を避けてください。 パッチ or マイナー リリースが利⽤可能です ‒ 更新が推奨されます メジャーリリースが利⽤可能です ‒

    更新が可能です mockery/mockeryは現在1.3.3を利⽤しており、1.5.0に更新することができます。 Laravel/frameworkは現在v6.20.41を利⽤しており、v8.83.5に更新することができます。
  9. 9 依存ライブラリの定期的な更新できてますか?? • composer outdated コマンド • 現在、インストールされているライブラリでアップデート可能なものの ⼀覧が表⽰できる •

    ライブラリごとに「現在のバージョン」と「アップデート可能なバー ジョン」が表⽰される • 緑⾊: 置き換えが必要なライブラリ • ⾚⾊: パッチバージョン or マイナーバージョンが更新できるライブラリ • ⻩⾊: メジャーバージョンが更新できるライブラリ
  10. 10 依存ライブラリの定期的な更新できてますか?? • 更新が必要なライブラリの数 • 置き換えが必要なライブラリ: 5個 • パッチバージョン or

    マイナーバージョンが更新できるライブラリ: 52個 • メジャーバージョンが更新できるライブラリ: 46個 • composer.jsonに定義してあるライブラリの数 • require: 12個、require-dev: 7個 • ライブラリが利⽤しているライブラリの更新も多い • composer outdated --direct のオプションを付けると composer.jsonに定義してあるライブラリを対象に確認することができる
  11. 置き換えが必要なライブラリ: 1個 パッチバージョン or マイナーバージョンが更新できるライブラリ: 10個 メジャーバージョンが更新できるライブラリ: 9個

  12. 置き換えが必要なライブラリ: 0個 パッチバージョン or マイナーバージョンが更新できるライブラリ: 2個 メジャーバージョンが更新できるライブラリ: 4個 置き換えが必要なライブラリ: 1個

    パッチバージョン or マイナーバージョンが更新できるライブラリ: 10個 メジャーバージョンが更新できるライブラリ: 9個
  13. 13 ⽬次 • Renovateは何をしてくれるのか? • どのように導⼊したか? • どのように運⽤しているか? • 運⽤で困ったこと・対策

    • まとめ
  14. Renovateは何をしてくれるのか? ざっくりと

  15. 15 Renovateは何をしてくれるのか? composer.json {} composer.lock {} Repository Renovate

  16. 16 Renovateは何をしてくれるのか? composer.json {} composer.lock {} Repository Renovate composer.jsonとcomposer.lockを確認

  17. 17 Renovateは何をしてくれるのか? composer.json {} composer.lock {} Repository Renovate ライブラリを更新するためのプルリクエストを作成

  18. 18 Renovateは何をしてくれるのか? 更新対象のライブラリとバージョン ライブラリごとの変更内容 ※ライブラリによって差異あり。リリースタグとか ちゃんと切られていたりすると仔細になったりする

  19. 19 Renovateは何をしてくれるのか? • リポジトリにあるcomposer.json、composer.lockから利⽤し ているライブラリを把握する • 更新できるライブラリがあればライブラリを更新するためのプル リクエストを⾃動的に作成する

  20. どのように導⼊したか?

  21. 21 どのように導⼊したか? • Githubを利⽤していれば導⼊⾃体もすごく簡単 • MarketplaceにRenovateのアプリケーションがあるのでインストールす る • 対象にしたいリポジトリを選ぶ •

    初期設定のためのプルリクエストが作成されるのでマージする • 無料で利⽤できる
  22. 22 どのように導⼊したか?

  23. 23 どのように導⼊したか?

  24. 24 どのように導⼊したか?

  25. 25 どのように導⼊したか? • 導⼊は簡単 • まずはRenovateの初期設定のためのプルリクエストが作成されるのでマージす る • renovate.jsonのファイルの追加のみ •

    バージョンを固定するためのプルリクエストが作成されるのでマージする • composer.lockをみて、composer.jsonのバージョンを固定してくれるので安⼼ • "laravel/framework": "^9.2", → "laravel/framework": "9.5.1", のように固 定される • 更新できるライブラリのプルリクエストが作成されるので確認してマージする
  26. 26 どのように導⼊したか? 既存のプロダクトに導⼊したところ‧‧‧ 27個のプルリクエストが⼀気に作成された 27個のプルリクエストが⼀気に作成された

  27. 27 どのように導⼊したか? • composer.json以外にもpackage.jsonやDockerfileに対する更新のプ ルリクエストもしてくれる • プルリクエストの数が多かったのはそのため • どんなプルリクエストが作成されている? •

    突然のメジャーバージョンアップ • Laravelを 6.20.41 から 9.5.1 にあげるプルリクエスト • PHPのバージョンも更新しないといけないのでそんなに気軽に上げられない‧‧‧ • パッチ、マイナーバージョンも⼀気に更新される • ⼤丈夫だとは思うが‧‧‧とても不安‧‧‧
  28. 28 どのように導⼊したか? • composer.json以外にもpackage.jsonやDockerfileに対する更新のプ ルリクエストもしてくれる • プルリクエストの数が多かったのはそのため • どんなプルリクエストが作成されている? •

    突然のメジャーバージョンアップ • Laravelを 6.20.41 から 9.5.1 にあげるプルリクエスト • PHPのバージョンも更新しないといけないのでそんなに気軽に上げられない‧‧‧ • パッチ、マイナーバージョンも⼀気に更新される • ⼤丈夫だとは思うが‧‧‧とても不安‧‧‧ ライブラリの更新を怠っていた 付けが回ってきたのを⼀気に実感‧‧‧ プロダクトの初期に導⼊できれば絶対にしたほうがよい
  29. 29 どのように導⼊したか? プルリクエストを1つ1つ確認!

  30. 30 どのように導⼊したか? • メジャーバージョンアップされるライブラリ • LaravelはPHPのバージョンも上げないと無理だが、PHPUnitはあげるこ とができそう • パッチ‧マイナーバージョンアップされるライブラリ •

    あげておかしくなるものは(たぶん)なさそう。ただし数が多い。 • 初期設定だと1ライブラリにつき1つのプルリクエストが作成されるた め、1つ1つを検証しながらマージしていくのはちょっとつらい
  31. 31 どのように導⼊したか? • やること • 最新バージョンまで更新できるライブラリは⼀気にあげてしまう • メジャーバージョン更新とマイナー‧パッチバージョン更新で⼀応分ける • やらないこと

    • 更新することのできないメジャーバージョンは保留にする • Dockerfileなどの更新は別途対応とし保留にする
  32. 32 どのように導⼊したか? • やること • 最新バージョンまで更新できるライブラリは⼀気にあげてしまう • メジャーバージョン更新とマイナー‧パッチバージョン更新で⼀応分ける • やらないこと

    • 更新することのできないメジャーバージョンは保留にする • Dockerfileなどの更新は別途対応とし保留にする Renovateの運⽤を開始した際に作成されるプルリクエストが なるべく少なく、バージョンの更新が⼩さくなるように
  33. 33 どのように導⼊したか? • 気合いで更新‧‧‧! • ここが⼀番⼤変だったかもしれない • プロダクトメンバーを巻き込んで、ライブラリの更新が問題がないか、 全体を動作検証を⾏いました •

    既存でプロダクト全体に影響するような⼤きな改修をする際に確認する検証項⽬が あったのでそちらを実施 • ライブラリの更新、サボらずしていこう‧‧‧(決意)
  34. どのように運⽤しているか?

  35. 35 どのように運⽤しているか? • プルリクエスト作成のタイミング • Renovateがプルリクエストを出すブランチ • laravel/frameworkは個別にプルリクエストを作成 • パッチバージョン‧マイナーバージョンのプルリクエストをまとめる

    • 週替りの当番制の採⽤ • 慣れるまでの運⽤⽅法 • 対応コスト
  36. 36 どのように運⽤しているか? プルリクエスト作成のタイミング • プロダクトは週1回の定期リリースを実施している • リリース前⽇、リリース当⽇はRenovateがプルリクエストを出し てきても対応しづらい • ⽇中にRenovateがプルリクエストを作成するのも少しノイズ

    • 業務時間外にプルリクエストを作成するように設定 • リリース前⽇、リリース当⽇(の朝)も対象外
  37. 37 どのように運⽤しているか? プルリクエスト作成のタイミング "schedule": [ "before 9am and after 10pm

    on Monday", "before 9am on Tuesday", "after 10pm on Thursday", "before 9am and after 10pm on Friday", "every weekend” ], https://docs.renovatebot.com/presets-schedule/ renovate.json
  38. 38 どのように運⽤しているか? Renovateがプルリクエストを出すブランチ • Git-flowのようなブランチ運⽤中 • 対象の週にリリース予定の機能はdevelopブランチに追加していき mainブランチにマージする運⽤をしている • developブランチにRenovateのプルリクエストが作成される

    ように設定
  39. 39 どのように運⽤しているか? Renovateがプルリクエストを出すブランチ "baseBranches": ["develop"], https://docs.renovatebot.com/configuration-options/#basebranches renovate.json

  40. 40 どのように運⽤しているか? laravel/frameworkは個別にプルリクエストを作成 • アプリケーション全体に影響があるようなライブラリは個別で プルリクエストが作成されるように設定 • 慎重に確認‧検証を⾏えるようにしている

  41. 41 どのように運⽤しているか? laravel/frameworkは個別にプルリクエストを作成 "packageRules": [ { "groupName": "laravel/framework", "matchPackageNames": ["laravel/framework"]

    } ] https://docs.renovatebot.com/configuration-options/#groupname renovate.json
  42. 42 どのように運⽤しているか? パッチバージョン‧マイナーバージョンのプルリクエストをまとめる • パッチバージョン‧マイナーバージョンは個別ではなくまとめ てプルリクエストを作成するように設定 • アプリケーションに与える影響範囲が⼤きくないと判断 • まとめて動作検証することができるのでその点でも効率は良い

  43. 43 どのように運⽤しているか? パッチバージョン‧マイナーバージョンのプルリクエストをまとめる "packageRules": [ { "groupName": "all dependencies for

    the minor version (PHP)", "matchLanguages": ["php"], "matchUpdateTypes": ["minor"], "excludePackageNames":[ "laravel/framework” ] } ] https://docs.renovatebot.com/configuration-options/#groupname renovate.json
  44. 44 どのように運⽤しているか? 週替りの当番制の採⽤ • 現在チームの開発メンバーは4⼈ • Renovateのプルリクエストを確認する当番を週替りで設定 • 担当が設定されていないとやはり漏れがち、偏りがちになってしまう •

    影響範囲を調べるためにコードをしっかり読むことでキャッチアップにもつながってよ かったという声もあり • 新メンバーが⼊った場合にまず⾒てもらうタスクとしても良さそう • 対象のライブラリの影響範囲など分かった事項は都度Wikiに記載し次回移⾏の対応が効 率化できるようにしている
  45. 45 どのように運⽤しているか? 慣れるまでの運⽤⽅法 • いきなり「じゃあ次の週当番お願いします」はつらい • 週1でRenovateのプルリクエストを倒すMTGを設定 • 最初の2〜3週は導⼊を進めた私がメインとなって画⾯共有をしながら「こ れはこの辺が変更点ですねー」など共有しながら対応

    • 慣れるまでチームメンバーでメイン担当を交代しつつ回す • 対応⽅法‧⽅針の共有ができた • 2周ほど回して慣れたかなという確認ののちMTGは解体
  46. 46 どのように運⽤しているか? 対応コスト • プロダクトによってもまちまちだと思う • 現状、週に2〜5程度のライブラリの更新がある • 出社したらプルリクエストが作成されているものを確認し順次対応の ながれ

    • 溜め込まなければ差分は⼩さい • 1プルリクエスト10〜30分程度で確認からマージできることが多い • 「ドキュメントだけ更新しました」というのも割とある
  47. 運⽤で困ったこと・対策

  48. 48 どのように運⽤しているか? 更新できないライブラリもプルリクエストが作成されてしまう • PHPのバージョンをあげないと更新できない場合がまれにある • CIが落ちていることで気付いた • composer installが失敗する

    • RenovateのPHP環境が新しい?(設定⽅法が分かっていない) • 並⾏でCIが回っているとより安⼼感が出るかなと思います • 対象のライブラリは個別でプルリクエストが作成されるように設定 • プルリクエストが作成されたらそのままクローズしている • 少しでもバージョンが上がると再度プルリクエストが作成されるので忘れるさられることはない
  49. 49 どのように運⽤しているか? 更新頻度が⾼いライブラリがある • aws/aws-sdk-phpなど • 実質使っているのはS3へのアップロードなどだが、いろいろな機能があるため更新 はたくさん⾶んでくる • 昨⽇マージしたけど、またプルリクエストが作成されまた確認するのか‧‧‧

    • プルリクエストが単体でくるように設定 • マージのタイミングをリリース前⽇のプルリクエストの更新がされなくなったタイ ミングで⾏っている • 影響範囲の検証をするコストを可能な限り削減
  50. まとめ

  51. 51 まとめ • Renovateを使うとライブラリの更新が容易に • 既存のプロジェクトでライブラリの更新が滞っている場合 • 導⼊が少し⼤変。気合で乗り切りましょう! • 新たにプロジェクトを⽴ち上げたり、作成して間もない場合は今すぐ

    Renovateを導⼊しましょう! • 開発プロセスに応じた運⽤を考えましょう!
  52. 52 まとめ • Renovateの導⼊前にはほとんど気にしていなかったライブラリの 更新がかなり意識できるようになっていると感じています • 「ライブラリが更新されている」という状況が知れるだけでも⼊ れる価値があるツールなのではないかと思っています • いい感じに依存ライブラリの更新をしていきましょう!

  53. blue_goheimochi ⼤橋 佑太 株式会社オウケイウェイヴ PHP(Laravel), JavaScript(Vue.js/Nuxt.js), ランニング, サッカー, フットサル, 浜松まつり,

    PUBG Mobile, さわやかのげんこつハンバーグ おおはし ゆうた
  54. Appendix

  55. 55 • 各種オプション • --minor-only:マイナー‧パッチバージョンが更新できるライブラリ のみ表⽰する • --direct:更新できる、composer.jsonに定義されているライブラリの みを表⽰する composer

    outdated https://getcomposer.org/doc/03-cli.md#outdated
  56. 56 • Fakerのライブラリは fakerphp/faker に引き継がれてメン テナンスが進んでいる • https://twitter.com/taylorotwell/status/1321091021342650377 • composer.jsonの指定を変更すればOK

    • fzaninotto/fake”: “1.9.2” → “fakerphp/faker”: “1.19.0” • バージョンがあがっていると思うのでバージョン番号を更新 • composer remove --dev fzaninotto/faker を実⾏ fzaninotto/fakerのライブラリの移⾏