Skip to content
Latchkey

Personal Unsigned Build workflow (jgraph/drawio-desktop)

The Personal Unsigned Build workflow from jgraph/drawio-desktop, explained and optimized by Latchkey.

C

CI health: C - fair

Run this on Latchkey for self-healing, caching, and up to 58% lower cost.

Grade your own workflow free or run it on Latchkey →
Source: jgraph/drawio-desktop.github/workflows/personal-build.ymlLicense Apache-2.0View source

What it does

This is the Personal Unsigned Build workflow from the jgraph/drawio-desktop repository, a real project running GitHub Actions. It is shown here with attribution under its Apache-2.0 license.

Below, Latchkey shows a faster, safer version produced by its optimization engine.

The workflow

workflow (.yml)
name: Personal Unsigned Build

# Manually-triggered, unsigned build for personal forks.
# See doc/BUILDING_FOR_PERSONAL_USE.md.
#
# Needs no repository secrets: signing and notarization are skipped
# (DRAWIO_UNSIGNED), auto-update is disabled so the app keeps your
# changes, and nothing is published - the installers are attached to
# the workflow run as a downloadable artifact.

on:
  workflow_dispatch:
    inputs:
      platform:
        description: 'Platform to build'
        type: choice
        required: true
        default: linux
        options:
          - linux
          - macos
          - windows

permissions:
  contents: read

jobs:
  build:
    runs-on: ${{ inputs.platform == 'macos' && 'macos-latest' || inputs.platform == 'windows' && 'windows-latest' || 'ubuntu-latest' }}
    env:
      DRAWIO_UNSIGNED: 'true'
      CSC_IDENTITY_AUTO_DISCOVERY: 'false'
    defaults:
      run:
        shell: bash
    steps:
      - name: Checkout repository
        uses: actions/checkout@v6
        with:
          submodules: true
          persist-credentials: false
      - name: Installing Node
        uses: actions/setup-node@v6
        with:
          node-version: 24
      - name: Install Linux packaging tools
        if: ${{ inputs.platform == 'linux' }}
        run: |
          sudo apt-get update && sudo apt-get install -y icnsutils graphicsmagick xz-utils rpm
          # Match the official Linux builds, which use "drawio" as the product name
          sed -ie 's/"asar": true,/"asar": true,\n"productName": "drawio",/' electron-builder-linux-mac.json
      - name: Build
        run: |
          npm ci
          # disableUpdate stops the app replacing itself with the official
          # (unmodified) release via auto-update
          npm run sync -- disableUpdate
          if [ "${{ inputs.platform }}" = "windows" ]; then
            npx electron-builder --config electron-builder-win.json --publish never
          else
            # Builds the current platform's targets from the shared config:
            # dmg/zip on macOS, AppImage/deb/rpm on Linux
            npx electron-builder --config electron-builder-linux-mac.json --publish never
          fi
      - name: Upload artifacts
        uses: actions/upload-artifact@v6
        with:
          name: drawio-${{ inputs.platform }}-unsigned
          path: |
            dist/*.dmg
            dist/*.zip
            dist/*.exe
            dist/*.msi
            dist/*.AppImage
            dist/*.deb
            dist/*.rpm

The same workflow, on Latchkey

Estimated ~20% faster on cache hits, plus fewer wasted runs and a safer supply chain. Added and changed lines are highlighted.

name: Personal Unsigned Build
 
# Manually-triggered, unsigned build for personal forks.
# See doc/BUILDING_FOR_PERSONAL_USE.md.
#
# Needs no repository secrets: signing and notarization are skipped
# (DRAWIO_UNSIGNED), auto-update is disabled so the app keeps your
# changes, and nothing is published - the installers are attached to
# the workflow run as a downloadable artifact.
 
on:
  workflow_dispatch:
    inputs:
      platform:
        description: 'Platform to build'
        type: choice
        required: true
        default: linux
        options:
          - linux
          - macos
          - windows
 
permissions:
  contents: read
 
jobs:
  build:
    timeout-minutes: 30
    runs-on: ${{ inputs.platform == 'macos' && 'macos-latest' || inputs.platform == 'windows' && 'windows-latest' || 'ubuntu-latest' }}
    env:
      DRAWIO_UNSIGNED: 'true'
      CSC_IDENTITY_AUTO_DISCOVERY: 'false'
    defaults:
      run:
        shell: bash
    steps:
      - name: Checkout repository
        uses: actions/checkout@v6
        with:
          submodules: true
          persist-credentials: false
      - name: Installing Node
        uses: actions/setup-node@v6
        with:
          cache: 'npm'
          node-version: 24
      - name: Install Linux packaging tools
        if: ${{ inputs.platform == 'linux' }}
        run: |
          sudo apt-get update && sudo apt-get install -y icnsutils graphicsmagick xz-utils rpm
          # Match the official Linux builds, which use "drawio" as the product name
          sed -ie 's/"asar": true,/"asar": true,\n"productName": "drawio",/' electron-builder-linux-mac.json
      - name: Build
        run: |
          npm ci
          # disableUpdate stops the app replacing itself with the official
          # (unmodified) release via auto-update
          npm run sync -- disableUpdate
          if [ "${{ inputs.platform }}" = "windows" ]; then
            npx electron-builder --config electron-builder-win.json --publish never
          else
            # Builds the current platform's targets from the shared config:
            # dmg/zip on macOS, AppImage/deb/rpm on Linux
            npx electron-builder --config electron-builder-linux-mac.json --publish never
          fi
      - name: Upload artifacts
        uses: actions/upload-artifact@v6
        with:
          name: drawio-${{ inputs.platform }}-unsigned
          path: |
            dist/*.dmg
            dist/*.zip
            dist/*.exe
            dist/*.msi
            dist/*.AppImage
            dist/*.deb
            dist/*.rpm
 

What changed

What Latchkey heals here

This workflow has steps that commonly fail on transient issues (network, registries, flaky browsers). On Latchkey managed runners they are detected, retried, and self-healed instead of failing your build:

This workflow runs 1 job per trigger. On Latchkey the same minutes cost up to 58% less than GitHub-hosted, with zero queue time.

Actions used in this workflow