name: CI on: push: pull_request: branches: - '*' workflow_dispatch: inputs: version: description: Release Version required: false buildtype: description: Release build type type: choice default: release options: - debug - debugoptimized - release # Builds & Uploads: # * Linux x86_64 Portable # * Linux App Image # * Mac Universal Portable # * Mac Universal DMG # * Windows x86_64 Portable # * Windows x86_64 Installer jobs: # Checks to see if we have an input, and stamps that onto the repo. # Determines if this is a release, and determines the official ref. version: name: Compute Version & Check for Release runs-on: ubuntu-latest env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} outputs: buildtype: ${{ steps.check_release.outputs.buildtype }} release: ${{ steps.check_release.outputs.release }} ref: ${{ steps.check_release.outputs.ref }} permissions: contents: write steps: - name: Update Tag uses: richardsimko/update-tag@v1 if: ${{ github.event.inputs.version }} with: tag_name: ${{ github.event.inputs.version }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - uses: actions/checkout@v5 with: fetch-depth: 0 fetch-tags: true - name: Check Release id: check_release env: { BUILDTYPE: "${{ github.event.inputs.buildtype }}" } run: | if [[ $GITHUB_REF == refs/pull/* || ( $GITHUB_REF != refs/heads/master && $GITHUB_REF != refs/tags/* ) ]]; then export BUILDTYPE="debugoptimized" elif [[ -z $BUILDTYPE ]]; then export BUILDTYPE="release" fi REF=$(git describe --exact-match --match v[0-9]* HEAD --tags 2>/dev/null) || REF=continuous echo "ref=$REF" >> $GITHUB_OUTPUT echo "buildtype=$BUILDTYPE" >> $GITHUB_OUTPUT echo "Build Version: $REF" echo "Build Type: $BUILDTYPE" if [[ "$REF" != "continuous" ]]; then echo "release=$REF" >> $GITHUB_OUTPUT echo "Release Version: $REF" fi build_darwin: name: Darwin needs: [version] strategy: matrix: config: - { runner: macos-15-intel, arch: x86_64-darwin } - { runner: macos-15, arch: aarch64-darwin } runs-on: ${{ matrix.config.runner }} steps: - name: System Information run: | system_profiler SPSoftwareDataType bash --version gcc -v xcodebuild -version - uses: actions/checkout@v5 - name: Python Setup uses: actions/setup-python@v6 with: { python-version: "3.11" } - name: Install Dependencies run: | brew install bash pip3 install meson ninja - name: Build & Package Mac (Bundle) run: | scripts/build.sh --addons --debug --forcefallback --reconfigure --lto --bundle --mode ${{ needs.version.outputs.buildtype }} -b build tar -C build -czvf lite-xl-${{ needs.version.outputs.ref }}-${{ matrix.config.arch }}-bundle.tar.gz "Lite XL.app" - name: Build & Package Mac (Portable) run: | scripts/build.sh --addons --debug --forcefallback --reconfigure --lto --portable --mode ${{ needs.version.outputs.buildtype }} -b build tar -C build -czvf lite-xl-${{ needs.version.outputs.ref }}-${{ matrix.config.arch }}-portable.tar.gz lite-xl - name: Upload (Intermediate) uses: actions/upload-artifact@v5 with: name: lite-xl-${{ needs.version.outputs.ref }}-${{ matrix.config.arch }} path: | *.tar.gz build_darwin_universal: name: Darwin (Universal) needs: [version, build_darwin] runs-on: macos-15 steps: - uses: actions/checkout@v5 - name: Python Setup uses: actions/setup-python@v6 with: { python-version: "3.11" } - name: Install Dependencies run: | brew install bash pip3 install dmgbuild - name: Download Artifacts uses: actions/download-artifact@v6 with: pattern: '*darwin*' merge-multiple: true - name: Create Universal Binaries run: | REF="lite-xl-${{ needs.version.outputs.ref }}" for TYPE in bundle portable; do mkdir -p $REF-universal-darwin-$TYPE package-$TYPE/{x86_64,aarch64} tar -C package-$TYPE/x86_64 -zxvf $REF-x86_64-darwin-$TYPE.tar.gz tar -C package-$TYPE/aarch64 -zxvf $REF-aarch64-darwin-$TYPE.tar.gz cp -a package-$TYPE/*/* $REF-universal-darwin-$TYPE find package-$TYPE -type f -name lite-xl -perm +111 -print0 | \ xargs -0 lipo -create -output "$(find $REF-universal-darwin-$TYPE -type f -name lite-xl -perm +111)" done - name: Package Darwin (Universal DMG Image) run: | dmgbuild -s resources/macos/lite-xl-dmg.py \ -D "app_path=lite-xl-${{ needs.version.outputs.ref }}-universal-darwin-bundle/Lite XL.app" \ "Lite XL" "lite-xl-${{ needs.version.outputs.ref }}-universal-darwin.dmg" - name: Package Darwin (Universal Portable) run: tar -C lite-xl-${{ needs.version.outputs.ref }}-universal-darwin-portable -zcvf lite-xl-${{ needs.version.outputs.ref }}-universal-darwin-portable.tar.gz . - name: Upload (Release) uses: actions/upload-artifact@v5 with: name: lite-xl-${{ needs.version.outputs.ref }}-universal-darwin-release path: | lite-xl-${{ needs.version.outputs.ref }}-universal-darwin.dmg lite-xl-${{ needs.version.outputs.ref }}-universal-darwin-portable.tar.gz build_linux: name: Linux (x86_64) needs: [version] runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - name: Build uses: docker://ghcr.io/lite-xl/lite-xl-build-box-manylinux:v4 with: entrypoint: /entrypoint.sh args: bash scripts/build.sh --addons --debug --forcefallback --lto --portable --mode ${{ needs.version.outputs.buildtype }} -b build - name: Package Linux (Portable) run: tar -C build -czvf lite-xl-${{ needs.version.outputs.ref }}-x86_64-linux-portable.tar.gz lite-xl - name: Package Linux (AppImage) uses: docker://ghcr.io/lite-xl/lite-xl-build-box-manylinux:v4 with: entrypoint: /entrypoint.sh run: bash scripts/package-appimage.sh --debug --version ${{ needs.version.outputs.ref }} -b build - name: Upload (Release) uses: actions/upload-artifact@v5 with: name: lite-xl-${{ needs.version.outputs.ref }}-x86_64-linux-portable-release path: | *.tar.gz *.AppImage build_windows: name: Windows (x86_64) (MSYS) runs-on: windows-2022 defaults: run: shell: msys2 {0} needs: [version] steps: - uses: msys2/setup-msys2@v2 with: msystem: MINGW64 install: >- git zip patch pacboy: >- gcc:p meson:p cmake:p ninja:p pkg-config:p ca-certificates:p - uses: actions/checkout@v5 - name: Build run: bash scripts/build.sh --addons --debug --forcefallback --lto --portable --mode ${{ needs.version.outputs.buildtype }} -b build - name: Package Windows (Portable) run: cd build && zip -r ../lite-xl-${{ needs.version.outputs.ref }}-x86_64-windows-portable.zip lite-xl && cd .. - name: Package Windows (InnoSetup) run: bash scripts/package-innosetup.sh --debug --version ${{ needs.version.outputs.ref }} -b build - name: Upload (Release) uses: actions/upload-artifact@v5 with: name: lite-xl-${{ needs.version.outputs.ref }}-x86_64-windows-portable-release path: | *.zip *.exe build_windows_msvc: name: Windows (x86_64) (MSVC) needs: [version] runs-on: windows-latest steps: - uses: actions/checkout@v5 - name: Setup MSVC id: msvc-dev-cmd uses: ilammy/msvc-dev-cmd@v1 with: arch: x86_64 - name: Setup Python uses: actions/setup-python@v6 with: { python-version: "3.11" } - name: Install meson and ninja run: pip install --no-cache-dir meson ninja - name: Export GitHub Actions cache environment variables uses: actions/github-script@v8 with: script: | core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - name: Install pkgconf env: { VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" } run: vcpkg install pkgconf:x64-windows-release # https://github.com/ilammy/msvc-dev-cmd?tab=readme-ov-file#name-conflicts-with-shell-bash - name: Set environment variables run: | echo "PKG_CONFIG=C:\vcpkg\installed\x64-windows-release\tools\pkgconf\pkgconf.exe" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append echo "CC_LD=$((Get-Command link.exe).Source)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - name: Build run: bash scripts/build.sh --addons --debug --forcefallback --lto --portable --mode ${{ needs.version.outputs.buildtype }} -b build - name: Package run: cd build && 7z a -mx=9 "..\lite-xl-${{ needs.version.outputs.ref }}-x86_64-windows.zip" lite-xl && cd .. - name: Upload Artifacts (Intermediate) uses: actions/upload-artifact@v5 with: name: lite-xl-${{ needs.version.outputs.ref }}-x86_64-windows (MSVC) compression-level: 0 path: | *.zip release: name: Create Release needs: [version, build_linux, build_windows, build_darwin_universal] runs-on: ubuntu-latest if: ${{ needs.version.outputs.release || github.ref == 'refs/heads/master' }} permissions: contents: write steps: - uses: actions/checkout@v5 - name: Download Artifacts uses: actions/download-artifact@v6 with: pattern: lite-xl-*-release merge-multiple: true path: releases - name: Generate Release Notes if: needs.version.outputs.release env: GH_TOKEN: ${{ github.token }} run: bash scripts/generate-release-notes.sh --version ${{ needs.version.outputs.release }} - name: Versioned Release uses: ncipollo/release-action@v1 if: ${{ needs.version.outputs.release }} with: tag: ${{ needs.version.outputs.release }} name: Lite XL ${{ needs.version.outputs.release }} draft: true allowUpdates: true bodyFile: release-notes.md artifacts: "releases/*.*" - name: Update Tag uses: richardsimko/update-tag@v1 if: github.ref == 'refs/heads/master' with: tag_name: continuous env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Continuous Release uses: ncipollo/release-action@v1 if: github.ref == 'refs/heads/master' with: name: Lite XL Continuous Release tag: continuous prerelease: true allowUpdates: true removeArtifacts: true generateReleaseNotes: true artifacts: "releases/*.*"