Build vendored artifacts #35
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 }}" |