Migrate GitHub automation to GitLab CI

This commit is contained in:
KingKDot
2026-08-23 16:36:55 -05:00
parent c6053b694d
commit cabab9e33b
14 changed files with 345 additions and 471 deletions
-116
View File
@@ -1,116 +0,0 @@
name: Overlord Desktop Windows Release
on:
push:
branches: ["main"]
paths:
- "Overlord-Desktop/**"
permissions:
contents: read
jobs:
build:
runs-on: windows-latest
permissions:
contents: write
defaults:
run:
working-directory: Overlord-Desktop
steps:
- name: Checkout Repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
fetch-depth: 0
- name: Get Version
id: version
run: |
$version = (Get-Content package.json | ConvertFrom-Json).version
if ($version -notmatch '^\d+\.\d+\.\d+$') {
throw "package.json version must be strict X.Y.Z SemVer for release tags; got '$version'"
}
"version=$version" >> $env:GITHUB_OUTPUT
shell: pwsh
- name: Ensure Release Tag Does Not Exist
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
VERSION: ${{ steps.version.outputs.version }}
run: |
set -euo pipefail
tag="Overlord-Desktop-v${VERSION}"
if git ls-remote --exit-code --tags origin "refs/tags/${tag}" >/dev/null 2>&1; then
echo "Release tag already exists: ${tag}" >&2
exit 1
fi
if gh release view "${tag}" --repo "${GITHUB_REPOSITORY}" >/dev/null 2>&1; then
echo "Release already exists: ${tag}" >&2
exit 1
fi
shell: bash
- name: Setup Bun
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
with:
bun-version: 1.3.14
- name: Setup Rust
uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
- name: Cache Rust build
uses: Swatinem/rust-cache@42dc69e1aa15d09112580998cf2ef0119e2e91ae # v2
with:
workspaces: Overlord-Desktop/src-tauri -> target
- name: Install Dependencies
run: bun install --frozen-lockfile
- name: Vendor frontend assets
run: bun run vendor
- name: Build Windows Installer (Tauri NSIS)
run: bun run build:win
- name: Locate NSIS Installer
id: locate
shell: pwsh
run: |
$nsis = Get-ChildItem -Path src-tauri\target\release\bundle\nsis\*.exe -ErrorAction Stop | Select-Object -First 1
echo "INSTALLER=$($nsis.FullName)" >> $env:GITHUB_ENV
echo "INSTALLER_NAME=$($nsis.Name)" >> $env:GITHUB_ENV
- name: Upload Build Artifact
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: overlord-desktop-${{ steps.version.outputs.version }}
path: ${{ env.INSTALLER }}
- name: Create and Push Tag
env:
VERSION: ${{ steps.version.outputs.version }}
run: |
set -euo pipefail
tag="Overlord-Desktop-v${VERSION}"
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git tag "${tag}"
git push origin "${tag}"
shell: bash
- name: Create Release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
VERSION: ${{ steps.version.outputs.version }}
run: |
set -euo pipefail
tag="Overlord-Desktop-v${VERSION}"
gh release create "${tag}" "${INSTALLER}" "PLEASE_READ.txt" \
--verify-tag \
-t "Overlord Desktop v${VERSION}" \
-n "Automated build release for Overlord Desktop v${VERSION}" \
--draft=false \
--prerelease=false
shell: bash
-204
View File
@@ -1,204 +0,0 @@
name: overlord-ci
on:
workflow_dispatch:
inputs:
release_version:
description: 'Release version to publish, for example 1.2.3'
required: true
type: string
env:
REGISTRY: ghcr.io
RELEASE_VERSION: ${{ inputs.release_version }}
permissions:
contents: read
jobs:
approve-release:
runs-on: ubuntu-latest
environment: overlord-ci
steps:
- name: Confirm release approval
run: echo "Approved release ${RELEASE_VERSION}"
build-and-push:
needs: approve-release
name: Build and push (${{ matrix.platform }})
runs-on: ${{ matrix.runner }}
timeout-minutes: 45
strategy:
fail-fast: false
matrix:
include:
- platform: linux/amd64
runner: ubuntu-latest
artifact: amd64
- platform: linux/arm64
runner: ubuntu-24.04-arm
artifact: arm64
permissions:
contents: read
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- name: Read Source Version
id: srcver
shell: bash
run: |
set -euo pipefail
client_version=$(grep -oP 'var\s+AgentVersion\s*=\s*"\K[0-9]+\.[0-9]+\.[0-9]+' Overlord-Client/cmd/agent/config/config.go)
server_version=$(grep -oP 'export\s+const\s+SERVER_VERSION\s*=\s*"\K[0-9]+\.[0-9]+\.[0-9]+' Overlord-Server/src/version.ts)
package_version=$(node -p "require('./Overlord-Server/package.json').version")
if [[ -z "$client_version" || -z "$server_version" || -z "$package_version" ]]; then
echo "Failed to parse one or more version values from source files" >&2
exit 1
fi
if ! { [[ "$client_version" == "$server_version" ]] && [[ "$client_version" == "$package_version" ]]; }; then
echo "Version mismatch detected:" >&2
echo " client(config.go): $client_version" >&2
echo " server(version.ts): $server_version" >&2
echo " package(package.json): $package_version" >&2
exit 1
fi
major="${client_version%%.*}"
rest="${client_version#*.}"
minor="${rest%%.*}"
{
echo "version=$client_version"
echo "major=$major"
echo "minor=$minor"
} >> "$GITHUB_OUTPUT"
- name: Validate Release Version Matches Source Version
shell: bash
run: |
set -euo pipefail
if [[ ! "$RELEASE_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "Release version must be strict semver like 1.2.3; got ${RELEASE_VERSION}" >&2
exit 1
fi
src_version="${{ steps.srcver.outputs.version }}"
if [[ "$RELEASE_VERSION" != "$src_version" ]]; then
echo "Release version ($RELEASE_VERSION) does not match source version ($src_version)" >&2
exit 1
fi
- name: Normalize image name
run: printf 'IMAGE_NAME=%s\n' "${GITHUB_REPOSITORY,,}" >> "$GITHUB_ENV"
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3
- name: Log in to GitHub Container Registry
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata
id: meta
uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=raw,value=${{ steps.srcver.outputs.version }}
type=raw,value=${{ steps.srcver.outputs.major }}.${{ steps.srcver.outputs.minor }}
type=raw,value=${{ steps.srcver.outputs.major }}
type=raw,value=latest
- name: Build and push server image
id: build
uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5
with:
context: .
file: ./Dockerfile
platforms: ${{ matrix.platform }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha,scope=server-${{ matrix.artifact }}
cache-to: type=gha,mode=max,scope=server-${{ matrix.artifact }}
outputs: type=image,name=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true
- name: Export image digest
shell: bash
run: |
set -euo pipefail
mkdir -p /tmp/digests
digest="${{ steps.build.outputs.digest }}"
test -n "$digest"
touch "/tmp/digests/${digest#sha256:}"
- name: Upload image digest
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: image-digest-${{ matrix.artifact }}
path: /tmp/digests/*
if-no-files-found: error
retention-days: 1
merge-and-publish:
name: Merge and publish multi-architecture image
needs: build-and-push
runs-on: ubuntu-latest
timeout-minutes: 15
permissions:
contents: read
packages: write
steps:
- name: Normalize image name
run: printf 'IMAGE_NAME=%s\n' "${GITHUB_REPOSITORY,,}" >> "$GITHUB_ENV"
- name: Download image digests
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
with:
pattern: image-digest-*
path: /tmp/digests
merge-multiple: true
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3
- name: Log in to GitHub Container Registry
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract release tags
id: meta
uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=semver,pattern={{version}},value=${{ env.RELEASE_VERSION }}
type=semver,pattern={{major}}.{{minor}},value=${{ env.RELEASE_VERSION }}
type=semver,pattern={{major}},value=${{ env.RELEASE_VERSION }}
type=raw,value=latest
- name: Create and push multi-architecture manifest
working-directory: /tmp/digests
shell: bash
run: |
set -euo pipefail
test "$(find . -maxdepth 1 -type f | wc -l)" -eq 2
mapfile -t tag_args < <(jq -r '.tags[] | "-t", .' <<< "$DOCKER_METADATA_OUTPUT_JSON")
digest_args=()
for digest_file in *; do
digest_args+=("${REGISTRY}/${IMAGE_NAME}@sha256:${digest_file}")
done
docker buildx imagetools create "${tag_args[@]}" "${digest_args[@]}"
- name: Verify published manifest
run: docker buildx imagetools inspect "${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${RELEASE_VERSION}"
-135
View File
@@ -1,135 +0,0 @@
name: tests
on:
pull_request:
push:
workflow_dispatch:
permissions:
contents: read
jobs:
changes:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
outputs:
server: ${{ steps.filter.outputs.server }}
client: ${{ steps.filter.outputs.client }}
steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- name: Detect changed paths
uses: dorny/paths-filter@6852f92c20ea7fd3b0c25de3b5112db3a98da050 # v3
id: filter
with:
filters: |
server:
- 'Overlord-Server/**'
- 'Overlord-Client/cmd/agent/wire/wire_contract_generated.go'
- 'protocol/**'
- 'scripts/generate-wire-protocol.ts'
- '.github/workflows/tests.yml'
client:
- 'Overlord-Client/**'
- 'protocol/**'
- 'scripts/generate-wire-protocol.ts'
- 'go.work'
- 'go.work.sum'
server-tests:
needs: changes
if: needs.changes.outputs.server == 'true' || github.event_name == 'workflow_dispatch'
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
defaults:
run:
working-directory: Overlord-Server
steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- name: Setup Bun
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
with:
bun-version: 1.3.14
- name: Install server dependencies
run: bun install --frozen-lockfile
- name: Typecheck server
run: bun run typecheck
- name: Verify generated wire protocol
run: bun run protocol:check
- name: Run server tests
run: bun run test
server-e2e-tests:
needs: changes
if: needs.changes.outputs.server == 'true' || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
defaults:
run:
working-directory: Overlord-Server
steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- name: Setup Bun
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
with:
bun-version: 1.3.14
- name: Install server dependencies
run: bun install --frozen-lockfile
- name: Install Chromium and system dependencies
run: bunx playwright install --with-deps chromium
- name: Run browser tests
run: bun run test:e2e
client-tests:
needs: changes
if: needs.changes.outputs.client == 'true' || github.event_name == 'workflow_dispatch'
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
defaults:
run:
working-directory: Overlord-Client
steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- name: Setup Go
uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v5
with:
go-version-file: Overlord-Client/go.mod
cache: true
cache-dependency-path: |
Overlord-Client/go.sum
go.work.sum
- name: Download Go modules
run: go mod download
- name: Vendor third-party headers (Windows)
if: runner.os == 'Windows'
shell: bash
working-directory: ${{ github.workspace }}
run: |
bash scripts/vendor-onevpl-headers.sh
bash scripts/vendor-amf-headers.sh
- name: Run client tests
run: go test ./...
+21
View File
@@ -0,0 +1,21 @@
stages:
- test
- package
- release
workflow:
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
- if: '$CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS && $CI_PIPELINE_SOURCE == "push"'
when: never
- if: "$CI_COMMIT_BRANCH || $CI_COMMIT_TAG"
variables:
RELEASE_VERSION:
value: ""
description: "Server image version to publish (strict SemVer, for example 3.1.0). Leave blank for a test-only pipeline."
include:
- local: /.gitlab/ci/tests.yml
- local: /.gitlab/ci/container-release.yml
- local: /.gitlab/ci/desktop-release.yml
+106
View File
@@ -0,0 +1,106 @@
approve-container-release:
stage: package
image: alpine:3.22
rules:
- if: '$CI_PIPELINE_SOURCE == "web" && $RELEASE_VERSION =~ /^\d+\.\d+\.\d+$/'
when: manual
environment:
name: overlord-container-release
script:
- echo "Approved container release ${RELEASE_VERSION}"
container-build:
stage: package
image: docker:27.5.1-cli
services:
- name: docker:27.5.1-dind
command: ["--mtu=1400"]
needs:
- approve-container-release
rules:
- if: '$CI_PIPELINE_SOURCE == "web" && $RELEASE_VERSION =~ /^\d+\.\d+\.\d+$/'
parallel:
matrix:
- PLATFORM: linux/amd64
ARCH: amd64
RUNNER_TAG: saas-linux-small-amd64
- PLATFORM: linux/arm64
ARCH: arm64
RUNNER_TAG: saas-linux-small-arm64
tags:
- $RUNNER_TAG
variables:
DOCKER_TLS_CERTDIR: /certs
before_script:
- echo "$CI_REGISTRY_PASSWORD" | docker login --username "$CI_REGISTRY_USER" --password-stdin "$CI_REGISTRY"
- docker buildx create --driver docker-container --use
- docker buildx inspect --bootstrap
script:
- |
set -eu
client_version=$(sed -nE 's/.*AgentVersion[[:space:]]*=[[:space:]]*"([0-9]+\.[0-9]+\.[0-9]+)".*/\1/p' Overlord-Client/cmd/agent/config/config.go | head -n1)
server_version=$(sed -nE 's/.*SERVER_VERSION[[:space:]]*=[[:space:]]*"([0-9]+\.[0-9]+\.[0-9]+)".*/\1/p' Overlord-Server/src/version.ts | head -n1)
package_version=$(sed -nE 's/[[:space:]]*"version":[[:space:]]*"([0-9]+\.[0-9]+\.[0-9]+)".*/\1/p' Overlord-Server/package.json | head -n1)
test -n "$client_version"
test "$client_version" = "$server_version"
test "$client_version" = "$package_version"
test "$RELEASE_VERSION" = "$client_version"
- |
set -eu
metadata_file=$(mktemp)
docker buildx build \
--file Dockerfile \
--platform "$PLATFORM" \
--label "org.opencontainers.image.source=$CI_PROJECT_URL" \
--label "org.opencontainers.image.revision=$CI_COMMIT_SHA" \
--cache-from "type=registry,ref=$CI_REGISTRY_IMAGE:buildcache-$ARCH" \
--cache-to "type=registry,ref=$CI_REGISTRY_IMAGE:buildcache-$ARCH,mode=max" \
--output "type=image,name=$CI_REGISTRY_IMAGE,push-by-digest=true,name-canonical=true,push=true" \
--metadata-file "$metadata_file" \
.
digest=$(sed -nE 's/.*"containerimage.digest"[[:space:]]*:[[:space:]]*"sha256:([a-f0-9]+)".*/\1/p' "$metadata_file" | head -n1)
test -n "$digest"
mkdir -p digests
touch "digests/$digest"
artifacts:
expire_in: 1 day
paths:
- digests/
container-publish:
stage: release
image: docker:27.5.1-cli
services:
- name: docker:27.5.1-dind
command: ["--mtu=1400"]
tags:
- saas-linux-small-amd64
needs:
- job: container-build
artifacts: true
rules:
- if: '$CI_PIPELINE_SOURCE == "web" && $RELEASE_VERSION =~ /^\d+\.\d+\.\d+$/'
variables:
DOCKER_TLS_CERTDIR: /certs
before_script:
- echo "$CI_REGISTRY_PASSWORD" | docker login --username "$CI_REGISTRY_USER" --password-stdin "$CI_REGISTRY"
- docker buildx create --driver docker-container --use
- docker buildx inspect --bootstrap
script:
- |
set -eu
major=${RELEASE_VERSION%%.*}
remainder=${RELEASE_VERSION#*.}
minor=${remainder%%.*}
set --
for digest_file in digests/*; do
set -- "$@" "$CI_REGISTRY_IMAGE@sha256:$(basename "$digest_file")"
done
test "$#" -eq 2
docker buildx imagetools create \
--tag "$CI_REGISTRY_IMAGE:$RELEASE_VERSION" \
--tag "$CI_REGISTRY_IMAGE:$major.$minor" \
--tag "$CI_REGISTRY_IMAGE:$major" \
--tag "$CI_REGISTRY_IMAGE:latest" \
"$@"
docker buildx imagetools inspect "$CI_REGISTRY_IMAGE:$RELEASE_VERSION"
+88
View File
@@ -0,0 +1,88 @@
desktop-build-windows:
stage: package
tags:
- saas-windows-medium-amd64
rules:
- if: "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH"
changes:
- Overlord-Desktop/package.json
- Overlord-Desktop/bun.lock
- Overlord-Desktop/scripts/**/*
- Overlord-Desktop/src/**/*
- Overlord-Desktop/src-tauri/**/*
before_script:
- npm install --global --prefix "$env:CI_PROJECT_DIR\.tools" bun@1.3.14
- $env:PATH = "$env:CI_PROJECT_DIR\.tools;$env:USERPROFILE\.cargo\bin;$env:PATH"
- |
if (-not (Get-Command rustup -ErrorAction SilentlyContinue)) {
Invoke-WebRequest -UseBasicParsing https://win.rustup.rs/x86_64 -OutFile "$env:CI_PROJECT_DIR\rustup-init.exe"
& "$env:CI_PROJECT_DIR\rustup-init.exe" -y --profile minimal
}
- rustup toolchain install stable --profile minimal
- rustup default stable
script:
- Set-Location Overlord-Desktop
- |
$Version = (Get-Content package.json | ConvertFrom-Json).version
if ($Version -notmatch '^\d+\.\d+\.\d+$') {
throw "package.json version must be strict X.Y.Z SemVer; got '$Version'"
}
$Tag = "Overlord-Desktop-v$Version"
if (git ls-remote --exit-code --tags origin "refs/tags/$Tag") {
throw "Release tag already exists: $Tag"
}
$env:DESKTOP_VERSION = $Version
$env:DESKTOP_TAG = $Tag
"DESKTOP_VERSION=$Version" | Out-File -FilePath "$env:CI_PROJECT_DIR\desktop.env" -Encoding ascii
"DESKTOP_TAG=$Tag" | Out-File -FilePath "$env:CI_PROJECT_DIR\desktop.env" -Encoding ascii -Append
- bun install --frozen-lockfile
- bun run vendor
- bun run build:win
- |
$Installer = Get-ChildItem -Path src-tauri\target\release\bundle\nsis\*.exe -ErrorAction Stop | Select-Object -First 1
$ReleaseDirectory = New-Item -ItemType Directory -Path "$env:CI_PROJECT_DIR\release" -Force
$InstallerName = "Overlord-Desktop-$env:DESKTOP_VERSION-setup.exe"
Copy-Item -LiteralPath $Installer.FullName -Destination (Join-Path $ReleaseDirectory $InstallerName)
Copy-Item -LiteralPath PLEASE_READ.txt -Destination $ReleaseDirectory
"INSTALLER_NAME=$InstallerName" | Out-File -FilePath "$env:CI_PROJECT_DIR\desktop.env" -Encoding ascii -Append
artifacts:
expire_in: 30 days
paths:
- release/
reports:
dotenv: desktop.env
desktop-release:
stage: release
image: registry.gitlab.com/gitlab-org/cli:latest
needs:
- job: desktop-build-windows
artifacts: true
rules:
- if: "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH"
changes:
- Overlord-Desktop/package.json
- Overlord-Desktop/bun.lock
- Overlord-Desktop/scripts/**/*
- Overlord-Desktop/src/**/*
- Overlord-Desktop/src-tauri/**/*
script:
- |
set -eu
package_base="$CI_API_V4_URL/projects/$CI_PROJECT_ID/packages/generic/overlord-desktop/$DESKTOP_VERSION"
curl --fail --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file "release/$INSTALLER_NAME" "$package_base/$INSTALLER_NAME"
curl --fail --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file release/PLEASE_READ.txt "$package_base/PLEASE_READ.txt"
release:
tag_name: $DESKTOP_TAG
tag_message: "Overlord Desktop v$DESKTOP_VERSION"
name: "Overlord Desktop v$DESKTOP_VERSION"
description: "Automated build release for Overlord Desktop v$DESKTOP_VERSION"
ref: $CI_COMMIT_SHA
assets:
links:
- name: $INSTALLER_NAME
url: "$CI_API_V4_URL/projects/$CI_PROJECT_ID/packages/generic/overlord-desktop/$DESKTOP_VERSION/$INSTALLER_NAME"
link_type: package
- name: PLEASE_READ.txt
url: "$CI_API_V4_URL/projects/$CI_PROJECT_ID/packages/generic/overlord-desktop/$DESKTOP_VERSION/PLEASE_READ.txt"
link_type: other
+114
View File
@@ -0,0 +1,114 @@
.server-test-rules:
rules:
- changes:
- Overlord-Server/**/*
- Overlord-Client/cmd/agent/wire/wire_contract_generated.go
- protocol/**/*
- scripts/generate-wire-protocol.ts
- .gitlab-ci.yml
- .gitlab/ci/tests.yml
.client-test-rules:
rules:
- changes:
- Overlord-Client/**/*
- protocol/**/*
- scripts/generate-wire-protocol.ts
- go.work
- go.work.sum
- .gitlab-ci.yml
- .gitlab/ci/tests.yml
server-tests-linux:
extends: .server-test-rules
stage: test
image: oven/bun:1.3.14
script:
- cd Overlord-Server
- bun install --frozen-lockfile
- bun run typecheck
- bun run protocol:check
- bun run test
server-tests-macos:
extends: .server-test-rules
stage: test
tags:
- saas-macos-medium-m1
image: macos-15-xcode-16
before_script:
- npm install --global --prefix "$CI_PROJECT_DIR/.tools" bun@1.3.14
- export PATH="$CI_PROJECT_DIR/.tools/bin:$PATH"
script:
- cd Overlord-Server
- bun install --frozen-lockfile
- bun run typecheck
- bun run protocol:check
- bun run test
server-tests-windows:
extends: .server-test-rules
stage: test
tags:
- saas-windows-medium-amd64
before_script:
- npm install --global --prefix "$env:CI_PROJECT_DIR\.tools" bun@1.3.14
- $env:PATH = "$env:CI_PROJECT_DIR\.tools;$env:PATH"
script:
- Set-Location Overlord-Server
- bun install --frozen-lockfile
- bun run typecheck
- bun run protocol:check
- bun run test
server-e2e-tests:
extends: .server-test-rules
stage: test
image: oven/bun:1.3.14
script:
- cd Overlord-Server
- bun install --frozen-lockfile
- bunx playwright install --with-deps chromium
- bun run test:e2e
client-tests-linux:
extends: .client-test-rules
stage: test
image: golang:1.26-bookworm
script:
- cd Overlord-Client
- go mod download
- go test ./...
client-tests-macos:
extends: .client-test-rules
stage: test
tags:
- saas-macos-medium-m1
image: macos-15-xcode-16
before_script:
- export GO_VERSION="$(awk '/^go / { print $2; exit }' Overlord-Client/go.mod)"
- mkdir -p "$CI_PROJECT_DIR/.toolchains"
- curl --fail --silent --show-error --location "https://go.dev/dl/go${GO_VERSION}.darwin-arm64.tar.gz" | tar -xz -C "$CI_PROJECT_DIR/.toolchains"
- export PATH="$CI_PROJECT_DIR/.toolchains/go/bin:$PATH"
script:
- cd Overlord-Client
- go mod download
- go test ./...
client-tests-windows:
extends: .client-test-rules
stage: test
tags:
- saas-windows-medium-amd64
before_script:
- $GoVersion = ((Select-String -Path Overlord-Client/go.mod -Pattern '^go ').Line -split '\s+')[1]
- Invoke-WebRequest -UseBasicParsing "https://go.dev/dl/go$GoVersion.windows-amd64.zip" -OutFile "$env:CI_PROJECT_DIR\go.zip"
- Expand-Archive -Path "$env:CI_PROJECT_DIR\go.zip" -DestinationPath "$env:CI_PROJECT_DIR\.toolchains" -Force
- $env:PATH = "$env:CI_PROJECT_DIR\.toolchains\go\bin;$env:PATH"
script:
- bash scripts/vendor-onevpl-headers.sh
- bash scripts/vendor-amf-headers.sh
- Set-Location Overlord-Client
- go mod download
- go test ./...
+1 -1
View File
@@ -15,7 +15,7 @@ show a connection error and nothing will work. That is expected.
The server is a separate component that you must deploy yourself. The server is a separate component that you must deploy yourself.
2. Full setup instructions are in the README: 2. Full setup instructions are in the README:
https://github.com/vxaboveground/Overlord/blob/main/README.md https://gitlab.com/vxaboveground/overlord/-/blob/main/README.md
3. Once the server is running, open this desktop client and enter the 3. Once the server is running, open this desktop client and enter the
server's IP address (or hostname) and port on the connection screen. server's IP address (or hostname) and port on the connection screen.
+1 -1
View File
@@ -49,7 +49,7 @@ bun run build:linux # Linux AppImage
Or from the repo root: `./scripts/build-desktop.sh` (or `scripts\build-desktop.bat` on Windows) picks the right target for the current OS. Or from the repo root: `./scripts/build-desktop.sh` (or `scripts\build-desktop.bat` on Windows) picks the right target for the current OS.
Output lands in `src-tauri/target/release/bundle/`. The CI workflow in `.github/workflows/desktop-release.yml` builds the Windows NSIS installer on every push to `main` that touches `Overlord-Desktop/` and publishes it as a GitHub Release tagged `Overlord-Desktop-v<version>`. Output lands in `src-tauri/target/release/bundle/`. The CI workflow in `.gitlab/ci/desktop-release.yml` builds the Windows NSIS installer on every push to `main` that changes the desktop application or its build inputs, and publishes it as a GitLab Release tagged `Overlord-Desktop-v<version>`.
## Configuration ## Configuration
+5 -5
View File
@@ -1,5 +1,5 @@
const TELEGRAM_URL = "https://t.me/Onimai"; const TELEGRAM_URL = "https://t.me/Onimai";
const GITHUB_ISSUES_URL = "https://github.com/vxaboveground/Overlord/issues/new"; const GITLAB_ISSUES_URL = "https://gitlab.com/vxaboveground/overlord/-/issues/new";
let mounted = false; let mounted = false;
@@ -90,11 +90,11 @@ export function showOnboardingIfNeeded(user) {
stepContent.innerHTML = ` stepContent.innerHTML = `
<div class="account-onboarding__card"> <div class="account-onboarding__card">
<h2><i class="fa-brands fa-github" aria-hidden="true"></i> Found a bug? Use GitHub Issues</h2> <h2><i class="fa-brands fa-gitlab" aria-hidden="true"></i> Found a bug? Use GitLab Issues</h2>
<p><strong>This is the official place to report bugs.</strong> Create a GitHub issue with what happened, what you expected, and any useful screenshots or logs so the problem can be tracked and fixed.</p> <p><strong>This is the official place to report bugs.</strong> Create a GitLab issue with what happened, what you expected, and any useful screenshots or logs so the problem can be tracked and fixed.</p>
<div class="account-onboarding__url-label">Full bug report link</div> <div class="account-onboarding__url-label">Full bug report link</div>
<a class="account-onboarding__url" href="${GITHUB_ISSUES_URL}" target="_blank" rel="noopener noreferrer">${GITHUB_ISSUES_URL}</a> <a class="account-onboarding__url" href="${GITLAB_ISSUES_URL}" target="_blank" rel="noopener noreferrer">${GITLAB_ISSUES_URL}</a>
<a class="account-onboarding__open" href="${GITHUB_ISSUES_URL}" target="_blank" rel="noopener noreferrer"><i class="fa-brands fa-github" aria-hidden="true"></i> Create a GitHub issue</a> <a class="account-onboarding__open" href="${GITLAB_ISSUES_URL}" target="_blank" rel="noopener noreferrer"><i class="fa-brands fa-gitlab" aria-hidden="true"></i> Create a GitLab issue</a>
</div> </div>
`; `;
progressText.textContent = "Step 2 of 2"; progressText.textContent = "Step 2 of 2";
+6 -6
View File
@@ -1,5 +1,5 @@
<p align="center"> <p align="center">
<img src="https://raw.githubusercontent.com/vxaboveground/Overlord/refs/heads/main/Overlord-Server/public/assets/overlord.png" alt="Overlord" width="280" /> <img src="https://gitlab.com/vxaboveground/overlord/-/raw/main/Overlord-Server/public/assets/overlord.png" alt="Overlord" width="280" />
</p> </p>
# Overlord # Overlord
@@ -103,7 +103,7 @@ docker compose version
**2. Get the project** **2. Get the project**
```powershell ```powershell
git clone https://github.com/vxaboveground/Overlord.git git clone https://gitlab.com/vxaboveground/overlord.git
cd Overlord cd Overlord
``` ```
@@ -190,14 +190,14 @@ Make a folder for it, drop in the file, and you're done:
```bash ```bash
mkdir overlord && cd overlord mkdir overlord && cd overlord
wget https://raw.githubusercontent.com/vxaboveground/Overlord/refs/heads/main/docker-compose.yml wget https://gitlab.com/vxaboveground/overlord/-/raw/main/docker-compose.yml
``` ```
No `wget`? Use `curl`: No `wget`? Use `curl`:
```bash ```bash
mkdir overlord && cd overlord mkdir overlord && cd overlord
curl -O https://raw.githubusercontent.com/vxaboveground/Overlord/refs/heads/main/docker-compose.yml curl -O https://gitlab.com/vxaboveground/overlord/-/raw/main/docker-compose.yml
``` ```
**3. Start it** **3. Start it**
@@ -206,7 +206,7 @@ curl -O https://raw.githubusercontent.com/vxaboveground/Overlord/refs/heads/main
docker compose up -d docker compose up -d
``` ```
The image is pulled automatically from `ghcr.io/vxaboveground/overlord:latest` on first run. The image is pulled automatically from `registry.gitlab.com/vxaboveground/overlord:latest` on first run.
**4. Open the panel** **4. Open the panel**
@@ -266,7 +266,7 @@ docker compose version
**2. Get the project** **2. Get the project**
```bash ```bash
git clone https://github.com/vxaboveground/Overlord.git git clone https://gitlab.com/vxaboveground/overlord.git
cd Overlord cd Overlord
``` ```
+1 -1
View File
@@ -1,6 +1,6 @@
services: services:
overlord-server: overlord-server:
image: ghcr.io/vxaboveground/overlord:latest image: registry.gitlab.com/vxaboveground/overlord:latest
build: build:
context: . context: .
dockerfile: Dockerfile dockerfile: Dockerfile
+1 -1
View File
@@ -1,6 +1,6 @@
services: services:
overlord-server: overlord-server:
image: ${DOCKER_IMAGE:-ghcr.io/vxaboveground/overlord:latest} image: ${DOCKER_IMAGE:-registry.gitlab.com/vxaboveground/overlord:latest}
build: build:
context: . context: .
dockerfile: Dockerfile dockerfile: Dockerfile
+1 -1
View File
@@ -1,6 +1,6 @@
services: services:
overlord-server: overlord-server:
image: ${DOCKER_IMAGE:-ghcr.io/vxaboveground/overlord:latest} image: ${DOCKER_IMAGE:-registry.gitlab.com/vxaboveground/overlord:latest}
build: build:
context: . context: .
dockerfile: Dockerfile dockerfile: Dockerfile