mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-07-04 19:15:33 +08:00
91e00f08d0
This PR contains the following updates: | Package | Update | Change | |---|---|---| | [rustc](https://redirect.github.com/rust-lang/rust) | minor | `1.84.1` -> `1.85.0` | --- ### Release Notes <details> <summary>rust-lang/rust (rustc)</summary> ### [`v1.85.0`](https://redirect.github.com/rust-lang/rust/blob/HEAD/RELEASES.md#Version-1850-2025-02-20) [Compare Source](https://redirect.github.com/rust-lang/rust/compare/1.84.1...1.85.0) \========================== <a id="1.85.0-Language"></a> ## Language - [The 2024 Edition is now stable.](https://redirect.github.com/rust-lang/rust/pull/133349) See [the edition guide](https://doc.rust-lang.org/nightly/edition-guide/rust-2024/index.html) for more details. - [Stabilize async closures](https://redirect.github.com/rust-lang/rust/pull/132706) See [RFC 3668](https://rust-lang.github.io/rfcs/3668-async-closures.html) for more details. - [Stabilize `#[diagnostic::do_not_recommend]`](https://redirect.github.com/rust-lang/rust/pull/132056) - [Add `unpredictable_function_pointer_comparisons` lint to warn against function pointer comparisons](https://redirect.github.com/rust-lang/rust/pull/118833) - [Lint on combining `#[no_mangle]` and `#[export_name]` attributes.](https://redirect.github.com/rust-lang/rust/pull/131558) <a id="1.85.0-Compiler"></a> ## Compiler - [The unstable flag `-Zpolymorphize` has been removed](https://redirect.github.com/rust-lang/rust/pull/133883), see [https://github.com/rust-lang/compiler-team/issues/810](https://redirect.github.com/rust-lang/compiler-team/issues/810) for some background. <a id="1.85.0-Platform-Support"></a> ## Platform Support - [Promote `powerpc64le-unknown-linux-musl` to tier 2 with host tools](https://redirect.github.com/rust-lang/rust/pull/133801) Refer to Rust's \[platform support page]\[platform-support-doc] for more information on Rust's tiered platform support. <a id="1.85.0-Libraries"></a> ## Libraries - [Panics in the standard library now have a leading `library/` in their path](https://redirect.github.com/rust-lang/rust/pull/132390) - [`std::env::home_dir()` on Windows now ignores the non-standard `$HOME` environment variable](https://redirect.github.com/rust-lang/rust/pull/132515) It will be un-deprecated in a subsequent release. - [Add `AsyncFn*` to the prelude in all editions.](https://redirect.github.com/rust-lang/rust/pull/132611) <a id="1.85.0-Stabilized-APIs"></a> ## Stabilized APIs - [`BuildHasherDefault::new`](https://doc.rust-lang.org/stable/std/hash/struct.BuildHasherDefault.html#method.new) - [`ptr::fn_addr_eq`](https://doc.rust-lang.org/std/ptr/fn.fn_addr_eq.html) - [`io::ErrorKind::QuotaExceeded`](https://doc.rust-lang.org/stable/std/io/enum.ErrorKind.html#variant.QuotaExceeded) - [`io::ErrorKind::CrossesDevices`](https://doc.rust-lang.org/stable/std/io/enum.ErrorKind.html#variant.CrossesDevices) - [`{float}::midpoint`](https://doc.rust-lang.org/core/primitive.f32.html#method.midpoint) - [Unsigned `{integer}::midpoint`](https://doc.rust-lang.org/std/primitive.u64.html#method.midpoint) - [`NonZeroU*::midpoint`](https://doc.rust-lang.org/std/num/type.NonZeroU32.html#method.midpoint) - [impl `std::iter::Extend` for tuples with arity 1 through 12](https://doc.rust-lang.org/stable/std/iter/trait.Extend.html#impl-Extend%3C\(A,\)%3E-for-\(EA,\)) - [`FromIterator<(A, ...)>` for tuples with arity 1 through 12](https://doc.rust-lang.org/stable/std/iter/trait.FromIterator.html#impl-FromIterator%3C\(EA,\)%3E-for-\(A,\)) - [`std::task::Waker::noop`](https://doc.rust-lang.org/stable/std/task/struct.Waker.html#method.noop) These APIs are now stable in const contexts: - [`mem::size_of_val`](https://doc.rust-lang.org/stable/std/mem/fn.size_of_val.html) - [`mem::align_of_val`](https://doc.rust-lang.org/stable/std/mem/fn.align_of_val.html) - [`Layout::for_value`](https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.for_value) - [`Layout::align_to`](https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.align_to) - [`Layout::pad_to_align`](https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.pad_to_align) - [`Layout::extend`](https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.extend) - [`Layout::array`](https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.array) - [`std::mem::swap`](https://doc.rust-lang.org/stable/std/mem/fn.swap.html) - [`std::ptr::swap`](https://doc.rust-lang.org/stable/std/ptr/fn.swap.html) - [`NonNull::new`](https://doc.rust-lang.org/stable/std/ptr/struct.NonNull.html#method.new) - [`HashMap::with_hasher`](https://doc.rust-lang.org/stable/std/collections/struct.HashMap.html#method.with_hasher) - [`HashSet::with_hasher`](https://doc.rust-lang.org/stable/std/collections/struct.HashSet.html#method.with_hasher) - [`BuildHasherDefault::new`](https://doc.rust-lang.org/stable/std/hash/struct.BuildHasherDefault.html#method.new) - [`<float>::recip`](https://doc.rust-lang.org/stable/std/primitive.f32.html#method.recip) - [`<float>::to_degrees`](https://doc.rust-lang.org/stable/std/primitive.f32.html#method.to_degrees) - [`<float>::to_radians`](https://doc.rust-lang.org/stable/std/primitive.f32.html#method.to_radians) - [`<float>::max`](https://doc.rust-lang.org/stable/std/primitive.f32.html#method.max) - [`<float>::min`](https://doc.rust-lang.org/stable/std/primitive.f32.html#method.min) - [`<float>::clamp`](https://doc.rust-lang.org/stable/std/primitive.f32.html#method.clamp) - [`<float>::abs`](https://doc.rust-lang.org/stable/std/primitive.f32.html#method.abs) - [`<float>::signum`](https://doc.rust-lang.org/stable/std/primitive.f32.html#method.signum) - [`<float>::copysign`](https://doc.rust-lang.org/stable/std/primitive.f32.html#method.copysign) - [`MaybeUninit::write`](https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#method.write) <a id="1.85.0-Cargo"></a> ## Cargo - [Add future-incompatibility warning against keywords in cfgs and add raw-idents](https://redirect.github.com/rust-lang/cargo/pull/14671/) - [Stabilize higher precedence trailing flags](https://redirect.github.com/rust-lang/cargo/pull/14900/) - [Pass `CARGO_CFG_FEATURE` to build scripts](https://redirect.github.com/rust-lang/cargo/pull/14902/) <a id="1.85.0-Rustdoc"></a> ## Rustdoc - [Doc comment on impl blocks shows the first line, even when the impl block is collapsed](https://redirect.github.com/rust-lang/rust/pull/132155) <a id="1.85.0-Compatibility-Notes"></a> ## Compatibility Notes - [`rustc` no longer treats the `test` cfg as a well known check-cfg](https://redirect.github.com/rust-lang/rust/pull/131729), instead it is up to the build systems and users of `--check-cfg`\[^check-cfg] to set it as a well known cfg using `--check-cfg=cfg(test)`. This is done to enable build systems like Cargo to set it conditionally, as not all source files are suitable for unit tests. [Cargo (for now) unconditionally sets the `test` cfg as a well known cfg](https://redirect.github.com/rust-lang/cargo/pull/14963). \[^check-cfg]: https://doc.rust-lang.org/nightly/rustc/check-cfg.html - [Disable potentially incorrect type inference if there are trivial and non-trivial where-clauses](https://redirect.github.com/rust-lang/rust/pull/132325) - `std::env::home_dir()` has been deprecated for years, because it can give surprising results in some Windows configurations if the `HOME` environment variable is set (which is not the normal configuration on Windows). We had previously avoided changing its behavior, out of concern for compatibility with code depending on this non-standard configuration. Given how long this function has been deprecated, we're now fixing its behavior as a bugfix. A subsequent release will remove the deprecation for this function. - [Make `core::ffi::c_char` signedness more closely match that of the platform-default `char`](https://redirect.github.com/rust-lang/rust/pull/132975) This changed `c_char` from an `i8` to `u8` or vice versa on many Tier 2 and 3 targets (mostly Arm and RISC-V embedded targets). The new definition may result in compilation failures but fixes compatibility issues with C. The `libc` crate matches this change as of its 0.2.169 release. - [When compiling a nested `macro_rules` macro from an external crate, the content of the inner `macro_rules` is now built with the edition of the external crate, not the local crate.](https://redirect.github.com/rust-lang/rust/pull/133274) - [Increase `sparcv9-sun-solaris` and `x86_64-pc-solaris` Solaris baseline to 11.4.](https://redirect.github.com/rust-lang/rust/pull/133293) - [Show `abi_unsupported_vector_types` lint in future breakage reports](https://redirect.github.com/rust-lang/rust/pull/133374) - [Error if multiple super-trait instantiations of `dyn Trait` need associated types to be specified but only one is provided](https://redirect.github.com/rust-lang/rust/pull/133392) - [Change `powerpc64-ibm-aix` default `codemodel` to large](https://redirect.github.com/rust-lang/rust/pull/133811) <a id="1.85.0-Internal-Changes"></a> ## Internal Changes These changes do not affect any public interfaces of Rust, but they represent significant improvements to the performance or internals of rustc and related tools. - [Build `x86_64-unknown-linux-gnu` with LTO for C/C++ code (e.g., `jemalloc`)](https://redirect.github.com/rust-lang/rust/pull/134690) </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/toeverything/AFFiNE). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4xNzYuMiIsInVwZGF0ZWRJblZlciI6IjM5LjE3Ni4yIiwidGFyZ2V0QnJhbmNoIjoiY2FuYXJ5IiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyJdfQ==-->
941 lines
29 KiB
YAML
941 lines
29 KiB
YAML
name: Build & Test
|
||
|
||
on:
|
||
push:
|
||
branches:
|
||
- canary
|
||
- beta
|
||
- stable
|
||
- v[0-9]+.[0-9]+.x-staging
|
||
- v[0-9]+.[0-9]+.x
|
||
paths-ignore:
|
||
- README.md
|
||
pull_request:
|
||
|
||
env:
|
||
DEBUG: napi:*
|
||
BUILD_TYPE: canary
|
||
APP_NAME: affine
|
||
AFFINE_ENV: dev
|
||
COVERAGE: true
|
||
MACOSX_DEPLOYMENT_TARGET: '10.13'
|
||
DEPLOYMENT_TYPE: affine
|
||
|
||
concurrency:
|
||
group: ${{ github.workflow }}-${{ github.ref }}
|
||
cancel-in-progress: true
|
||
|
||
jobs:
|
||
optimize_ci:
|
||
name: Optimize CI
|
||
runs-on: ubuntu-latest
|
||
outputs:
|
||
skip: ${{ steps.check_skip.outputs.skip }}
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
- name: Graphite CI Optimizer
|
||
uses: withgraphite/graphite-ci-action@main
|
||
id: check_skip
|
||
with:
|
||
graphite_token: ${{ secrets.GRAPHITE_CI_OPTIMIZER_TOKEN }}
|
||
|
||
analyze:
|
||
name: Analyze
|
||
runs-on: ubuntu-latest
|
||
needs: optimize_ci
|
||
if: needs.optimize_ci.outputs.skip == 'false'
|
||
permissions:
|
||
actions: read
|
||
contents: read
|
||
security-events: write
|
||
|
||
strategy:
|
||
fail-fast: false
|
||
matrix:
|
||
language: ['javascript', 'typescript']
|
||
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
|
||
|
||
steps:
|
||
- name: Checkout repository
|
||
uses: actions/checkout@v4
|
||
|
||
# Initializes the CodeQL tools for scanning.
|
||
- name: Initialize CodeQL
|
||
uses: github/codeql-action/init@v3
|
||
with:
|
||
languages: ${{ matrix.language }}
|
||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||
# By default, queries listed here will override any specified in a config file.
|
||
# Prefix the list here with "+" to use these queries and those in the config file.
|
||
|
||
# Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
|
||
# queries: security-extended,security-and-quality
|
||
|
||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||
# If this step fails, then you should remove it and run the build manually (see below)
|
||
- name: Autobuild
|
||
uses: github/codeql-action/autobuild@v3
|
||
|
||
# ℹ️ Command-line programs to run using the OS shell.
|
||
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
||
|
||
# If the Autobuild fails above, remove it and uncomment the following three lines.
|
||
# modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
|
||
|
||
# - run: |
|
||
# echo "Run, Build Application using script"
|
||
# ./location_of_script_within_repo/buildscript.sh
|
||
|
||
- name: Perform CodeQL Analysis
|
||
uses: github/codeql-action/analyze@v3
|
||
lint:
|
||
name: Lint
|
||
runs-on: ubuntu-latest
|
||
needs: optimize_ci
|
||
if: needs.optimize_ci.outputs.skip == 'false'
|
||
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
- name: Run oxlint
|
||
# oxlint is fast, so wrong code will fail quickly
|
||
run: yarn dlx $(node -e "console.log(require('./package.json').scripts['lint:ox'].replace('oxlint', 'oxlint@' + require('./package.json').devDependencies.oxlint))")
|
||
- name: Setup Node.js
|
||
uses: ./.github/actions/setup-node
|
||
with:
|
||
electron-install: false
|
||
full-cache: true
|
||
- name: Run i18n codegen
|
||
run: yarn affine @affine/i18n build
|
||
- name: Run ESLint
|
||
run: yarn lint:eslint --max-warnings=0
|
||
- name: Run Prettier
|
||
# Set nmMode in `actions/setup-node` will modify the .yarnrc.yml
|
||
run: |
|
||
git checkout .yarnrc.yml
|
||
yarn lint:prettier
|
||
- name: Yarn Dedupe
|
||
run: yarn dedupe --check
|
||
- name: Run Type Check
|
||
run: yarn typecheck
|
||
|
||
lint-rust:
|
||
name: Lint Rust
|
||
runs-on: ubuntu-latest
|
||
needs: optimize_ci
|
||
if: needs.optimize_ci.outputs.skip == 'false'
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
- uses: ./.github/actions/build-rust
|
||
with:
|
||
no-build: 'true'
|
||
- name: fmt check
|
||
run: |
|
||
rustup toolchain add nightly
|
||
rustup component add --toolchain nightly-x86_64-unknown-linux-gnu rustfmt
|
||
cargo +nightly fmt --all -- --check
|
||
- name: Clippy
|
||
run: |
|
||
rustup component add clippy
|
||
cargo clippy --all-targets --all-features -- -D warnings
|
||
|
||
check-yarn-binary:
|
||
name: Check yarn binary
|
||
runs-on: ubuntu-latest
|
||
needs: optimize_ci
|
||
if: needs.optimize_ci.outputs.skip == 'false'
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
- name: Run check
|
||
run: |
|
||
yarn set version $(node -e "console.log(require('./package.json').packageManager.split('@')[1])")
|
||
git diff --exit-code
|
||
|
||
e2e-legacy-blocksuite-test:
|
||
name: Legacy Blocksuite E2E Test
|
||
runs-on: ubuntu-latest
|
||
needs: optimize_ci
|
||
if: needs.optimize_ci.outputs.skip == 'false'
|
||
strategy:
|
||
fail-fast: false
|
||
matrix:
|
||
shard: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
- name: Setup Node.js
|
||
uses: ./.github/actions/setup-node
|
||
with:
|
||
playwright-install: true
|
||
electron-install: false
|
||
full-cache: true
|
||
|
||
- name: Run playground build
|
||
run: yarn workspace @blocksuite/playground build
|
||
|
||
- name: Run playwright tests
|
||
run: yarn workspace @blocksuite/legacy-e2e test --forbid-only --shard=${{ matrix.shard }}/${{ strategy.job-total }}
|
||
|
||
- name: Upload test results
|
||
if: always()
|
||
uses: actions/upload-artifact@v4
|
||
with:
|
||
name: test-results-e2e-legacy-bs-${{ matrix.shard }}
|
||
path: ./test-results
|
||
if-no-files-found: ignore
|
||
|
||
e2e-test:
|
||
name: E2E Test
|
||
runs-on: ubuntu-latest
|
||
needs: optimize_ci
|
||
if: needs.optimize_ci.outputs.skip == 'false'
|
||
env:
|
||
DISTRIBUTION: web
|
||
IN_CI_TEST: true
|
||
strategy:
|
||
fail-fast: false
|
||
matrix:
|
||
shard: [1, 2, 3, 4, 5]
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
- name: Setup Node.js
|
||
uses: ./.github/actions/setup-node
|
||
with:
|
||
playwright-install: true
|
||
electron-install: false
|
||
full-cache: true
|
||
|
||
- name: Run playwright tests
|
||
run: yarn affine @affine-test/affine-local e2e --forbid-only --shard=${{ matrix.shard }}/${{ strategy.job-total }}
|
||
|
||
- name: Upload test results
|
||
if: always()
|
||
uses: actions/upload-artifact@v4
|
||
with:
|
||
name: test-results-e2e-${{ matrix.shard }}
|
||
path: ./test-results
|
||
if-no-files-found: ignore
|
||
|
||
e2e-mobile-test:
|
||
name: E2E Mobile Test
|
||
runs-on: ubuntu-latest
|
||
needs: optimize_ci
|
||
if: needs.optimize_ci.outputs.skip == 'false'
|
||
env:
|
||
DISTRIBUTION: mobile
|
||
IN_CI_TEST: true
|
||
strategy:
|
||
fail-fast: false
|
||
matrix:
|
||
shard: [1, 2, 3, 4, 5]
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
- name: Setup Node.js
|
||
uses: ./.github/actions/setup-node
|
||
with:
|
||
playwright-install: true
|
||
electron-install: false
|
||
full-cache: true
|
||
|
||
- name: Run playwright tests
|
||
run: yarn affine @affine-test/affine-mobile e2e --forbid-only --shard=${{ matrix.shard }}/${{ strategy.job-total }}
|
||
|
||
- name: Upload test results
|
||
if: always()
|
||
uses: actions/upload-artifact@v4
|
||
with:
|
||
name: test-results-e2e-mobile-${{ matrix.shard }}
|
||
path: ./test-results
|
||
if-no-files-found: ignore
|
||
|
||
unit-test:
|
||
name: Unit Test
|
||
runs-on: ubuntu-latest
|
||
needs:
|
||
- optimize_ci
|
||
- build-native
|
||
if: needs.optimize_ci.outputs.skip == 'false'
|
||
env:
|
||
DISTRIBUTION: web
|
||
strategy:
|
||
fail-fast: false
|
||
matrix:
|
||
shard: [1, 2, 3, 4, 5]
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
- name: Setup Node.js
|
||
uses: ./.github/actions/setup-node
|
||
with:
|
||
electron-install: true
|
||
playwright-install: true
|
||
full-cache: true
|
||
|
||
- name: Download affine.linux-x64-gnu.node
|
||
uses: actions/download-artifact@v4
|
||
with:
|
||
name: affine.linux-x64-gnu.node
|
||
path: ./packages/frontend/native
|
||
|
||
- name: Unit Test
|
||
run: yarn test:coverage --shard=${{ matrix.shard }}/${{ strategy.job-total }}
|
||
|
||
- name: Upload unit test coverage results
|
||
uses: codecov/codecov-action@v5
|
||
with:
|
||
token: ${{ secrets.CODECOV_TOKEN }}
|
||
files: ./.coverage/store/lcov.info
|
||
flags: unittest
|
||
name: affine
|
||
fail_ci_if_error: false
|
||
|
||
build-native:
|
||
name: Build AFFiNE native (${{ matrix.spec.target }})
|
||
runs-on: ${{ matrix.spec.os }}
|
||
needs: optimize_ci
|
||
if: needs.optimize_ci.outputs.skip == 'false'
|
||
env:
|
||
CARGO_PROFILE_RELEASE_DEBUG: '1'
|
||
strategy:
|
||
fail-fast: false
|
||
matrix:
|
||
spec:
|
||
- { os: ubuntu-latest, target: x86_64-unknown-linux-gnu }
|
||
- { os: windows-latest, target: x86_64-pc-windows-msvc }
|
||
- { os: macos-latest, target: x86_64-apple-darwin }
|
||
- { os: macos-latest, target: aarch64-apple-darwin }
|
||
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
- uses: samypr100/setup-dev-drive@v3
|
||
if: ${{ matrix.spec.os == 'windows-latest' }}
|
||
with:
|
||
workspace-copy: true
|
||
drive-size: 8GB
|
||
drive-format: NTFS
|
||
env-mapping: |
|
||
CARGO_HOME,{{ DEV_DRIVE }}/.cargo
|
||
RUSTUP_HOME,{{ DEV_DRIVE }}/.rustup
|
||
- name: Setup Node.js
|
||
uses: ./.github/actions/setup-node
|
||
with:
|
||
extra-flags: workspaces focus @affine/native
|
||
electron-install: false
|
||
- name: Setup filename
|
||
id: filename
|
||
working-directory: ${{ env.DEV_DRIVE_WORKSPACE || github.workspace }}
|
||
shell: bash
|
||
run: |
|
||
export PLATFORM_ARCH_ABI=$(node -e "console.log(require('@napi-rs/cli').parseTriple('${{ matrix.spec.target }}').platformArchABI)")
|
||
echo "filename=affine.$PLATFORM_ARCH_ABI.node" >> "$GITHUB_OUTPUT"
|
||
- name: Build AFFiNE native
|
||
uses: ./.github/actions/build-rust
|
||
with:
|
||
target: ${{ matrix.spec.target }}
|
||
package: '@affine/native'
|
||
- name: Upload ${{ steps.filename.outputs.filename }}
|
||
uses: actions/upload-artifact@v4
|
||
if: always()
|
||
with:
|
||
name: ${{ steps.filename.outputs.filename }}
|
||
path: ${{ env.DEV_DRIVE_WORKSPACE || github.workspace }}/packages/frontend/native/${{ steps.filename.outputs.filename }}
|
||
if-no-files-found: error
|
||
|
||
build-server-native:
|
||
name: Build Server native
|
||
runs-on: ubuntu-latest
|
||
needs: optimize_ci
|
||
if: needs.optimize_ci.outputs.skip == 'false'
|
||
env:
|
||
CARGO_PROFILE_RELEASE_DEBUG: '1'
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
- name: Setup Node.js
|
||
uses: ./.github/actions/setup-node
|
||
with:
|
||
extra-flags: workspaces focus @affine/server-native
|
||
electron-install: false
|
||
- name: Build Rust
|
||
uses: ./.github/actions/build-rust
|
||
with:
|
||
target: 'x86_64-unknown-linux-gnu'
|
||
package: '@affine/server-native'
|
||
- name: Upload server-native.node
|
||
uses: actions/upload-artifact@v4
|
||
if: always()
|
||
with:
|
||
name: server-native.node
|
||
path: ./packages/backend/native/server-native.node
|
||
if-no-files-found: error
|
||
|
||
build-electron-renderer:
|
||
name: Build @affine/electron renderer
|
||
runs-on: ubuntu-latest
|
||
needs: optimize_ci
|
||
if: needs.optimize_ci.outputs.skip == 'false'
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
- name: Setup Node.js
|
||
uses: ./.github/actions/setup-node
|
||
with:
|
||
electron-install: false
|
||
full-cache: true
|
||
- name: Build Electron renderer
|
||
run: yarn affine @affine/electron-renderer build
|
||
env:
|
||
DISTRIBUTION: desktop
|
||
- name: zip web
|
||
run: tar -czf dist.tar.gz --directory=packages/frontend/apps/electron-renderer/dist .
|
||
- name: Upload web artifact
|
||
uses: actions/upload-artifact@v4
|
||
if: always()
|
||
with:
|
||
name: web
|
||
path: dist.tar.gz
|
||
if-no-files-found: error
|
||
|
||
native-unit-test:
|
||
name: Native Unit Test
|
||
runs-on: ubuntu-latest
|
||
needs:
|
||
- optimize_ci
|
||
- build-native
|
||
if: needs.optimize_ci.outputs.skip == 'false'
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
- name: Setup Node.js
|
||
uses: ./.github/actions/setup-node
|
||
with:
|
||
extra-flags: workspaces focus @affine-tools/cli @affine/monorepo @affine/native
|
||
electron-install: false
|
||
- name: Download affine.linux-x64-gnu.node
|
||
uses: actions/download-artifact@v4
|
||
with:
|
||
name: affine.linux-x64-gnu.node
|
||
path: ./packages/frontend/native
|
||
- name: Unit Test
|
||
run: yarn affine @affine/native test
|
||
|
||
server-test:
|
||
name: Server Test
|
||
runs-on: ubuntu-latest
|
||
needs:
|
||
- optimize_ci
|
||
- build-server-native
|
||
if: needs.optimize_ci.outputs.skip == 'false'
|
||
strategy:
|
||
fail-fast: false
|
||
matrix:
|
||
node_index: [0, 1, 2]
|
||
total_nodes: [3]
|
||
env:
|
||
NODE_ENV: test
|
||
DISTRIBUTION: web
|
||
DATABASE_URL: postgresql://affine:affine@localhost:5432/affine
|
||
REDIS_SERVER_HOST: localhost
|
||
services:
|
||
postgres:
|
||
image: postgres
|
||
env:
|
||
POSTGRES_PASSWORD: affine
|
||
options: >-
|
||
--health-cmd pg_isready
|
||
--health-interval 10s
|
||
--health-timeout 5s
|
||
--health-retries 5
|
||
ports:
|
||
- 5432:5432
|
||
redis:
|
||
image: redis
|
||
ports:
|
||
- 6379:6379
|
||
mailer:
|
||
image: mailhog/mailhog
|
||
ports:
|
||
- 1025:1025
|
||
- 8025:8025
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
|
||
- name: Setup Node.js
|
||
uses: ./.github/actions/setup-node
|
||
with:
|
||
electron-install: false
|
||
full-cache: true
|
||
|
||
- name: Download server-native.node
|
||
uses: actions/download-artifact@v4
|
||
with:
|
||
name: server-native.node
|
||
path: ./packages/backend/server
|
||
|
||
- name: Prepare Server Test Environment
|
||
uses: ./.github/actions/server-test-env
|
||
|
||
- name: Run server tests
|
||
run: yarn affine @affine/server test:coverage --forbid-only
|
||
env:
|
||
CARGO_TARGET_DIR: '${{ github.workspace }}/target'
|
||
COPILOT_OPENAI_API_KEY: 'use_fake_openai_api_key'
|
||
CI_NODE_INDEX: ${{ matrix.node_index }}
|
||
CI_NODE_TOTAL: ${{ matrix.total_nodes }}
|
||
|
||
- name: Upload server test coverage results
|
||
uses: codecov/codecov-action@v5
|
||
with:
|
||
token: ${{ secrets.CODECOV_TOKEN }}
|
||
files: ./packages/backend/server/.coverage/lcov.info
|
||
flags: server-test
|
||
name: affine
|
||
fail_ci_if_error: false
|
||
|
||
rust-test:
|
||
name: Run native tests
|
||
runs-on: ubuntu-latest
|
||
needs: optimize_ci
|
||
if: needs.optimize_ci.outputs.skip == 'false'
|
||
env:
|
||
CARGO_TERM_COLOR: always
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
- name: Setup Rust
|
||
uses: ./.github/actions/build-rust
|
||
with:
|
||
package: 'affine'
|
||
no-build: 'true'
|
||
|
||
- name: Install latest nextest release
|
||
uses: taiki-e/install-action@nextest
|
||
|
||
- name: Run tests
|
||
run: cargo nextest run --release --no-fail-fast
|
||
|
||
copilot-api-test:
|
||
name: Server Copilot Api Test
|
||
runs-on: ubuntu-latest
|
||
needs:
|
||
- optimize_ci
|
||
- build-server-native
|
||
if: needs.optimize_ci.outputs.skip == 'false'
|
||
env:
|
||
NODE_ENV: test
|
||
DISTRIBUTION: web
|
||
DATABASE_URL: postgresql://affine:affine@localhost:5432/affine
|
||
REDIS_SERVER_HOST: localhost
|
||
services:
|
||
postgres:
|
||
image: postgres
|
||
env:
|
||
POSTGRES_PASSWORD: affine
|
||
options: >-
|
||
--health-cmd pg_isready
|
||
--health-interval 10s
|
||
--health-timeout 5s
|
||
--health-retries 5
|
||
ports:
|
||
- 5432:5432
|
||
redis:
|
||
image: redis
|
||
ports:
|
||
- 6379:6379
|
||
mailer:
|
||
image: mailhog/mailhog
|
||
ports:
|
||
- 1025:1025
|
||
- 8025:8025
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
|
||
- name: Check blocksuite update
|
||
id: check-blocksuite-update
|
||
env:
|
||
BASE_REF: ${{ github.base_ref }}
|
||
run: |
|
||
if node ./scripts/detect-blocksuite-update.mjs "$BASE_REF"; then
|
||
echo "skip=false" >> $GITHUB_OUTPUT
|
||
else
|
||
echo "skip=true" >> $GITHUB_OUTPUT
|
||
fi
|
||
|
||
- uses: dorny/paths-filter@v3
|
||
id: apifilter
|
||
with:
|
||
filters: |
|
||
changed:
|
||
- 'packages/backend/server/src/plugins/copilot/**'
|
||
- 'packages/backend/server/tests/copilot.*'
|
||
|
||
- name: Setup Node.js
|
||
if: ${{ steps.check-blocksuite-update.outputs.skip != 'true' || steps.apifilter.outputs.changed == 'true' }}
|
||
uses: ./.github/actions/setup-node
|
||
with:
|
||
electron-install: false
|
||
full-cache: true
|
||
|
||
- name: Download server-native.node
|
||
if: ${{ steps.check-blocksuite-update.outputs.skip != 'true' || steps.apifilter.outputs.changed == 'true' }}
|
||
uses: actions/download-artifact@v4
|
||
with:
|
||
name: server-native.node
|
||
path: ./packages/backend/server
|
||
|
||
- name: Prepare Server Test Environment
|
||
if: ${{ steps.check-blocksuite-update.outputs.skip != 'true' || steps.apifilter.outputs.changed == 'true' }}
|
||
uses: ./.github/actions/server-test-env
|
||
|
||
- name: Run server tests
|
||
if: ${{ steps.check-blocksuite-update.outputs.skip != 'true' || steps.apifilter.outputs.changed == 'true' }}
|
||
run: yarn affine @affine/server test:copilot:coverage --forbid-only
|
||
env:
|
||
CARGO_TARGET_DIR: '${{ github.workspace }}/target'
|
||
COPILOT_OPENAI_API_KEY: ${{ secrets.COPILOT_OPENAI_API_KEY }}
|
||
COPILOT_FAL_API_KEY: ${{ secrets.COPILOT_FAL_API_KEY }}
|
||
COPILOT_PERPLEXITY_API_KEY: ${{ secrets.COPILOT_PERPLEXITY_API_KEY }}
|
||
|
||
- name: Upload server test coverage results
|
||
if: ${{ steps.check-blocksuite-update.outputs.skip != 'true' || steps.apifilter.outputs.changed == 'true' }}
|
||
uses: codecov/codecov-action@v5
|
||
with:
|
||
token: ${{ secrets.CODECOV_TOKEN }}
|
||
files: ./packages/backend/server/.coverage/lcov.info
|
||
flags: server-test
|
||
name: affine
|
||
fail_ci_if_error: false
|
||
|
||
copilot-e2e-test:
|
||
name: Server Copilot E2E Test
|
||
runs-on: ubuntu-latest
|
||
env:
|
||
DISTRIBUTION: web
|
||
DATABASE_URL: postgresql://affine:affine@localhost:5432/affine
|
||
IN_CI_TEST: true
|
||
REDIS_SERVER_HOST: localhost
|
||
DEPLOYMENT_TYPE: affine
|
||
strategy:
|
||
fail-fast: false
|
||
matrix:
|
||
shardIndex: [1, 2, 3]
|
||
shardTotal: [3]
|
||
needs:
|
||
- build-server-native
|
||
services:
|
||
postgres:
|
||
image: postgres
|
||
env:
|
||
POSTGRES_PASSWORD: affine
|
||
options: >-
|
||
--health-cmd pg_isready
|
||
--health-interval 10s
|
||
--health-timeout 5s
|
||
--health-retries 5
|
||
ports:
|
||
- 5432:5432
|
||
redis:
|
||
image: redis
|
||
ports:
|
||
- 6379:6379
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
|
||
- name: Check blocksuite update
|
||
id: check-blocksuite-update
|
||
env:
|
||
BASE_REF: ${{ github.base_ref }}
|
||
run: |
|
||
if node ./scripts/detect-blocksuite-update.mjs "$BASE_REF"; then
|
||
echo "skip=false" >> $GITHUB_OUTPUT
|
||
else
|
||
echo "skip=true" >> $GITHUB_OUTPUT
|
||
fi
|
||
|
||
- uses: dorny/paths-filter@v3
|
||
id: e2efilter
|
||
with:
|
||
filters: |
|
||
changed:
|
||
- 'packages/frontend/core/src/blocksuite/ai/**'
|
||
- 'tests/affine-cloud-copilot/**'
|
||
|
||
- name: Setup Node.js
|
||
if: ${{ steps.check-blocksuite-update.outputs.skip != 'true' || steps.e2efilter.outputs.changed == 'true' }}
|
||
uses: ./.github/actions/setup-node
|
||
with:
|
||
playwright-install: true
|
||
electron-install: false
|
||
hard-link-nm: false
|
||
|
||
- name: Download server-native.node
|
||
if: ${{ steps.check-blocksuite-update.outputs.skip != 'true' || steps.e2efilter.outputs.changed == 'true' }}
|
||
uses: actions/download-artifact@v4
|
||
with:
|
||
name: server-native.node
|
||
path: ./packages/backend/server
|
||
|
||
- name: Run Copilot E2E Test ${{ matrix.shardIndex }}/${{ matrix.shardTotal }}
|
||
if: ${{ steps.check-blocksuite-update.outputs.skip != 'true' || steps.e2efilter.outputs.changed == 'true' }}
|
||
uses: ./.github/actions/copilot-test
|
||
with:
|
||
script: yarn affine @affine-test/affine-cloud-copilot e2e --forbid-only --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }}
|
||
openai-key: ${{ secrets.COPILOT_OPENAI_API_KEY }}
|
||
fal-key: ${{ secrets.COPILOT_FAL_API_KEY }}
|
||
perplexity-key: ${{ secrets.COPILOT_PERPLEXITY_API_KEY }}
|
||
|
||
server-e2e-test:
|
||
name: ${{ matrix.tests.name }}
|
||
runs-on: ubuntu-latest
|
||
needs:
|
||
- optimize_ci
|
||
- build-server-native
|
||
- build-native
|
||
if: needs.optimize_ci.outputs.skip == 'false'
|
||
env:
|
||
DISTRIBUTION: web
|
||
DATABASE_URL: postgresql://affine:affine@localhost:5432/affine
|
||
REDIS_SERVER_HOST: localhost
|
||
IN_CI_TEST: true
|
||
strategy:
|
||
fail-fast: false
|
||
matrix:
|
||
tests:
|
||
- name: 'Server E2E Test 1/3'
|
||
shard: 1
|
||
script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=1/3
|
||
- name: 'Server E2E Test 2/3'
|
||
shard: 2
|
||
script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=2/3
|
||
- name: 'Server E2E Test 3/3'
|
||
shard: 3
|
||
script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=3/3
|
||
- name: 'Server Desktop E2E Test'
|
||
shard: desktop
|
||
script: |
|
||
yarn affine @affine/electron build:dev
|
||
# Workaround for Electron apps failing to initialize on Ubuntu 24.04 due to AppArmor restrictions
|
||
# Disables unprivileged user namespaces restriction to allow Electron apps to run
|
||
# Reference: https://github.com/electron/electron/issues/42510
|
||
sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0
|
||
xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- yarn affine @affine-test/affine-desktop-cloud e2e
|
||
services:
|
||
postgres:
|
||
image: postgres
|
||
env:
|
||
POSTGRES_PASSWORD: affine
|
||
options: >-
|
||
--health-cmd pg_isready
|
||
--health-interval 10s
|
||
--health-timeout 5s
|
||
--health-retries 5
|
||
ports:
|
||
- 5432:5432
|
||
redis:
|
||
image: redis
|
||
ports:
|
||
- 6379:6379
|
||
mailer:
|
||
image: mailhog/mailhog
|
||
ports:
|
||
- 1025:1025
|
||
- 8025:8025
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
|
||
- name: Setup Node.js
|
||
uses: ./.github/actions/setup-node
|
||
with:
|
||
playwright-install: true
|
||
hard-link-nm: false
|
||
|
||
- name: Download server-native.node
|
||
uses: actions/download-artifact@v4
|
||
with:
|
||
name: server-native.node
|
||
path: ./packages/backend/server
|
||
|
||
- name: Download affine.linux-x64-gnu.node
|
||
uses: actions/download-artifact@v4
|
||
with:
|
||
name: affine.linux-x64-gnu.node
|
||
path: ./packages/frontend/native
|
||
|
||
- name: Prepare Server Test Environment
|
||
uses: ./.github/actions/server-test-env
|
||
|
||
- name: ${{ matrix.tests.name }}
|
||
run: |
|
||
${{ matrix.tests.script }}
|
||
env:
|
||
DEV_SERVER_URL: http://localhost:8080
|
||
COPILOT_OPENAI_API_KEY: 1
|
||
COPILOT_FAL_API_KEY: 1
|
||
COPILOT_PERPLEXITY_API_KEY: 1
|
||
|
||
- name: Upload test results
|
||
if: always()
|
||
uses: actions/upload-artifact@v4
|
||
with:
|
||
name: test-results-e2e-server-${{ matrix.tests.shard }}
|
||
path: ./test-results
|
||
if-no-files-found: ignore
|
||
|
||
desktop-test:
|
||
name: Desktop Test (${{ matrix.spec.os }}, ${{ matrix.spec.platform }}, ${{ matrix.spec.arch }}, ${{ matrix.spec.target }}, ${{ matrix.spec.test }})
|
||
runs-on: ${{ matrix.spec.os }}
|
||
needs:
|
||
- optimize_ci
|
||
- build-electron-renderer
|
||
- build-native
|
||
if: needs.optimize_ci.outputs.skip == 'false'
|
||
strategy:
|
||
fail-fast: false
|
||
matrix:
|
||
spec:
|
||
- {
|
||
os: macos-latest,
|
||
platform: macos,
|
||
arch: x64,
|
||
target: x86_64-apple-darwin,
|
||
test: false,
|
||
}
|
||
- {
|
||
os: macos-latest,
|
||
platform: macos,
|
||
arch: arm64,
|
||
target: aarch64-apple-darwin,
|
||
test: true,
|
||
}
|
||
- {
|
||
os: ubuntu-latest,
|
||
platform: linux,
|
||
arch: x64,
|
||
target: x86_64-unknown-linux-gnu,
|
||
test: true,
|
||
}
|
||
- {
|
||
os: windows-latest,
|
||
platform: windows,
|
||
arch: x64,
|
||
target: x86_64-pc-windows-msvc,
|
||
test: true,
|
||
}
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
- name: Setup Node.js
|
||
uses: ./.github/actions/setup-node
|
||
timeout-minutes: 10
|
||
with:
|
||
extra-flags: workspaces focus @affine/electron @affine/monorepo @affine-test/affine-desktop @affine/nbstore @toeverything/infra
|
||
playwright-install: true
|
||
hard-link-nm: false
|
||
enableScripts: false
|
||
|
||
- name: Setup filename
|
||
id: filename
|
||
shell: bash
|
||
run: |
|
||
export PLATFORM_ARCH_ABI=$(node -e "console.log(require('@napi-rs/cli').parseTriple('${{ matrix.spec.target }}').platformArchABI)")
|
||
echo "filename=affine.$PLATFORM_ARCH_ABI.node" >> "$GITHUB_OUTPUT"
|
||
|
||
- name: Download ${{ steps.filename.outputs.filename }}
|
||
uses: actions/download-artifact@v4
|
||
with:
|
||
name: ${{ steps.filename.outputs.filename }}
|
||
path: ./packages/frontend/native
|
||
|
||
- name: Run unit tests
|
||
if: ${{ matrix.spec.test }}
|
||
shell: bash
|
||
run: yarn affine @affine/electron vitest
|
||
|
||
- name: Download web artifact
|
||
uses: ./.github/actions/download-web
|
||
with:
|
||
path: packages/frontend/apps/electron/resources/web-static
|
||
|
||
- name: Build Desktop Layers
|
||
run: yarn affine @affine/electron build
|
||
|
||
- name: Run desktop tests
|
||
if: ${{ matrix.spec.os == 'ubuntu-latest' }}
|
||
run: |
|
||
# Workaround for Electron apps failing to initialize on Ubuntu 24.04 due to AppArmor restrictions
|
||
# Disables unprivileged user namespaces restriction to allow Electron apps to run
|
||
# Reference: https://github.com/electron/electron/issues/42510
|
||
sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0
|
||
xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- yarn affine @affine-test/affine-desktop e2e
|
||
|
||
- name: Run desktop tests
|
||
if: ${{ matrix.spec.test && matrix.spec.os != 'ubuntu-latest' }}
|
||
run: yarn affine @affine-test/affine-desktop e2e
|
||
|
||
- name: Make bundle (macOS)
|
||
if: ${{ matrix.spec.target == 'aarch64-apple-darwin' }}
|
||
env:
|
||
SKIP_BUNDLE: true
|
||
SKIP_WEB_BUILD: true
|
||
HOIST_NODE_MODULES: 1
|
||
run: yarn affine @affine/electron package --platform=darwin --arch=arm64
|
||
|
||
- name: Make Bundle (Linux)
|
||
run: |
|
||
sudo add-apt-repository universe
|
||
sudo apt install -y libfuse2 elfutils flatpak flatpak-builder
|
||
flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
||
flatpak update
|
||
# some flatpak deps need git protocol.file.allow
|
||
git config --global protocol.file.allow always
|
||
yarn affine @affine/electron make --platform=linux --arch=x64
|
||
if: ${{ matrix.spec.target == 'x86_64-unknown-linux-gnu' }}
|
||
env:
|
||
SKIP_WEB_BUILD: 1
|
||
HOIST_NODE_MODULES: 1
|
||
|
||
- name: Output check
|
||
if: ${{ matrix.spec.os == 'macos-14' && matrix.spec.arch == 'arm64' }}
|
||
run: |
|
||
yarn affine @affine/electron node ./scripts/macos-arm64-output-check.ts
|
||
|
||
- name: Upload test results
|
||
if: always()
|
||
uses: actions/upload-artifact@v4
|
||
with:
|
||
name: test-results-e2e-${{ matrix.spec.os }}-${{ matrix.spec.arch }}
|
||
path: ./test-results
|
||
if-no-files-found: ignore
|
||
|
||
test-build-mobile-app:
|
||
uses: ./.github/workflows/release-mobile.yml
|
||
needs: optimize_ci
|
||
if: needs.optimize_ci.outputs.skip == 'false'
|
||
with:
|
||
build-type: canary
|
||
build-target: development
|
||
secrets: inherit
|
||
permissions:
|
||
id-token: 'write'
|
||
|
||
test-done:
|
||
needs:
|
||
- analyze
|
||
- lint
|
||
- lint-rust
|
||
- check-yarn-binary
|
||
- e2e-test
|
||
- e2e-legacy-blocksuite-test
|
||
- e2e-mobile-test
|
||
- unit-test
|
||
- build-native
|
||
- build-server-native
|
||
- build-electron-renderer
|
||
- native-unit-test
|
||
- server-test
|
||
- rust-test
|
||
- copilot-api-test
|
||
- copilot-e2e-test
|
||
- server-e2e-test
|
||
- desktop-test
|
||
- test-build-mobile-app
|
||
if: always()
|
||
runs-on: ubuntu-latest
|
||
name: 3, 2, 1 Launch
|
||
steps:
|
||
- run: exit 1
|
||
# Thank you, next https://github.com/vercel/next.js/blob/canary/.github/workflows/build_and_test.yml#L379
|
||
if: ${{ always() && (contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled')) }}
|