日本の山岳一覧・百名山 API を開発しましたCLICK !

Rust 製 CLI ツールを Github Actions で crates.io に cargo publish する

Automate Rust CLI publishing with GitHub Actions
  • URLをコピーしました!

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 で自動化しちゃいましょう!

参考

Automate Rust CLI publishing with GitHub Actions

この記事が気に入ったら
フォローしてね!

  • URLをコピーしました!

コメント

コメントする

目次