name: Flutter-CI on: push: branches: - "main" - "release/*" paths: - ".github/workflows/flutter_ci.yaml" - "frontend/rust-lib/**" - "frontend/appflowy_flutter/**" - "frontend/resources/**" pull_request: branches: - "main" - "release/*" paths: - ".github/workflows/flutter_ci.yaml" - "frontend/rust-lib/**" - "frontend/appflowy_flutter/**" - "frontend/resources/**" env: CARGO_TERM_COLOR: always FLUTTER_VERSION: "3.19.0" RUST_TOOLCHAIN: "1.75" CARGO_MAKE_VERSION: "0.36.6" concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true jobs: prepare: if: github.event.pull_request.draft != true strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] include: - os: ubuntu-latest flutter_profile: development-linux-x86_64 target: x86_64-unknown-linux-gnu - os: macos-latest flutter_profile: development-mac-x86_64 target: x86_64-apple-darwin - os: windows-latest flutter_profile: development-windows-x86 target: x86_64-pc-windows-msvc runs-on: ${{ matrix.os }} steps: # the following step is required to avoid running out of space - name: Maximize build space if: matrix.os == 'ubuntu-latest' run: | sudo rm -rf /usr/share/dotnet sudo rm -rf /opt/ghc sudo rm -rf "/usr/local/share/boost" sudo rm -rf "$AGENT_TOOLSDIRECTORY" - name: Checkout source code uses: actions/checkout@v4 - name: Install Rust toolchain id: rust_toolchain uses: actions-rs/toolchain@v1 with: toolchain: ${{ env.RUST_TOOLCHAIN }} target: ${{ matrix.target }} override: true profile: minimal - name: Export pub environment variables and add to PATH run: | if [ "$RUNNER_OS" == "Windows" ]; then echo "PUB_CACHE=$LOCALAPPDATA\\Pub\\Cache" >> $GITHUB_ENV fi shell: bash - name: Install flutter id: flutter uses: subosito/flutter-action@v2 with: channel: "stable" flutter-version: ${{ env.FLUTTER_VERSION }} cache: true - uses: Swatinem/rust-cache@v2 with: prefix-key: ${{ matrix.os }} workspaces: | frontend/rust-lib cache-all-crates: true - uses: taiki-e/install-action@v2 with: tool: cargo-make@${{ env.CARGO_MAKE_VERSION }}, duckscript_cli - name: Install prerequisites working-directory: frontend run: | if [ "$RUNNER_OS" == "Linux" ]; then sudo wget -qO /etc/apt/trusted.gpg.d/dart_linux_signing_key.asc https://dl-ssl.google.com/linux/linux_signing_key.pub sudo wget -qO /etc/apt/sources.list.d/dart_stable.list https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list sudo apt-get update sudo apt-get install -y dart curl build-essential libssl-dev clang cmake ninja-build pkg-config libgtk-3-dev keybinder-3.0 libnotify-dev elif [ "$RUNNER_OS" == "Windows" ]; then vcpkg integrate install elif [ "$RUNNER_OS" == "macOS" ]; then echo 'do nothing' fi cargo make appflowy-flutter-deps-tools shell: bash - name: Build AppFlowy working-directory: frontend run: cargo make --profile ${{ matrix.flutter_profile }} appflowy-core-dev - name: Run code generation working-directory: frontend run: cargo make code_generation - name: Flutter Analyzer working-directory: frontend/appflowy_flutter run: flutter analyze . - name: Compress appflowy_flutter run: | tar -czf appflowy_flutter.tar.gz frontend/appflowy_flutter - uses: actions/upload-artifact@v4 with: name: ${{ github.run_id }}-${{ matrix.os }} path: appflowy_flutter.tar.gz unit_test: needs: [prepare] if: github.event.pull_request.draft != true strategy: fail-fast: false matrix: os: [ubuntu-latest] include: - os: ubuntu-latest flutter_profile: development-linux-x86_64 target: x86_64-unknown-linux-gnu runs-on: ${{ matrix.os }} steps: - name: Checkout source code uses: actions/checkout@v4 - name: Install Rust toolchain id: rust_toolchain uses: actions-rs/toolchain@v1 with: toolchain: ${{ env.RUST_TOOLCHAIN }} target: ${{ matrix.target }} override: true profile: minimal - name: Install flutter id: flutter uses: subosito/flutter-action@v2 with: channel: "stable" flutter-version: ${{ env.FLUTTER_VERSION }} cache: true - uses: Swatinem/rust-cache@v2 with: prefix-key: ${{ matrix.os }} workspaces: | frontend/rust-lib cache-all-crates: true - uses: taiki-e/install-action@v2 with: tool: cargo-make@${{ env.CARGO_MAKE_VERSION }}, duckscript_cli - name: Install prerequisites working-directory: frontend run: | if [ "$RUNNER_OS" == "Linux" ]; then sudo wget -qO /etc/apt/trusted.gpg.d/dart_linux_signing_key.asc https://dl-ssl.google.com/linux/linux_signing_key.pub sudo wget -qO /etc/apt/sources.list.d/dart_stable.list https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list sudo apt-get update sudo apt-get install -y dart curl build-essential libssl-dev clang cmake ninja-build pkg-config libgtk-3-dev keybinder-3.0 libnotify-dev fi shell: bash - name: Enable Flutter Desktop run: | if [ "$RUNNER_OS" == "Linux" ]; then flutter config --enable-linux-desktop elif [ "$RUNNER_OS" == "macOS" ]; then flutter config --enable-macos-desktop elif [ "$RUNNER_OS" == "Windows" ]; then git config --system core.longpaths true flutter config --enable-windows-desktop fi shell: bash - uses: actions/download-artifact@v4 with: name: ${{ github.run_id }}-${{ matrix.os }} - name: Uncompress appflowy_flutter run: tar -xf appflowy_flutter.tar.gz - name: Run flutter pub get working-directory: frontend run: cargo make pub_get - name: Run Flutter unit tests working-directory: frontend run: | if [ "$RUNNER_OS" == "macOS" ]; then cargo make dart_unit_test elif [ "$RUNNER_OS" == "Linux" ]; then cargo make dart_unit_test_no_build elif [ "$RUNNER_OS" == "Windows" ]; then cargo make dart_unit_test_no_build fi shell: bash cloud_integration_test: needs: [prepare] strategy: fail-fast: false matrix: os: [ubuntu-latest] include: - os: ubuntu-latest flutter_profile: development-linux-x86_64 target: x86_64-unknown-linux-gnu runs-on: ${{ matrix.os }} steps: - name: Checkout appflowy cloud code uses: actions/checkout@v4 with: repository: AppFlowy-IO/AppFlowy-Cloud path: AppFlowy-Cloud - name: Prepare appflowy cloud env working-directory: AppFlowy-Cloud run: | # log level cp deploy.env .env sed -i 's|RUST_LOG=.*|RUST_LOG=trace|' .env sed -i 's/GOTRUE_EXTERNAL_GOOGLE_ENABLED=.*/GOTRUE_EXTERNAL_GOOGLE_ENABLED=true/' .env sed -i 's|API_EXTERNAL_URL=.*|API_EXTERNAL_URL=http://localhost|' .env - name: Run Docker-Compose working-directory: AppFlowy-Cloud run: | docker compose down -v --remove-orphans docker compose pull docker compose up -d sleep 10 - name: Checkout source code uses: actions/checkout@v4 - name: Install flutter id: flutter uses: subosito/flutter-action@v2 with: channel: "stable" flutter-version: ${{ env.FLUTTER_VERSION }} cache: true - uses: taiki-e/install-action@v2 with: tool: cargo-make@${{ env.CARGO_MAKE_VERSION }} - name: Install prerequisites working-directory: frontend run: | sudo wget -qO /etc/apt/trusted.gpg.d/dart_linux_signing_key.asc https://dl-ssl.google.com/linux/linux_signing_key.pub sudo wget -qO /etc/apt/sources.list.d/dart_stable.list https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list sudo apt-get update sudo apt-get install -y dart curl build-essential libssl-dev clang cmake ninja-build pkg-config libgtk-3-dev keybinder-3.0 libnotify-dev shell: bash - name: Enable Flutter Desktop run: | flutter config --enable-linux-desktop shell: bash - uses: actions/download-artifact@v4 with: name: ${{ github.run_id }}-${{ matrix.os }} - name: Uncompressed appflowy_flutter run: | tar -xf appflowy_flutter.tar.gz ls -al - name: Run flutter pub get working-directory: frontend run: cargo make pub_get - name: Run Flutter integration tests working-directory: frontend/appflowy_flutter run: | export DISPLAY=:99 sudo Xvfb -ac :99 -screen 0 1280x1024x24 > /dev/null 2>&1 & sudo apt-get install network-manager docker ps -a flutter test integration_test/cloud/cloud_runner.dart -d Linux --coverage shell: bash integration_test: needs: [prepare] if: github.event.pull_request.draft != true strategy: fail-fast: false matrix: os: [ubuntu-latest] include: - os: ubuntu-latest flutter_profile: development-linux-x86_64 target: x86_64-unknown-linux-gnu runs-on: ${{ matrix.os }} steps: - name: Checkout source code uses: actions/checkout@v4 - name: Install Rust toolchain id: rust_toolchain uses: actions-rs/toolchain@v1 with: toolchain: ${{ env.RUST_TOOLCHAIN }} target: ${{ matrix.target }} override: true profile: minimal - name: Install flutter id: flutter uses: subosito/flutter-action@v2 with: channel: "stable" flutter-version: ${{ env.FLUTTER_VERSION }} cache: true - uses: taiki-e/install-action@v2 with: tool: cargo-make@${{ env.CARGO_MAKE_VERSION }} - name: Install prerequisites working-directory: frontend run: | if [ "$RUNNER_OS" == "Linux" ]; then sudo wget -qO /etc/apt/trusted.gpg.d/dart_linux_signing_key.asc https://dl-ssl.google.com/linux/linux_signing_key.pub sudo wget -qO /etc/apt/sources.list.d/dart_stable.list https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list sudo apt-get update sudo apt-get install -y dart curl build-essential libssl-dev clang cmake ninja-build pkg-config libgtk-3-dev keybinder-3.0 libnotify-dev fi shell: bash - name: Enable Flutter Desktop run: | if [ "$RUNNER_OS" == "Linux" ]; then flutter config --enable-linux-desktop elif [ "$RUNNER_OS" == "macOS" ]; then flutter config --enable-macos-desktop elif [ "$RUNNER_OS" == "Windows" ]; then git config --system core.longpaths true flutter config --enable-windows-desktop fi shell: bash - uses: actions/download-artifact@v4 with: name: ${{ github.run_id }}-${{ matrix.os }} - name: Uncompressed appflowy_flutter run: tar -xf appflowy_flutter.tar.gz - name: Run flutter pub get working-directory: frontend run: cargo make pub_get - name: Run Flutter integration tests working-directory: frontend/appflowy_flutter run: | if [ "$RUNNER_OS" == "Linux" ]; then export DISPLAY=:99 sudo Xvfb -ac :99 -screen 0 1280x1024x24 > /dev/null 2>&1 & sudo apt-get install network-manager flutter test integration_test/runner.dart -d Linux --coverage elif [ "$RUNNER_OS" == "macOS" ]; then flutter test integration_test/runner.dart -d macOS --coverage elif [ "$RUNNER_OS" == "Windows" ]; then flutter test integration_test/runner.dart -d Windows --coverage fi shell: bash build: needs: [prepare] if: github.event.pull_request.draft != true strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] include: - os: ubuntu-latest flutter_profile: development-linux-x86_64 target: x86_64-unknown-linux-gnu - os: macos-latest flutter_profile: development-mac-x86_64 target: x86_64-apple-darwin - os: windows-latest flutter_profile: development-windows-x86 target: x86_64-pc-windows-msvc runs-on: ${{ matrix.os }} steps: - name: Checkout source code uses: actions/checkout@v4 - name: Install Rust toolchain id: rust_toolchain uses: actions-rs/toolchain@v1 with: toolchain: ${{ env.RUST_TOOLCHAIN }} target: ${{ matrix.target }} override: true profile: minimal - name: Install flutter id: flutter uses: subosito/flutter-action@v2 with: channel: "stable" flutter-version: ${{ env.FLUTTER_VERSION }} cache: true - uses: taiki-e/install-action@v2 with: tool: cargo-make@${{ env.CARGO_MAKE_VERSION }} - name: Install prerequisites working-directory: frontend run: | if [ "$RUNNER_OS" == "Linux" ]; then sudo wget -qO /etc/apt/trusted.gpg.d/dart_linux_signing_key.asc https://dl-ssl.google.com/linux/linux_signing_key.pub sudo wget -qO /etc/apt/sources.list.d/dart_stable.list https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list sudo apt-get update sudo apt-get install -y dart curl build-essential libssl-dev clang cmake ninja-build pkg-config libgtk-3-dev keybinder-3.0 libnotify-dev fi shell: bash - name: Enable Flutter Desktop run: | if [ "$RUNNER_OS" == "Linux" ]; then flutter config --enable-linux-desktop elif [ "$RUNNER_OS" == "macOS" ]; then flutter config --enable-macos-desktop elif [ "$RUNNER_OS" == "Windows" ]; then git config --system core.longpaths true flutter config --enable-windows-desktop fi shell: bash - uses: actions/download-artifact@v4 with: name: ${{ github.run_id }}-${{ matrix.os }} - name: Uncompressed appflowy_flutter run: tar -xf appflowy_flutter.tar.gz - name: Build flutter product working-directory: frontend run: | cargo make --profile ${{ matrix.flutter_profile }} appflowy-make-product-dev