Skip to content
Closed
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
24 changes: 23 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,26 @@ jobs:
with:
name: server-log-${{ matrix.os }}
path: ${{ steps.server.outputs.log-path }}
if-no-files-found: error
if-no-files-found: error

test-version-pin:
name: Test version pin (ubuntu)
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Run LiveKit server (pinned commit)
id: server
uses: ./
with:
github-token: ${{ github.token }}
version: a47e21b6cb945aabee88c98650366cef8cbf7a99
config: |
enable_data_tracks: true
enable_participant_data_blob: true
- name: Upload server log
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: server-log-version-pin
path: ${{ steps.server.outputs.log-path }}
if-no-files-found: error
16 changes: 15 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,26 @@ Install and run a LiveKit server in development mode for end-to-end testing.
github-token: ${{ github.token }}
```

Pin a specific server release or commit (builds from source when no binary is
available for the runner OS, e.g. macOS or a commit SHA):

```yaml
- uses: livekit/dev-server-action@v1
with:
github-token: ${{ github.token }}
version: a47e21b6cb945aabee88c98650366cef8cbf7a99
config: |
enable_data_tracks: true
enable_participant_data_blob: true
```

## Inputs

| Name | Required | Default | Description |
| -------------- | -------- | ------- | -------------------------------------------------------------------- |
| `github-token` | Yes | | Token used to download the LiveKit server release. |
| `config` | No | `""` | Server configuration YAML
| `version` | No | `""` | Release tag (e.g. `v1.13.2`) or `livekit/livekit` commit SHA. When empty, Linux and Windows use the latest release; macOS uses Homebrew. |
| `config` | No | `""` | Server configuration YAML merged over the action base config. |

## Outputs

Expand Down
126 changes: 105 additions & 21 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,13 @@ inputs:
github-token:
description: GitHub token
required: true
version:
description: |
livekit-server version to run: a release tag (e.g. v1.13.2) or a commit SHA
from github.com/livekit/livekit. When empty, Linux and Windows use the latest
release; macOS installs the current Homebrew formula.
required: false
default: ""
config:
description: Server configuration YAML
required: false
Expand All @@ -22,32 +29,103 @@ outputs:
runs:
using: composite
steps:
- name: Resolve server version
id: resolve
shell: bash
env:
GH_TOKEN: ${{ inputs.github-token }}
VERSION_INPUT: ${{ inputs.version }}
run: |
set -euo pipefail
version="${VERSION_INPUT//[[:space:]]/}"
if [ -z "$version" ]; then
if [ "${RUNNER_OS}" = "macOS" ]; then
echo "mode=brew" >> "$GITHUB_OUTPUT"
echo "Resolved livekit-server install mode: Homebrew (latest formula)"
exit 0
fi
version="$(gh api repos/livekit/livekit/releases/latest --jq '.tag_name')"
if [ -z "$version" ]; then
echo "::error::Failed to resolve latest livekit-server release tag"
exit 1
fi
echo "mode=release" >> "$GITHUB_OUTPUT"
echo "ref=$version" >> "$GITHUB_OUTPUT"
echo "Resolved livekit-server release: $version"
exit 0
fi

if [[ "$version" =~ ^v[0-9] ]]; then
if [ "${RUNNER_OS}" = "macOS" ]; then
echo "mode=source" >> "$GITHUB_OUTPUT"
else
echo "mode=release" >> "$GITHUB_OUTPUT"
fi
echo "ref=$version" >> "$GITHUB_OUTPUT"
echo "Resolved livekit-server release: $version"
exit 0
fi

if [[ "$version" =~ ^[0-9a-fA-F]{7,40}$ ]]; then
echo "mode=source" >> "$GITHUB_OUTPUT"
echo "ref=$version" >> "$GITHUB_OUTPUT"
echo "Resolved livekit-server commit: $version"
exit 0
fi

echo "::error::Invalid version '$version' (expected release tag like v1.13.2 or commit SHA)"
exit 1

- name: Brew install
if: runner.os == 'macOS'
if: steps.resolve.outputs.mode == 'brew'
shell: bash
env:
HOMEBREW_NO_ENV_HINTS: 1
run: brew install livekit
- name: Resolve latest version
if: runner.os == 'Linux' || runner.os == 'Windows'
id: version

- name: Setup Go
if: steps.resolve.outputs.mode == 'source'
uses: actions/setup-go@40a3f19a49f82516b2f1a6604d1e33c0c247d7f5 # v5.6.0
with:
go-version: "1.26"
cache: false

- name: Build livekit-server from source
if: steps.resolve.outputs.mode == 'source'
shell: bash
env:
GH_TOKEN: ${{ inputs.github-token }}
run: |
tag="$(gh api repos/livekit/livekit/releases/latest --jq '.tag_name')"
if [ -z "$tag" ]; then
echo "::error::Failed to resolve version tag"
exit 1
set -euo pipefail
ref="${{ steps.resolve.outputs.ref }}"
src_dir="$RUNNER_TEMP/livekit-src"
out="$RUNNER_TEMP/livekit-server"
if [ "${RUNNER_OS}" = "Windows" ]; then
out="$RUNNER_TEMP/livekit-server.exe"
fi

git clone https://github.com/livekit/livekit.git "$src_dir"
pushd "$src_dir" >/dev/null
if [[ "$ref" =~ ^v[0-9] ]]; then
git fetch --depth 1 origin "refs/tags/${ref}:refs/tags/${ref}"
git checkout "refs/tags/${ref}"
else
git fetch --depth 1 origin "$ref"
git checkout "$ref"
fi
popd >/dev/null

go build -o "$out" "$src_dir/cmd/server"
if [ "${RUNNER_OS}" != "Windows" ]; then
chmod +x "$out"
fi
echo "Latest version tag: $tag"
echo "tag=$tag" >> "$GITHUB_OUTPUT"
"$out" --version

- name: Download release artifact
if: runner.os == 'Linux' || runner.os == 'Windows'
if: steps.resolve.outputs.mode == 'release'
shell: bash
env:
GH_TOKEN: ${{ inputs.github-token }}
run: |
set -euo pipefail
case "${RUNNER_OS}-${RUNNER_ARCH}" in
Linux-X64) suffix='linux_amd64.tar.gz' ;;
Linux-ARM64) suffix='linux_arm64.tar.gz' ;;
Expand All @@ -57,7 +135,7 @@ runs:
esac
echo "::debug::Artifact suffix: $suffix"

gh release download "${{ steps.version.outputs.tag }}" \
gh release download "${{ steps.resolve.outputs.ref }}" \
--repo livekit/livekit \
--pattern "*_${suffix}" \
--output "$RUNNER_TEMP/release-archive"
Expand All @@ -68,9 +146,10 @@ runs:
}

- name: Extract release artifact
if: runner.os == 'Linux' || runner.os == 'Windows'
if: steps.resolve.outputs.mode == 'release'
shell: bash
run: |
set -euo pipefail
case "${RUNNER_OS}" in
Linux) tar -xzf "$RUNNER_TEMP/release-archive" -C "$RUNNER_TEMP" && chmod +x "$RUNNER_TEMP/livekit-server" ;;
Windows) unzip -o "$RUNNER_TEMP/release-archive" -d "$RUNNER_TEMP" ;;
Expand Down Expand Up @@ -99,12 +178,17 @@ runs:
id: start
shell: bash
run: |
case "${RUNNER_OS}" in
macOS) livekit_cmd="livekit-server" ;;
Linux) livekit_cmd="$RUNNER_TEMP/livekit-server" ;;
Windows) livekit_cmd="$RUNNER_TEMP/livekit-server.exe" ;;
*) echo "::error::Unsupported platform: ${RUNNER_OS}"; exit 1 ;;
esac
set -euo pipefail
if [ -x "$RUNNER_TEMP/livekit-server" ]; then
livekit_cmd="$RUNNER_TEMP/livekit-server"
elif [ -f "$RUNNER_TEMP/livekit-server.exe" ]; then
livekit_cmd="$RUNNER_TEMP/livekit-server.exe"
elif command -v livekit-server >/dev/null 2>&1; then
livekit_cmd="livekit-server"
else
echo "::error::livekit-server binary not found"
exit 1
fi

"$livekit_cmd" --version

Expand Down
Loading