coiai Logo
ホーム記事コラムPodcast会社情報
お問い合わせ
Featured

「最新版を使えばいい」は本当に正しい?Dependabotを使って“pin + 自動更新”にする理由

依存ライブラリやGitHub Actions、Terraform Providerのバージョン管理をしていると、よく出てくるのが次の考え方です。

新しいバージョンが出たら、常に最新版へ上げればいいのでは?

一見すると合理的です。

実際、古いバージョンを長期間使い続けるより、継続的にアップデートした方が、脆弱性や非互換の問題を後回しにしにくくなります。

ただし、実際の開発運用では、

「バージョンを固定しない」ことと「常に新しい状態を保つ」ことは別です。

むしろ、

バージョンは固定し、Dependabotで自動的に更新PRを作る

という運用の方が、安全性と更新頻度を両立しやすくなります。

今回は、実際の開発チームで出た「pinするべきか、しないべきか」という議論をベースに、Dependabotをどう使うべきか整理します。

きっかけは「そもそもpinしなくていいのでは?」という疑問

あるプロジェクトで、GitHub ActionsやTerraform Providerのバージョンを更新する話が出ました。

その中で、

理想的には何もpinしない方がいい。新しいバージョンが出たら常にアップグレードすればいいのでは?

という意見が出ました。

この考え方自体は間違っていません。

目標としては、

依存関係を古いまま放置しない

というのが正しいです。

ただし、その目標を実現する方法として「pinしない」を選ぶと、別の問題が出てきます。

そこで出てきたのが、

「pinしない」のではなく、「pin + automated bumps」にしよう

という考え方です。

つまり、

バージョンは固定する。しかし、更新作業は自動化する。

これがDependabotを使う理由です。

GitHub Actionsでは、floating tagがリスクになる

たとえばGitHub Actionsでは、次のような指定をすることがあります。

uses: actions/checkout@v4

これは分かりやすく、一般的な書き方です。

ただし、v4 のようなタグは、厳密には「特定のコードそのもの」を表しているわけではありません。

タグが別のコミットを指すように変更されれば、同じ @v4 という記述でも、実際に実行されるコードが変わる可能性があります。

CI/CDで実行されるActionは、ビルド環境やデプロイ権限にアクセスすることがあります。

そのため、これはサプライチェーンセキュリティの観点でも重要です。

より厳密に管理するなら、特定のコミットSHAに固定します。

uses: actions/checkout@<commit-sha>

こうすると、同じ設定から実行されるコードが勝手に変わることはありません。

ただし問題があります。

固定しただけでは、そのバージョンは永遠に古くなっていきます。

そこでDependabotを使います。

新しいバージョンが出たら、

  • Dependabotが変更を検出する
  • Pull Requestを作成する
  • 差分を確認する
  • CIを実行する
  • 問題なければマージする

という流れにします。

つまり、

固定することで再現性を確保し、Dependabotで鮮度を維持する

という考え方です。

「固定する」と「最新版を使う」は矛盾しない

ここが重要です。

バージョンを固定すると、

「古いバージョンを使い続けることになるのでは?」

と思うかもしれません。

しかし、Dependabotを使えばそうなりません。

例えば現在のバージョンが1.2.3だったとします。

1.2.3

新しく1.2.4が出ると、DependabotがPRを作ります。

1.2.3 → 1.2.4

そのPRをレビューしてマージします。

さらに1.3.0が出れば、

1.2.4 → 1.3.0

というPRが作られます。

つまり、実際には常に最新版を追うことができます。

違うのは、

勝手に最新版へ切り替わるのではなく、Pull Requestというレビュー可能な変更として更新される

という点です。

これが大きな違いです。

Terraformでは少し事情が違う

Terraform Providerでも、似た議論があります。

例えばAWS Providerを次のように指定するとします。

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 6.0"
    }
  }
}

~> 6.0 は、AWS Provider 6系を使うという制約です。

ここで重要なのは、Terraformでは実際に使用するProviderバージョンは .terraform.lock.hcl に記録されるという点です。

つまり、

versions.tf などに書くversion constraintは、

どのバージョンまで許可するか

を決めます。

一方でlock fileは、

実際にどのバージョンを使うか

を固定します。

この2つは役割が違います。

Terraformで完全に制約をなくすと何が起きるか

たとえばAWS Provider 6系を使っている状態で、将来7系がリリースされたとします。

