semantic-release/GitHub Actionsを使ってGitHubのタグとリリースを自動で作成する
と思ったらこんなものがあった
とはいえまだPythonパッケージがよくわかってないので、semantic-releaseが汎用的なツールとして使えるか?(npmプロジェクトじゃなくても使えるか?現時点ではなんとなく、いけそうと思っている)を確認したい
方針
- semantic-releaseが汎用的なツールとして使えるかを確認する
- devcontainer環境で行う
- github actionsで自動化する
とりあえずいろいろ試してみるにせよ、
- Pythonメインのプロジェクトを想定
- Nodeも一応いれておく
- 上記など必要なものが入れてあるdevcontainerを使う
が自分的にはミニマムで必要なので、それらを用意したテンプレートレポジトリを元に新しいレポジトリを作成する。で、ある程度固まったらテンプレートレポジトリに反映していくつもり。
テンプレートレポジトリ
↑からレポジトリを作成。
cloneしてVSCodeで開く
$ git clone https://github.com/kun432/semantic-release-sample
$ cd semantic-release-sample
$ code .
VSCodeが立ち上がったらre-open in devcontainerで開き直す
上がってきたら、以降の作業はVSCodeのターミナルで作業を行う。
諸々インストール
$ npm init -y
$ npm install --save-dev semantic-release husky @commitlint/cli @commitlint/config-conventional
package.json修正。追加したのは"private": true
あたり含めた下の部分。
{
"name": "workspace",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@commitlint/cli": "^17.6.1",
"@commitlint/config-conventional": "^17.6.1",
"husky": "^8.0.3",
"semantic-release": "^21.0.2"
},
"private": true,
"release": {
"plugins": [
"@semantic-release/commit-analyzer",
"@semantic-release/release-notes-generator",
"@semantic-release/github"
],
"branches": [
"main"
]
},
"commitlint": {
"extends": [
"@commitlint/config-conventional"
]
},
"husky": {
"hooks": {
"commit-msg": "npx commitlint --edit $1"
}
}
}
huskyの初期設定
$ npx husky install
$ npx husky add .husky/commit-msg 'npx commitlint --edit $1'
ここやってること上と同じなんだよな・・・以前のバージョンではpackage.jsonだけで設定するようになっていたのが、コマンドラインから設定するように変わったらしい。
となるとpackage.json側は要らない気もするけど・・・・とりあえずおいておくか
GitHub Actionsはあとでやるとして、ここでコミットしてどうなるかを試してみる。
$ git status
On branch main
Your branch is up to date with 'origin/main'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
.husky/
package-lock.json
package.json
nothing added to commit but untracked files present (use "git add" to track)
$ git add .
$ git commit -m "semantic-releaseを設定した"
こうなる
⧗ input: semantic-releaseを設定した
✖ subject may not be empty [subject-empty]
✖ type may not be empty [type-empty]
✖ found 2 problems, 0 warnings
ⓘ Get help: https://github.com/conventional-changelog/commitlint/#what-is-commitlint
husky - commit-msg hook exited with code 1 (error)
コミットメッセージが一定のルールに基づいていない場合はエラーになる。
でコミットメッセージのルールは以下。
Commit message | Release type |
---|---|
fix(pencil): stop graphite breaking when too much pressure applied |
Fix Release |
feat(pencil): add 'graphiteWidth' option |
Feature Release |
perf(pencil): remove graphiteWidth option BREAKING CHANGE: The graphiteWidth option has been removed. The default graphite width of 10mm is always used for performance reasons.
|
Breaking Release (Note that the BREAKING CHANGE: token must be in the footer of the commit) |
refs: https://github.com/semantic-release/semantic-release#commit-message-format
デフォルトだとAngularのフォーマットになるらしい。コミットメッセージの最初のtype部分は上記以外にもいくつかあるみたい。
ということでfix releaseにしてみる。
$ git commit -m "fix(base): semantic-releaseを設定した"
[main 09d2384] fix(base): semantic-releaseを設定した
3 files changed, 7916 insertions(+)
create mode 100755 .husky/commit-msg
create mode 100644 package-lock.json
create mode 100644 package.json
行けた。
ではsemantic-releaseを使うようにGitHub Actionsの設定を行う。
$ mkdir -p .github/workflows
$ touch .github/workflows/main.yml
name: Release
on:
push:
branches:
- main
jobs:
release:
name: Release
runs-on: ubuntu-latest
permissions:
contents: write # to be able to publish a GitHub release
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: "18.15.0"
- name: Install dependencies
run: npm clean-install
- name: Release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: npx semantic-release
ではcommitしてpushする。実はpushしてactionsがうまく動かなかったりして何回か試したので、コミットメッセージがここまでの内容と違うけど、気にしないで。。。。
$ git add .
$ git commit -m "fix(base): テストで修正してみた"
$ git push
でGitHub側でActionが正常に行われて、
ReleaseができていたらOK
とりあえずv1.0.0になってる。
少し修正してもう一度pushしてみる。
$ git add .
$ git commit -m "fix(base): readme修正"
$ git push
v1.0.1になっていた。
今度はFeature Releaseにしてみる。
$ git add .
$ git commit -m "feat(base): readme修正ふたたび"
$ git push
今度は1.1.0になった。
その他
- 汎用ツールとして使えそうな雰囲気。
- GitHub側での設定変更は必要なかったけど、workflowで
jobs.release.permissions.contents: write
を設定しておかないとだめ。 - semantic-release-actionというものがあるらしい。これを使えばもっとworkflowをスッキリかけそう
- semantic-releaseには他にもいろいろなプラグインがあるので、上手く使えばもっと楽になりそう。
- 全体的に、一次情報は最初から読むにはちょっと厳しい、二次情報は古いものが多い、って感じでちょこちょこハマった。workflowの書き方はsemantic-releaseの公式ドキュメントが一番スッキリまとまっているので、一次情報はやはり大事。
流れがわかったのでpython-semantic-releaseの方を軽く読んでみた。当然ながらツールセットが変わるけど、なんとなく行けそう。
とはいえ、ツールセットが変わると学習コストは高い、まだPythonのパッケージとかツール周りよくわかってないし。
この記事はとても参考になりそう。