feat: unify vendored release workflow #25
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: | |
| inputs: | |
| publish_to_azure: | |
| description: Publish built artifacts to Azure Storage after all builds succeed | |
| required: false | |
| type: boolean | |
| default: false | |
| 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: 24 | |
| 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: 24 | |
| - 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_azure: | |
| name: publish-azure | |
| 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' && github.event.inputs.publish_to_azure == 'true') | |
| }} | |
| runs-on: ubuntu-22.04 | |
| concurrency: | |
| group: vendered-azure-publication | |
| cancel-in-progress: false | |
| 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: Validate Azure SAS secret | |
| shell: bash | |
| env: | |
| AZURE_STORAGE_CONTAINER_SAS_URL: ${{ secrets.VENDORED_AZURE_CONTAINER_SAS_URL }} | |
| run: | | |
| if [[ -z "${AZURE_STORAGE_CONTAINER_SAS_URL}" ]]; then | |
| echo "Missing GitHub secret: VENDORED_AZURE_CONTAINER_SAS_URL" >&2 | |
| exit 1 | |
| fi | |
| - name: Publish vendored artifacts to Azure Storage | |
| env: | |
| AZURE_STORAGE_CONTAINER_SAS_URL: ${{ secrets.VENDORED_AZURE_CONTAINER_SAS_URL }} | |
| run: node ./scripts/publish-to-azure.mjs --artifacts-dir downloaded --publish-result artifacts/publish-result.json | |
| - name: Update version index | |
| env: | |
| AZURE_STORAGE_CONTAINER_SAS_URL: ${{ secrets.VENDORED_AZURE_CONTAINER_SAS_URL }} | |
| run: node ./scripts/update-version-index.mjs --publish-result artifacts/publish-result.json | |
| 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' && github.event.inputs.publish_to_azure == 'true') | |
| }} | |
| 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 }}" |