2023/11/25
はじめに
今まで、気が向くたびにOSS開発をして、飽きたらプライベートプロジェクトを開発する。といったように気まぐれに個人開発を進めている。
そんな私が現時点で到達したプロジェクト管理の設定について、簡単な考察とともにまとめておく。
機能の考察
単体テストを書いても、結局ローカルで手動で行っている限りはテスト実行忘れをし、いつしかコードとテストが乖離して手の施しようがない状態になることがたまにあると思う。そこで、「コード更新時の自動テスト」は導入したい。
また、Publish (e.g. npm publish
, cargo publish
)もローカル実行を避けてクリーンな環境で実行したい。
個人プロジェクトではフランクにmain
にpushすることが多いと思うので、毎pushごとにpublishはしないのが利便性が高いと考えている。
そこで、実行タイミングはUI上での管理が可能な「releaseが作られたとき」がいいと思う。
Workflows for Rust
code updated
push
(or pull_request
)の時にTestが走る。このTestに関連して、Build, Format, Lintも成功を必須にするのがリポジトリの管理を簡単にする工夫と言える。
pull_request
を含めているのは、OSSの性質上、他の開発者がプルリクを出してくれた時にTestを意識してもらうための管理コスト低減のためである。
実行時間の短縮のために依存はキャッシュ設定しておこう。
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 created
releaseが作成されるとそのバージョンでのコードをレジストリに公開する。
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/Actions
のNew repository secret
で登録する。
Name
はどんな値でもいいが、きちんとWorkflowの secrets.<SECRET_NAME>
の<SECRET_NAME>
と一致させる必要がある。
おわりに
この設定によって、コード品質の維持がしやすくなり、OSSの開発が捗りますね!