feature image

2023年3月28日 | ブログ記事

Rustでライブラリを作った

この記事は新歓ブログリレー202320日目です。

TL; DR

リポジトリです。

GitHub - H1rono/traq-bot-http-rs: traQ BOTのHTTPリクエストパーサー
traQ BOTのHTTPリクエストパーサー. Contribute to H1rono/traq-bot-http-rs development by creating an account on GitHub.

そして、こちらがcrates.ioに公開しているライブラリです。

https://crates.io/crates/traq-bot-http

なんですかこれは

部内SNSのtraQではBOTを導入することができます。昨日のブログリレーでもBOTに関する記事がありましたね。

22BによるtraQ bot制作ブームについて
これはtraP 新歓ブログリレー2023 19日目の記事です。 22Bの @ikura-hamuです。SysAd班に所属して部内サービスの開発・メンテナンスをしたり、ゲーム班に所属してゲームを作ったりしています。 traQって何? traPには、SysAd班が運用しているSNS「traQ」があります。このサービスはtraPのオンライン上の部室となることを目的として作られており、部員たちは日々このSNS上で会話をしています。traQについての記事はこちらをご覧ください。 traQ - 東京工業大学デジタル創作同好会traP『デジタル創作同好会traP』は、東京工業大学で活動するデジタル創作…

このように活発に開発されているBOT開発をやりやすくするために、このライブラリは作成されました。開発にあたって、traP公式に提供されているtraQ BOT用のGoライブラリを参考にしました。

GitHub - traPtitech/traq-bot: traQ BOT用Goライブラリ
traQ BOT用Goライブラリ. Contribute to traPtitech/traq-bot development by creating an account on GitHub.

ここでは、開発過程で得たちょっとしたノウハウをつらつら書いていこうと思います。

リポジトリ作成

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)

Rust

ここでやっているのはrustfmt, clippy, test, そしてgrcovの4つです。grcovについては私が先日書いた記事を参照してください。

code_coverage.rs
この記事は新歓ブログリレー2023の10日目です。 何をするんですか? RustでCode Coverageをとります。Rustとは何か、Code Coverageとは何かについての説明は省略します。 Requirements まずは必要なツールたちをインストールしましょう。 $ rustup component add llvm-tools $ cargo install grcov cargo installは1日かかる(かからない)のでその間に次に進むことをお勧めします。 どうやってるの? ここでの説明はほとんどInstrumentation-based Code Coverag…

その2 (release.yml)

Release

v*.*.*にマッチするtagがpushされたらreleaseを出すやつです。taiki-e/create-gh-release-actionJichouPさんから教えていただきました🙏

いつからかは知りませんが、GitHub Actionsワークフローがリポジトリに書き込みをする場合は相応の権限を与えないといけなくなったようですね。最初のCI実行がコケたのは↓の2行を書いていなかったことが原因でした。

permissions:
  contents: write

「hogehogeにリクエストしたら403だったよー」みたいなエラーが出ていたらこの辺を疑うといいでしょう。

詳しくは後述しますが、cargo publishはこのCIで行なっていません

リリース

  1. CHANGELOGを書く
  2. Cargo.tomlのバージョンを上げる
  3. 確認
  4. コミット(メッセージはなんでもいい)
  5. git tag v*.*.*でタグ付け
  6. 確認
  7. 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には以下のように書かれています。(拙訳)

今のところ私は破壊的変更を行なっていない(はず)なのでメジャーバージョンは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 publishcrates.ioにライブラリが公開されます。詳細は↓

ここで重要なのは、公開したライブラリは取り消せないことです。大事なことなのでもう2回言います。

公開したライブラリは取り消せません

公開したライブラリは取り消せません

そのため、公開する前には念入りにチェックを行う必要があります。↓は私が最近になって定着してきたチェックリストです。

公開後にバグが見つかったら

cargo yankしましょう。

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に貼りましょう。

crate

CIのバッジ、さらにCodecovのものも合わせるととても†それっぽい†ものが出来上がります。

traq-bot-http-rs-1

おわり

このライブラリで開発されたBOTはまだ見当たらないので、そのうち作りたいなと思ってます。

明日の担当は@yashuさんと@mazreanさんです!

H1rono_K icon
この記事を書いた人
H1rono_K

趣味プログラマー(大学生)

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

2023年4月17日
ポケモンを飼いたい夢を叶える
tqk icon tqk
2023年4月25日
【驚愕】作曲4年目だった男が大学3年間ゲームサウンドに関わった末路...【ゲームサウンドのお仕事について】
tenya icon tenya
2023年3月20日
traPグラフィック班の活動紹介(Ver.2023)
NABE icon NABE
2023年4月27日
Vulkanのデバイスドライバを自作してみた
kegra icon kegra
2023年4月25日
15時間でゲームを作った #Oxygenator
Komichi icon Komichi
2022年9月26日
競プロしかシラン人間が web アプリ QK Judge を作った話
tqk icon tqk
記事一覧 タグ一覧 Google アナリティクスについて 特定商取引法に基づく表記