From 4ac364a769a362ac56cf0f745b0abc3f146878b9 Mon Sep 17 00:00:00 2001 From: wgqqqqq <1120619671@qq.com> Date: Wed, 11 Feb 2026 17:34:16 +0800 Subject: [PATCH 1/2] ci: add Release Please, CI checks, nightly builds and unify version management - Unify version across all 11 crates using Cargo workspace.package.version as the single source of truth (all crates now use version.workspace = true) - Remove version field from tauri.conf.json (Tauri 2 falls back to Cargo.toml) - Normalize package.json version to standard semver "0.1.0" - Add CI workflow (ci.yml): rust-lint, rust-test, rust-build-check, frontend-build with concurrency control and cancel-in-progress - Add Release Please workflow + config for automated versioning and changelog generation based on Conventional Commits - Refactor desktop-package.yml to trigger on release:published event instead of manually detecting version changes in tauri.conf.json - Add nightly build workflow: scheduled weekday builds with pre-release publishing Co-authored-by: Cursor --- .github/workflows/ci.yml | 52 +++++ .github/workflows/desktop-package.yml | 82 ++++++-- .github/workflows/nightly.yml | 195 ++++++++++++++++++ .github/workflows/release-please.yml | 39 ++++ .release-please-manifest.json | 3 + Cargo.toml | 7 +- package.json | 2 +- release-please-config.json | 28 +++ src/apps/cli/Cargo.toml | 6 +- src/apps/desktop/Cargo.toml | 6 +- src/apps/desktop/tauri.conf.json | 1 - src/apps/server/Cargo.toml | 6 +- src/crates/api-layer/Cargo.toml | 6 +- src/crates/core/Cargo.toml | 6 +- .../implementations/tool-runtime/Cargo.toml | 4 +- .../ai/ai_stream_handlers/Cargo.toml | 4 +- .../core/src/service/terminal/Cargo.toml | 6 +- src/crates/events/Cargo.toml | 4 +- src/crates/transport/Cargo.toml | 6 +- 19 files changed, 413 insertions(+), 50 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/nightly.yml create mode 100644 .github/workflows/release-please.yml create mode 100644 .release-please-manifest.json create mode 100644 release-please-config.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..3738fe33 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,52 @@ +name: CI + +on: + pull_request: + branches: [main] + push: + branches: [main] + +# Cancel previous runs on same branch/PR +concurrency: + group: ci-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + # ── Rust: build check ───────────────────────────────────────────── + rust-build-check: + name: Rust Build Check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: dtolnay/rust-toolchain@stable + + - uses: swatinem/rust-cache@v2 + with: + shared-key: "ci-check" + + - name: Check compilation + run: cargo check --all-targets + + # ── Frontend: build ──────────────────────────────────────────────── + frontend-build: + name: Frontend Build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build web UI + run: pnpm build:web diff --git a/.github/workflows/desktop-package.yml b/.github/workflows/desktop-package.yml index 0548f063..968f36c8 100644 --- a/.github/workflows/desktop-package.yml +++ b/.github/workflows/desktop-package.yml @@ -1,31 +1,74 @@ name: Desktop Package on: + # Triggered automatically when Release Please publishes a release + release: + types: [published] + # Manual trigger for ad-hoc builds workflow_dispatch: - push: - tags: - - "v*" + inputs: + tag_name: + description: "Tag name to build (e.g. v0.2.0). Leave empty to build from HEAD." + required: false + type: string permissions: contents: write jobs: + # ── Resolve version info ─────────────────────────────────────────── + prepare: + name: Prepare + runs-on: ubuntu-latest + outputs: + version: ${{ steps.meta.outputs.version }} + release_tag: ${{ steps.meta.outputs.release_tag }} + upload_to_release: ${{ steps.meta.outputs.upload_to_release }} + steps: + - uses: actions/checkout@v4 + + - name: Resolve version metadata + id: meta + shell: bash + run: | + set -euo pipefail + + if [[ "${{ github.event_name }}" == "release" ]]; then + TAG="${{ github.event.release.tag_name }}" + VERSION="${TAG#v}" + UPLOAD="true" + elif [[ -n "${{ inputs.tag_name }}" ]]; then + TAG="${{ inputs.tag_name }}" + VERSION="${TAG#v}" + UPLOAD="false" + else + VERSION="$(jq -r '.version' package.json)" + TAG="v${VERSION}" + UPLOAD="false" + fi + + echo "version=$VERSION" >> "$GITHUB_OUTPUT" + echo "release_tag=$TAG" >> "$GITHUB_OUTPUT" + echo "upload_to_release=$UPLOAD" >> "$GITHUB_OUTPUT" + + # ── Build per platform ───────────────────────────────────────────── package: name: Package (${{ matrix.platform.name }}) runs-on: ${{ matrix.platform.os }} + needs: prepare strategy: fail-fast: false matrix: platform: - - os: macos-15-intel - name: macos-x64 - target: x86_64-apple-darwin - build_command: pnpm desktop:build:x86_64 - os: macos-15 name: macos-arm64 target: aarch64-apple-darwin build_command: pnpm build:web && cd src/apps/desktop && pnpm tauri build --target aarch64-apple-darwin --bundles dmg + - os: macos-15-intel + name: macos-x64 + target: x86_64-apple-darwin + build_command: pnpm desktop:build:x86_64 - os: windows-latest name: windows-x64 target: x86_64-pc-windows-msvc @@ -34,6 +77,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + with: + ref: ${{ needs.prepare.outputs.release_tag }} - name: Setup pnpm uses: pnpm/action-setup@v4 @@ -52,8 +97,7 @@ jobs: - name: Cache Rust build uses: swatinem/rust-cache@v2 with: - workspaces: | - . -> target + shared-key: "package-${{ matrix.platform.name }}" - name: Install dependencies run: pnpm install --frozen-lockfile @@ -64,24 +108,25 @@ jobs: - name: Upload bundles uses: actions/upload-artifact@v4 with: - name: bitfun-${{ matrix.platform.name }}-bundle + name: bitfun-${{ needs.prepare.outputs.release_tag }}-${{ matrix.platform.name }}-bundle if-no-files-found: error path: | target/*/release/bundle target/release/bundle src/apps/desktop/target/release/bundle - release: - name: Create GitHub Release - if: startsWith(github.ref, 'refs/tags/v') - needs: package + # ── Upload assets to GitHub Release ──────────────────────────────── + upload-release-assets: + name: Upload Release Assets + needs: [prepare, package] + if: needs.prepare.outputs.upload_to_release == 'true' runs-on: ubuntu-latest steps: - name: Download bundled artifacts uses: actions/download-artifact@v4 with: - pattern: bitfun-*-bundle + pattern: bitfun-${{ needs.prepare.outputs.release_tag }}-*-bundle path: release-assets merge-multiple: true @@ -90,14 +135,11 @@ jobs: echo "Release assets:" find release-assets -type f | sort - - name: Publish release + - name: Upload to release uses: softprops/action-gh-release@v2 with: - tag_name: ${{ github.ref_name }} - name: ${{ github.ref_name }} - generate_release_notes: true + tag_name: ${{ needs.prepare.outputs.release_tag }} files: | release-assets/**/*.dmg release-assets/**/*setup.exe - overwrite_files: true fail_on_unmatched_files: true diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml new file mode 100644 index 00000000..92067f54 --- /dev/null +++ b/.github/workflows/nightly.yml @@ -0,0 +1,195 @@ +name: Nightly Build + +on: + schedule: + # Weekdays at 02:00 UTC + - cron: "0 2 * * 1-5" + workflow_dispatch: + +permissions: + contents: write + +concurrency: + group: nightly + cancel-in-progress: true + +env: + NIGHTLY_TAG: nightly + +jobs: + # ── Check if there are new commits since last nightly ────────────── + check-changes: + name: Check for Changes + runs-on: ubuntu-latest + outputs: + should_build: ${{ steps.check.outputs.should_build }} + nightly_version: ${{ steps.check.outputs.nightly_version }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Check for recent changes + id: check + shell: bash + run: | + set -euo pipefail + + BASE_VERSION="$(jq -r '.version' package.json)" + DATE_SUFFIX="$(date -u '+%Y%m%d')" + SHORT_SHA="$(git rev-parse --short HEAD)" + NIGHTLY_VERSION="${BASE_VERSION}-nightly.${DATE_SUFFIX}+${SHORT_SHA}" + + echo "nightly_version=$NIGHTLY_VERSION" >> "$GITHUB_OUTPUT" + + if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then + echo "should_build=true" >> "$GITHUB_OUTPUT" + exit 0 + fi + + # Check if any commits landed in the last 25 hours + LAST_COMMIT_TIME="$(git log -1 --format='%ct')" + NOW="$(date -u '+%s')" + HOURS_AGO=$(( (NOW - LAST_COMMIT_TIME) / 3600 )) + + if [[ "$HOURS_AGO" -lt 25 ]]; then + echo "should_build=true" >> "$GITHUB_OUTPUT" + else + echo "No new commits in the last 25 hours, skipping nightly build." + echo "should_build=false" >> "$GITHUB_OUTPUT" + fi + + # ── Patch version for nightly ────────────────────────────────────── + package: + name: Package (${{ matrix.platform.name }}) + runs-on: ${{ matrix.platform.os }} + needs: check-changes + if: needs.check-changes.outputs.should_build == 'true' + + strategy: + fail-fast: false + matrix: + platform: + - os: macos-15 + name: macos-arm64 + target: aarch64-apple-darwin + build_command: pnpm build:web && cd src/apps/desktop && pnpm tauri build --target aarch64-apple-darwin --bundles dmg + - os: macos-15-intel + name: macos-x64 + target: x86_64-apple-darwin + build_command: pnpm desktop:build:x86_64 + - os: windows-latest + name: windows-x64 + target: x86_64-pc-windows-msvc + build_command: pnpm desktop:build:nsis + + steps: + - uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + + - name: Setup Rust toolchain + uses: dtolnay/rust-toolchain@stable + with: + targets: ${{ matrix.platform.target }} + + - name: Cache Rust build + uses: swatinem/rust-cache@v2 + with: + shared-key: "nightly-${{ matrix.platform.name }}" + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Patch nightly version + shell: bash + env: + NIGHTLY_VERSION: ${{ needs.check-changes.outputs.nightly_version }} + run: | + set -euo pipefail + + echo "Patching version to $NIGHTLY_VERSION" + + # Patch package.json + node -e " + const fs = require('fs'); + const pkg = JSON.parse(fs.readFileSync('package.json', 'utf-8')); + pkg.version = process.env.NIGHTLY_VERSION.split('+')[0]; + fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2) + '\n'); + " + + # Patch Cargo workspace version (semver: nightly suffix uses hyphen) + # Cargo.toml only accepts: MAJOR.MINOR.PATCH or MAJOR.MINOR.PATCH-PRE + CARGO_VERSION="$(echo "$NIGHTLY_VERSION" | sed 's/+.*//')" + sed -i.bak "s/^version = \".*\" # x-release-please-version/version = \"${CARGO_VERSION}\" # x-release-please-version/" Cargo.toml + rm -f Cargo.toml.bak + + echo "package.json version: $(jq -r '.version' package.json)" + echo "Cargo.toml version: $(grep 'x-release-please-version' Cargo.toml)" + + - name: Build desktop app + run: ${{ matrix.platform.build_command }} + + - name: Upload bundles + uses: actions/upload-artifact@v4 + with: + name: bitfun-nightly-${{ matrix.platform.name }}-bundle + if-no-files-found: error + retention-days: 7 + path: | + target/*/release/bundle + target/release/bundle + src/apps/desktop/target/release/bundle + + # ── Publish nightly pre-release ──────────────────────────────────── + publish-nightly: + name: Publish Nightly + needs: [check-changes, package] + if: needs.check-changes.outputs.should_build == 'true' + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Download bundled artifacts + uses: actions/download-artifact@v4 + with: + pattern: bitfun-nightly-*-bundle + path: release-assets + merge-multiple: true + + - name: List release assets + run: | + echo "Nightly assets:" + find release-assets -type f | sort + + - name: Delete previous nightly release + env: + GH_TOKEN: ${{ github.token }} + run: | + gh release delete "${{ env.NIGHTLY_TAG }}" --yes --cleanup-tag 2>/dev/null || true + + - name: Create nightly release + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ env.NIGHTLY_TAG }} + name: "Nightly Build (${{ needs.check-changes.outputs.nightly_version }})" + body: | + Automated nightly build from `main` branch. + + **Version**: `${{ needs.check-changes.outputs.nightly_version }}` + **Commit**: ${{ github.sha }} + **Date**: ${{ github.event.head_commit.timestamp || github.event.repository.updated_at }} + + > **Warning**: Nightly builds are untested and may be unstable. + prerelease: true + files: | + release-assets/**/*.dmg + release-assets/**/*setup.exe diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml new file mode 100644 index 00000000..876e84f8 --- /dev/null +++ b/.github/workflows/release-please.yml @@ -0,0 +1,39 @@ +name: Release Please + +on: + push: + branches: [main] + +permissions: + contents: write + pull-requests: write + +jobs: + release-please: + name: Release Please + runs-on: ubuntu-latest + outputs: + release_created: ${{ steps.release.outputs.release_created }} + tag_name: ${{ steps.release.outputs.tag_name }} + version: ${{ steps.release.outputs.version }} + steps: + - uses: googleapis/release-please-action@v4 + id: release + with: + config-file: release-please-config.json + manifest-file: .release-please-manifest.json + + # When a release is created, trigger the desktop package workflow + trigger-package: + name: Trigger Desktop Package + needs: release-please + if: ${{ needs.release-please.outputs.release_created }} + runs-on: ubuntu-latest + permissions: + actions: write + contents: read + steps: + - name: Log release info + run: | + echo "Release created: ${{ needs.release-please.outputs.tag_name }}" + echo "Version: ${{ needs.release-please.outputs.version }}" diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 00000000..466df71c --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "0.1.0" +} diff --git a/Cargo.toml b/Cargo.toml index 29b5b9bb..93bcffa7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,9 +9,14 @@ members = [ "src/apps/server", ] - resolver = "2" +# Shared package metadata — single source of truth for version +[workspace.package] +version = "0.1.0" # x-release-please-version +authors = ["BitFun Team"] +edition = "2021" + # Shared dependency versions to keep all crates aligned [workspace.dependencies] # Async runtime diff --git a/package.json b/package.json index fd0b2f3a..23c6cd64 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "BitFun", "private": true, - "version": "0.1.0-alpha.1(dev)", + "version": "0.1.0", "type": "module", "scripts": { "copy-monaco": "copyfiles -u 3 \"node_modules/monaco-editor/min/vs/**/*\" src/web-ui/public/monaco-editor", diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 00000000..22eb8617 --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "release-type": "node", + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": true, + "include-component-in-tag": false, + "include-v-in-tag": true, + "changelog-sections": [ + { "type": "feat", "section": "Features" }, + { "type": "fix", "section": "Bug Fixes" }, + { "type": "perf", "section": "Performance Improvements" }, + { "type": "refactor", "section": "Code Refactoring" }, + { "type": "docs", "section": "Documentation" }, + { "type": "test", "section": "Tests" }, + { "type": "ci", "section": "CI/CD" }, + { "type": "chore", "section": "Miscellaneous", "hidden": true } + ], + "packages": { + ".": { + "extra-files": [ + { + "type": "generic", + "path": "Cargo.toml" + } + ] + } + } +} diff --git a/src/apps/cli/Cargo.toml b/src/apps/cli/Cargo.toml index 1489cc40..4106f016 100644 --- a/src/apps/cli/Cargo.toml +++ b/src/apps/cli/Cargo.toml @@ -1,9 +1,9 @@ [package] name = "bitfun-cli" -version = "0.1.0" +version.workspace = true +authors.workspace = true +edition.workspace = true description = "BitFun CLI - Terminal User Interface" -authors = ["BitFun Team"] -edition = "2021" [[bin]] name = "bitfun-cli" diff --git a/src/apps/desktop/Cargo.toml b/src/apps/desktop/Cargo.toml index 95a8d97c..ad555b60 100644 --- a/src/apps/desktop/Cargo.toml +++ b/src/apps/desktop/Cargo.toml @@ -1,9 +1,9 @@ [package] name = "bitfun-desktop" -version = "0.1.0" +version.workspace = true +authors.workspace = true +edition.workspace = true description = "BitFun Desktop Application (Tauri)" -authors = ["BitFun Team"] -edition = "2021" [lib] name = "bitfun_desktop_lib" diff --git a/src/apps/desktop/tauri.conf.json b/src/apps/desktop/tauri.conf.json index 0e2d0770..c5cd59db 100644 --- a/src/apps/desktop/tauri.conf.json +++ b/src/apps/desktop/tauri.conf.json @@ -1,7 +1,6 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "BitFun", - "version": "0.1.0", "identifier": "com.bitfun.desktop", "build": { "beforeDevCommand": "npm run dev:web", diff --git a/src/apps/server/Cargo.toml b/src/apps/server/Cargo.toml index cc80f0dc..e6b52cbc 100644 --- a/src/apps/server/Cargo.toml +++ b/src/apps/server/Cargo.toml @@ -1,9 +1,9 @@ [package] name = "bitfun-server" -version = "0.1.0" +version.workspace = true +authors.workspace = true +edition.workspace = true description = "BitFun Server - Web-based AI Code Assistant" -authors = ["BitFun Team"] -edition = "2021" [[bin]] name = "bitfun-server" diff --git a/src/crates/api-layer/Cargo.toml b/src/crates/api-layer/Cargo.toml index 32978c85..5ae31a25 100644 --- a/src/crates/api-layer/Cargo.toml +++ b/src/crates/api-layer/Cargo.toml @@ -1,9 +1,9 @@ [package] name = "bitfun-api-layer" -version = "0.1.0" +version.workspace = true +authors.workspace = true +edition.workspace = true description = "BitFun API Layer - Platform-agnostic business handlers" -authors = ["BitFun Team"] -edition = "2021" [lib] name = "bitfun_api_layer" diff --git a/src/crates/core/Cargo.toml b/src/crates/core/Cargo.toml index dc67c8ae..1521ea88 100644 --- a/src/crates/core/Cargo.toml +++ b/src/crates/core/Cargo.toml @@ -1,9 +1,9 @@ [package] name = "bitfun-core" -version = "0.1.0" +version.workspace = true +authors.workspace = true +edition.workspace = true description = "BitFun Core Library - Platform-agnostic business logic" -authors = ["BitFun Team"] -edition = "2021" [lib] name = "bitfun_core" diff --git a/src/crates/core/src/agentic/tools/implementations/tool-runtime/Cargo.toml b/src/crates/core/src/agentic/tools/implementations/tool-runtime/Cargo.toml index 2083af83..d4aa880b 100644 --- a/src/crates/core/src/agentic/tools/implementations/tool-runtime/Cargo.toml +++ b/src/crates/core/src/agentic/tools/implementations/tool-runtime/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "tool-runtime" -version = "0.1.0" -edition = "2021" +version.workspace = true +edition.workspace = true [dependencies] globset = { workspace = true } diff --git a/src/crates/core/src/infrastructure/ai/ai_stream_handlers/Cargo.toml b/src/crates/core/src/infrastructure/ai/ai_stream_handlers/Cargo.toml index d31d01ca..fd58fc03 100644 --- a/src/crates/core/src/infrastructure/ai/ai_stream_handlers/Cargo.toml +++ b/src/crates/core/src/infrastructure/ai/ai_stream_handlers/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ai_stream_handlers" -version = "0.1.0" -edition = "2021" +version.workspace = true +edition.workspace = true [dependencies] anyhow = { workspace = true } diff --git a/src/crates/core/src/service/terminal/Cargo.toml b/src/crates/core/src/service/terminal/Cargo.toml index e6b1f8de..b2e3bb74 100644 --- a/src/crates/core/src/service/terminal/Cargo.toml +++ b/src/crates/core/src/service/terminal/Cargo.toml @@ -1,9 +1,9 @@ [package] name = "terminal-core" -version = "0.1.0" -edition = "2021" +version.workspace = true +authors.workspace = true +edition.workspace = true description = "A standalone terminal module" -authors = ["BitFun Team"] [lib] name = "terminal_core" diff --git a/src/crates/events/Cargo.toml b/src/crates/events/Cargo.toml index 5d3aed4a..4182158c 100644 --- a/src/crates/events/Cargo.toml +++ b/src/crates/events/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "bitfun-events" -version = "0.1.0" -edition = "2021" +version.workspace = true +edition.workspace = true [dependencies] async-trait = { workspace = true } diff --git a/src/crates/transport/Cargo.toml b/src/crates/transport/Cargo.toml index 71fde85c..c7cff370 100644 --- a/src/crates/transport/Cargo.toml +++ b/src/crates/transport/Cargo.toml @@ -1,9 +1,9 @@ [package] name = "bitfun-transport" -version = "0.1.0" +version.workspace = true +authors.workspace = true +edition.workspace = true description = "BitFun Transport Layer - Cross-platform communication adapters" -authors = ["BitFun Team"] -edition = "2021" [lib] name = "bitfun_transport" From 0ba48341946d2a5a03ee5820d84026dc38f0f51a Mon Sep 17 00:00:00 2001 From: wgqqqqq <1120619671@qq.com> Date: Wed, 11 Feb 2026 22:16:14 +0800 Subject: [PATCH 2/2] ci: install linux deps for tauri/glib --- .github/workflows/ci.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3738fe33..0064b99e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,6 +22,30 @@ jobs: steps: - uses: actions/checkout@v4 + - name: Install Linux system dependencies (Tauri) + run: | + sudo apt-get update + if apt-cache show libwebkit2gtk-4.1-dev >/dev/null 2>&1; then + WEBKIT_PKG=libwebkit2gtk-4.1-dev + else + WEBKIT_PKG=libwebkit2gtk-4.0-dev + fi + + if apt-cache show libappindicator3-dev >/dev/null 2>&1; then + APPINDICATOR_PKG=libappindicator3-dev + else + APPINDICATOR_PKG=libayatana-appindicator3-dev + fi + + sudo apt-get install -y --no-install-recommends \ + pkg-config \ + libglib2.0-dev \ + libgtk-3-dev \ + "$WEBKIT_PKG" \ + "$APPINDICATOR_PKG" \ + librsvg2-dev \ + patchelf + - uses: dtolnay/rust-toolchain@stable - uses: swatinem/rust-cache@v2