Skip to content

Build vendored artifacts #35

Build vendored artifacts

Build vendored artifacts #35

name: Build vendored artifacts
on:
workflow_dispatch:
schedule:
- cron: "23 3 * * *"
push:
branches:
- main
paths:
- ".github/workflows/code-server-artifacts.yaml"
- ".gitmodules"
- "README.md"
- "scripts/**"
- "packages/code-server/**"
- "packages/omniroute/**"
pull_request:
branches:
- main
paths:
- ".github/workflows/code-server-artifacts.yaml"
- ".gitmodules"
- "README.md"
- "scripts/**"
- "packages/code-server/**"
- "packages/omniroute/**"
permissions:
contents: read
jobs:
prepare_release:
name: prepare-release
runs-on: ubuntu-22.04
outputs:
version: ${{ steps.version.outputs.version }}
tag: ${{ steps.version.outputs.tag }}
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: 22
- name: Resolve shared release version
id: version
run: node ./scripts/versioning.mjs >> "$GITHUB_OUTPUT"
build_code_server:
name: ${{ matrix.name }}
needs: prepare_release
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include:
- name: code-server Linux
runner: ubuntu-22.04
artifact_name: code-server-linux
bash_path: bash
- name: code-server macOS
runner: macos-latest
artifact_name: code-server-macos
bash_path: bash
- name: code-server Windows
runner: windows-latest
artifact_name: code-server-windows
bash_path: bash
env:
CI: true
GITHUB_TOKEN: ${{ github.token }}
ELECTRON_SKIP_BINARY_DOWNLOAD: 1
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
npm_config_build_from_source: true
BASH_PATH: ${{ matrix.bash_path }}
NPM_CONFIG_SCRIPT_SHELL: ${{ matrix.bash_path }}
VERSION: ${{ needs.prepare_release.outputs.version }}
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
submodules: recursive
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version-file: packages/code-server/upstream/.node-version
cache: npm
cache-dependency-path: |
packages/code-server/upstream/package-lock.json
packages/code-server/upstream/test/package-lock.json
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: "3.11"
- name: Install Linux prerequisites
if: runner.os == 'Linux'
run: sudo apt-get update && sudo apt-get install -y jq rsync quilt libkrb5-dev
- name: Install macOS prerequisites
if: runner.os == 'macOS'
run: brew install jq rsync quilt python-setuptools
- name: Setup MSYS2
if: runner.os == 'Windows'
uses: msys2/setup-msys2@v2
with:
msystem: MSYS
path-type: inherit
update: true
install: >-
diffutils
jq
patch
quilt
rsync
unzip
zip
- name: Configure Windows shell paths
if: runner.os == 'Windows'
shell: pwsh
run: |
Add-Content -Path $env:GITHUB_ENV -Value 'NPM_CONFIG_SCRIPT_SHELL=/usr/bin/bash'
Add-Content -Path $env:GITHUB_ENV -Value ("MSYS2_CMD={0}\\setup-msys2\\msys2.cmd" -f $env:RUNNER_TEMP)
- name: Build artifacts
run: node ./packages/code-server/scripts/build-artifacts.mjs
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.artifact_name }}
path: artifacts/code-server/*
if-no-files-found: error
build_omniroute:
name: ${{ matrix.name }}
needs: prepare_release
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include:
- name: omniroute Linux x64
runner: ubuntu-22.04
artifact_name: omniroute-linux-amd64
platform: linux
arch: amd64
- name: omniroute macOS x64
runner: macos-15-intel
artifact_name: omniroute-macos-amd64
platform: macos
arch: amd64
- name: omniroute macOS arm64
runner: macos-14
artifact_name: omniroute-macos-arm64
platform: macos
arch: arm64
- name: omniroute Windows x64
runner: windows-latest
artifact_name: omniroute-windows-amd64
platform: windows
arch: amd64
env:
CI: true
VERSION: ${{ needs.prepare_release.outputs.version }}
BUILD_ARTIFACTS_PLATFORM: ${{ matrix.platform }}
ARCH: ${{ matrix.arch }}
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
submodules: recursive
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: 22
cache: npm
cache-dependency-path: packages/omniroute/upstream/package-lock.json
- name: Build artifacts
run: node ./packages/omniroute/scripts/build-artifacts.mjs
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.artifact_name }}
path: artifacts/omniroute/*
if-no-files-found: error
verify_code_server:
name: ${{ format('verify-{0}', matrix.name) }}
needs: build_code_server
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include:
- name: code-server Linux
runner: ubuntu-22.04
artifact_name: code-server-linux
bash_path: bash
- name: code-server macOS
runner: macos-latest
artifact_name: code-server-macos
bash_path: bash
- name: code-server Windows
runner: windows-latest
artifact_name: code-server-windows
bash_path: C:\msys64\usr\bin\bash.exe
env:
BASH_PATH: ${{ matrix.bash_path }}
NPM_CONFIG_SCRIPT_SHELL: ${{ matrix.bash_path }}
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
submodules: recursive
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version-file: packages/code-server/upstream/.node-version
- name: Download artifacts
uses: actions/download-artifact@v5
with:
name: ${{ matrix.artifact_name }}
path: downloaded/code-server
- name: Extract downloaded artifact
if: runner.os != 'Windows'
shell: bash
run: |
set -euo pipefail
mkdir -p extracted/code-server
ARCHIVE="$(find downloaded/code-server -maxdepth 1 -type f \( -name '*.tar.gz' -o -name '*.zip' \) | head -n 1)"
test -n "$ARCHIVE"
case "$ARCHIVE" in
*.tar.gz) tar -xzf "$ARCHIVE" -C extracted/code-server ;;
*.zip) unzip -q "$ARCHIVE" -d extracted/code-server ;;
*) echo "Unsupported archive: $ARCHIVE" >&2; exit 1 ;;
esac
RELEASE_DIR="$(find extracted/code-server -mindepth 1 -maxdepth 1 -type d | head -n 1)"
test -n "$RELEASE_DIR"
echo "CODE_SERVER_ROOT=$RELEASE_DIR" >> "$GITHUB_ENV"
- name: Extract downloaded artifact
if: runner.os == 'Windows'
shell: pwsh
run: |
New-Item -ItemType Directory -Force -Path extracted/code-server | Out-Null
$archive = Get-ChildItem downloaded/code-server -File | Where-Object { $_.Name -match '(\.zip|\.tar\.gz)$' } | Select-Object -First 1
if (-not $archive) { throw 'No archive found in downloaded/code-server' }
if ($archive.Name -like '*.zip') {
Expand-Archive -Path $archive.FullName -DestinationPath extracted/code-server -Force
} else {
tar -xzf $archive.FullName -C extracted/code-server
}
$releaseDir = Get-ChildItem extracted/code-server -Directory | Select-Object -First 1
if (-not $releaseDir) { throw 'No extracted release directory found' }
Add-Content -Path $env:GITHUB_ENV -Value ("CODE_SERVER_ROOT={0}" -f $releaseDir.FullName)
- name: Verify downloaded release can start
run: node ./packages/code-server/scripts/verify-startup.mjs
verify_omniroute:
name: ${{ format('verify-{0}', matrix.name) }}
needs: build_omniroute
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include:
- name: omniroute Linux x64
runner: ubuntu-22.04
artifact_name: omniroute-linux-amd64
- name: omniroute macOS x64
runner: macos-15-intel
artifact_name: omniroute-macos-amd64
- name: omniroute macOS arm64
runner: macos-14
artifact_name: omniroute-macos-arm64
- name: omniroute Windows x64
runner: windows-latest
artifact_name: omniroute-windows-amd64
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: 22
- name: Download artifacts
uses: actions/download-artifact@v5
with:
name: ${{ matrix.artifact_name }}
path: downloaded/omniroute
- name: Verify downloaded release
run: node ./packages/omniroute/scripts/verify-startup.mjs
publish_github_release:
name: publish-github-release
needs:
- prepare_release
- build_code_server
- build_omniroute
- verify_code_server
- verify_omniroute
if: >-
${{
(github.event_name == 'push' && github.ref == 'refs/heads/main') ||
github.event_name == 'workflow_dispatch'
}}
runs-on: ubuntu-22.04
concurrency:
group: ${{ format('vendered-github-release-{0}', needs.prepare_release.outputs.tag) }}
cancel-in-progress: false
permissions:
contents: write
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: 22
- name: Download code-server build artifacts
uses: actions/download-artifact@v5
with:
pattern: code-server-*
path: downloaded
- name: Download OmniRoute build artifacts
uses: actions/download-artifact@v5
with:
pattern: omniroute-*
path: downloaded
- name: Create GitHub release and upload build archives
env:
GITHUB_TOKEN: ${{ github.token }}
run: >-
node ./scripts/github-release.mjs
--artifacts-dir downloaded
--tag "${{ needs.prepare_release.outputs.tag }}"
--name "${{ needs.prepare_release.outputs.version }}"
--target-commitish "${{ github.sha }}"