制約がなければ、次回の更新時に7系が入ってくる可能性があります。

しかし、メジャーバージョンアップには破壊的変更が含まれる可能性があります。

その結果、

  • resourceの仕様変更
  • deprecated属性の削除
  • stateとの差分発生
  • 予期しないTerraform plan

などが起きる可能性があります。

インフラでは特に、

「次にapplyしたら突然大量変更が出た」

という状態を避ける必要があります。

そのため、

version = "~> 6.0"

のようにメジャーバージョンを制約しておきます。

その上でDependabotにアップデートPRを作らせます。

Terraformでは「PR → plan → review → apply」にする

Terraformで重要なのは、アップデートそのものより、

アップデートによってインフラにどんな変更が出るか

です。

そのためProvider更新は、

  1. Dependabotが更新PRを作る
  2. Terraform planを実行する
  3. speculative planを確認する
  4. breaking changeがないかレビューする
  5. 問題なければマージ
  6. applyする

という流れにすると安全です。

特にAWS Providerのメジャーバージョンアップでは、このフローが重要です。

単純に、

6.x → 7.x

と最新版へ更新するのではなく、

変更内容をコードレビューとplanレビューの両方で確認する

ということです。

ではDependabotとは何なのか

Dependabotは、GitHubが提供している依存関係管理の自動化機能です。

主に次の機能があります。

Dependency graph

リポジトリがどのパッケージやライブラリに依存しているのかをGitHubが把握します。

Dependabotの脆弱性検知の基礎になる機能です。

Dependabot alerts

利用中の依存関係に既知の脆弱性がある場合、GitHub上で通知します。

Dependabot security updates

脆弱性を修正できるバージョンがある場合、自動的にPull Requestを作成します。

Dependabot version updates

脆弱性の有無に関係なく、新しいバージョンが出たときにアップデートPRを作ります。

実務で「pin + automated bumps」を実現する中心的な機能は、このversion updatesです。

version updatesはdependabot.ymlで設定する

通常のバージョンアップデートを自動化する場合、リポジトリに次のファイルを置きます。

.github/dependabot.yml

例えばGitHub Actionsを毎週確認する場合はこうします。

version: 2

updates:
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"

Terraformも監視できます。

version: 2

updates:
  - package-ecosystem: "terraform"
    directory: "/"
    schedule:
      interval: "weekly"

Gradleなら次のように設定できます。

version: 2

updates:
  - package-ecosystem: "gradle"
    directory: "/"
    schedule:
      interval: "weekly"

複数のecosystemを1ファイルにまとめることもできます。

なぜ手動更新ではなくDependabotなのか

もちろん、人間が定期的に最新版を確認して更新することもできます。

ただ、これは長期的にはかなり漏れやすい運用です。

プロジェクト開始直後は、

「毎月確認しよう」

と思っていても、

  • 開発が忙しくなる
  • 担当者が変わる
  • リポジトリが増える
  • 優先度が下がる

などの理由で、徐々に更新されなくなります。

Dependabotを使えば、

更新を人間の記憶に依存しない運用

にできます。

これはかなり大きなメリットです。

PR履歴そのものが更新理由になる

今回の議論では、もう1つ面白いポイントがありました。

当初は、

バージョンをpinするときは、「なぜこのバージョンなのか」をコメントとして残そう

という案がありました。

これは悪い考えではありません。

ただ、Dependabotを使う場合は、必ずしもすべてのpinにコメントを書く必要はありません。

なぜなら、

更新履歴そのものがPull Requestとして残るからです。

例えば、

Bump hashicorp/aws from 6.12.0 to 6.13.0

というPRがあれば、

  • いつ
  • 何を
  • どのバージョンから
  • どのバージョンへ
  • CIが通ったか
  • 誰がレビューしたか

がGitHub上に残ります。

コードコメントに背景を書き続けるよりも、PR履歴の方が正確な場合もあります。

pinしない運用の問題

ここまでを整理すると、「pinしない」運用にはいくつか問題があります。

1つは、意図しないタイミングで依存関係が変わることです。

昨日まで動いていたCIが、コードを変更していないのに今日突然壊れる、といった現象が起きる可能性があります。

もう1つは、変更点が見えにくいことです。

Dependabot経由なら、

v1 → v2

という変更がPRとして明示されます。

しかし、参照先が自動的に変化する場合、その変更がコードレビューに現れません。

ソフトウェア開発では、

いつ何が変わったかを追跡できること

