Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
178 changes: 178 additions & 0 deletions .github/workflows/build-snap.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

name: Build Snap

on:
workflow_call:
inputs:
checkout-ref:
required: true
type: string
arch:
description: "Snap package architecture"
required: true
type: string
runner:
description: "GitHub Actions runner label"
required: true
type: string
cli-artifact-name:
required: true
type: string
gateway-artifact-name:
required: true
type: string
supervisor-artifact-name:
required: true
type: string
upload-channel:
required: false
type: string
default: ""
description: "Snap Store channel to upload to; leave empty to skip upload"

secrets:
publish-credentials:
required: false
description: "Snap Store credentials (SNAPCRAFT_STORE_CREDENTIALS)"
permissions:
contents: read

defaults:
run:
shell: bash

jobs:
build-snap:
name: Build Snap (Linux ${{ inputs.arch }})
runs-on: ${{ inputs.runner }}
timeout-minutes: 60
environment: ${{ inputs.upload-channel != '' && inputs.upload-channel || '' }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ inputs.checkout-ref }}
fetch-depth: 0

- name: Install snapd
run: |
set -euo pipefail
if ! command -v snapd >/dev/null 2>&1; then
sudo apt-get update
sudo apt-get install -y snapd
fi
sudo systemctl enable --now snapd.socket
sudo systemctl start snapd
sudo snap wait system seed.loaded

- name: Install LXD
run: |
set -euo pipefail
sudo snap install lxd
sudo usermod -aG lxd "$USER"
sudo lxd waitready
sudo lxd init --auto
sudo iptables -P FORWARD ACCEPT
sudo chgrp lxd /var/snap/lxd/common/lxd/unix.socket
sudo chmod 660 /var/snap/lxd/common/lxd/unix.socket

- name: Install snapcraft
run: sudo snap install snapcraft --classic

- name: Download prebuilt CLI binary
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: ${{ inputs.cli-artifact-name }}
path: prebuilt/cli

- name: Download prebuilt gateway binary
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: ${{ inputs.gateway-artifact-name }}
path: prebuilt/gateway

- name: Download prebuilt sandbox binary
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: ${{ inputs.supervisor-artifact-name }}
path: prebuilt/sandbox

- name: Prepare snap build directory
run: |
set -euo pipefail
find_binary() {
find "$1" -type f -name "$2" -print -quit
}
cli="$(find_binary prebuilt/cli openshell)"
gateway="$(find_binary prebuilt/gateway openshell-gateway)"
sandbox="$(find_binary prebuilt/sandbox openshell-sandbox)"
test -n "$cli" && test -n "$gateway" && test -n "$sandbox"

mkdir -p snap/prebuilt/meta/gui
install -m 0755 "$cli" snap/prebuilt/openshell
install -m 0755 "$gateway" snap/prebuilt/openshell-gateway
install -m 0755 "$sandbox" snap/prebuilt/openshell-sandbox
install -m 0755 tasks/scripts/snap-gateway-wrapper.sh snap/prebuilt/openshell-gateway-wrapper
cp LICENSE README.md snap/prebuilt/
cp snap/local/term.desktop snap/prebuilt/meta/gui/term.desktop
cp snap/local/icon.png snap/prebuilt/meta/gui/icon.png
python3 tasks/scripts/release.py get-version --snap > snap/prebuilt/version

- name: Build snap
run: |
set -euo pipefail
runtime_dir="/run/user/$(id -u)"
sudo install -d -m 0700 -o "$(id -u)" -g "$(id -g)" "$runtime_dir"
export XDG_RUNTIME_DIR="$runtime_dir"
sg lxd -c "XDG_RUNTIME_DIR=${runtime_dir} snapcraft pack -v"

- name: Upload snapcraft logs on failure
if: failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: snapcraft-logs-${{ inputs.arch }}
path: "~/.local/state/snapcraft/log/snapcraft-*.log"
retention-days: 7

- name: Capture Snap filename
id: capture
run: |
set -euo pipefail
snap_file=$(find . -maxdepth 1 -type f -name '*.snap' -printf '%f\n' | head -1)
if [ -z "$snap_file" ]; then
echo "::error::No .snap file found after snapcraft pack"
exit 1
fi
echo "snap-file=$snap_file" >> "$GITHUB_OUTPUT"
echo "Built Snap: $snap_file"

- name: Upload snap artifact (${{ inputs.arch }})
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: snap-linux-${{ inputs.arch }}
path: |
${{ steps.capture.outputs.snap-file }}
*.comp
retention-days: 5

- name: Upload Snap to Snap Store
if: inputs.upload-channel != ''
env:
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.publish-credentials }}
INPUTS_UPLOAD_CHANNEL: ${{ inputs.upload-channel }}
run: |
set -euo pipefail
snap_file="${{ steps.capture.outputs.snap-file }}"
snap_name="${snap_file%.snap}"
snap_name="${snap_name%%_*}"

component_args=()
shopt -s nullglob
for component in "${snap_name}"+*.comp; do
echo "Adding component: $component"
component_args+=(--component "$component")
done

echo "Uploading $snap_file to ${INPUTS_UPLOAD_CHANNEL}"
snapcraft upload --release "${INPUTS_UPLOAD_CHANNEL}" "$snap_file" "${component_args[@]}"
Loading
Loading