name: CI
on:
push:
branches: [main, master]
pull_request:
branches: [main, master]
env:
CARGO_TERM_COLOR: always
jobs:
test:
name: Test
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
steps:
- uses: actions/checkout@v4
- name: Install Linux dependencies
if: matrix.os == 'ubuntu-latest'
run: |
sudo apt-get update
sudo apt-get install -y libglib2.0-dev libgtk-3-dev libwebkit2gtk-4.1-dev libjavascriptcoregtk-4.1-dev libsoup-3.0-dev libayatana-appindicator3-dev libxdo-dev
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- name: Run tests
run: cargo test --all-features
lint:
name: Clippy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Linux dependencies
run: |
sudo apt-get update
sudo apt-get install -y libglib2.0-dev libgtk-3-dev libwebkit2gtk-4.1-dev libjavascriptcoregtk-4.1-dev libsoup-3.0-dev libayatana-appindicator3-dev libxdo-dev
- uses: dtolnay/rust-toolchain@stable
with:
components: clippy
- uses: Swatinem/rust-cache@v2
- name: Run clippy
run: cargo clippy --all-targets --all-features -- -D warnings
format:
name: Format
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt
- name: Check formatting
run: cargo fmt --check
doc:
name: Documentation
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Linux dependencies
run: |
sudo apt-get update
sudo apt-get install -y libglib2.0-dev libgtk-3-dev libwebkit2gtk-4.1-dev libjavascriptcoregtk-4.1-dev libsoup-3.0-dev libayatana-appindicator3-dev libxdo-dev
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- name: Check documentation
env:
RUSTDOCFLAGS: -D warnings
run: cargo doc --no-deps --all-features
publish-dry-run:
name: Publish Dry Run
runs-on: ubuntu-latest
needs: [test, lint, format, doc]
if: github.event_name == 'pull_request'
steps:
- uses: actions/checkout@v4
- name: Install Linux dependencies
run: |
sudo apt-get update
sudo apt-get install -y libglib2.0-dev libgtk-3-dev libwebkit2gtk-4.1-dev libjavascriptcoregtk-4.1-dev libsoup-3.0-dev libayatana-appindicator3-dev libxdo-dev
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- name: Dry run publish
run: cargo publish --dry-run --allow-dirty
publish:
name: Publish to crates.io
runs-on: ubuntu-latest
needs: [test, lint, format, doc]
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- name: Install Linux dependencies
run: |
sudo apt-get update
sudo apt-get install -y libglib2.0-dev libgtk-3-dev libwebkit2gtk-4.1-dev libjavascriptcoregtk-4.1-dev libsoup-3.0-dev libayatana-appindicator3-dev libxdo-dev
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- name: Extract local version
id: local_version
run: |
VERSION=$(grep '^version' Cargo.toml | head -1 | sed 's/.*= *"\(.*\)".*/\1/')
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "Local version: $VERSION"
- name: Fetch latest crates.io version
id: crates_io_version
run: |
CRATES_IO_VERSION=$(curl -s https://crates.io/api/v1/crates/dioxus-three | jq -r '.crate.max_version')
echo "version=$CRATES_IO_VERSION" >> $GITHUB_OUTPUT
echo "Crates.io version: $CRATES_IO_VERSION"
- name: Check if version should be published
id: version_check
run: |
LOCAL="${{ steps.local_version.outputs.version }}"
CRATES="${{ steps.crates_io_version.outputs.version }}"
if [ "$LOCAL" != "$CRATES" ]; then
echo "should_publish=true" >> $GITHUB_OUTPUT
echo "đĻ Version bumped: $CRATES -> $LOCAL"
else
echo "should_publish=false" >> $GITHUB_OUTPUT
echo "âšī¸ No version bump. Current: $LOCAL"
fi
- name: Publish to crates.io
if: steps.version_check.outputs.should_publish == 'true'
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
run: |
echo "đ Publishing dioxus-three v${{ steps.local_version.outputs.version }}..."
cargo publish --token "$CARGO_REGISTRY_TOKEN"
echo "â
Published successfully!"
- name: Create Git tag
if: steps.version_check.outputs.should_publish == 'true'
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
TAG="v${{ steps.local_version.outputs.version }}"
git tag -a "$TAG" -m "Release $TAG"
git push origin "$TAG"
echo "đˇī¸ Created and pushed tag $TAG"
- name: Create GitHub Release
if: steps.version_check.outputs.should_publish == 'true'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
TAG="v${{ steps.local_version.outputs.version }}"
gh release create "$TAG" \
--title "$TAG" \
--generate-notes
echo "đ Created GitHub Release $TAG"