Skip to content

Build-Desktop-Release #37

Build-Desktop-Release

Build-Desktop-Release #37

# This is the main desktop application release workflow for both nightly and beta/stable releases.
name: Build-Desktop-Release
on:
workflow_dispatch:
inputs:
build-target:
description: 'Build Target (Release Type)'
type: choice
required: true
options:
- beta
- nightly
- non-release
default: "non-release"
git-ref:
description: "Release Git Ref (Which branch or tag to build?)"
required: true
default: "master"
is-draft:
description: 'Draft Release? (Beta only, Nightly will always be a non-draft)'
type: boolean
required: true
default: true
is-pre-release:
description: 'Pre Release? (labeled as "PreRelease")'
type: boolean
required: true
default: true
enable-file-sync-production:
description: 'File sync production mode'
type: boolean
required: true
default: true
enable-plugins:
description: 'Build with plugin system support'
type: boolean
required: true
default: true
build-android:
description: 'Build Android App'
type: boolean
required: true
default: true
schedule: # Every workday at the 2 P.M. (UTC) we run a scheduled nightly build
- cron: '0 14 * * MON-FRI'
env:
CLOJURE_VERSION: '1.11.1.1413'
NODE_VERSION: '18'
JAVA_VERSION: '11'
jobs:
compile-cljs:
runs-on: ubuntu-20.04
steps:
- name: Check build options
if: ${{ github.event_name == 'workflow_dispatch' && (github.event.inputs.build-target == 'nightly' || github.event.inputs.build-target == 'beta') && github.event.inputs.git-ref != 'master' }}
run: |
echo "::error title=CheckFail::Nightly and Beta Release MUST be built from master"
exit 1
- name: Check out Git repository
uses: actions/checkout@v3
with:
ref: ${{ github.event.inputs.git-ref }}
- name: Install Node.js, NPM and Yarn
uses: actions/setup-node@v3
with:
node-version: ${{ env.NODE_VERSION }}
- name: Get yarn cache directory path
id: yarn-cache-dir-path
run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- name: Cache yarn cache directory
uses: actions/cache@v3
id: yarn-cache
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- name: Setup Java JDK
uses: actions/setup-java@v3
with:
distribution: 'zulu'
java-version: ${{ env.JAVA_VERSION }}
- name: Cache clojure deps
uses: actions/cache@v3
with:
path: |
~/.m2/repository
~/.gitlibs
key: ${{ runner.os }}-clojure-lib-${{ hashFiles('**/deps.edn') }}
- name: Setup clojure
uses: DeLaGuardo/setup-clojure@10.1
with:
cli: ${{ env.CLOJURE_VERSION }}
- name: Retrieve tag version
id: ref
run: |
pkgver=$(node ./scripts/get-pkg-version.js "${{ github.event.inputs.build-target }}")
echo "version=$pkgver" >> $GITHUB_OUTPUT
- name: Do Not Overwrite Existing Release
if: ${{ github.event.inputs.build-target == 'beta' }}
run: |
if curl -f "https://api.github.com/repos/${{ github.repository }}/releases/tags/${{ steps.ref.outputs.version }}" &>/dev/null; then
echo "::error title=CheckFail::Release already exists"
exit 1
fi
- name: Update Nightly APP Version
if: ${{ github.event.inputs.build-target == 'nightly' || github.event_name == 'schedule' }}
run: |
sed -i 's/defonce version ".*"/defonce version "${{ steps.ref.outputs.version }}"/g' src/main/frontend/version.cljs
- name: Set Build Environment Variables (only when workflow_dispatch)
if: ${{ github.event_name == 'workflow_dispatch' }}
# if scheduled, use default settings
run: |
echo "ENABLE_PLUGINS=${{ github.event_name == 'schedule' || github.event.inputs.enable-plugins == 'true' }}" >> $GITHUB_ENV
echo "ENABLE_FILE_SYNC_PRODUCTION=${{ github.event_name == 'schedule' || github.event.inputs.enable-file-sync-production == 'true' }}" >> $GITHUB_ENV
- name: Compile CLJS
run: yarn install && gulp build && yarn cljs:release-electron
env:
LOGSEQ_SENTRY_DSN: ${{ secrets.LOGSEQ_SENTRY_DSN }}
LOGSEQ_POSTHOG_TOKEN: ${{ secrets.LOGSEQ_POSTHOG_TOKEN }}
- name: Update APP Version
run: |
sed -i 's/"version": "0.0.1"/"version": "${{ steps.ref.outputs.version }}"/g' ./package.json
working-directory: ./static
- name: Display Package.json
run: cat ./package.json
working-directory: ./static
- name: Save VERSION file
run: echo "${{ steps.ref.outputs.version }}" > ./VERSION
working-directory: ./static
- name: List Files
run: ls -al
working-directory: ./static
- name: Upload Sentry Sourcemaps (beta only)
if: ${{ github.repository == 'logseq/logseq' && github.event_name == 'workflow_dispatch' && github.event.inputs.build-target == 'beta' }}
run: |
curl -sL https://sentry.io/get-cli/ | bash
release_name="logseq@${{ steps.ref.outputs.version }}"
sentry-cli releases new "${release_name}"
sentry-cli releases files "${release_name}" upload-sourcemaps --ext map --ext js ./static/js --url-prefix '~/static/js'
sentry-cli releases finalize "${release_name}"
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
SENTRY_ORG: logseq
SENTRY_PROJECT: logseq
- name: Cache Static File
uses: actions/upload-artifact@v3
with:
name: static
path: static
e2e-test:
name: E2E Test Shard ${{ matrix.shard }}
runs-on: ubuntu-latest
strategy:
matrix:
shard: [1, 2, 3]
needs: [ compile-cljs ]
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Download The Static Asset
uses: actions/download-artifact@v3
with:
name: static
path: static
- name: Set up Node
uses: actions/setup-node@v3
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'yarn'
cache-dependency-path: |
yarn.lock
static/yarn.lock
- name: Fetch yarn deps for E2E test
run: |
yarn install
(cd static && yarn install && yarn rebuild:all)
env:
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: true
- name: Install Fluxbox
run: sudo apt-get update && sudo apt-get install -y fluxbox
# Emulate a virtual framebuffer on machines with no display hardware
- name: Run XVFB
run: Xvfb :1 -screen 0 1024x768x24 >/dev/null 2>&1 &
# Start a lightweight window manager to simulate window actions (maximize,restore etc)
- name: Start Fluxbox
run: DISPLAY=:1.0 fluxbox >/dev/null 2>&1 &
- name: Run Playwright test
run: DISPLAY=:1.0 npx playwright test --reporter github --shard=${{ matrix.shard }}/3
env:
LOGSEQ_CI: true
DEBUG: "pw:api"
RELEASE: true # skip dev only test
build-linux-x64:
runs-on: ubuntu-20.04
needs: [ compile-cljs ]
steps:
- name: Download The Static Asset
uses: actions/download-artifact@v3
with:
name: static
path: static
- name: Retrieve tag version
id: ref
run: |
pkgver=$(cat ./static/VERSION)
echo "version=$pkgver" >> $GITHUB_OUTPUT
- name: Install Node.js, NPM and Yarn
uses: actions/setup-node@v3
with:
node-version: ${{ env.NODE_VERSION }}
# - name: Cache Node Modules
# uses: actions/cache@v3
# with:
# path: |
# **/node_modules
# key: ${{ runner.os }}-node-modules
- name: Build/Release Electron App
run: yarn install && yarn electron:make
working-directory: ./static
- name: Save artifacts
run: |
mkdir -p builds
# NOTE: save VERSION file to builds directory
cp static/VERSION ./builds/VERSION
mv static/out/make/*-*.AppImage ./builds/Logseq-linux-x64-${{ steps.ref.outputs.version }}.AppImage
mv static/out/make/zip/linux/x64/*-linux-x64-*.zip ./builds/Logseq-linux-x64-${{ steps.ref.outputs.version }}.zip
- name: Upload Artifact
uses: actions/upload-artifact@v3
with:
name: logseq-linux-x64-builds
path: builds
build-linux-arm64:
runs-on: ubuntu-20.04
needs: [ compile-cljs ]
steps:
- name: Download The Static Asset
uses: actions/download-artifact@v3
with:
name: static
path: static
- name: Retrieve tag version
id: ref
run: |
pkgver=$(cat ./static/VERSION)
echo "version=$pkgver" >> $GITHUB_OUTPUT
- name: Install Node.js, NPM and Yarn
uses: actions/setup-node@v3
with:
node-version: ${{ env.NODE_VERSION }}
- name: Fetch deps
env:
npm_config_arch: arm64
run: |
yarn install --target_arch=arm64 --target_platform=linux
rsapi_version=`node -e 'console.log(require("@logseq/rsapi/package.json").optionalDependencies["@logseq/rsapi-linux-arm64-gnu"])'`
temp_dir=`mktemp -d`
cd "$temp_dir"
echo '{"dependencies": {"@logseq/rsapi-linux-arm64-gnu": "'"$rsapi_version"'"}}' > package.json
yarn install --ignore-platform
cd -
mv "$temp_dir/node_modules/@logseq/rsapi-linux-arm64-gnu" node_modules/@logseq/rsapi-linux-arm64-gnu
rm -rf "$temp_dir" "node_modules/@logseq/rsapi-linux-x64-gnu"
working-directory: ./static
- name: Build/Release Electron App
run: yarn electron:make-linux-arm64
working-directory: ./static
- name: Save artifacts
run: |
mkdir -p builds
# NOTE: save VERSION file to builds directory
cp static/VERSION ./builds/VERSION
# mv static/out/make/*-*.AppImage ./builds/Logseq-linux-arm64-${{ steps.ref.outputs.version }}.AppImage
mv static/out/make/zip/linux/arm64/*-linux-arm64-*.zip ./builds/Logseq-linux-arm64-${{ steps.ref.outputs.version }}.zip
- name: Upload Artifact
uses: actions/upload-artifact@v3
with:
name: logseq-linux-arm64-builds
path: builds
build-windows:
runs-on: windows-latest
needs: [ compile-cljs ]
steps:
- name: Download The Static Asset
uses: actions/download-artifact@v3
with:
name: static
path: static
- name: Retrieve tag version
id: ref
run: echo "version=$(cat ./static/VERSION)" >> $env:GITHUB_OUTPUT
- name: Install Node.js, NPM and Yarn
uses: actions/setup-node@v3
with:
node-version: ${{ env.NODE_VERSION }}
# - name: Cache Node Modules
# uses: actions/cache@v3
# with:
# path: |
# **/node_modules
# key: ${{ runner.os }}-node-modules
- name: Deps Electron app
run: yarn install
working-directory: ./static
- name: Fix Deps Electron app
run: yarn run postinstall
working-directory: ./static/node_modules/dugite/
- name: Build/Release Electron app
run: yarn electron:make
working-directory: ./static
#env:
# CODE_SIGN_CERTIFICATE_FILE: ../codesign.pfx
# CODE_SIGN_CERTIFICATE_PASSWORD: ${{ secrets.CODE_SIGN_CERTIFICATE_PASSWORD }}
- name: Save Artifact for Code Signing
run: |
mkdir builds
mv static\out\make\squirrel.windows\x64\*.exe builds\Logseq-win-x64-${{ steps.ref.outputs.version }}.exe
- name: Upload Artifact for Code Signing
uses: actions/upload-artifact@v3
with:
name: logseq-win64-unsigned-builds
path: builds
- name: Save Artifact
run: |
rm builds\*.exe
mv static\out\make\squirrel.windows\x64\*.nupkg builds\Logseq-win-x64-${{ steps.ref.outputs.version }}-full.nupkg
mv static\out\make\zip\win32\x64\*.zip builds\Logseq-win-x64-${{ steps.ref.outputs.version }}.zip
mv static\out\make\squirrel.windows\x64\RELEASES builds\RELEASES
- name: Upload Artifact
uses: actions/upload-artifact@v3
with:
name: logseq-win64-builds
path: builds
build-macos-x64:
needs: [ compile-cljs ]
runs-on: macos-11
steps:
- name: Download The Static Asset
uses: actions/download-artifact@v3
with:
name: static
path: static
- name: Retrieve tag version
id: ref
run: |
pkgver=$(cat ./static/VERSION)
echo "version=$pkgver" >> $GITHUB_OUTPUT
- name: List Static Files
run: ls -al ./static
- name: Install Node.js, NPM and Yarn
uses: actions/setup-node@v3
with:
node-version: ${{ env.NODE_VERSION }}
- name: Install Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Get yarn cache directory path
id: yarn-cache-dir-path
run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- name: Cache yarn cache directory
uses: actions/cache@v3
id: yarn-cache
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- name: Signing By Apple Developer ID
if: ${{ github.repository == 'logseq/logseq' }}
uses: apple-actions/import-codesign-certs@v1
with:
p12-file-base64: ${{ secrets.APPLE_CERTIFICATES_P12 }}
p12-password: ${{ secrets.APPLE_CERTIFICATES_P12_PASSWORD }}
# - name: Cache Node Modules
# uses: actions/cache@v3
# with:
# path: |
# **/node_modules
# key: ${{ runner.os }}-node-modules
- name: Build/Release Electron App for x64
run: yarn install && yarn electron:make
working-directory: ./static
env:
APPLE_ID: ${{ secrets.APPLE_ID_EMAIL }}
APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
- name: Save x64 artifacts
run: |
mkdir -p builds
mv static/out/make/Logseq.dmg ./builds/Logseq-darwin-x64-${{ steps.ref.outputs.version }}.dmg
mv static/out/make/zip/darwin/x64/*.zip ./builds/Logseq-darwin-x64-${{ steps.ref.outputs.version }}.zip
- name: Upload Artifact
uses: actions/upload-artifact@v3
with:
name: logseq-darwin-x64-builds
path: builds
build-macos-arm64:
needs: [ compile-cljs ]
runs-on: macos-11
steps:
- name: Download The Static Asset
uses: actions/download-artifact@v3
with:
name: static
path: static
- name: Retrieve tag version
id: ref
run: |
pkgver=$(cat ./static/VERSION)
echo "version=$pkgver" >> $GITHUB_OUTPUT
- name: Install Node.js, NPM and Yarn
uses: actions/setup-node@v3
with:
node-version: ${{ env.NODE_VERSION }}
- name: Get yarn cache directory path
id: yarn-cache-dir-path
run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- name: Cache yarn cache directory
uses: actions/cache@v3
id: yarn-cache
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-arm64-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-arm64-yarn-
- name: Install Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Signing By Apple Developer ID
if: ${{ github.repository == 'logseq/logseq' }}
uses: apple-actions/import-codesign-certs@v1
with:
p12-file-base64: ${{ secrets.APPLE_CERTIFICATES_P12 }}
p12-password: ${{ secrets.APPLE_CERTIFICATES_P12_PASSWORD }}
# - name: Cache Node Modules
# uses: actions/cache@v3
# with:
# path: |
# **/node_modules
# key: ${{ runner.os }}-node-modules
- name: Fetch deps and fix dugit arch for arm64
run: yarn install --ignore-platform && cd node_modules/dugite && npm_config_arch=arm64 node script/download-git.js
working-directory: ./static
- name: Build/Release Electron App for arm64
run: yarn electron:make-macos-arm64
working-directory: ./static
env:
APPLE_ID: ${{ secrets.APPLE_ID_EMAIL }}
APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
- name: Save arm64 artifacts
run: |
mkdir -p builds
mv static/out/make/Logseq.dmg ./builds/Logseq-darwin-arm64-${{ steps.ref.outputs.version }}.dmg
mv static/out/make/zip/darwin/arm64/*.zip ./builds/Logseq-darwin-arm64-${{ steps.ref.outputs.version }}.zip
- name: Upload Artifact
uses: actions/upload-artifact@v3
with:
name: logseq-darwin-arm64-builds
path: builds
# reuse workflow via workflow_call
build-android:
uses: ./.github/workflows/build-android.yml
if: ${{ github.event_name == 'schedule' || github.event.inputs.build-android == 'true' }}
with:
build-target: "${{ github.event.inputs.build-target }}"
# if scheduled, use production mode
enable-file-sync-production: "${{ github.event_name == 'schedule' || github.event.inputs.enable-file-sync-production == 'true' }}"
secrets:
ANDROID_KEYSTORE: "${{ secrets.ANDROID_KEYSTORE }}"
ANDROID_KEYSTORE_PASSWORD: "${{ secrets.ANDROID_KEYSTORE_PASSWORD }}"
SENTRY_AUTH_TOKEN: "${{ secrets.SENTRY_AUTH_TOKEN }}"
codesign-windows:
if: ${{ github.event_name == 'schedule' || github.event.inputs.build-target == 'nightly' || github.event.inputs.build-target == 'beta' }}
needs: [ build-windows ]
runs-on: [self-hosted, macos, token]
steps:
- name: Download Windows Artifact
uses: actions/download-artifact@v3
with:
name: logseq-win64-unsigned-builds
path: ./builds
- name: Sign Windows Executable
run: |
ls -lah ./builds
jsign --storetype ETOKEN --storepass "${PASS}" -t http://timestamp.digicert.com ./builds/*.exe
env:
PASS: ${{ secrets.CODE_SIGN_CERTIFICATE_PASSWORD }}
- name: Upload Artifact
uses: actions/upload-artifact@v3
with:
name: logseq-win64-signed-builds
path: builds
nightly-release:
if: ${{ github.event_name == 'schedule' || github.event.inputs.build-target == 'nightly' }}
needs: [ build-macos-x64, build-macos-arm64, build-linux-x64, build-linux-arm64, codesign-windows, build-android, e2e-test ]
runs-on: ubuntu-20.04
steps:
- name: Download MacOS x64 Artifacts
uses: actions/download-artifact@v3
with:
name: logseq-darwin-x64-builds
path: ./
- name: Download MacOS arm64 Artifacts
uses: actions/download-artifact@v3
with:
name: logseq-darwin-arm64-builds
path: ./
- name: Download The Linux x64 Artifacts
uses: actions/download-artifact@v3
with:
name: logseq-linux-x64-builds
path: ./
- name: Download The Linux arm64 Artifacts
uses: actions/download-artifact@v3
with:
name: logseq-linux-arm64-builds
path: ./
- name: Download The Windows Artifact (Signed)
uses: actions/download-artifact@v3
with:
name: logseq-win64-signed-builds
path: ./
- name: Download The Windows Artifact
uses: actions/download-artifact@v3
with:
name: logseq-win64-builds
path: ./
- name: Download Android Artifacts
uses: actions/download-artifact@v3
with:
name: logseq-android-builds
path: ./
- name: Generate SHA256 checksums
run: |
sha256sum *-darwin-* > SHA256SUMS.txt
sha256sum *-win-* >> SHA256SUMS.txt
sha256sum *-linux-* >> SHA256SUMS.txt
sha256sum *.apk >> SHA256SUMS.txt
cat SHA256SUMS.txt
- name: List files
run: ls -rl
- name: Update Nightly Release
uses: andelf/nightly-release@main
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: nightly
name: 'Desktop/Android APP Nightly Release $$'
draft: false
prerelease: ${{ (github.event_name == 'workflow_dispatch' && github.event.inputs.is-pre-release) || (github.event_name == 'schedule')}}
body: |
This is a nightly release of the Logseq desktop app.
It's unstable compared to the official releases, **use it with caution**!
files: |
./SHA256SUMS.txt
./*.zip
./*.dmg
./*.exe
./*.AppImage
./*.apk
release:
# NOTE: For now, we only have beta channel to be released on Github
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.build-target == 'beta' }}
needs: [ build-macos-x64, build-macos-arm64, build-linux-x64, build-linux-arm64, codesign-windows, build-android, e2e-test ]
runs-on: ubuntu-20.04
steps:
- name: Download MacOS x64 Artifacts
uses: actions/download-artifact@v3
with:
name: logseq-darwin-x64-builds
path: ./
- name: Download MacOS arm64 Artifacts
uses: actions/download-artifact@v3
with:
name: logseq-darwin-arm64-builds
path: ./
- name: Download The Linux x64 Artifacts
uses: actions/download-artifact@v3
with:
name: logseq-linux-x64-builds
path: ./
- name: Download The Linux arm64 Artifacts
uses: actions/download-artifact@v3
with:
name: logseq-linux-arm64-builds
path: ./
- name: Download The Windows Artifact (Signed)
uses: actions/download-artifact@v3
with:
name: logseq-win64-signed-builds
path: ./
- name: Download The Windows Artifact
uses: actions/download-artifact@v3
with:
name: logseq-win64-builds
path: ./
- name: Download Android Artifacts
uses: actions/download-artifact@v3
if: ${{ github.event_name == 'schedule' || github.event.inputs.build-android == 'true' }}
with:
name: logseq-android-builds
path: ./
- name: List files
run: ls -rl
- name: Retrieve tag version
id: ref
run: |
pkgver=$(cat VERSION)
echo "version=$pkgver" >> $GITHUB_OUTPUT
- name: Fix .nupkg name in RELEASES file
run: |
sed -i "s/Logseq-.*.nupkg/Logseq-win-x64-${{ steps.ref.outputs.version }}-full.nupkg/g" RELEASES
- name: Generate SHA256 checksums
run: |
sha256sum *-darwin-* > SHA256SUMS.txt
sha256sum *-win-* >> SHA256SUMS.txt
sha256sum *-linux-* >> SHA256SUMS.txt
sha256sum *.apk >> SHA256SUMS.txt
sha256sum RELEASES >> SHA256SUMS.txt
cat SHA256SUMS.txt
- name: Create Release Draft
uses: softprops/action-gh-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ steps.ref.outputs.version }}
name: Desktop/Android APP ${{ steps.ref.outputs.version }} (Beta Testing)
body: "TODO: Fill this changelog. Sorry for the inconvenience!"
draft: ${{ github.event.inputs.is-draft }}
prerelease: ${{ github.event.inputs.is-pre-release }}
files: |
./VERSION
./SHA256SUMS.txt
./*.zip
./*.dmg
./*.exe
./*.nupkg
./RELEASES
./*.AppImage
./*.apk