ys memos

Blog

GitHubで個人OSSのCICD設定の考察とRustにおける例


github

2023/11/25


今まで、気が向くたびにOSS開発をして、飽きたらプライベートプロジェクトを開発する。といったように気まぐれに個人開発を進めている。

そんな私が現時点で到達したプロジェクト管理の設定について、簡単な考察とともにまとめておく。


単体テストを書いても、結局ローカルで手動で行っている限りはテスト実行忘れをし、いつしかコードとテストが乖離して手の施しようがない状態になることがたまにあると思う。そこで、「コード更新時の自動テスト」は導入したい。

また、Publish (e.g. npm publish, cargo publish)もローカル実行を避けてクリーンな環境で実行したい。 個人プロジェクトではフランクにmainにpushすることが多いと思うので、毎pushごとにpublishはしないのが利便性が高いと考えている。 そこで、実行タイミングはUI上での管理が可能な「releaseが作られたとき」がいいと思う。



push (or pull_request)の時にTestが走る。このTestに関連して、Build, Format, Lintも成功を必須にするのがリポジトリの管理を簡単にする工夫と言える。

pull_requestを含めているのは、OSSの性質上、他の開発者がプルリクを出してくれた時にTestを意識してもらうための管理コスト低減のためである。

実行時間の短縮のために依存はキャッシュ設定しておこう。

.github/workflows/rust-ci.yml
name: Rust CI

on:
  push:
    branches: ['main']
  pull_request:
    branches: ['main']

env:
  CARGO_TERM_COLOR: always

jobs:
  ci:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          components: rustfmt, clippy

      - name: Cache cargo dependencies
        uses: actions/cache@v3
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml') }}

      - name: Build
        run: cargo build --verbose

      - name: Test
        run: cargo test --verbose

      - name: Check Formatting
        run: cargo fmt -- --check

      - name: Check Linting
        run: cargo clippy --all-targets --all-features -- -D warnings

releaseが作成されるとそのバージョンでのコードをレジストリに公開する。

.github/workflows/rust-cd.yml
name: Rust CD

on:
  release:
    types: [created]

env:
  CARGO_TERM_COLOR: always

jobs:
  cd:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable

      - name: Cache cargo dependencies
        uses: actions/cache@v3
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml') }}

      - name: Test
        run: cargo test --verbose

      - name: Publish
        run: cargo publish
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_TOKEN }}

Workflowのコードはリポジトリで見ることが可能なので、TOKENなどのシークレットはハードコードしてはいけない。

GitHubのリポジトリのSettings/Secrets and variables/ActionsNew repository secretで登録する。

Nameはどんな値でもいいが、きちんとWorkflowの secrets.<SECRET_NAME><SECRET_NAME>と一致させる必要がある。


この設定によって、コード品質の維持がしやすくなり、OSSの開発が捗りますね!


関連タグを探す