KEIS BLOGは株式会社ケイズ・ソフトウェアが運営しています。

KEIS BLOG

セマンティックバージョニング


Go言語プロジェクトでのセマンティックバージョニングの採用とそのメリット

はじめに

前回はGo言語プロジェクトでのChangelogの管理について、特にコンベンショナルコミットとの連携を中心に解説しました。今回はその続きとして、セマンティックバージョニングについて解説します。

セマンティックバージョニングとは

セマンティックバージョニングは、ソフトウェアのバージョンを明示的かつ一貫性を持って管理する方法論です。基本の形は MAJOR.MINOR.PATCH となっており、それぞれの数字が特定の意味を持っています。

各バージョン番号の意味

  • MAJOR: 互換性がないAPIの変更がある場合にインクリメント
  • MINOR: 互換性があり、新機能が追加された場合にインクリメント
  • PATCH: 互換性があり、バグが修正された場合にインクリメント

Go言語でのセマンティックバージョニング

Go言語はモジュールの管理にもセマンティックバージョニングが広く採用されています。Goのパッケージ管理ツールであるgo modでも、このバージョニング方法がフルサポートされています。

具体的な実例: Goプロジェクトにおけるバージョン変更

Go言語において以下のような変更があったとしましょう。

変更前のGoコード(v1.0.0)


package main

func Add(a int, b int) int {
  return a + b
}

func main() {
  result := Add(3, 4)
  println(result)
}

新機能を追加(MINORバージョンアップ: v1.1.0)


package main

// この関数は新機能です。
func Multiply(a int, b int) int {
  return a * b
}

func Add(a int, b int) int {
  return a + b
}

func main() {
  result := Add(3, 4)
  println(result)

  newResult := Multiply(3, 4)
  println(newResult)
}

バグ修正(PATCHバージョンアップ: v1.1.1)


package main

func Multiply(a int, b int) int {
  return a * b
}

// この関数はバグ修正がされました。
func Add(a int, b int) int {
  if a < 0 || b < 0 {
    return 0
  }
  return a + b
}

func main() {
  result := Add(3, 4)
  println(result)

  newResult := Multiply(3, 4)
  println(newResult)
}

破壊的変更(MAJORバージョンアップ: v2.0.0)


package main

func Multiply(a int, b int) int {
  return a * b
}

// この関数は破壊的変更がされました。
func Add(a, b, c int) int {
  return a + b + c
}

func main() {
  result := Add(3, 4, 5)
  println(result)

  newResult := Multiply(3, 4)
  println(newResult)
}

短い例で機能追加と破壊的変更の例を作るのが難しくて、ちょっと無理やり感ありますが、雰囲気で理解していただくとして・・・。破壊的変更が無い限り、いくら機能追加してもメジャーバージョンは上がらないよというのが原則ですね。

go-semantic-releaseの活用

前回の記事で紹介したgo-semantic-releaseを用いると、セマンティックバージョニングに基づいたリリースとChangelogの生成が自動化できます。


# バージョンを自動でインクリメントしてタグを付ける
go-semantic-release -ghr

セマンティックバージョニングのメリット

  • 明確性: バージョン番号だけで、そのバージョンで何が変わったのかが一目でわかる。
  • 自動化の容易性: バージョン管理とChangelog生成を一元的に自動化できる。

参考リンク

まとめ

セマンティックバージョニングは、Go言語プロジェクトにおいても多くのメリットをもたらします。特に、コンベンショナルコミットとの連携により、バージョン管理とChangelog生成を効率よく行うことが可能です。