も重要です。

Dependabotを使えば安全になるわけではない

注意点もあります。

Dependabotを導入すれば、自動的にすべて安全になるわけではありません。

Dependabotはあくまで、

アップデート候補を自動で提示する仕組み

です。

PRが作られたからといって、そのまま自動マージすればよいとは限りません。

特に、

  • Terraform Providerのメジャーアップデート
  • DBライブラリ
  • 認証ライブラリ
  • ビルドツール
  • GitHub Actions

などは、変更内容を確認した方がよいです。

重要なのは、

自動更新ではなく、自動PR化

という考え方です。

実務では「pin + bot + CI」が扱いやすい

最終的に、依存関係管理の基本形は次のようになります。

Version pin
    ↓
Dependabot
    ↓
Pull Request
    ↓
CI / Terraform plan
    ↓
Human review
    ↓
Merge

これなら、

  • 再現性を確保できる
  • 最新版を追従できる
  • 変更履歴が残る
  • CIで問題を検出できる
  • 人間が最終判断できる

というバランスを取れます。

「最新版を使う」と「勝手に最新版になる」は違う

今回の議論で一番重要なのはここだと思います。

最新版を積極的に使うこと自体は正しい。

ただし、

最新版へ自動的に切り替わることが正しいとは限りません。

理想的なのは、

常に新しいバージョンを追う。ただし、変更は必ずPull Requestとして可視化する。

という状態です。

そのための仕組みとして、Dependabotはかなり使いやすいです。

まとめ

Dependabotを使う理由は、単に「アップデートが面倒だから」ではありません。

本質的には、

依存関係の更新を、レビュー可能で追跡可能な開発プロセスにするため

です。

「pinすると古くなる」という問題は、Dependabotで解決できます。

「最新版を使うと突然壊れる」という問題は、pinとPRレビューで抑えられます。

そのため実務では、

pin + Dependabot + CI

という組み合わせが扱いやすいです。

バージョンを固定することと、常に新しい状態を保つことは矛盾しません。

むしろDependabotを間に入れることで、

固定して安全性を確保しながら、継続的に最新版へ追従する

という運用が可能になります。

投稿日: 2026年9月11日
カテゴリ: 未分類
タグ:
coiai

coiai

この記事もおすすめ

デフォルトサムネイル

GMKtec EVO-X2にUbuntuを入れたら有線LANが認識されなかった話

