adaptorex
Version:
Connect all your live interactive storytelling devices and software
310 lines (270 loc) • 12.8 kB
YAML
# publish npm package, docker image, linux appimage and windows exe
stages:
- build
- publish
# ─── NPM Package ───────────────────────────────────────────────────────────────
# Publish npm package if commit has a version tag or is production branch.
# Publish only if version changed.
# Publish tagged "beta" if version contains beta (e.g. v2.0.0-beta.0)
#
# The original template is located at:
# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/npm.gitlab-ci.yml
npm-publish:
image: node:latest
stage: publish
dependencies: [] # don't download bundle artifacts
id_tokens:
NPM_ID_TOKEN:
aud: "npm:registry.npmjs.org"
SIGSTORE_ID_TOKEN:
aud: sigstore
rules:
- if: $CI_COMMIT_REF_NAME =~ /^v\d+\.\d+\.\d+.*$/
- if: $API_JOB_NAME == $CI_JOB_NAME
script:
# Fetch latest client build artifact and unzip
- apt update && apt install -y unzip
- curl --location --output artifacts.zip "https://gitlab.com/machina_ex/adaptor_ex/adaptor_ex_client/-/jobs/artifacts/production/download?job=build-site"
- unzip artifacts.zip
- mv dist/* public
- rm artifacts.zip
# Extract version from package.json
- NPM_PACKAGE_VERSION=$(node -p "require('./package.json').version")
# If package version is "beta" prerelease publish with "beta" tag otherwise publish latest
- |
if [[ "$NPM_PACKAGE_VERSION" =~ -beta* ]]; then
npm publish --tag=beta
else
npm publish
fi
echo "Successfully published version ${NPM_PACKAGE_VERSION} to GitLab's NPM registry: ${CI_PROJECT_URL}/-/packages"
# ─── Docker image ─────────────────────────────────────────────────────────────
# Build a Docker image with CI/CD and push to the GitLab registry.
# Docker-in-Docker documentation: https://docs.gitlab.com/ee/ci/docker/using_docker_build.html
#
# This template uses one generic job with conditional builds
# for the default branch and all other (MR) branches.
docker-build:
# Use the official docker image.
image: docker:latest
stage: publish
dependencies: [] # don't download bundle artifacts — Docker builds from source only
# Run this job for tags only. If tag is version number, build 'latest' container also (tag like v0.0.0)
only:
- tags
services:
- docker:dind
before_script:
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
# tagged with production version number (commit tag)
script:
- docker build --pull -t "$CI_REGISTRY_IMAGE" -t "$CI_REGISTRY_IMAGE:${CI_COMMIT_TAG}" .
- VERSION_PATTERN="^v([0-9]+\.){0,2}(\*|[0-9]+)$"
- |
if [[ "$CI_COMMIT_TAG" =~ $VERSION_PATTERN ]]; then
docker push "$CI_REGISTRY_IMAGE"
echo "Tag is version number. Build also with tag 'latest'"
else
echo "Tag '$CI_COMMIT_TAG' is not a valid version number. Push with tag '$CI_COMMIT_TAG' only"
fi
- docker push "$CI_REGISTRY_IMAGE:${CI_COMMIT_TAG}"
# ─── Linux AppImage ───────────────────────────────────────────────────────────
# Runs npm run bundle:linux (build:linux + bundle-linux-appimage.js) and
# publishes the resulting AppImage to the GitLab Generic Packages registry.
# Stable download URL for docs:
# <CI_API_V4_URL>/projects/<CI_PROJECT_ID>/packages/generic/adaptorex/<version>/adaptorex-<version>-x86_64.AppImage
bundle-linux:
image: node:22
stage: build
rules:
- if: $CI_COMMIT_TAG
before_script:
- apt-get update && apt-get install -y unzip libfuse2
# Allow appimagetool (itself an AppImage) to run via FUSE
- modprobe fuse || true
script:
- VERSION=$(node -p "require('./package.json').version")
- APPIMAGE_NAME="adaptorex-${VERSION}-x86_64.AppImage"
# Fetch latest client build
- curl --location --output artifacts.zip "https://gitlab.com/machina_ex/adaptor_ex/adaptor_ex_client/-/jobs/artifacts/production/download?job=build-site"
- unzip artifacts.zip
- mv dist/* public
- rm artifacts.zip
# Install deps (needed for pkg and build scripts)
- npm ci
# Build pkg binary + wrap in AppImage
# appimagetool is downloaded and cached by bundle-linux-appimage.js itself
- npm run build:linux
- npm run bundle:linux
# Publish to Generic Packages registry
- |
curl --fail --header "JOB-TOKEN: $CI_JOB_TOKEN" \
--upload-file "dist/${APPIMAGE_NAME}" \
"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/adaptorex/${VERSION}/${APPIMAGE_NAME}"
echo "Versioned: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/adaptorex/${VERSION}/${APPIMAGE_NAME}"
curl --fail --header "JOB-TOKEN: $CI_JOB_TOKEN" \
--upload-file "dist/${APPIMAGE_NAME}" \
"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/adaptorex/latest/adaptorex-x86_64.AppImage"
echo "Latest: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/adaptorex/latest/adaptorex-x86_64.AppImage"
artifacts:
name: "adaptorex-linux-${VERSION}"
paths:
- dist/*x86_64*.AppImage
expire_in: 30 days
bundle-linux-arm:
image: node:22
stage: build
tags:
- saas-linux-small-arm64
cache:
key: pkg-cache-linux-arm64
paths:
- /root/.pkg-cache
before_script:
- apt-get update && apt-get install -y unzip libfuse2
- modprobe fuse || true
rules:
- if: $CI_COMMIT_TAG
script:
- VERSION=$(node -p "require('./package.json').version")
- APPIMAGE_NAME="adaptorex-${VERSION}-arm64.AppImage"
# Fetch latest client build
- curl --location --output artifacts.zip "https://gitlab.com/machina_ex/adaptor_ex/adaptor_ex_client/-/jobs/artifacts/production/download?job=build-site"
- unzip artifacts.zip
- mv dist/* public
- rm artifacts.zip
# install node modules
- npm ci
# Build the binary
- npm run build:linux-arm
# bundle script
- npm run bundle:linux-arm
# Publish to Generic Packages registry
- |
curl --fail --header "JOB-TOKEN: $CI_JOB_TOKEN" \
--upload-file "dist/${APPIMAGE_NAME}" \
"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/adaptorex/${VERSION}/${APPIMAGE_NAME}"
echo "Versioned: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/adaptorex/${VERSION}/${APPIMAGE_NAME}"
curl --fail --header "JOB-TOKEN: $CI_JOB_TOKEN" \
--upload-file "dist/${APPIMAGE_NAME}" \
"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/adaptorex/latest/adaptorex-arm64.AppImage"
echo "Latest: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/adaptorex/latest/adaptorex-arm64.AppImage"
artifacts:
name: "adaptorex-linux-arm-${CI_COMMIT_TAG}"
paths:
- dist/*arm64*.AppImage
expire_in: 30 days
# ─── Windows Executable ───────────────────────────────────────────────────────
# Runs npm run bundle:windows (bundle-windows-exe.js) which uses resedit to
# embed the icon and version info, then calls yao-pkg to produce the .exe.
# Output: dist/adaptorex-win-<version>.exe
bundle-windows:
image: node:22
stage: build
rules:
- if: $CI_COMMIT_TAG
script:
- VERSION=$(node -p "require('./package.json').version")
- EXE_NAME="adaptorex-win-${VERSION}.exe"
# Fetch latest client build
- apt-get update && apt-get install -y unzip
- curl --location --output artifacts.zip "https://gitlab.com/machina_ex/adaptor_ex/adaptor_ex_client/-/jobs/artifacts/production/download?job=build-site"
- unzip artifacts.zip
- mv dist/* public
- rm artifacts.zip
# Install deps (resedit and yao-pkg are devDependencies)
- npm ci
# Build the Windows exe (cross-compiles from Linux via yao-pkg)
- npm run bundle:windows
# Publish to Generic Packages registry
- |
curl --fail --header "JOB-TOKEN: $CI_JOB_TOKEN" \
--upload-file "dist/${EXE_NAME}" \
"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/adaptorex/${VERSION}/${EXE_NAME}"
echo "Versioned: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/adaptorex/${VERSION}/${EXE_NAME}"
curl --fail --header "JOB-TOKEN: $CI_JOB_TOKEN" \
--upload-file "dist/${EXE_NAME}" \
"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/adaptorex/latest/adaptorex-win-x64.exe"
echo "Latest: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/adaptorex/latest/adaptorex-win-x64.exe"
artifacts:
name: "adaptorex-windows-${VERSION}"
paths:
- dist/*win*.exe
expire_in: 30 days
# ─── macOS App Bundle ─────────────────────────────────────────────────────────
# Runs npm run bundle:macos (build:macos + bundle-macos-app.js) on a macOS
# runner — required because the script uses sips, iconutil, and codesign which
# are macOS-only tools.
# The resulting adaptorex.app directory is turned into a dm using npm package create-dmg
bundle-macos:
stage: build
tags:
- macos # requires a GitLab Runner registered with the 'macos' tag
rules:
- if: $CI_COMMIT_TAG
script:
- VERSION=$(node -p "require('./package.json').version")
- DMG_NAME="adaptorex-${VERSION}-macos-x86_64.dmg"
# Fetch latest client build
- curl --location --output artifacts.zip "https://gitlab.com/machina_ex/adaptor_ex/adaptor_ex_client/-/jobs/artifacts/production/download?job=build-site"
- unzip artifacts.zip
- mv dist/* public
- rm artifacts.zip
# Install deps
- npm ci
- npm install -g create-dmg # macOS runner only, not in package.json
# Build pkg binary
- npm run build:macos
# assemble .app bundle (sips/iconutil/codesign run here) and create .dmg
- npm run bundle:macos
# Publish to Generic Packages registry
- |
curl --fail --header "JOB-TOKEN: $CI_JOB_TOKEN" \
--upload-file "dist/${DMG_NAME}" \
"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/adaptorex/${VERSION}/${DMG_NAME}"
echo "Versioned: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/adaptorex/${VERSION}/${DMG_NAME}"
curl --fail --header "JOB-TOKEN: $CI_JOB_TOKEN" \
--upload-file "dist/${DMG_NAME}" \
"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/adaptorex/latest/adaptorex-macos-x86_64.dmg"
echo "Latest: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/adaptorex/latest/adaptorex-macos-x86_64.dmg"
artifacts:
name: "adaptorex-macos-${VERSION}"
paths:
- dist/*x86_64*.dmg
expire_in: 30 days
bundle-macos-arm:
stage: build
tags:
- macos # requires a GitLab Runner registered with the 'macos' tag
rules:
- if: $CI_COMMIT_TAG
script:
- VERSION=$(node -p "require('./package.json').version")
- DMG_NAME="adaptorex-${VERSION}-macos-arm64.dmg"
# Fetch latest client build
- curl --location --output artifacts.zip "https://gitlab.com/machina_ex/adaptor_ex/adaptor_ex_client/-/jobs/artifacts/production/download?job=build-site"
- unzip artifacts.zip
- mv dist/* public
- rm artifacts.zip
# Install deps
- npm ci
- npm install -g create-dmg # macOS runner only, not in package.json
# Build pkg binary
- npm run build:macos-arm
# assemble .app bundle (sips/iconutil/codesign run here) and create .dmg
- npm run bundle:macos-arm
# Publish to Generic Packages registry
- |
curl --fail --header "JOB-TOKEN: $CI_JOB_TOKEN" \
--upload-file "dist/${DMG_NAME}" \
"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/adaptorex/${VERSION}/${DMG_NAME}"
echo "Versioned: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/adaptorex/${VERSION}/${DMG_NAME}"
curl --fail --header "JOB-TOKEN: $CI_JOB_TOKEN" \
--upload-file "dist/${DMG_NAME}" \
"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/adaptorex/latest/adaptorex-macos-arm64.dmg"
echo "Latest: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/adaptorex/latest/adaptorex-macos-arm64.dmg"
artifacts:
name: "adaptorex-macos-${VERSION}"
paths:
- dist/*arm64*.dmg
expire_in: 30 days