# All-in-one continuous integration (CI) workflow. # Runs on all platforms (Windows, macOS, and Linux) # for all events (pull request, release, and schedule). name: CI on: workflow_dispatch: inputs: version: description: Synergy version number required: true pull_request: types: - opened - reopened - synchronize - ready_for_review release: types: [published] schedule: - cron: "0 5 * * *" env: GIT_SHA: ${{ github.sha }} SYNERGY_VERSION: ${{ github.event.inputs.version || github.event.release.tag_name }} SYNERGY_PRODUCT_NAME: ${{ vars.SYNERGY_PRODUCT_NAME }} SYNERGY_PACKAGE_PREFIX: ${{ vars.SYNERGY_PACKAGE_PREFIX }} SYNERGY_ENABLE_LICENSING: ${{ vars.SYNERGY_ENABLE_LICENSING }} PACKAGE_BUILD: ${{ !github.event.pull_request.draft }} PACKAGE_UPLOAD: ${{ !github.event.pull_request.draft && github.event_name != 'schedule' }} UPLOAD_TO_GITHUB: ${{ github.event_name == 'pull_request' && !github.event.pull_request.draft }} UPLOAD_TO_GDRIVE: ${{ github.event_name != 'pull_request' }} jobs: windows: name: ${{ matrix.target.name }} runs-on: ${{ matrix.target.runs-on }} container: ${{ matrix.target.container }} timeout-minutes: 20 env: QT_BASE_DIR: ${{ github.workspace }}\deps\Qt strategy: matrix: target: - name: windows-2022-x64 runs-on: windows-2022 steps: - name: Checkout uses: actions/checkout@v4 with: submodules: "recursive" - name: Install dependencies run: python ./scripts/install_deps.py - name: Set QT_VERSION env var run: python ./scripts/github_env.py --set-qt-version - name: Cache Qt id: cache-qt uses: actions/cache@v4 with: path: ${{ env.QT_BASE_DIR }} key: ${{ runner.os }}-Qt_${{ env.QT_VERSION }} - name: Install Qt if: steps.cache-qt.outputs.cache-hit != 'true' run: python ./scripts/install_deps.py --only qt - name: Setup VC++ environment uses: ilammy/msvc-dev-cmd@v1 - name: Configure env: CMAKE_PREFIX_PATH: "${{ env.QT_BASE_DIR }}\\${{ env.QT_VERSION }}\\msvc2019_64\\" run: cmake -B build --preset=windows-release - name: Build run: cmake --build build -j8 - name: Test run: ./build/bin/unittests - name: Package if: ${{ vars.SYNERGY_ENABLE_PACKAGING && env.PACKAGE_BUILD == 'true' }} run: python ./scripts/package.py env: WINDOWS_PFX_CERTIFICATE: ${{ secrets.WINDOWS_PFX }} WINDOWS_PFX_PASSWORD: ${{ secrets.WINDOWS_PFX_PASS }} - name: Upload if: ${{ vars.SYNERGY_ENABLE_PACKAGING && env.PACKAGE_UPLOAD == 'true' }} uses: ./.github/actions/dist-upload with: use_github: ${{ env.UPLOAD_TO_GITHUB }} use_gdrive: ${{ env.UPLOAD_TO_GDRIVE }} github-target-filename: "${{ env.SYNERGY_PACKAGE_PREFIX }}-${{ matrix.target.name }}" gdrive-target-base-dir: ${{ vars.GDRIVE_TARGET_BASE_DIR }} gdrive-secret-key: ${{ secrets.GOOGLE_DRIVE_KEY }} gdrive-parent-folder-id: ${{ secrets.GOOGLE_DRIVE_TECH_DRIVE }} package-version: ${{ env.SYNERGY_VERSION }} macos: name: ${{ matrix.target.name }} runs-on: ${{ matrix.target.os }} timeout-minutes: ${{ matrix.target.timeout }} defaults: run: shell: ${{ matrix.target.shell }} strategy: matrix: target: - name: "macos-11-arm64" timeout: 10 os: "macos-14" arch: arm64 version: "11" shell: "/usr/bin/arch -arch arm64e /bin/bash --noprofile --norc -eo pipefail {0}" - name: "macos-10-intel" timeout: 20 os: "macos-14-large" arch: x64 version: "10.14" shell: "bash" steps: - name: Checkout uses: actions/checkout@v4 with: submodules: "recursive" - name: Install dependencies run: ./scripts/install_deps.py - name: Configure env: CMAKE_OSX_DEPLOYMENT_TARGET: ${{ matrix.target.version }} run: cmake -B build --preset=macos-release -DCMAKE_PREFIX_PATH=$(brew --prefix qt@6) - name: Build run: cmake --build build -j8 - name: Test run: ./build/bin/unittests - name: Package if: ${{ vars.SYNERGY_ENABLE_PACKAGING && env.PACKAGE_BUILD == 'true' }} run: ./scripts/package.py env: APPLE_CODESIGN_ID: ${{ secrets.APPLE_CODESIGN_ID }} APPLE_P12_CERTIFICATE: ${{ secrets.APPLE_P12_CERTIFICATE }} APPLE_P12_PASSWORD: ${{ secrets.APPLE_P12_PASSWORD }} APPLE_NOTARY_USER: ${{ secrets.APPLE_NOTARY_USER }} APPLE_NOTARY_PASSWORD: ${{ secrets.APPLE_NOTARY_PASSWORD }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} - name: Upload if: ${{ vars.SYNERGY_ENABLE_PACKAGING && env.PACKAGE_UPLOAD == 'true' }} uses: ./.github/actions/dist-upload with: use_github: ${{ env.UPLOAD_TO_GITHUB }} use_gdrive: ${{ env.UPLOAD_TO_GDRIVE }} github-target-filename: "${{ env.SYNERGY_PACKAGE_PREFIX }}-${{ matrix.target.name }}" gdrive-target-base-dir: ${{ vars.GDRIVE_TARGET_BASE_DIR }} gdrive-secret-key: ${{ secrets.GOOGLE_DRIVE_KEY }} gdrive-parent-folder-id: ${{ secrets.GOOGLE_DRIVE_TECH_DRIVE }} package-version: ${{ env.SYNERGY_VERSION }} linux: name: linux-${{ matrix.distro.name }} runs-on: ${{ matrix.distro.runs-on }} container: ${{ matrix.distro.container }} timeout-minutes: 20 env: # Prevent apt prompting for input. DEBIAN_FRONTEND: noninteractive strategy: matrix: distro: - name: debian-12-arm64 container: arm64v8/debian:12 runs-on: buildjet-4vcpu-ubuntu-2204-arm install-deps-apt: true - name: debian-12-amd64 container: debian:12 runs-on: ubuntu-latest install-deps-apt: true - name: ubuntu-24.04-amd64 container: ubuntu:24.04 runs-on: ubuntu-latest install-deps-apt: true extra-packages: true - name: ubuntu-22.04-amd64 container: ubuntu:22.04 runs-on: ubuntu-latest install-deps-apt: true - name: fedora-40-arm64 container: arm64v8/fedora:40 runs-on: buildjet-4vcpu-ubuntu-2204-arm install-deps-dnf: true - name: fedora-40-amd64 container: fedora:40 runs-on: ubuntu-latest install-deps-dnf: true - name: fedora-39-amd64 container: fedora:39 runs-on: ubuntu-latest install-deps-dnf: true - name: opensuse-amd64 container: opensuse/tumbleweed:latest runs-on: ubuntu-latest install-deps-zypper: true - name: arch-amd64 container: archlinux:latest runs-on: ubuntu-latest install-deps-pacman: true package-user: build - name: manjaro-amd64 container: manjarolinux/base:latest runs-on: ubuntu-latest install-deps-pacman: true package-user: build steps: - name: Bootstrap run: | if [ "${{ matrix.distro.install-deps-apt }}" = "true" ]; then apt update && apt install -y git python3 elif [ "${{ matrix.distro.install-deps-dnf }}" = "true" ]; then dnf install -y git python3 elif [ "${{ matrix.distro.install-deps-pacman }}" = "true" ]; then pacman -Syu --noconfirm git python sudo useradd -m build elif [ "${{ matrix.distro.install-deps-zypper }}" = "true" ]; then zypper install -y git python3 fi - name: Checkout uses: actions/checkout@v4 with: submodules: "recursive" - name: Config Git safe dir run: git config --global --add safe.directory $GITHUB_WORKSPACE - name: Install dependencies run: ./scripts/install_deps.py - name: Configure run: cmake -B build --preset=linux-release - name: Build run: cmake --build build -j8 - name: Test run: ./build/bin/unittests - name: Package if: ${{ vars.SYNERGY_ENABLE_PACKAGING && env.PACKAGE_BUILD == 'true' }} env: LINUX_EXTRA_PACKAGES: ${{ matrix.distro.extra-packages }} LINUX_PACKAGE_USER: ${{ matrix.distro.package-user }} run: ./scripts/package.py - name: Upload if: ${{ vars.SYNERGY_ENABLE_PACKAGING && env.PACKAGE_UPLOAD == 'true' }} uses: ./.github/actions/dist-upload with: use_github: ${{ env.UPLOAD_TO_GITHUB }} use_gdrive: ${{ env.UPLOAD_TO_GDRIVE }} github-target-filename: "${{ env.SYNERGY_PACKAGE_PREFIX }}-${{ matrix.distro.name }}" gdrive-target-base-dir: ${{ vars.GDRIVE_TARGET_BASE_DIR }} gdrive-secret-key: ${{ secrets.GOOGLE_DRIVE_KEY }} gdrive-parent-folder-id: ${{ secrets.GOOGLE_DRIVE_TECH_DRIVE }} package-version: ${{ env.SYNERGY_VERSION }}