オンプレミスAIサーバー(ローカルLLM + 社内文書RAG)の構築を始めました。機材はGMKtec EVO-X2、AMD Ryzen AI Max+ 395搭載のミニPCです。128GBのユニファイドメモリをGPUに大きく割り当てられるので、ローカルLLM用途では今いちばん面白いマシンだと思っています。 この記事は初日の作業ログです。結論から言うと「インストールUSBが起動しない」「有線LANが認識されない」という2つの罠を踏んだので、同じ構成を組む方のために記録しておきます。 OSはLinuxかWindowsか 最初に迷うのがここですが、サーバー用途ならUbuntu Server一択でした。 日常操作はすべてブラウザ(Open WebUI)経由なので、サーバーOSにGUIは不要です。管理画面が欲しければCockpitを入れれば、Webブラウザからメトリクス確認・サービス再起動・ターミナルまで使えます。「CUIのサーバー + Web管理画面」が現代の標準形だと思います。 BIOS設定 ― EVO-X2で一番大事なのはVRAM割り当て 電源ON直後にDel連打でBIOS(AMI)へ入ります。設定したのは3つです。 罠その1: インストールUSBが起動しない Ubuntu Server 24.04のISOをMacから dd でUSBメモリに書き込み、いざブート……しません。Boot Overrideに出てくる「UEFI OS」を選んでもWindowsが立ち上がってしまいます。 切り分けの過程が学びでした。 原因はおそらく、dd の書き込みが完全に終わる前に抜いてしまったことです。dd は進捗表示が止まってからもバッファの書き出しが続くので、完了統計が表示されるまで待たなければいけません。パーティションテーブルはディスク先頭に書かれるため、途中で切れていても一見正常に見えるのが厄介なところです。 教訓: インストールUSB作成はbalenaEtcherを使いましょう。 書き込み後に自動でベリファイ(照合)まで走るので、「書けたつもり」が原理的に起きません。Etcherで書き直したら一発で起動しました。 インストール時の選択 罠その2: 有線LANが認識されない インストール完了、ログイン成功。しかし ip a を見ると有線LANにIPがありません。それどころか、よく見ると有線のインターフェース自体が存在しません。 カーネルログを見て原因が確定しました。 EVO-X2の2.5GbEチップ(Realtek RTL8125D)が新しすぎて、Ubuntu 24.04の標準カーネル6.8のドライバが知らないチップだったのです。インストール中にネットに繋がらなかったのもこれが原因でした。ケーブルを何度挿し直しても無駄だったわけです。 教訓: 「繋がらない」時はケーブルを疑う前に dmesg を読みましょう。 カーネルログには大抵、答えがそのまま書いてあります。 解決: HWEカーネル 新しいチップに対応するには、新しいカーネルを入れれば解決します。Ubuntuには**HWE(Hardware [&hellip;]

FSD v2.1 Feature-Sliced Design を導入する

FSD v2.1 Feature-Sliced Design を導入する

この記事は何? 公式のドキュメントやチュートリアル、exsample を読んで理解するのが一番いいですが、備忘録として残しておきます。特に後述の Skills, Steiger については開発する際にあった方が便利なので、それについても記事にします。 FSDとは? FSD (Feature-Sliced Design) はフロントエンドのアーキテクチャの一つです。 FSDとは責務で分けていくアーキテクチャと違い、ページやエンティティで分けていくアーキテクチャというとわかりやすいと思います。 コードの分離の仕方について話す前に、FSDで前提となる この3つについて理解する必要があります。 レイヤー より細かく分けていく方法がありますが、この記事では導入だけ触れたいので、3つのレイヤーのみ説明します。 です。この流れは上(app)に向かえば向かうほどアプリケーション固有、下(shared)に向かうほど汎用的になります。 原則として上位レイヤーは下位レイヤーを利用できるが、下位レイヤーから上位レイヤーへ依存できません。 始め方としては小さく初めて、必要になったらレイヤーを増やしてくようです。 スライス ブログアプリであればレイヤーの pages には といったページに分けられるため、このような構成になります。このblog-list, blog-detail, user がスライスです。これらはページやエンティティによって分けられます。 セグメント これらのmodel, ui といった部分がエンティティです。これらは責務にあたります。sharedに関しては直下にスライスではなくセグメントが入ります。 FSD 2.1 で重要なのは Pages First です。とにかくPagesから作って、細分化の必要ができたら、下位レイヤーに抽出します。 Steiger Steiger とはアーキテクチャリンターです。以下でインストールできます。 AIコーディングのために Claude Skills https://github.com/feature-sliced/skills?utm_source=chatgpt.com このリポジトリが公式に公開されています。 これで Skills を追加できるので、claude にFSDの設計知識を共有できます。

フロントエンドのアーキテクチャについて最初から考える

フロントエンドのアーキテクチャについて最初から考える

これは何? この記事は基本に立ち戻りアーキテクチャの選定を試みた際の備忘録です。Feature-Sliced Design(FSD)や Vertical Slice Architecture など、モダンなアーキテクチャがありますが、どのような判断をもとに選定するのかを考え直します。 アーキテクチャの地図 アーキテクチャを理解するために、以下のような学習のための地図を作りました。設計原則、アーキテクチャ、個別の設計パターンへと詳細になっていきます。 そもそも、、、 このコードは何を担当しているのかを考えるのが最初の問です。 商品一覧画面を作るときに といったタスクを書き出します。 これら全てを一つの巨大なコンポーネントとして作ることもできますが、管理が大変になるのは皆さんもお分かりだと思います。参考:https://blog.cleancoder.com/uncle-bob/2014/05/08/SingleReponsibilityPrinciple.html?utm_source=chatgpt.com ここからどこまでを同じモジュールとして管理するのか?という設計の問題が始まります。 Cohesion と Coupling CohesionとCouplingはそれぞれ、凝集度、結合度というようです。https://qiita.com/dsudo/items/ee3fee1f558c7f1b359f Cohesionは関係するコードがまとまっているか? Couplingは別のコードにどれだけ依存しているか? です。 例えば以下のようなコードがあります。 技術的な種類ごとに整理されていますが、商品一覧のコーディングをするのにそれぞれ別のディレクトリを行き来する必要があります。一方で、以下のように書いた場合はどうでしょうか? この書き方なら、商品に依存するコードがまとまっています。 この書き方が Feature-based Architecture, Vertical Slice Architecture に繋がっていきます。 コロケーションについて colocation Place code as close to where it&#8217;s relevant as possible 同じ種類のコードを集めることではなく、一緒に変更されるコードを近くに置くことです。 https://kentcdodds.com/blog/colocation?utm_source=chatgpt.com Layered Architecture について ここからアーキテクチャの話です。 Layered Architectureでは、技術的責務でアプリケーションを分離します。 これのメリットは責務がわかりやすいところです。 しかし、この方法では前述までとは変わり、機能を変更するときに、横断して変更する可能性があります。 つまり、技術的には分かれている一方で、機能は複数に分散するわけです。 [&hellip;]

デフォルトサムネイル

【WSL入門】Ubuntu on WSL2 に開発ツールを一式そろえる — Git / nvm / pnpm / AWS CLI / Terraform

前回の記事では、Windows に WSL2 を導入して Ubuntu が動くところまでを扱いました。ただ、素の Ubuntu はあくまで「まっさらな Linux」です。ここから実際に開発を始めるには、バージョン管理・ランタイム・クラウド操作のツールを自分で入れていく必要があります。 この記事では、すべて公式ドキュメントに載っている手順だけを使って、次のツールを順番にセットアップします。 各セクションの末尾に出典 URL を置いてあるので、手順が古くなったと感じたらそこを見に行ってください。記事末尾には出典一覧もまとめています。 検証環境Windows 11 / WSL2 / Ubuntu 24.04 LTS(x86_64)確認日:2026年7月28日 バージョン番号は執筆時点のものです。インストールコマンド自体は基本的に「常に最新を取ってくる」形になっているので、そのまま実行して問題ありません。 はじめに:WSL開発の大原則 コマンドに入る前に、ひとつだけ。Microsoft の公式ドキュメントが繰り返し書いている重要な原則があります。 使う予定のツールと同じ OS 側にファイルを置く。Linux ツールで Linux コマンドラインから作業しているなら、最速のパフォーマンスを出すためにファイルは WSL ファイルシステムに格納します。 具体的には、プロジェクトは次の場所に置きます。 /mnt/c/ 配下はファイルシステムをまたぐため、npm install や git status が体感でわかるほど遅くなります。第2弾でこれから入れるツールも、すべて Linux 側のホームディレクトリを前提に使ってください。 出典:WSL 開発環境を設定する — Microsoft Learn 1. まずは基本ツール Ubuntu を起動したら、最初にやることはパッケージの更新です。Microsoft の公式ドキュメントにもこう書かれています。 ディストリビューションの優先パッケージ マネージャーを使用して、パッケージを定期的に更新およびアップグレードすることをお勧めします。Windows [&hellip;]

この記事を書いた会社

株式会社coiaiは、「想像できることを美しく実現」を掲げ、XR・Web・アプリ・システム開発およびDX支援を行う会社です。 創業2022年、東京都練馬区に本社を置き、要件のヒアリングからPoC(概念実証)、本番運用まで一貫して伴走します。 まずはお気軽にご相談ください。

商号株式会社 coiai創業2022年1月設立2025年1月23日資本金1,500,000円(設立時点)本社所在地東京都練馬区関町北 3-6-9代表者代表取締役 竹村 啓佑 / 代表取締役 服部 陽良

主なご相談内容

  • Webサイト・Webアプリの設計・開発
  • スマートフォンアプリ(iOS / Android)の開発
  • XR・AR・VRを活用した体験設計・開発
  • DX推進・業務システムの企画・開発
  • PoC(概念実証)から本番運用までの伴走支援
  • マーケティング・コンサルティング
会社概要・役員紹介を見る

詳しい会社情報は会社概要ページでご覧いただけます。

資料請求・無料相談

導入要件のヒアリングからPoC、本番運用まで伴走します。まずはお気軽にご相談ください。

フォームで問い合わせメールで相談

お問い合わせの前に 個人情報保護方針 をご確認ください。

株式会社coiai株式会社coiai

XR, Web, システム開発, DX — 想像できることを美しく実現

メールでお問い合わせ

サービス

on-premise AI

基幹システム Anchor

XR開発

会社情報

会社概要

ブログ

お問い合わせ

法務

プライバシーポリシー


所在地

〒177-0051 東京都練馬区関町北3-6-9

営業時間

平日 10:00-18:00

土日祝 休み

info@coiai.net

© 2023–2026 株式会社coiai. All rights reserved.