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

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

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

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

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    • 対象にしたいリポジトリを選ぶ
    • 初期設定のためのプルリクエストが作成されるのでマージする
    • 無料で利⽤できる

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  36. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  42. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  46. 運⽤で困ったこと・対策

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide