Build AppFlowy macOS #122
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Build AppFlowy macOS | |
on: | |
workflow_dispatch: | |
inputs: | |
repo: | |
description: "Repo" | |
required: true | |
default: "AppFlowy-IO/AppFlowy" | |
branch: | |
description: "Branch" | |
required: true | |
default: "main" | |
build_name: | |
description: "Build Version (it should match the version in pubspec.yaml)" | |
required: true | |
default: "0.7.8" | |
arch: | |
type: choice | |
description: "Build Architecture" | |
required: true | |
options: | |
- All | |
- x86_64 | |
- aarch64 | |
- universal | |
internal_build: | |
type: choice | |
description: "Internal Build Type (1 for internal, 0 for external)" | |
required: true | |
default: "1" | |
options: | |
- 0 | |
- 1 | |
env: | |
FLUTTER_VERSION: "3.22.0" | |
RUST_TOOLCHAIN: "1.80.1" | |
jobs: | |
x86_64: | |
runs-on: macos-13 | |
if: ${{ github.event.inputs.arch == 'All' || github.event.inputs.arch == 'x86_64' }} | |
env: | |
MACOS_APP_RELEASE_PATH: frontend/appflowy_flutter/product/${{ github.event.inputs.build_name }}/macos/Release | |
MACOS_X86_ZIP_NAME: AppFlowy-${{ github.event.inputs.build_name }}-macos-x86_64.zip | |
MACOS_DMG_NAME: AppFlowy-${{ github.event.inputs.build_name }}-macos-x86_64 | |
steps: | |
- name: Checkout source code | |
uses: actions/checkout@v2 | |
with: | |
repository: ${{ github.event.inputs.repo }} | |
ref: ${{ github.event.inputs.branch }} | |
- name: Install flutter | |
uses: subosito/flutter-action@v2 | |
with: | |
cache: true | |
channel: "stable" | |
flutter-version: ${{ env.FLUTTER_VERSION }} | |
- name: Install Rust toolchain | |
uses: actions-rs/toolchain@v1 | |
with: | |
toolchain: ${{ env.RUST_TOOLCHAIN }} | |
target: x86_64-apple-darwin | |
override: true | |
components: rustfmt | |
profile: minimal | |
- uses: davidB/rust-cargo-make@v1 | |
with: | |
version: "0.37.5" | |
- name: Install prerequisites | |
working-directory: frontend | |
run: | | |
cargo install duckscript_cli --force --locked | |
- name: Generate env file | |
working-directory: frontend/appflowy_flutter | |
run: | | |
echo "INTERNAL_BUILD=${{ github.env.inputs.internal_build }}" >> .env | |
shell: bash | |
- name: Build AppFlowy | |
working-directory: frontend | |
run: | | |
flutter config --enable-macos-desktop | |
dart ./scripts/flutter_release_build/build_flowy.dart run . ${{ github.event.inputs.build_name }} | |
- name: Codesign AppFlowy | |
run: | | |
echo ${{ secrets.MACOS_CERTIFICATE_BASE64 }} | base64 --decode > certificate.p12 | |
security create-keychain -p action build.keychain | |
security default-keychain -s build.keychain | |
security unlock-keychain -p action build.keychain | |
security import certificate.p12 -k build.keychain -P ${{ secrets.P12_PASSWORD }} -T /usr/bin/codesign | |
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k action build.keychain | |
/usr/bin/codesign --force --options runtime --deep --sign "${{ secrets.MACOS_CODESIGN_ID }}" "${{ env.MACOS_APP_RELEASE_PATH }}/AppFlowy.app" -v | |
- name: Create macOS dmg | |
run: | | |
brew install create-dmg | |
create-dmg \ | |
--volname ${{ env.MACOS_DMG_NAME }} \ | |
--hide-extension "AppFlowy.app" \ | |
--background frontend/scripts/dmg_assets/AppFlowyInstallerBackground.jpg \ | |
--window-size 600 450 \ | |
--icon-size 94 \ | |
--icon "AppFlowy.app" 141 249 \ | |
--app-drop-link 458 249 \ | |
"${{ env.MACOS_APP_RELEASE_PATH }}/${{ env.MACOS_DMG_NAME }}.dmg" \ | |
"${{ env.MACOS_APP_RELEASE_PATH }}/AppFlowy.app" | |
- name: Notarize AppFlowy | |
run: | | |
xcrun notarytool submit ${{ env.MACOS_APP_RELEASE_PATH }}/${{ env.MACOS_DMG_NAME }}.dmg --apple-id ${{ secrets.MACOS_NOTARY_USER }} --team-id ${{ secrets.MACOS_TEAM_ID }} --password ${{ secrets.MACOS_NOTARY_PWD }} -v -f "json" --wait | |
- name: Archive Asset | |
working-directory: ${{ env.MACOS_APP_RELEASE_PATH }} | |
run: zip --symlinks -qr ${{ env.MACOS_X86_ZIP_NAME }} AppFlowy.app | |
- name: Upload ZIP | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ env.MACOS_X86_ZIP_NAME }} | |
path: ${{ env.MACOS_APP_RELEASE_PATH }}/${{ env.MACOS_X86_ZIP_NAME }} | |
- name: Upload DMG | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ env.MACOS_DMG_NAME }}.dmg | |
path: ${{ env.MACOS_APP_RELEASE_PATH }}/${{ env.MACOS_DMG_NAME }}.dmg | |
aarch64: | |
runs-on: macos-15 | |
if: ${{ github.event.inputs.arch == 'All' || github.event.inputs.arch == 'aarch64' }} | |
env: | |
MACOS_APP_RELEASE_PATH: frontend/appflowy_flutter/product/${{ github.event.inputs.build_name }}/macos/Release | |
MACOS_AARCH64_ZIP_NAME: AppFlowy-${{ github.event.inputs.build_name }}-macos-aarch64.zip | |
MACOS_DMG_NAME: AppFlowy-${{ github.event.inputs.build_name }}-macos-aarch64 | |
steps: | |
- name: Checkout source code | |
uses: actions/checkout@v2 | |
with: | |
repository: ${{ github.event.inputs.repo }} | |
ref: ${{ github.event.inputs.branch }} | |
- name: Install flutter | |
uses: subosito/flutter-action@v2 | |
with: | |
cache: true | |
channel: "stable" | |
flutter-version: ${{ env.FLUTTER_VERSION }} | |
- name: Install Rust toolchain | |
uses: actions-rs/toolchain@v1 | |
with: | |
toolchain: ${{ env.RUST_TOOLCHAIN }} | |
target: aarch64-apple-darwin | |
override: true | |
components: rustfmt | |
profile: minimal | |
- uses: davidB/rust-cargo-make@v1 | |
with: | |
version: "0.37.5" | |
- name: Install prerequisites | |
working-directory: frontend | |
run: | | |
cargo install duckscript_cli --force --locked | |
- name: Generate env file | |
working-directory: frontend/appflowy_flutter | |
run: | | |
echo "INTERNAL_BUILD=${{ github.env.inputs.internal_build }}" >> .env | |
shell: bash | |
- name: Build AppFlowy | |
working-directory: frontend | |
run: | | |
flutter config --enable-macos-desktop | |
dart ./scripts/flutter_release_build/build_flowy.dart run . ${{ github.event.inputs.build_name }} | |
- name: Codesign AppFlowy | |
run: | | |
echo ${{ secrets.MACOS_CERTIFICATE_BASE64 }} | base64 --decode > certificate.p12 | |
security create-keychain -p action build.keychain | |
security default-keychain -s build.keychain | |
security unlock-keychain -p action build.keychain | |
security import certificate.p12 -k build.keychain -P ${{ secrets.P12_PASSWORD }} -T /usr/bin/codesign | |
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k action build.keychain | |
/usr/bin/codesign --force --options runtime --deep --sign "${{ secrets.MACOS_CODESIGN_ID }}" "${{ env.MACOS_APP_RELEASE_PATH }}/AppFlowy.app" -v | |
- name: Create macOS dmg | |
continue-on-error: true | |
run: | | |
brew install create-dmg | |
create-dmg \ | |
--volname ${{ env.MACOS_DMG_NAME }} \ | |
--hide-extension "AppFlowy.app" \ | |
--background frontend/scripts/dmg_assets/AppFlowyInstallerBackground.jpg \ | |
--window-size 600 450 \ | |
--icon-size 94 \ | |
--icon "AppFlowy.app" 141 249 \ | |
--app-drop-link 458 249 \ | |
"${{ env.MACOS_APP_RELEASE_PATH }}/${{ env.MACOS_DMG_NAME }}.dmg" \ | |
"${{ env.MACOS_APP_RELEASE_PATH }}/AppFlowy.app" | |
- name: Notarize AppFlowy | |
continue-on-error: true | |
run: | | |
xcrun notarytool submit ${{ env.MACOS_APP_RELEASE_PATH }}/${{ env.MACOS_DMG_NAME }}.dmg --apple-id ${{ secrets.MACOS_NOTARY_USER }} --team-id ${{ secrets.MACOS_TEAM_ID }} --password ${{ secrets.MACOS_NOTARY_PWD }} -v -f "json" --wait | |
- name: Archive Asset | |
working-directory: ${{ env.MACOS_APP_RELEASE_PATH }} | |
run: zip --symlinks -qr ${{ env.MACOS_AARCH64_ZIP_NAME }} AppFlowy.app | |
- name: Upload ZIP | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ env.MACOS_AARCH64_ZIP_NAME }} | |
path: ${{ env.MACOS_APP_RELEASE_PATH }}/${{ env.MACOS_AARCH64_ZIP_NAME }} | |
- name: Upload DMG | |
uses: actions/upload-artifact@v4 | |
continue-on-error: true | |
with: | |
name: ${{ env.MACOS_DMG_NAME }}.dmg | |
path: ${{ env.MACOS_APP_RELEASE_PATH }}/${{ env.MACOS_DMG_NAME }}.dmg | |
universal: | |
runs-on: macos-latest | |
if: ${{ github.event.inputs.arch == 'All' || github.event.inputs.arch == 'universal' }} | |
env: | |
MACOS_APP_RELEASE_PATH: frontend/appflowy_flutter/product/${{ github.event.inputs.build_name }}/macos/Release | |
MACOS_AARCH64_ZIP_NAME: AppFlowy-${{ github.event.inputs.build_name }}-macos-universal.zip | |
MACOS_DMG_NAME: AppFlowy-${{ github.event.inputs.build_name }}-macos-universal | |
steps: | |
- name: Checkout source code | |
uses: actions/checkout@v2 | |
with: | |
repository: ${{ github.event.inputs.repo }} | |
ref: ${{ github.event.inputs.branch }} | |
- name: Install flutter | |
uses: subosito/flutter-action@v2 | |
with: | |
cache: true | |
channel: "stable" | |
flutter-version: ${{ env.FLUTTER_VERSION }} | |
- name: Install Rust toolchain | |
uses: dtolnay/rust-toolchain@stable | |
with: | |
toolchain: ${{ env.RUST_TOOLCHAIN }} | |
targets: "aarch64-apple-darwin,x86_64-apple-darwin" | |
components: rustfmt | |
- uses: davidB/rust-cargo-make@v1 | |
with: | |
version: "0.37.5" | |
- name: Install prerequisites | |
working-directory: frontend | |
run: | | |
cargo install duckscript_cli --force --locked | |
- name: Generate env file | |
working-directory: frontend/appflowy_flutter | |
run: | | |
echo "INTERNAL_BUILD=${{ github.env.inputs.internal_build }}" >> .env | |
shell: bash | |
- name: Build AppFlowy | |
working-directory: frontend | |
run: | | |
flutter config --enable-macos-desktop | |
sh scripts/flutter_release_build/build_universal_package_for_macos.sh ${{ github.event.inputs.build_name }} | |
- name: Codesign AppFlowy | |
run: | | |
echo ${{ secrets.MACOS_CERTIFICATE_BASE64 }} | base64 --decode > certificate.p12 | |
security create-keychain -p action build.keychain | |
security default-keychain -s build.keychain | |
security unlock-keychain -p action build.keychain | |
security import certificate.p12 -k build.keychain -P ${{ secrets.P12_PASSWORD }} -T /usr/bin/codesign | |
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k action build.keychain | |
/usr/bin/codesign --force --options runtime --deep --sign "${{ secrets.MACOS_CODESIGN_ID }}" "${{ env.MACOS_APP_RELEASE_PATH }}/AppFlowy.app" -v | |
- name: Create macOS dmg | |
run: | | |
brew install create-dmg | |
create-dmg \ | |
--volname ${{ env.MACOS_DMG_NAME }} \ | |
--hide-extension "AppFlowy.app" \ | |
--background frontend/scripts/dmg_assets/AppFlowyInstallerBackground.jpg \ | |
--window-size 600 450 \ | |
--icon-size 94 \ | |
--icon "AppFlowy.app" 141 249 \ | |
--app-drop-link 458 249 \ | |
"${{ env.MACOS_APP_RELEASE_PATH }}/${{ env.MACOS_DMG_NAME }}.dmg" \ | |
"${{ env.MACOS_APP_RELEASE_PATH }}/AppFlowy.app" | |
- name: Check for Secret availability | |
id: secret-check | |
shell: bash | |
run: | | |
if [ "${{ secrets.MACOS_NOTARY_USER }}" == '' ]; then | |
echo "available=false" >> $GITHUB_OUTPUT; | |
elif [ "${{ secrets.MACOS_TEAM_ID }}" == '' ]; then | |
echo "available=false" >> $GITHUB_OUTPUT; | |
elif [ "${{ secrets.MACOS_NOTARY_PWD }}" == '' ]; then | |
echo "available=false" >> $GITHUB_OUTPUT; | |
else | |
echo "available=true" >> $GITHUB_OUTPUT; | |
fi | |
- name: Notarize AppFlowy | |
if: ${{ steps.secret-check.outputs.available == 'true' }} | |
run: | | |
xcrun notarytool submit ${{ env.MACOS_APP_RELEASE_PATH }}/${{ env.MACOS_DMG_NAME }}.dmg --apple-id ${{ secrets.MACOS_NOTARY_USER }} --team-id ${{ secrets.MACOS_TEAM_ID }} --password ${{ secrets.MACOS_NOTARY_PWD }} -v -f "json" --wait | |
- name: Archive Asset | |
working-directory: ${{ env.MACOS_APP_RELEASE_PATH }} | |
run: zip --symlinks -qr ${{ env.MACOS_AARCH64_ZIP_NAME }} AppFlowy.app | |
- name: Upload ZIP | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ env.MACOS_AARCH64_ZIP_NAME }} | |
path: ${{ env.MACOS_APP_RELEASE_PATH }}/${{ env.MACOS_AARCH64_ZIP_NAME }} | |
- name: Upload DMG | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ env.MACOS_DMG_NAME }}.dmg | |
path: ${{ env.MACOS_APP_RELEASE_PATH }}/${{ env.MACOS_DMG_NAME }}.dmg | |
notify-failure: | |
runs-on: ubuntu-latest | |
needs: universal | |
if: failure() | |
steps: | |
- uses: 8398a7/action-slack@v3 | |
with: | |
status: ${{ job.status }} | |
text: | | |
🔴🔴🔴 Workflow ${{ github.workflow }} in repository ${{ github.repository }} was failed 🔴🔴🔴. | |
fields: repo,message,author,eventName,ref,workflow | |
env: | |
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} | |
if: always() |