GitHub Actionsとnpを使ったプロダクトのバージョン管理/リリースフローが簡単すぎた

公開:2020/11/10
更新:2020/11/11
3 min読了の目安(約2900字TECH技術記事

DESCRIPTION

  • https://github.com/capacitor-community/admob/releases のようなバージョンタグとリリースノートを自動生成した話
  • package.jsonのversionとGitHub上のversionが一致するようになって幸せ
  • デプロイ/リリースフローもそれに沿った形にした話

本文

GitHubでプロダクトのソースコード管理することは当たり前になりましたが、皆さんリリースバージョンはどのように管理していますか??

恥ずかしながら半年ほど前まで、プロダクトでリリースバージョンというものをつけていませんでした。

  • よし、この機能追加した
  • よし、テストも通った。リリースするぞ。
  • 手動でpackage.jsonのversionを変更する
  • じゃあ、productブランチにマージして(GitHub Actionsが動いて)デプロイだ!!

まぁ、特筆した問題はないのですが、アプリ内でバージョン表示するために resolveJsonModule: true にしてpackage.jsonをインポートしてる関係上、これを変え忘れると問い合わせ対応の時のバージョン確認で手間増えるし、GitHubを利用してるのに、GitHubのバージョンタグは活用されていないし、それによってどのバージョンでどこを変更したかの一覧性ないし。 あれ、今考えてみると、十分に問題だらけでした。

そこで、ちょっと本腰をいれて対応してみました。

npの設定

まず、プロジェクトにnpmパッケージをいれます。なので、トップディレクトリに package.json がない場合は、 npm init して package.json を追加してください。この段階で、 versionrepository があることを確認しておく必要があります。例えば、以下のような形です。

{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/test/test.git"
  },
  "author": "",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/test/test/issues"
  },
  "homepage": "https://github.com/test/test#readme"
}

そして、今回の肝であるパッケージ、 np をインストールします。

% npm install np --save-dev

このパッケージはもともと、 npm publish する時に利用されるバージョン管理パッケージなのですが、オプションをちゃんとみると npm publish 以外でも利用できるのでこれを利用します。では、まず試しに実行してみましょう。

% npx np --no-publish --yolo

--no-publish は 「 npm publish ではない」(npmパッケージとしてリリースしない)、 --yolo は 「node_modulesのクリーンアップとテストを実行しない」という意味です。オプションは必要に応じて変更してください。ここでテストを実行してもいいのですが、私は本番デプロイ時のCI上で行うので --yolo にしています。

オプションはこちら: https://www.npmjs.com/package/np#usage

そうして、パッチなのか、マイナーアップデート、メジャーアップデートなのかを選択します。

? Select semver increment or specify new version (Use arrow keys)
❯ patch         8.2.17 
  minor         8.3.0 
  major         9.0.0 
  prepatch      8.2.17-0 
  preminor      8.3.0-0 
  premajor      9.0.0-0 
  prerelease    8.2.17-0

選択すると、以下の実行が行われます。

  • package.jsonのversionの値を変更する
  • 最後のGitHubのタグからここまでのGitのコミット履歴を一覧にしてくれる
  • Gitにタグをつけてくれる
  • GitHubにリリースノートの下書きをつくってリリースをクリックするだけの状態にしてくれる(以下)

めっちゃ便利!!そして、GitHub上からこのようにリリースバージョン、タグバージョンを追えるようになります。

GitHub Actionsの設定

デプロイ用のGitHub Actionsをブランチ指定ではなく、タグ指定をするようにします。

on:
  push:
    tags:
      - v[0-9]+.[0-9]+.[0-9]+

これだと、 x.x.x のタグがついたPushがデプロイされます。タグがついてなかったらデプロイされません。

おわりに

これで関係者に「今回のアップデートは」みたいな説明は不要になって、以下のようにURLを渡すだけで済むようになりました。

自分自身物忘れしやすいので「あれ変更したのっていつだっけな」みたいなのなくなり助かっています。ぜひCI環境を構築してる方は、バージョン管理も追加してみてください。

ちなみに以下記事もおすすめなのでぜひお時間ある方はご覧ください。

それではまた。

この記事に贈られたバッジ