mocks というモック用の API を起動できる CLI ツールを crates.io で公開しています。
今回は、GitHub Actions を使って自動化された crates.io 公開ワークフローを構築する方法を紹介します。
GitHub Actions で crates.io に公開する
What is mocks?
mocks については、以下の記事で紹介しています。興味がある方はぜひ見ていってください!

なお、crates.io で公開された mocks は https://crates.io/crates/mocks で確認できます。
Cargo.toml の設定
公開前の事前準備として、crates.io で公開するために必要なメタデータを Cargo.toml
に設定します。
必要になってくる項目は以下です。
[package]
name = "mocks"
version = "1.0.3"
edition = "2021"
authors = ["codemountains <codemountains@gmail.com>"]
description = "Mock REST APIs from JSON with zero coding within seconds."
homepage = "https://github.com/mocks-rs/mocks"
repository = "https://github.com/mocks-rs/mocks"
documentation = "https://mocks-rs.github.io/mocks"
readme = "README.md"
license = "MIT"
rust-version = "1.80.1"
GitHub Secrets の設定
crates.io にクレートを公開するためには、API トークンが必要です。
crates.io にログインし、Account Settings の API Tokens からトークンを生成します。
次に、GitHub リポジトリの Settings → Secrets and variables → Actions で CRATES_TOKEN
を設定します。
Github Actions のワークフローを定義する
再利用可能な Rust セットアップアクションを作成する
今回は crates.io への公開がメインですが、Github Actions でテストを実行するなど、他にもワークフローが組まれることが多いかと思います。
そこで、共通の Rust セットアップ処理を再利用可能なアクションとして分離します。
テストは test-and-lint.yml で定義しているので、良ければ確認してみてください。
name: 'Setup Rust'
description: 'Setup Rust toolchain with caching'
inputs:
toolchain:
description: 'Rust toolchain to install'
required: false
default: 'stable'
targets:
description: 'Additional targets to install'
required: false
default: ''
components:
description: 'Additional components to install'
required: false
default: ''
cache-key:
description: 'Additional cache key suffix'
required: false
default: ''
runs:
using: 'composite'
steps:
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
toolchain: ${{ inputs.toolchain }}
targets: ${{ inputs.targets }}
components: ${{ inputs.components }}
- name: Cache Rust dependencies
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ inputs.toolchain }}-${{ inputs.cache-key }}-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-${{ inputs.toolchain }}-${{ inputs.cache-key }}-
${{ runner.os }}-cargo-${{ inputs.toolchain }}-
${{ runner.os }}-cargo-
Github Actions で cargo publish する
行っていることは簡単で、Rust 環境、つまり cargo が使える環境を作成して、cargo publish
を実行しているだけです。
作成したワークフローのポイントは以下です。
- 手動実行と他のワークフローから呼び出すトリガーに対応
- ドライラン実行に対応
name: Publish to crates.io
on:
workflow_call:
inputs:
version:
description: 'Version to publish (e.g., 1.0.0)'
required: true
type: string
dry_run:
description: 'Dry run (do not actually publish)'
required: false
default: false
type: boolean
workflow_dispatch:
inputs:
version:
description: 'Version to publish (e.g., 1.0.0)'
required: true
type: string
dry_run:
description: 'Dry run (do not actually publish)'
required: false
default: false
type: boolean
permissions:
contents: read
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Rust
uses: ./.github/actions/setup-rust
with:
components: ''
- name: Dry run publish to crates.io
if: github.event.inputs.dry_run == 'true' || inputs.dry_run == true
run: cargo publish --dry-run --token ${{ secrets.CRATES_TOKEN }}
env:
CRATES_TOKEN: ${{ secrets.CRATES_TOKEN }}
- name: Publish to crates.io
if: github.event.inputs.dry_run == 'false' || inputs.dry_run == false
run: cargo publish --token ${{ secrets.CRATES_TOKEN }}
env:
CRATES_TOKEN: ${{ secrets.CRATES_TOKEN }}
Cargo.toml で定義したバージョンと公開済みのバージョンが同じ場合はエラーになります。
mocks のワークフローでは release.yml でバージョンチェックを行った後に、バージョン変更があれば publish-to-cratesio.yml を呼び出しています。
まとめ
GitHub Actions を使用することで、Rust で実装したツールの crates.io 公開・配布を自動化できます。
crates.io への公開作業自体は簡単ですが、毎回自分で実行するのは面倒なので、ぜひ Github Actions で自動化しちゃいましょう!
コメント