Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
245 changes: 245 additions & 0 deletions .github/workflows/build-tauri.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,245 @@
name: Build Tauri

on:
push:
branches: [master]
tags:
- v*
pull_request:
branches: [master]

jobs:
build:
name: ${{ matrix.os }}, py-${{ matrix.python_version }}, node-${{ matrix.node_version }}
runs-on: ${{ matrix.os }}
continue-on-error: ${{ matrix.experimental }}
env:
# Whether to build and include extras (like aw-notify and aw-watcher-input)
AW_EXTRAS: true
TAURI_BUILD: true
# sets the macOS version target, see: https://users.rust-lang.org/t/compile-rust-binary-for-older-versions-of-mac-osx/38695
MACOSX_DEPLOYMENT_TARGET: 10.9
defaults:
run:
shell: bash
strategy:
fail-fast: false
max-parallel: 5
matrix:
os:
[
ubuntu-24.04,
ubuntu-24.04-arm,
windows-latest,
macos-14,
macos-latest,
]
python_version: [3.9]
node_version: [22]
skip_rust: [false]
skip_webui: [false]
experimental: [false]

steps:
- uses: actions/checkout@v4
with:
submodules: "recursive"
fetch-depth: 0

- name: Set environment variables
run: |
echo "RELEASE=${{ startsWith(github.ref_name, 'v') || github.ref_name == 'master' }}" >> $GITHUB_ENV
echo "TAURI_BUILD=true" >> $GITHUB_ENV

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python_version }}

- name: Set up Node
if: ${{ !matrix.skip_webui }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node_version }}

- name: Set up Rust
if: ${{ !matrix.skip_rust }}
uses: dtolnay/rust-toolchain@master
id: toolchain
with:
toolchain: stable

- name: Cache node_modules
uses: actions/cache@v4
if: ${{ !matrix.skip_webui }}
with:
path: |
aw-server-rust/aw-webui/node_modules
aw-tauri/node_modules
key: ${{ matrix.os }}-node_modules-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ matrix.os }}-node_modules-

- name: Cache cargo build
uses: actions/cache@v4
env:
cache-name: cargo-build-target
with:
path: |
aw-server-rust/target
aw-tauri/src-tauri/target
key: ${{ matrix.os }}-${{ env.cache-name }}-${{ steps.toolchain.outputs.cachekey }}-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ matrix.os }}-${{ env.cache-name }}-${{ steps.toolchain.outputs.rustc_hash }}-

- name: Install APT dependencies
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y \
libgtk-3-dev \
libwebkit2gtk-4.1-dev \
libayatana-appindicator3-dev \
librsvg2-dev \
libjavascriptcoregtk-4.1-dev \
libsoup-3.0-dev \
xdg-utils

- name: Install dependencies
run: |
if [ "$RUNNER_OS" == "Windows" ]; then
choco install innosetup
fi
pip3 install poetry==1.4.2

- name: Build
uses: nick-fields/retry@v3
with:
timeout_minutes: 60
max_attempts: 3
shell: bash
command: |
python3 -m venv venv
source venv/bin/activate || source venv/Scripts/activate
poetry install
make build SKIP_WEBUI=${{ matrix.skip_webui }} SKIP_SERVER_RUST=${{ matrix.skip_rust }}
pip freeze

- name: Run tests
uses: nick-fields/retry@v3
with:
timeout_minutes: 60
max_attempts: 3
shell: bash
command: |
source venv/bin/activate || source venv/Scripts/activate
make test SKIP_SERVER_RUST=${{ matrix.skip_rust }}

- name: Package
run: |
source venv/bin/activate || source venv/Scripts/activate
poetry install
make package SKIP_SERVER_RUST=${{ matrix.skip_rust }}

- name: Package dmg
if: runner.os == 'macOS'
run: |
if [ -n "$APPLE_EMAIL" ]; then
./scripts/ci/import-macos-p12.sh
fi

source venv/bin/activate
make dist/ActivityWatch.dmg

if [ -n "$APPLE_EMAIL" ]; then
codesign --verbose -s ${APPLE_PERSONALID} dist/ActivityWatch.dmg

