Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

9 依存ライブラリの定期的な更新できてますか?? • composer outdated コマンド • 現在、インストールされているライブラリでアップデート可能なものの ⼀覧が表⽰できる • ライブラリごとに「現在のバージョン」と「アップデート可能なバー ジョン」が表⽰される • 緑⾊: 置き換えが必要なライブラリ • ⾚⾊: パッチバージョン or マイナーバージョンが更新できるライブラリ • ⻩⾊: メジャーバージョンが更新できるライブラリ

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

13 ⽬次 • Renovateは何をしてくれるのか? • どのように導⼊したか? • どのように運⽤しているか? • 運⽤で困ったこと・対策 • まとめ

Slide 14

Slide 14 text

Renovateは何をしてくれるのか? ざっくりと

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

どのように導⼊したか?

Slide 21

Slide 21 text

21 どのように導⼊したか? • Githubを利⽤していれば導⼊⾃体もすごく簡単 • MarketplaceにRenovateのアプリケーションがあるのでインストールす る • 対象にしたいリポジトリを選ぶ • 初期設定のためのプルリクエストが作成されるのでマージする • 無料で利⽤できる

Slide 22

Slide 22 text

22 どのように導⼊したか?

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

25 どのように導⼊したか? • 導⼊は簡単 • まずはRenovateの初期設定のためのプルリクエストが作成されるのでマージす る • renovate.jsonのファイルの追加のみ • バージョンを固定するためのプルリクエストが作成されるのでマージする • composer.lockをみて、composer.jsonのバージョンを固定してくれるので安⼼ • "laravel/framework": "^9.2", → "laravel/framework": "9.5.1", のように固 定される • 更新できるライブラリのプルリクエストが作成されるので確認してマージする

Slide 26

Slide 26 text

26 どのように導⼊したか? 既存のプロダクトに導⼊したところ‧‧‧ 27個のプルリクエストが⼀気に作成された 27個のプルリクエストが⼀気に作成された

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

29 どのように導⼊したか? プルリクエストを1つ1つ確認!

Slide 30

Slide 30 text

30 どのように導⼊したか? • メジャーバージョンアップされるライブラリ • LaravelはPHPのバージョンも上げないと無理だが、PHPUnitはあげるこ とができそう • パッチ‧マイナーバージョンアップされるライブラリ • あげておかしくなるものは(たぶん)なさそう。ただし数が多い。 • 初期設定だと1ライブラリにつき1つのプルリクエストが作成されるた め、1つ1つを検証しながらマージしていくのはちょっとつらい

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

32 どのように導⼊したか? • やること • 最新バージョンまで更新できるライブラリは⼀気にあげてしまう • メジャーバージョン更新とマイナー‧パッチバージョン更新で⼀応分ける • やらないこと • 更新することのできないメジャーバージョンは保留にする • Dockerfileなどの更新は別途対応とし保留にする Renovateの運⽤を開始した際に作成されるプルリクエストが なるべく少なく、バージョンの更新が⼩さくなるように

Slide 33

Slide 33 text

33 どのように導⼊したか? • 気合いで更新‧‧‧! • ここが⼀番⼤変だったかもしれない • プロダクトメンバーを巻き込んで、ライブラリの更新が問題がないか、 全体を動作検証を⾏いました • 既存でプロダクト全体に影響するような⼤きな改修をする際に確認する検証項⽬が あったのでそちらを実施 • ライブラリの更新、サボらずしていこう‧‧‧(決意)

Slide 34

Slide 34 text

どのように運⽤しているか?

Slide 35

Slide 35 text

35 どのように運⽤しているか? • プルリクエスト作成のタイミング • Renovateがプルリクエストを出すブランチ • laravel/frameworkは個別にプルリクエストを作成 • パッチバージョン‧マイナーバージョンのプルリクエストをまとめる • 週替りの当番制の採⽤ • 慣れるまでの運⽤⽅法 • 対応コスト

Slide 36

Slide 36 text

