この記事は新歓ブログリレー202320日目です。
TL; DR
リポジトリです。
そして、こちらがcrates.ioに公開しているライブラリです。
https://crates.io/crates/traq-bot-http
なんですかこれは
部内SNSのtraQではBOTを導入することができます。昨日のブログリレーでもBOTに関する記事がありましたね。
このように活発に開発されているBOT開発をやりやすくするために、このライブラリは作成されました。開発にあたって、traP公式に提供されているtraQ BOT用のGoライブラリを参考にしました。
ここでは、開発過程で得たちょっとしたノウハウをつらつら書いていこうと思います。
リポジトリ作成
GitHub側はREADMEとLICENSEのみ作りました。ローカルでは↓
$ cargo new traq-bot-http-rs --lib
$ cd traq-bot-http-rs
$ git remote add origin git@github.com:H1rono/traq-bot-http-rs.git
$ git pull --set-upstream origin main
.gitignoreはgithub/gitignore/Rust.gitignoreを見て加筆しましょう。私はそれに加えて、.*
系のファイル/フォルダのみホワイトリスト形式にしました。
開発フロー
基本的な機能が揃うまではmainに直pushでやってました。私一人が趣味で開発しているものなのであまり深くは考えていません。
最近は基本的な機能も揃って重大なバグも見当たらなくなってきたのでissue→pull requestの流れで進めています。
CI
その1 (rust.yml)
ここでやっているのはrustfmt, clippy, test, そしてgrcovの4つです。grcovについては私が先日書いた記事を参照してください。
その2 (release.yml)
v*.*.*
にマッチするtagがpushされたらreleaseを出すやつです。taiki-e/create-gh-release-actionはJichouPさんから教えていただきました🙏
いつからかは知りませんが、GitHub Actionsワークフローがリポジトリに書き込みをする場合は相応の権限を与えないといけなくなったようですね。最初のCI実行がコケたのは↓の2行を書いていなかったことが原因でした。
permissions:
contents: write
「hogehogeにリクエストしたら403だったよー」みたいなエラーが出ていたらこの辺を疑うといいでしょう。
詳しくは後述しますが、cargo publish
はこのCIで行なっていません。
リリース
- CHANGELOGを書く
- Cargo.tomlのバージョンを上げる
- 確認
- コミット(メッセージはなんでもいい)
git tag v*.*.*
でタグ付け- 確認
git push --tags
私はこれでやってます。ちなみにmainブランチです。release用にブランチ切るやつはよくわかっていないのでやってません。(CHANGELOGいじるタイミングがわからない)
GitHubにリリースするのはこれで完了です。あとはCIがやってくれます。
push後に誤りに気づいた場合はgit tag -d v*.*.*
でローカルのタグを消してからgit push --tags
で反映させます。tagが消えるとreleaseも自動的に消えるようです。
バージョンどうしよう
とりあえずSemantic Versioning 2.0.0 | Semantic Versioningを読みましょう。Summaryには以下のように書かれています。(拙訳)
- メジャーバージョンは非互換なAPI変更の時
- マイナーバージョンは後方互換性を保った機能追加の時
- パッチバージョンは後方互換性を保ったバグ修正
今のところ私は破壊的変更を行なっていない(はず)なのでメジャーバージョンは0になっています。
追記
https://semver.org/#spec-item-4 に次のような記述があります。
Major version zero (0.y.z) is for initial development. Anything MAY change at any time. The public API SHOULD NOT be considered stable.
即ち、メジャーバージョンが0の場合はどのような変更も許容されるようです。ではメジャーバージョンが1になるとはどういうことかというと、上記引用に続いて次のような記述があります。
Version 1.0.0 defines the public API. The way in which the version number is incremented after this release is dependent on this public API and how it changes.
パッチバージョンですが、バグ修正だけでなく軽微なリファクタリングも含んでいいと私は思います。
crates.ioに公開
cargo publish
でcrates.ioにライブラリが公開されます。詳細は↓
ここで重要なのは、公開したライブラリは取り消せないことです。大事なことなのでもう2回言います。
公開したライブラリは取り消せません
公開したライブラリは取り消せません
そのため、公開する前には念入りにチェックを行う必要があります。↓は私が最近になって定着してきたチェックリストです。
- ビルド、テストは通るか
- exampleは想定通りに動くか
- CHANGELOG, Cargo.toml, その他のバージョンは上がっているか
公開後にバグが見つかったら
cargo yank
しましょう。
- cargo yank - The Cargo Book
- Crates.ioにクレートを公開する - The Rust Programming Language 日本語版 #cargo yankでCrates.ioからバージョンを削除する
crates.ioのバージョン管理ページ(https://crates.io/crates/your-library-name/versions
)からでもyankすることができます。
私はバグが原因でv0.1.0とv0.2.0をyankしました。できる限りyankは避けたいですね。
バッジ
画像のURLはhttps://img.shields.io/crates/v/your-library-name.svg
です。[![](https://img.shields.io/crates/v/your-library-name.svg)](https://crates.io/crates/your-library-name)
のようにしてREADMEに貼りましょう。
CIのバッジ、さらにCodecovのものも合わせるととても†それっぽい†ものが出来上がります。
おわり
このライブラリで開発されたBOTはまだ見当たらないので、そのうち作りたいなと思ってます。