brew install akeru-inc/tap/xcnotary
xcnotary precheck dist/ActivityWatch.app
xcnotary precheck dist/ActivityWatch.dmg

make dist/notarize
fi
mv dist/ActivityWatch.dmg dist/activitywatch-$(scripts/package/getversion.sh)-macos-x86_64.dmg
env:
APPLE_EMAIL: ${{ secrets.APPLE_EMAIL }}
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
APPLE_PERSONALID: ${{ secrets.APPLE_TEAMID }}
APPLE_TEAMID: ${{ secrets.APPLE_TEAMID }}
CERTIFICATE_MACOS_P12_BASE64: ${{ secrets.CERTIFICATE_MACOS_P12_BASE64 }}
CERTIFICATE_MACOS_P12_PASSWORD: ${{ secrets.CERTIFICATE_MACOS_P12_PASSWORD }}

- name: Upload packages
uses: actions/upload-artifact@v4
with:
name: builds-tauri-${{ matrix.os }}-py${{ matrix.python_version }}
path: dist/activitywatch-*.*

release-notes:
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/v')
steps:
- uses: actions/checkout@v4
with:
submodules: "recursive"
fetch-depth: 0

- uses: ActivityWatch/check-version-format-action@v2
id: version
with:
prefix: "v"

- name: Echo version
run: |
echo "${{ steps.version.outputs.full }} (stable: ${{ steps.version.outputs.is_stable }})"

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.12"

- name: Install deps
run: |
pip install requests

- name: Generate release notes
run: |
LAST_RELEASE=`STABLE_ONLY=${{ steps.version.output.is_stable }} ./scripts/get_latest_release.sh`
./scripts/build_changelog.py --range "$LAST_RELEASE...${{ steps.version.outputs.full }}"

- name: Rename
run: |
mv changelog.md release_notes.md

- name: Upload release notes
uses: actions/upload-artifact@v4
with:
name: release_notes_tauri
path: release_notes.md

release:
needs: [build, release-notes]
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest
steps:
- name: Download build artifacts
uses: actions/download-artifact@v4
with:
path: dist

- name: Display structure of downloaded files
run: ls -R
working-directory: dist

- uses: ActivityWatch/check-version-format-action@v2
id: version
with:
prefix: "v"

