Closed6

semantic-release/GitHub Actionsを使ってGitHubのタグとリリースを自動で作成する

kun432kun432

と思ったらこんなものがあった

https://python-semantic-release.readthedocs.io/en/latest/

とはいえまだPythonパッケージがよくわかってないので、semantic-releaseが汎用的なツールとして使えるか?(npmプロジェクトじゃなくても使えるか?現時点ではなんとなく、いけそうと思っている)を確認したい

kun432kun432

方針

  • semantic-releaseが汎用的なツールとして使えるかを確認する
  • devcontainer環境で行う
  • github actionsで自動化する
kun432kun432

とりあえずいろいろ試してみるにせよ、

  • Pythonメインのプロジェクトを想定
  • Nodeも一応いれておく
  • 上記など必要なものが入れてあるdevcontainerを使う

が自分的にはミニマムで必要なので、それらを用意したテンプレートレポジトリを元に新しいレポジトリを作成する。で、ある程度固まったらテンプレートレポジトリに反映していくつもり。

テンプレートレポジトリ
https://github.com/kun432/semantic-release-devcontainer-boilerplate

↑からレポジトリを作成。
https://github.com/kun432/semantic-release-sample

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だけで設定するようになっていたのが、コマンドラインから設定するように変わったらしい。

https://r17n.page/2021/03/12/fix-husky-hooks-not-working/

となると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部分は上記以外にもいくつかあるみたい。

https://github.com/angular/angular/blob/main/CONTRIBUTING.md#-commit-message-format

ということで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の設定を行う。

https://semantic-release.gitbook.io/semantic-release/recipes/ci-configurations/github-actions

$ mkdir -p .github/workflows
$ touch .github/workflows/main.yml
.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になった。

kun432kun432

その他

  • 汎用ツールとして使えそうな雰囲気。
  • GitHub側での設定変更は必要なかったけど、workflowでjobs.release.permissions.contents: writeを設定しておかないとだめ。
  • semantic-release-actionというものがあるらしい。これを使えばもっとworkflowをスッキリかけそう
  • semantic-releaseには他にもいろいろなプラグインがあるので、上手く使えばもっと楽になりそう。
  • 全体的に、一次情報は最初から読むにはちょっと厳しい、二次情報は古いものが多い、って感じでちょこちょこハマった。workflowの書き方はsemantic-releaseの公式ドキュメントが一番スッキリまとまっているので、一次情報はやはり大事。
kun432kun432

流れがわかったのでpython-semantic-releaseの方を軽く読んでみた。当然ながらツールセットが変わるけど、なんとなく行けそう。

https://python-semantic-release.readthedocs.io/en/latest/#getting-started

とはいえ、ツールセットが変わると学習コストは高い、まだPythonのパッケージとかツール周りよくわかってないし。

この記事はとても参考になりそう。

https://qiita.com/nakamasato/items/bb0f2c89d3d849ecfe90

このスクラップは2023/05/03にクローズされました