Skip to content

Nightly snapshot

Nightly snapshot #1218

# Copyright © SixtyFPS GmbH <info@slint.dev>
# SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-2.0 OR LicenseRef-Slint-Software-3.0
# Build various demo binaries, c++ packages and documentation and publish them on the website
name: Nightly snapshot
on:
workflow_dispatch:
inputs:
private:
type: boolean
default: true
required: false
description: "Private build? True means artifacts are only built. False means the artefacts are published (docs, vscode extension) to the web/marketplace"
release:
type: boolean
default: false
required: false
description: "Release? Enable options for building binaries for a release (i.e. don't have a -nightly suffix for the extension)"
schedule:
- cron: "0 4 * * *"
env:
# Keep in sync with features in slint_tool_binary.yaml, cpp_package.yaml, api/node/Cargo.toml, and api/python/Cargo.toml
SLINT_BINARY_FEATURES: "backend-linuxkms-noseat,backend-winit,renderer-femtovg,renderer-skia,renderer-software"
MACOSX_DEPLOYMENT_TARGET: "11.0"
jobs:
slint-viewer-binary:
uses: ./.github/workflows/slint_tool_binary.yaml
with:
program: "viewer"
secrets:
certificate: ${{ secrets.APPLE_CERTIFICATE_P12 }}
certificate_password: ${{ secrets.APPLE_CERTIFICATE_P12_PASSWORD }}
keychain_password: ${{ secrets.APPLE_KEYCHAIN_PASSWORD }}
developer_id: ${{ secrets.APPLE_DEV_ID }}
slint-lsp-binary:
uses: ./.github/workflows/slint_tool_binary.yaml
with:
program: "lsp"
secrets:
certificate: ${{ secrets.APPLE_CERTIFICATE_P12 }}
certificate_password: ${{ secrets.APPLE_CERTIFICATE_P12_PASSWORD }}
keychain_password: ${{ secrets.APPLE_KEYCHAIN_PASSWORD }}
developer_id: ${{ secrets.APPLE_DEV_ID }}
docs:
uses: ./.github/workflows/build_docs.yaml
wasm_demo:
uses: ./.github/workflows/wasm_demos.yaml
with:
rustflags: "--cfg=web_sys_unstable_apis"
wasm:
uses: ./.github/workflows/wasm_editor_and_interpreter.yaml
with:
rustflags: "--cfg=web_sys_unstable_apis"
cpp_package:
uses: ./.github/workflows/cpp_package.yaml
check-for-secrets:
runs-on: ubuntu-latest
outputs:
has-vscode-marketplace-pat: ${{ steps.one.outputs.has-vscode-marketplace-pat }}
has-openvsx-pat: ${{ steps.one.outputs.has-openvsx-pat }}
has-www-publish-secret: ${{ steps.one.outputs.has-www-publish-secret }}
steps:
- id: one
run: |
[ -n "${{ secrets.VSCODE_MARKETPLACE_PAT }}" ] && echo "has-vscode-marketplace-pat=yes" >> "$GITHUB_OUTPUT"
[ -n "${{ secrets.OPENVSX_PAT }}" ] && echo "has-openvsx-pat=yes" >> "$GITHUB_OUTPUT"
[ -n "${{ secrets.WWW_PUBLISH_SSH_KEY }}" ] && echo "has-www-publish-secret=yes" >> "$GITHUB_OUTPUT"
cat "$GITHUB_OUTPUT"
build_vscode_lsp_linux_windows:
env:
SLINT_NO_QT: 1
strategy:
matrix:
include:
- os: ubuntu-20.04
toolchain: x86_64-unknown-linux-gnu
binary_built: slint-lsp
artifact_name: slint-lsp-x86_64-unknown-linux-gnu
- os: windows-2022
toolchain: x86_64-pc-windows-msvc
binary_built: slint-lsp.exe
artifact_name: slint-lsp-x86_64-pc-windows-msvc.exe
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup-rust
with:
target: ${{ matrix.toolchain }}
- uses: ./.github/actions/install-linux-dependencies
with:
old-ubuntu: true
- name: Build LSP
run: cargo build --target ${{ matrix.toolchain }} --features ${{ env.SLINT_BINARY_FEATURES }} --release -p slint-lsp
- name: Create artifact directory
run: |
mkdir bin
cp target/${{ matrix.toolchain }}/release/${{ matrix.binary_built }} bin/${{ matrix.artifact_name }}
- name: "Upload LSP Artifact"
uses: actions/upload-artifact@v4
with:
name: vscode-lsp-binary-${{ matrix.toolchain }}
path: |
bin
build_vscode_lsp_macos_x86_64:
env:
SLINT_NO_QT: 1
runs-on: macos-12
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup-rust
with:
target: x86_64-apple-darwin
- name: Install cargo-bundle
run: cargo install cargo-bundle
- name: Build Main LSP Bundle
working-directory: tools/lsp
run: cargo bundle --release --features ${{ env.SLINT_BINARY_FEATURES }}
- name: Create artifact directory
run: |
mkdir bin
cp -a target/release/bundle/osx/Slint\ Live\ Preview.app bin
- name: "Upload LSP Artifact"
uses: actions/upload-artifact@v4
with:
name: vscode-lsp-binary-x86_64-apple-darwin
path: |
bin
build_vscode_lsp_macos_aarch64:
env:
SLINT_NO_QT: 1
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup-rust
with:
target: aarch64-apple-darwin
- name: Build AArch64 LSP
run: cargo build --target aarch64-apple-darwin --features ${{ env.SLINT_BINARY_FEATURES }} --release -p slint-lsp
- name: Create artifact directory
run: |
mkdir bin
cp -a target/aarch64-apple-darwin/release/slint-lsp bin/slint-lsp-aarch64-apple-darwin
- name: "Upload LSP Artifact"
uses: actions/upload-artifact@v4
with:
name: vscode-lsp-binary-aarch64-apple-darwin
path: |
bin
build_vscode_lsp_macos_bundle:
needs: [build_vscode_lsp_macos_x86_64, build_vscode_lsp_macos_aarch64]
runs-on: macos-12
steps:
- uses: actions/checkout@v4
with:
path: "src"
- uses: actions/download-artifact@v4
with:
name: vscode-lsp-binary-x86_64-apple-darwin
- uses: actions/download-artifact@v4
with:
name: vscode-lsp-binary-aarch64-apple-darwin
path: bin
- name: Add macOS AArch64 binary to bundle
run: |
lipo -create -output tmp Slint\ Live\ Preview.app/Contents/MacOS/slint-lsp bin/slint-lsp-aarch64-apple-darwin
mv tmp Slint\ Live\ Preview.app/Contents/MacOS/slint-lsp
rm -rf bin
- uses: ./src/.github/actions/codesign
with:
binary: "Slint Live Preview.app"
certificate: ${{ secrets.APPLE_CERTIFICATE_P12 }}
certificate_password: ${{ secrets.APPLE_CERTIFICATE_P12_PASSWORD }}
keychain_password: ${{ secrets.APPLE_KEYCHAIN_PASSWORD }}
developer_id: ${{ secrets.APPLE_DEV_ID }}
- name: "Remove temporary source checkout"
run: rm -rf src
- name: "Upload LSP macOS bundle Artifact"
uses: actions/upload-artifact@v4
with:
name: vscode-lsp-binary-darwin
path: .
build_vscode_cross_linux_lsp:
env:
SLINT_NO_QT: 1
strategy:
matrix:
target:
- armv7-unknown-linux-gnueabihf
- aarch64-unknown-linux-gnu
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup-rust
with:
target: ${{ matrix.target }}
- uses: baptiste0928/cargo-install@v3
with:
crate: cross
- name: Build LSP
run: cross build --target ${{ matrix.target }} --features ${{ env.SLINT_BINARY_FEATURES }} --release -p slint-lsp
- name: Create artifact directory
run: |
mkdir bin
cp target/${{ matrix.target }}/release/slint-lsp bin/slint-lsp-${{ matrix.target }}
- name: "Upload LSP Artifact"
uses: actions/upload-artifact@v4
with:
name: vscode-lsp-binary-${{ matrix.target }}
path: |
bin
build_vscode_extension:
needs:
[
build_vscode_lsp_linux_windows,
build_vscode_lsp_macos_bundle,
build_vscode_cross_linux_lsp,
check-for-secrets,
]
runs-on: macos-12
if: ${{ needs.check-for-secrets.outputs.has-openvsx-pat == 'yes' && needs.check-for-secrets.outputs.has-vscode-marketplace-pat == 'yes' }}
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
name: vscode-lsp-binary-x86_64-unknown-linux-gnu
path: editors/vscode/bin
- uses: actions/download-artifact@v4
with:
name: vscode-lsp-binary-x86_64-pc-windows-msvc
path: editors/vscode/bin
- uses: actions/download-artifact@v4
with:
name: vscode-lsp-binary-darwin
path: editors/vscode/bin
- uses: actions/download-artifact@v4
with:
name: vscode-lsp-binary-armv7-unknown-linux-gnueabihf
path: editors/vscode/bin
- uses: actions/download-artifact@v4
with:
name: vscode-lsp-binary-aarch64-unknown-linux-gnu
path: editors/vscode/bin
- name: Fix permissions
run: chmod 755 editors/vscode/bin/* editors/vscode/bin/*.app/Contents/MacOS/*
- uses: ./.github/actions/install-nodejs
- name: "Prepare meta-data files for nightly package"
env:
RELEASE_INPUT: ${{ github.event.inputs.release }}
working-directory: editors/vscode
run: |
if [ "$RELEASE_INPUT" != "true" ]; then
../../scripts/prepare_vscode_nightly.sh
fi
- name: "npm install"
working-directory: editors/vscode
run: npm install
- name: Install wasm-pack
run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
- name: Build package and optionally publish to Visual Studio Marketplace
id: publishToVSCM
uses: HaaLeo/publish-vscode-extension@v1
with:
pat: ${{ secrets.VSCODE_MARKETPLACE_PAT }}
registryUrl: https://marketplace.visualstudio.com
dryRun: ${{ github.event.inputs.private == 'true' || (github.ref != 'refs/heads/master' && github.event.inputs.release != 'true') }}
packagePath: editors/vscode
- name: Publish to Open VSX Registry
continue-on-error: true
if: ${{ github.event.inputs.private != 'true' && (github.ref == 'refs/heads/master' || github.event.inputs.release == 'true') }}
uses: HaaLeo/publish-vscode-extension@v1
with:
pat: ${{ secrets.OPENVSX_PAT }}
extensionFile: ${{ steps.publishToVSCM.outputs.vsixPath }}
packagePath: ""
- name: "Upload extension artifact"
uses: actions/upload-artifact@v4
with:
name: slint-vscode.zip
path: |
${{ steps.publishToVSCM.outputs.vsixPath }}
# publish_tree_sitter:
# if: github.event.inputs.private != 'true'
# runs-on: ubuntu-20.04
# steps:
# - uses: actions/checkout@v4
# - name: Upload artifact
# uses: actions/upload-artifact@v4
# with:
# name: tree-sitter-slint
# path: editors/tree-sitter-slint
publish_artifacts:
if: ${{ github.event.inputs.private != 'true' && needs.check-for-secrets.outputs.has-www-publish-secret == 'yes' }}
needs: [docs, wasm_demo, wasm, check-for-secrets]
runs-on: ubuntu-20.04
steps:
- uses: actions/download-artifact@v4
with:
name: docs
- uses: actions/download-artifact@v4
with:
name: slintpad
path: slintpad
- uses: actions/download-artifact@v4
with:
name: wasm
- uses: actions/download-artifact@v4
with:
name: wasm_demo
- uses: actions/download-artifact@v4
with:
name: android-demo
path: android
- name: Extract Version
id: version
run: |
version=$(grep -oP '(?<=<title>Slint )[0-9]+\.[0-9]+\.[0-9]+' target/slintdocs/html/index.html)
if [[ -z "$version" ]]; then
echo "Version not found"
exit 1
fi
echo "VERSION=$version" >> $GITHUB_OUTPUT
- name: Publish Docs and Demos
run: |
git config --global user.email "${GITHUB_ACTOR}@users.noreply.github.com"
git config --global user.name "${GITHUB_ACTOR}"
ssh-agent sh -c 'echo "${{ secrets.WWW_PUBLISH_SSH_KEY }}" | ssh-add - && git clone git@github.com:slint-ui/www-releases.git --depth 1'
cd www-releases
if [[ "${{ github.event.inputs.release }}" == "true" ]]; then
output_path="releases/${{ steps.version.outputs.VERSION }}"
else
output_path="snapshots/${GITHUB_REF##*/}"
fi
rm -rf $output_path/demos
mkdir -p $output_path/demos
for demo_subdir in gallery, printerdemo,rust printerdemo_old,rust todo,rust slide_puzzle, memory, imagefilter,rust plotter, opengl_underlay, carousel,rust energy-monitor,; do
IFS=',' read demo subdir <<< "${demo_subdir}"
mkdir -p $output_path/demos/$demo
cp -a ../$demo/$subdir/{pkg,index.html} $output_path/demos/$demo/
done
mkdir -p $output_path/demos/android
cp -a ../android/* $output_path/demos/android/
rm -rf $output_path/wasm-interpreter
mkdir -p $output_path/wasm-interpreter
cp -a ../api/wasm-interpreter/pkg/* ./$output_path/wasm-interpreter/
rm -rf $output_path/editor
mkdir -p $output_path/editor
cp -a ../slintpad/* $output_path/editor/
if [[ "${{ github.event.inputs.release }}" == "true" ]]; then
version="${{ steps.version.outputs.VERSION }}"
else
version="development snapshot"
fi
sed -i 's/VERSION/$version/g' ../docs/site/index.html
rm -rf $output_path/docs
mkdir -p $output_path/docs
cp -a ../docs/site/* $output_path/docs
mkdir -p $output_path/docs/cpp
cp -a ../target/cppdocs/html/* $output_path/docs/cpp/
mkdir -p $output_path/docs/rust
cp -a ../target/doc/* $output_path/docs/rust/
# Fix up link to Slint language documentation
sed -i "s!https://slint.dev/releases/.*/docs/!../../!" $output_path/docs/rust/slint/*.html
mkdir -p $output_path/docs/node
cp -a ../api/node/docs/* $output_path/docs/node/
mkdir -p $output_path/docs/slint
cp -a ../target/slintdocs/html/* $output_path/docs/slint/
- name: Adjust redirections
if: github.event.inputs.release == 'true'
run: |
sed -i "/1.0.2/! s,[0-9]*\.[0-9]*\.[0-9]*/\(.*\),${{ steps.version.outputs.VERSION }}/\1," www-releases/releases/_redirects
- name: Adjust slintpad default tag
if: github.event.inputs.release == 'true'
run: sed -i "s,XXXX_DEFAULT_TAG_XXXX,v${{ steps.version.outputs.VERSION }}," www-releases/releases/${{ steps.version.outputs.VERSION }}/editor/assets/*.js
- name: Update versions.txt
if: github.event.inputs.release == 'true'
run: ls -1d */ | cut -f1 -d'/' | sort --version-sort -r > versions.txt
working-directory: www-releases/releases
- name: Update SlintPad
if: github.event.inputs.release == 'true'
run: |
rm -rf www-releases/slintpad
cp -r www-releases/releases/${{ steps.version.outputs.VERSION }}/editor www-releases/slintpad
for f in 404.html script.js LICENSE.md; do
cp www-releases/releases/$f www-releases/slintpad
done
echo "${{ steps.version.outputs.VERSION }}" > www-releases/slintpad/versions.txt
- name: commit and push
run: |
cd www-releases
git add .
git add -u .
git commit --message "Update $NAME from $GITHUB_REPOSITORY" --message "Pull web demos and C++/Rust reference docs from commit $GITHUB_SHA ($GITHUB_REF)"
ssh-agent sh -c 'echo "${{ secrets.WWW_PUBLISH_SSH_KEY }}" | ssh-add - && git push origin master'
prepare_release:
if: github.event.inputs.private != 'true'
needs: [cpp_package, slint-viewer-binary, slint-lsp-binary]
runs-on: ubuntu-22.04
permissions:
contents: write
steps:
- uses: actions/download-artifact@v4
with:
name: cpp_bin-linux
- uses: actions/download-artifact@v4
with:
name: cpp_bin-macos
- uses: actions/download-artifact@v4
with:
name: cpp_bin-windows
- uses: actions/download-artifact@v4
with:
name: slint-viewer-linux
- uses: actions/download-artifact@v4
with:
name: slint-viewer-windows
- uses: actions/download-artifact@v4
with:
name: slint-viewer-macos
- uses: actions/download-artifact@v4
with:
name: slint-lsp-linux
- uses: actions/download-artifact@v4
with:
name: slint-lsp-windows
- uses: actions/download-artifact@v4
with:
name: slint-lsp-macos
- name: Extract files
run: |
mkdir artifacts
mv Slint-cpp-*-win64*.exe artifacts/
mv Slint-cpp-*-Linux-x86_64.tar.gz artifacts/
mv slint-viewer-linux.tar.gz artifacts/
mv slint-viewer-macos.tar.gz artifacts/
mv slint-lsp-linux.tar.gz artifacts/
mv slint-lsp-macos.tar.gz artifacts/
- name: Extract Version
id: version
run: |
version=$(echo artifacts/Slint-cpp-*-win64-MSVC.exe | sed -nre 's/^.*-([0-9]+\.[0-9]+\.[0-9]+).*$/\1/p')
if [[ -z "$version" ]]; then
echo "Version not found"
exit 1
fi
echo "VERSION=$version" >> $GITHUB_OUTPUT
- uses: montudor/action-zip@v1
with:
args: zip -r artifacts/slint-viewer-windows.zip slint-viewer
- uses: montudor/action-zip@v1
with:
args: zip -r artifacts/slint-lsp-windows.zip slint-lsp
- uses: ncipollo/release-action@v1
if: github.event.inputs.release == 'true'
with:
draft: true
artifacts: "artifacts/*"
body: "[ChangeLog](https://github.com/slint-ui/slint/blob/master/CHANGELOG.md)"
name: ${{ steps.version.outputs.VERSION }}
tag: v${{ steps.version.outputs.VERSION }}
commit: ${{ github.sha }}
android:
env:
CARGO_APK_RELEASE_KEYSTORE: /home/runner/.android/release.keystore
CARGO_APK_RELEASE_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Android API level 30
run: ${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager --install "platforms;android-30"
- name: Cache cargo-apk
id: cargo-apk-cache
uses: actions/cache@v4
with:
path: ~/.cargo/bin/cargo-apk
key: cargo-apk-cache
# Only build cargo-apk if not cached
- uses: dtolnay/rust-toolchain@stable
if: steps.cargo-apk-cache.outputs.cache-hit != 'true'
- name: Install cargo-apk
if: steps.cargo-apk-cache.outputs.cache-hit != 'true'
run: cargo install cargo-apk
- uses: ./.github/actions/setup-rust
with:
target: aarch64-linux-android
- name: dump keystore
run: |
mkdir -p /home/runner/.android
echo "${{ secrets.ANDROID_KEYSTORE_BASE64 }}" | base64 --decode > $CARGO_APK_RELEASE_KEYSTORE
- name: Build energy-monitor example
run: cargo apk build -p energy-monitor --target aarch64-linux-android --lib --release
- name: Build todo demo
run: cargo apk build -p todo --target aarch64-linux-android --lib --release
- name: "upload APK artifact"
uses: actions/upload-artifact@v4
with:
name: android-demo
path: |
target/release/apk/energy-monitor.apk
target/release/apk/todo_lib.apk
# Purely quality-assurance related jobs, not relevant for release artefacts
qa-esp-idf:
strategy:
matrix:
esp-idf-target:
- release-v5.2
- latest
runs-on: ubuntu-22.04
container: espressif/idf:${{ matrix.esp-idf-target }}
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: esp-rs/xtensa-toolchain@v1.5
with:
default: true
buildtargets: esp32
ldproxy: false
- uses: Swatinem/rust-cache@v2
- name: Build and Test Printer demo
shell: bash
working-directory: examples/printerdemo_mcu/esp-idf
run: |
. ${IDF_PATH}/export.sh
idf.py build
- name: Build and Test Carousel example s3 box
shell: bash
working-directory: examples/carousel/esp-idf/s3-box
run: |
. ${IDF_PATH}/export.sh
idf.py build
- name: Build and Test Carousel example s3 usb otg
shell: bash
working-directory: examples/carousel/esp-idf/s3-usb-otg
run: |
. ${IDF_PATH}/export.sh
idf.py build
- name: Build and Test Carousel example s2 kaluga kit
shell: bash
working-directory: examples/carousel/esp-idf/s2-kaluga-kit
run: |
. ${IDF_PATH}/export.sh
idf.py build
qa-tree-sitter-latest:
uses: ./.github/workflows/tree_sitter.yaml
with:
latest: true
qa-yocto-build:
strategy:
matrix:
include:
- sdk_url: https://nextcloud.slint.dev/s/SCXYDmEmr45pkak/download/poky-glibc-x86_64-core-image-weston-cortexa57-qemuarm64-toolchain-4.0.9.sh
env_setup: environment-setup-cortexa57-poky-linux
target: aarch64-unknown-linux-gnu
- sdk_url: https://nextcloud.slint.dev/s/BTL5NtLACjgS7Pf/download/poky-glibc-x86_64-core-image-weston-cortexa15t2hf-neon-qemuarm-toolchain-4.0.9.sh
env_setup: environment-setup-cortexa15t2hf-neon-poky-linux-gnueabi
target: armv7-unknown-linux-gnueabihf
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: Fetch Yocto SDK
run: |
# Fetch pre-built SDK built via populate_sdk for core-image-weston with setup from https://github.com/slint-ui/meta-slint/blob/main/.github/workflows/ci.yml
wget -O sdk.sh ${{ matrix.sdk_url }}
chmod +x sdk.sh
./sdk.sh -d ${{ runner.workspace }}/yocto-sdk -y
rm -f sdk.sh
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
toolchain: stable
target: ${{ matrix.target }}
- name: C++ Build
run: |
. ${{ runner.workspace }}/yocto-sdk/${{ matrix.env_setup }}
# Only needed for 32-bit arm builds where soft-fp/hard-fp affects header file lookup, hence the need to drag in these flags. See also commit
# f5c3908b7ec5131b7b19ff642b5975660c7484f8
export BINDGEN_EXTRA_CLANG_ARGS=$OECORE_TUNE_CCARGS
mkdir ${{ runner.workspace }}/cppbuild
cmake -GNinja -B ${{ runner.workspace }}/cppbuild -S . -DRust_CARGO_TARGET=${{ matrix.target }} -DSLINT_BUILD_TESTING=ON -DSLINT_BUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Debug -DSLINT_FEATURE_RENDERER_SKIA=ON -DSLINT_FEATURE_BACKEND_QT=OFF -DSLINT_FEATURE_BACKEND_LINUXKMS=ON -DSLINT_FEATURE_INTERPRETER=ON
cmake --build ${{ runner.workspace }}/cppbuild