CI #34
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
# 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 | |
pull_request: | |
types: | |
- opened | |
- reopened | |
- synchronize | |
- ready_for_review | |
schedule: | |
- cron: "0 5 * * *" # 5am UTC | |
env: | |
GIT_SHA: ${{ github.event.pull_request.head.sha || github.sha }} | |
SYNERGY_PRODUCT_NAME: ${{ vars.SYNERGY_PRODUCT_NAME }} | |
SYNERGY_PACKAGE_PREFIX: ${{ vars.SYNERGY_PACKAGE_PREFIX }} | |
SYNERGY_ENABLE_ACTIVATION: ${{ vars.SYNERGY_ENABLE_ACTIVATION }} | |
PACKAGE_BUILD: ${{ !github.event.pull_request.draft }} | |
PACKAGE_UPLOAD: ${{ !github.event.pull_request.draft }} | |
UPLOAD_TO_GITHUB: ${{ github.event_name == 'pull_request' && !github.event.pull_request.draft }} | |
UPLOAD_TO_GDRIVE: ${{ github.event_name != 'pull_request' }} | |
jobs: | |
# Quality gate to allow PR merge, used in the branch protection rules. | |
ci-passed: | |
runs-on: ubuntu-latest | |
needs: [windows, macos, linux] | |
steps: | |
- run: echo "✅ CI passed" > $GITHUB_STEP_SUMMARY | |
windows: | |
name: ${{ matrix.target.name }} | |
runs-on: ${{ matrix.target.runs-on }} | |
container: ${{ matrix.target.container }} | |
timeout-minutes: 20 | |
strategy: | |
# Normally, we want to fail fast, but in this case we shouldn't since one target may | |
# fail due to transient issues unrelated to the build. | |
fail-fast: false | |
matrix: | |
target: | |
- name: windows-2022-x64 | |
runs-on: windows-2022-8-core-x64 | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- name: Cache vcpkg dir | |
uses: actions/cache@v4 | |
with: | |
path: | | |
deskflow/vcpkg | |
deskflow/vcpkg_installed | |
key: vcpkg-${{ runner.os }}-${{ hashFiles('deskflow/vcpkg.json', 'deskflow/vcpkg-configuration.json') }} | |
- name: Cache deps dir | |
uses: actions/cache@v4 | |
with: | |
path: deskflow/deps | |
key: ${{ runner.os }}-deps-${{ hashFiles('config.yaml') }} | |
# This effectively runs `vcvarsall.bat`, etc. It's not actually installing | |
# VC++ as that's already pre-installed on the Windows runner. | |
- name: Setup VC++ environment | |
uses: ilammy/msvc-dev-cmd@v1 | |
# Install Ninja with an action instead of using Chocolatey, as it's more | |
# reliable and faster. The Ninja install action is pretty good as it | |
# downloads directly from the `ninja-build` GitHub project releases. | |
- name: Install Ninja | |
uses: seanmiddleditch/gha-setup-ninja@master | |
- name: Install dependencies | |
env: | |
VCPKG_ROOT: "" # Unset deliberately to suppress 'already installed' warning. | |
run: python ./scripts/setup.py | |
- name: Get version | |
uses: ./deskflow/.github/actions/get-version | |
- name: Configure | |
run: cmake -B build --preset=windows-release | |
- name: Build | |
run: cmake --build build -j8 | |
- name: Tests | |
uses: ./deskflow/.github/actions/run-tests | |
timeout-minutes: 2 | |
with: | |
job: ${{ matrix.target.name }} | |
bin-dir: build/deskflow/bin | |
- name: Package | |
if: ${{ 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: ${{ 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.DESKFLOW_VERSION }} | |
macos: | |
name: ${{ matrix.target.name }} | |
runs-on: ${{ matrix.target.os }} | |
timeout-minutes: ${{ matrix.target.timeout }} | |
defaults: | |
run: | |
shell: ${{ matrix.target.shell }} | |
strategy: | |
# Normally, we want to fail fast, but in this case we shouldn't since one target may | |
# fail due to transient issues unrelated to the build. | |
fail-fast: false | |
matrix: | |
target: | |
- name: "macos-14-arm64" | |
timeout: 10 | |
os: "macos-14" | |
arch: arm64 | |
shell: "/usr/bin/arch -arch arm64e /bin/bash --noprofile --norc -eo pipefail {0}" | |
- name: ${{ 'macos-14-x64' }} | |
timeout: 20 | |
os: ${{ 'macos-14-large' }} | |
arch: x64 | |
shell: "bash" | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- name: Cache deps dir | |
uses: actions/cache@v4 | |
with: | |
path: deskflow/deps | |
key: ${{ runner.os }}-deps-${{ hashFiles('config.yaml') }} | |
- name: Install dependencies | |
run: ./scripts/setup.py | |
- name: Get version | |
uses: ./deskflow/.github/actions/get-version | |
- name: Configure | |
run: cmake -B build --preset=macos-release | |
- name: Build | |
run: cmake --build build -j8 | |
- name: Tests | |
uses: ./deskflow/.github/actions/run-tests | |
timeout-minutes: 2 | |
with: | |
job: ${{ matrix.target.name }} | |
bin-dir: build/deskflow/bin | |
- name: Package | |
if: ${{ 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: ${{ 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.DESKFLOW_VERSION }} | |
linux-matrix: | |
runs-on: ubuntu-latest | |
outputs: | |
json-matrix: ${{ steps.get.outputs.json }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- name: Get JSON file | |
id: get | |
run: | | |
json_file="./deskflow/.github/workflows/ci-linux.json" | |
json=$(cat $json_file) | |
echo "json=$(echo $json)" >> $GITHUB_OUTPUT | |
linux: | |
needs: linux-matrix | |
name: linux-${{ matrix.distro.name }} | |
runs-on: ${{ matrix.distro.runs-on }} | |
container: ${{ matrix.distro.container }} | |
timeout-minutes: 20 | |
strategy: | |
# Normally, we want to fail fast, but in this case we shouldn't since one distro may | |
# fail due to transient issues unrelated to the build. | |
fail-fast: false | |
matrix: ${{fromJson(needs.linux-matrix.outputs.json-matrix)}} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- name: Config Git safe dir | |
run: git config --global --add safe.directory $GITHUB_WORKSPACE | |
- name: Install dependencies | |
run: ./scripts/setup.py ${{ matrix.distro.extra-dep-args }} | |
env: | |
# Prevent apt prompting for input. | |
DEBIAN_FRONTEND: noninteractive | |
- name: Get version | |
uses: ./deskflow/.github/actions/get-version | |
- name: Configure | |
run: cmake -B build --preset=linux-release ${{ matrix.distro.extra-cmake-args }} | |
- name: Build | |
run: cmake --build build -j8 | |
- name: Tests | |
uses: ./deskflow/.github/actions/run-tests | |
timeout-minutes: 2 | |
with: | |
job: linux-${{ matrix.distro.name }} | |
bin-dir: build/deskflow/bin | |
- name: Package | |
if: ${{ env.PACKAGE_BUILD == 'true' }} | |
env: | |
LINUX_PACKAGE_USER: ${{ matrix.distro.package-user }} | |
run: ./scripts/package.py | |
- name: Upload | |
if: ${{ 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.DESKFLOW_VERSION }} |