Skip to content

Release

Release #194

Workflow file for this run

name: Release
on:
workflow_dispatch:
release:
types: [published]
env:
FETCH_DEPTH: 0
jobs:
# Phase 1: Generate the Build ID.
# We have to do this ahead-of-time, and store it as a job output,
# to ensure that we use the same Build ID across all build jobs.
build-id:
name: "Build ID"
runs-on: ubuntu-latest
outputs:
RELEASE_BUILD_ID: ${{ steps.release-build-id-generator.outputs.BUILD_ID }}
NIGHTLY_BUILD_ID: ${{ steps.nightly-build-id-generator.outputs.BUILD_ID }}
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
fetch-depth: ${{ env.FETCH_DEPTH }}
- uses: actions/setup-python@v5
with:
python-version: "3.x"
- name: Generate Build ID (release)
if: "startsWith(github.ref, 'refs/tags/')"
id: release-build-id-generator
run: |
export BUILD_ID=$(python -m build.generate_build_id)
echo "BUILD_ID: ${BUILD_ID}"
echo "BUILD_ID=${BUILD_ID}" >> $GITHUB_OUTPUT
- name: Generate Build ID (nightly)
if: "!startsWith(github.ref, 'refs/tags/')"
id: nightly-build-id-generator
run: |
export BUILD_ID=$(python -m build.generate_build_id --pre-release)
echo "BUILD_ID: ${BUILD_ID}"
echo "BUILD_ID=${BUILD_ID}" >> $GITHUB_OUTPUT
# Phase 2: Build the extension on all platforms.
build:
strategy:
matrix:
include:
- os: windows-latest
target: x86_64-pc-windows-msvc
code-target: win32-x64
- os: windows-latest
target: aarch64-pc-windows-msvc
code-target: win32-arm64
- os: ubuntu-20.04
target: x86_64-unknown-linux-gnu
code-target: linux-x64
- os: ubuntu-20.04
target: aarch64-unknown-linux-gnu
code-target: linux-arm64
arch: aarch64
- os: ubuntu-20.04
target: arm-unknown-linux-gnueabihf
code-target: linux-armhf
arch: armv7
- os: macos-latest
target: x86_64-apple-darwin
code-target: darwin-x64
- os: macos-14
target: aarch64-apple-darwin
code-target: darwin-arm64
- os: ubuntu-20.04
target: x86_64-unknown-linux-musl
code-target: alpine-x64
arch: x86_64
- os: ubuntu-20.04
target: aarch64-unknown-linux-musl
code-target: alpine-arm64
arch: aarch64
name: Build (${{ matrix.target }})
needs: ["build-id"]
runs-on: ${{ matrix.os }}
container: ${{ matrix.container }}
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
fetch-depth: ${{ env.FETCH_DEPTH }}
# Install Python dependencies (including Ruff's native binary).
- uses: actions/setup-python@v5
with:
python-version: "3.x"
# ARM builds on macOS, which should select Ruff's universal binary.
- run: arch -arm64 python -m pip install -t ./bundled/libs --implementation py --no-deps --upgrade -r ./requirements.txt
if: ${{ startsWith(matrix.os, 'macos') && startsWith(matrix.target, 'aarch64') }}
# x86_64 builds on macOS, which should select Ruff's x86_64 binary.
- run: arch -x86_64 python -m pip install -t ./bundled/libs --implementation py --no-deps --upgrade -r ./requirements.txt
if: ${{ startsWith(matrix.os, 'macos') && startsWith(matrix.target, 'x86_64') }}
# ARM builds on Ubuntu, which should select Ruff's ARM binary.
- uses: uraimo/run-on-arch-action@v2
if: ${{ startsWith(matrix.os, 'ubuntu') && !startsWith(matrix.target, 'x86_64') && !endsWith(matrix.target, 'musl') }}
with:
arch: ${{ matrix.arch }}
distro: ubuntu20.04
install: |
apt-get update
apt-get install -y --no-install-recommends python3 python3-pip
pip3 install -U pip
run: |
python3 -m pip install -t ./bundled/libs --implementation py --no-deps --upgrade -r ./requirements.txt
# Alpine builds, which should select Ruff's musl binaries.
- uses: jirutka/setup-alpine@v1
if: ${{ startsWith(matrix.os, 'ubuntu') && endsWith(matrix.target, 'musl') }}
with:
arch: ${{ matrix.arch }}
- shell: alpine.sh --root {0}
if: ${{ startsWith(matrix.os, 'ubuntu') && endsWith(matrix.target, 'musl') }}
run: |
apk add --no-cache python3 py3-pip
python3 -m pip install -t ./bundled/libs --implementation py --no-deps --upgrade -r ./requirements.txt
# Every other architecture, which should defer to `pip` without any special treatment.
- run: python -m pip install -t ./bundled/libs --implementation py --no-deps --upgrade -r ./requirements.txt
if: ${{ !startsWith(matrix.os, 'macos')
&& !(startsWith(matrix.os, 'ubuntu') && !startsWith(matrix.target, 'x86_64') && !endsWith(matrix.target, 'musl'))
&& !(startsWith(matrix.os, 'ubuntu') && endsWith(matrix.target, 'musl')) }}
# Install Node.
- name: Install Node.js
uses: actions/setup-node@v3
with:
node-version: 18
# Install Node dependencies.
- run: npm ci
# Set the Build ID.
- name: Set Build ID (release)
if: "startsWith(github.ref, 'refs/tags/')"
run: |
python -m build.update_ext_version --build-id ${{ needs.build-id.outputs.RELEASE_BUILD_ID }} --for-publishing
- name: Set Build ID (nightly)
if: "!startsWith(github.ref, 'refs/tags/')"
run: |
python -m build.update_ext_version --build-id ${{ needs.build-id.outputs.NIGHTLY_BUILD_ID }} --for-publishing --pre-release
# Build the extension.
- name: Package Extension (release)
if: "startsWith(github.ref, 'refs/tags/')"
run: npx vsce package -o "./dist/ruff-${{ matrix.code-target }}.vsix" --target ${{ matrix.code-target }}
- name: Package Extension (nightly)
if: "!startsWith(github.ref, 'refs/tags/')"
run: npx vsce package -o "./dist/ruff-${{ matrix.code-target }}.vsix" --target ${{ matrix.code-target }} --pre-release
# Upload the extension.
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: dist-${{ matrix.target }}
path: ./dist
# Phase 3: Publish the built extension to the Marketplace.
publish:
name: "Publish"
needs: ["build"]
runs-on: ubuntu-latest
steps:
- name: Install Nodejs
uses: actions/setup-node@v3
with:
node-version: 18
- name: Checkout repository
uses: actions/checkout@v3
with:
fetch-depth: ${{ env.FETCH_DEPTH }}
# Download all built artifacts.
- uses: actions/download-artifact@v3
with:
name: dist-aarch64-apple-darwin
path: dist
- uses: actions/download-artifact@v3
with:
name: dist-x86_64-apple-darwin
path: dist
- uses: actions/download-artifact@v3
with:
name: dist-x86_64-unknown-linux-gnu
path: dist
- uses: actions/download-artifact@v3
with:
name: dist-aarch64-unknown-linux-gnu
path: dist
- uses: actions/download-artifact@v3
with:
name: dist-arm-unknown-linux-gnueabihf
path: dist
- uses: actions/download-artifact@v3
with:
name: dist-x86_64-pc-windows-msvc
path: dist
- uses: actions/download-artifact@v3
with:
name: dist-aarch64-pc-windows-msvc
path: dist
- uses: actions/download-artifact@v3
with:
name: dist-x86_64-unknown-linux-musl
path: dist
- uses: actions/download-artifact@v3
with:
name: dist-aarch64-unknown-linux-musl
path: dist
- run: ls -al ./dist
# Install Node dependencies.
- run: npm ci
# Publish to the Code Marketplace.
- name: Publish Extension (Code Marketplace, release)
if: "startsWith(github.ref, 'refs/tags/')"
run: npx vsce publish --pat ${{ secrets.MARKETPLACE_TOKEN }} --packagePath ./dist/ruff-*.vsix
- name: Publish Extension (Code Marketplace, nightly)
if: "!startsWith(github.ref, 'refs/tags/')"
run: npx vsce publish --pat ${{ secrets.MARKETPLACE_TOKEN }} --packagePath ./dist/ruff-*.vsix --pre-release
# Publish to OpenVSX.
- name: Publish Extension (OpenVSX, release)
if: "startsWith(github.ref, 'refs/tags/')"
run: npx ovsx publish --pat ${{ secrets.OPENVSX_TOKEN }} --packagePath ./dist/ruff-*.vsix
timeout-minutes: 2
- name: Publish Extension (OpenVSX, nightly)
if: "!startsWith(github.ref, 'refs/tags/')"
run: npx ovsx publish --pat ${{ secrets.OPENVSX_TOKEN }} --packagePath ./dist/ruff-*.vsix --pre-release
timeout-minutes: 2