36 どのように運⽤しているか? プルリクエスト作成のタイミング • プロダクトは週1回の定期リリースを実施している • リリース前⽇、リリース当⽇はRenovateがプルリクエストを出し てきても対応しづらい • ⽇中にRenovateがプルリクエストを作成するのも少しノイズ • 業務時間外にプルリクエストを作成するように設定 • リリース前⽇、リリース当⽇(の朝)も対象外

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

38 どのように運⽤しているか? Renovateがプルリクエストを出すブランチ • Git-flowのようなブランチ運⽤中 • 対象の週にリリース予定の機能はdevelopブランチに追加していき mainブランチにマージする運⽤をしている • developブランチにRenovateのプルリクエストが作成される ように設定

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

41 どのように運⽤しているか? laravel/frameworkは個別にプルリクエストを作成 "packageRules": [ { "groupName": "laravel/framework", "matchPackageNames": ["laravel/framework"] } ] https://docs.renovatebot.com/configuration-options/#groupname renovate.json

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

44 どのように運⽤しているか? 週替りの当番制の採⽤ • 現在チームの開発メンバーは4⼈ • Renovateのプルリクエストを確認する当番を週替りで設定 • 担当が設定されていないとやはり漏れがち、偏りがちになってしまう • 影響範囲を調べるためにコードをしっかり読むことでキャッチアップにもつながってよ かったという声もあり • 新メンバーが⼊った場合にまず⾒てもらうタスクとしても良さそう • 対象のライブラリの影響範囲など分かった事項は都度Wikiに記載し次回移⾏の対応が効 率化できるようにしている

Slide 45

Slide 45 text

45 どのように運⽤しているか? 慣れるまでの運⽤⽅法 • いきなり「じゃあ次の週当番お願いします」はつらい • 週1でRenovateのプルリクエストを倒すMTGを設定 • 最初の2〜3週は導⼊を進めた私がメインとなって画⾯共有をしながら「こ れはこの辺が変更点ですねー」など共有しながら対応 • 慣れるまでチームメンバーでメイン担当を交代しつつ回す • 対応⽅法‧⽅針の共有ができた • 2周ほど回して慣れたかなという確認ののちMTGは解体

Slide 46

Slide 46 text

46 どのように運⽤しているか? 対応コスト • プロダクトによってもまちまちだと思う • 現状、週に2〜5程度のライブラリの更新がある • 出社したらプルリクエストが作成されているものを確認し順次対応の ながれ • 溜め込まなければ差分は⼩さい • 1プルリクエスト10〜30分程度で確認からマージできることが多い • 「ドキュメントだけ更新しました」というのも割とある

Slide 47

Slide 47 text

運⽤で困ったこと・対策

Slide 48

Slide 48 text

48 どのように運⽤しているか? 更新できないライブラリもプルリクエストが作成されてしまう • PHPのバージョンをあげないと更新できない場合がまれにある • CIが落ちていることで気付いた • composer installが失敗する • RenovateのPHP環境が新しい?(設定⽅法が分かっていない) • 並⾏でCIが回っているとより安⼼感が出るかなと思います • 対象のライブラリは個別でプルリクエストが作成されるように設定 • プルリクエストが作成されたらそのままクローズしている • 少しでもバージョンが上がると再度プルリクエストが作成されるので忘れるさられることはない

Slide 49

Slide 49 text

49 どのように運⽤しているか? 更新頻度が⾼いライブラリがある • aws/aws-sdk-phpなど • 実質使っているのはS3へのアップロードなどだが、いろいろな機能があるため更新 はたくさん⾶んでくる • 昨⽇マージしたけど、またプルリクエストが作成されまた確認するのか‧‧‧ • プルリクエストが単体でくるように設定 • マージのタイミングをリリース前⽇のプルリクエストの更新がされなくなったタイ ミングで⾏っている • 影響範囲の検証をするコストを可能な限り削減

Slide 50

Slide 50 text

まとめ

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

blue_goheimochi ⼤橋 佑太 株式会社オウケイウェイヴ PHP(Laravel), JavaScript(Vue.js/Nuxt.js), ランニング, サッカー, フットサル, 浜松まつり, PUBG Mobile, さわやかのげんこつハンバーグ おおはし ゆうた

Slide 54

Slide 54 text

Appendix

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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のライブラリの移⾏