- name: Release
uses: softprops/action-gh-release@v1
with:
draft: true
files: dist/*/activitywatch-*.*
body_path: dist/release_notes_tauri/release_notes.md
prerelease: ${{ !(steps.version.outputs.is_stable == 'true') }}
57 changes: 15 additions & 42 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
runs-on: ${{ matrix.os }}
continue-on-error: ${{ matrix.experimental }}
env:
# Wether to build and include extras (like aw-notify and aw-watcher-input)
# Whether to build and include extras (like aw-notify and aw-watcher-input)
AW_EXTRAS: true
# sets the macOS version target, see: https://users.rust-lang.org/t/compile-rust-binary-for-older-versions-of-mac-osx/38695
MACOSX_DEPLOYMENT_TARGET: 10.9
Expand All @@ -26,9 +26,9 @@ jobs:
strategy:
fail-fast: false
matrix:
os: [ubuntu-22.04, windows-latest, macOS-13]
os: [ubuntu-24.04, windows-latest, macos-14, macos-latest]
python_version: [3.9]
node_version: [20]
node_version: [22]
skip_rust: [false]
skip_webui: [false]
experimental: [false]
Expand All @@ -53,31 +53,10 @@ jobs:
echo "RELEASE=${{ startsWith(github.ref_name, 'v') || github.ref_name == 'master' }}" >> $GITHUB_ENV

- name: Set up Python
if: runner.os != 'macOS'
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python_version }}

# Setup Python version built for older macOS (https://github.com/actions/virtual-environments/issues/1256)
- name: Set up Python for macOS
if: runner.os == 'macOS'
run: |
curl https://www.python.org/ftp/python/${PYTHON_VERSION}/python-${PYTHON_VERSION}-macosx10.9.pkg -o "python.pkg"

# Python 3.11+ only has *macos11.pkg, so no more *macosx10.9.pkg
# the 'macos11' naming seems to suggest it only supports macos11 and up,
# but the release page says "for macOS 10.9 and later",
# unclear what the resulting binary compatibility will be.
#
# curl https://www.python.org/ftp/python/${PYTHON_VERSION}/python-${PYTHON_VERSION}-macos11.pkg -o "python.pkg"

sudo installer -pkg python.pkg -target /
echo "/Library/Frameworks/Python.framework/Versions/${{ matrix.python_version }}/bin" >> $GITHUB_PATH
"/Applications/Python ${{ matrix.python_version }}/Install Certificates.command"
env:
# Add the patch number to the Python version (for FTP download link)
PYTHON_VERSION: ${{ matrix.python_version }}.13

- name: Set up Node
if: ${{ !matrix.skip_webui }}
uses: actions/setup-node@v4
Expand All @@ -91,33 +70,26 @@ jobs:
with:
toolchain: stable

- name: Get npm cache dir
id: npm-cache-dir
run: |
echo "dir=$(npm config get cache)" >> $GITHUB_OUTPUT

- uses: actions/cache@v4
name: Cache npm
- name: Cache node_modules
uses: actions/cache@v4
if: ${{ !matrix.skip_webui }}
env:
cache-name: node
with:
path: ${{ steps.npm-cache-dir.outputs.dir }}
key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
path: aw-server-rust/aw-webui/node_modules
key: ${{ matrix.os }}-node_modules-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-${{ env.cache-name }}-
${{ matrix.os }}-node_modules-

- name: Cache cargo build
uses: actions/cache@v4
if: ${{ !matrix.skip_rust && (runner.os != 'macOS') }} # cache doesn't seem to behave nicely on macOS, see: https://github.com/ActivityWatch/aw-server-rust/issues/180
# if: ${{ !matrix.skip_rust && (runner.os != 'macOS') }} # cache doesn't seem to behave nicely on macOS, see: https://github.com/ActivityWatch/aw-server-rust/issues/180
env:
cache-name: cargo-build-target
with:
path: aw-server-rust/target
# key needs to contain rustc_hash due to https://github.com/ActivityWatch/aw-server-rust/issues/180
key: ${{ runner.os }}-${{ env.cache-name }}-${{ steps.toolchain.outputs.cachekey }}-${{ hashFiles('**/Cargo.lock') }}
key: ${{ matrix.os }}-${{ env.cache-name }}-${{ steps.toolchain.outputs.cachekey }}-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-${{ env.cache-name }}-${{ steps.toolchain.outputs.rustc_hash }}-
${{ matrix.os }}-${{ env.cache-name }}-${{ steps.toolchain.outputs.rustc_hash }}-

- name: Install APT dependencies
if: runner.os == 'Linux'
Expand All @@ -126,7 +98,8 @@ jobs:
# Unsure which of these are actually necessary...
sudo apt-get install -y \
appstream \
qtbase5-dev qt5-qmake \
qt5-qmake \
qtbase5-dev \
qtwayland5 \
libqt5x11extras5 \
libfontconfig1 \
Expand All @@ -147,7 +120,7 @@ jobs:
if [ "$RUNNER_OS" == "Windows" ]; then
choco install innosetup
fi
pip3 install poetry==1.3.2
pip3 install poetry==1.4.2

- name: Build
run: |
Expand Down Expand Up @@ -223,7 +196,7 @@ jobs:
- name: Upload packages
uses: actions/upload-artifact@v4
with:
name: builds-${{ runner.os }}-py${{ matrix.python_version }}
name: builds-${{ matrix.os }}-py${{ matrix.python_version }}
path: dist/activitywatch-*.*

release-notes:
Expand Down
6 changes: 6 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,9 @@
[submodule "aw-watcher-input"]
path = aw-watcher-input
url = https://github.com/ActivityWatch/aw-watcher-input.git
[submodule "aw-tauri"]
path = aw-tauri
url = https://github.com/activitywatch/aw-tauri
[submodule "awatcher"]
path = awatcher
url = https://github.com/2e3s/awatcher
Loading
Loading