| name: release | |
| on: | |
| schedule: | |
| - cron: "0 0 * * *" # midnight UTC | |
| workflow_dispatch: | |
| push: | |
| branches: | |
| - release | |
| - trigger-nightly | |
| env: | |
| CARGO_INCREMENTAL: 0 | |
| CARGO_NET_RETRY: 10 | |
| RUSTFLAGS: "-D warnings -W unreachable-pub" | |
| RUSTUP_MAX_RETRIES: 10 | |
| FETCH_DEPTH: 0 # pull in the tags for the version string | |
| MACOSX_DEPLOYMENT_TARGET: 14.0 | |
| jobs: | |
| dist: | |
| if: ${{ github.repository == 'rust-lang/rust-analyzer' || github.event_name == 'workflow_dispatch' }} | |
| strategy: | |
| matrix: | |
| include: | |
| - os: windows-latest | |
| target: x86_64-pc-windows-msvc | |
| code-target: win32-x64 | |
| allocator: mimalloc | |
| pgo: clap-rs/clap@v4.5.36 | |
| - os: windows-latest | |
| target: i686-pc-windows-msvc | |
| allocator: mimalloc | |
| pgo: clap-rs/clap@v4.5.36 | |
| - os: windows-latest | |
| target: aarch64-pc-windows-msvc | |
| code-target: win32-arm64 | |
| allocator: mimalloc | |
| - os: ubuntu-latest | |
| target: x86_64-unknown-linux-gnu | |
| # Use a container with glibc 2.28 | |
| container: quay.io/pypa/manylinux_2_28_x86_64 | |
| code-target: linux-x64 | |
| allocator: system | |
| pgo: clap-rs/clap@v4.5.36 | |
| - os: ubuntu-24.04-arm | |
| target: aarch64-unknown-linux-gnu | |
| container: quay.io/pypa/manylinux_2_28_aarch64 | |
| code-target: linux-arm64 | |
| allocator: system | |
| pgo: clap-rs/clap@v4.5.36 | |
| - os: ubuntu-latest | |
| target: arm-unknown-linux-gnueabihf | |
| # Use a Debian 10 (EOL) container for glibc 2.28 | |
| # pypa/manylinux only has armv7l and glibc 2.31 | |
| container: debian:10 | |
| code-target: linux-armhf | |
| allocator: system | |
| - os: macos-14 | |
| target: x86_64-apple-darwin | |
| code-target: darwin-x64 | |
| allocator: system | |
| pgo: clap-rs/clap@v4.5.36 | |
| - os: macos-14 | |
| target: aarch64-apple-darwin | |
| code-target: darwin-arm64 | |
| allocator: system | |
| pgo: clap-rs/clap@v4.5.36 | |
| name: dist (${{ matrix.target }}) | |
| runs-on: ${{ matrix.os }} | |
| container: ${{ matrix.container }} | |
| env: | |
| RA_TARGET: ${{ matrix.target }} | |
| ALLOCATOR_FLAG: ${{ matrix.allocator != 'system' && format('--{0}', matrix.allocator) || '' }} | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: ${{ env.FETCH_DEPTH }} | |
| - name: Install target dependencies | |
| if: ${{ matrix.target == 'arm-unknown-linux-gnueabihf' }} | |
| run: | | |
| sed -i -e 's/deb.debian.org/archive.debian.org/g' -e 's/security.debian.org/archive.debian.org/g' -e '/buster-updates/d' /etc/apt/sources.list | |
| apt-get update | |
| apt-get dist-upgrade -y | |
| apt-get install -y curl gcc gcc-8-arm-linux-gnueabihf | |
| - name: Install Node.js toolchain | |
| uses: actions/setup-node@v6 | |
| with: | |
| node-version: 22 | |
| - name: Install rustup | |
| if: ${{ matrix.container }} | |
| run: | | |
| curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal | |
| echo "$HOME/.cargo/bin" >> $GITHUB_PATH | |
| - name: Install Rust toolchain | |
| run: | | |
| rustup update --no-self-update stable | |
| # llvm-tools contain the llvm-profdata tool which is needed for PGO | |
| rustup component add rust-src ${{ matrix.pgo && 'llvm-tools' || '' }} | |
| rustup target add ${{ matrix.target }} | |
| - name: Dist | |
| run: cargo xtask dist --client-patch-version ${{ github.run_number }} ${{ env.ALLOCATOR_FLAG }} ${{ matrix.pgo && format('--pgo {0}', matrix.pgo) || ''}} | |
| - run: npm ci | |
| working-directory: editors/code | |
| - name: Package Extension (release) | |
| if: github.ref == 'refs/heads/release' && matrix.code-target | |
| run: npx vsce package -o "../../dist/rust-analyzer-${{ matrix.code-target }}.vsix" --target ${{ matrix.code-target }} | |
| working-directory: editors/code | |
| - name: Package Extension (nightly) | |
| if: github.ref != 'refs/heads/release' && matrix.code-target | |
| run: npx vsce package -o "../../dist/rust-analyzer-${{ matrix.code-target }}.vsix" --target ${{ matrix.code-target }} --pre-release | |
| working-directory: editors/code | |
| - if: matrix.target == 'x86_64-unknown-linux-gnu' | |
| run: rm -rf editors/code/server | |
| - if: matrix.target == 'x86_64-unknown-linux-gnu' && github.ref == 'refs/heads/release' | |
| run: npx vsce package -o ../../dist/rust-analyzer-no-server.vsix | |
| working-directory: editors/code | |
| - if: matrix.target == 'x86_64-unknown-linux-gnu' && github.ref != 'refs/heads/release' | |
| run: npx vsce package -o ../../dist/rust-analyzer-no-server.vsix --pre-release | |
| working-directory: editors/code | |
| - name: Run analysis-stats on rust-analyzer | |
| if: matrix.target == 'x86_64-unknown-linux-gnu' | |
| run: target/${{ matrix.target }}/release/rust-analyzer analysis-stats . -q | |
| - name: Run analysis-stats on rust std library | |
| if: matrix.target == 'x86_64-unknown-linux-gnu' | |
| env: | |
| RUSTC_BOOTSTRAP: 1 | |
| run: target/${{ matrix.target }}/release/rust-analyzer analysis-stats --with-deps --no-sysroot --no-test $(rustc --print sysroot)/lib/rustlib/src/rust/library/std -q | |
| - name: Upload artifacts | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: dist-${{ matrix.target }} | |
| path: ./dist | |
| dist-x86_64-unknown-linux-musl: | |
| if: ${{ github.repository == 'rust-lang/rust-analyzer' || github.event_name == 'workflow_dispatch' }} | |
| name: dist (x86_64-unknown-linux-musl) | |
| runs-on: ubuntu-latest | |
| env: | |
| RA_TARGET: x86_64-unknown-linux-musl | |
| # For some reason `-crt-static` is not working for clang without lld | |
| RUSTFLAGS: "-C link-arg=-fuse-ld=lld -C target-feature=-crt-static" | |
| container: | |
| image: rust:alpine | |
| volumes: | |
| - /usr/local/cargo/registry:/usr/local/cargo/registry | |
| steps: | |
| - name: Install dependencies | |
| run: apk add --no-cache git clang lld musl-dev nodejs npm | |
| - name: Checkout repository | |
| uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: ${{ env.FETCH_DEPTH }} | |
| - name: Dist | |
| run: cargo xtask dist --client-patch-version ${{ github.run_number }} | |
| - run: npm ci | |
| working-directory: editors/code | |
| - name: Package Extension (release) | |
| if: github.ref == 'refs/heads/release' | |
| run: npx vsce package -o "../../dist/rust-analyzer-alpine-x64.vsix" --target alpine-x64 | |
| working-directory: editors/code | |
| - name: Package Extension (nightly) | |
| if: github.ref != 'refs/heads/release' | |
| run: npx vsce package -o "../../dist/rust-analyzer-alpine-x64.vsix" --target alpine-x64 --pre-release | |
| working-directory: editors/code | |
| - run: rm -rf editors/code/server | |
| - name: Upload artifacts | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: dist-x86_64-unknown-linux-musl | |
| path: ./dist | |
| publish: | |
| if: ${{ github.repository == 'rust-lang/rust-analyzer' || github.event_name == 'workflow_dispatch' }} | |
| runs-on: ubuntu-latest | |
| needs: ["dist", "dist-x86_64-unknown-linux-musl"] | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: ${{ env.FETCH_DEPTH }} | |
| - name: Set release tag | |
| run: | | |
| if [ "${{ github.ref }}" = "refs/heads/release" ]; then | |
| git fetch --tags | |
| today=$(date --iso -u) | |
| last_tag=$(git tag -l "${today}*" | sort -V | tail -n1) | |
| if [ -n "$last_tag" ]; then | |
| last_v=$(echo "$last_tag" | grep -oP '(?<=\.)\d+' || echo 0) | |
| new_v=$(($last_v + 1)) | |
| tag="${today}.${new_v}" | |
| else | |
| tag="$today" | |
| fi | |
| echo "TAG=$tag" >> $GITHUB_ENV | |
| else | |
| echo "TAG=nightly" >> $GITHUB_ENV | |
| fi | |
| - run: echo "HEAD_SHA=$(git rev-parse HEAD)" >> $GITHUB_ENV | |
| - run: 'echo "HEAD_SHA: $HEAD_SHA"' | |
| - uses: actions/download-artifact@v8 | |
| with: | |
| pattern: dist-* | |
| path: dist | |
| merge-multiple: true | |
| - run: ls -al ./dist | |
| - name: Publish Release | |
| uses: ./.github/actions/github-release | |
| with: | |
| files: "dist/*" | |
| name: ${{ env.TAG }} | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| publish-extension: | |
| if: ${{ github.repository == 'rust-lang/rust-analyzer' || github.event_name == 'workflow_dispatch' }} | |
| name: publish-extension (${{ matrix.cmd }}) | |
| runs-on: ubuntu-latest | |
| needs: publish | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - cmd: vsce | |
| - cmd: ovsx | |
| steps: | |
| - name: Install Nodejs | |
| uses: actions/setup-node@v6 | |
| with: | |
| node-version: 22 | |
| - name: Checkout repository | |
| uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: ${{ env.FETCH_DEPTH }} | |
| - uses: actions/download-artifact@v8 | |
| with: | |
| pattern: dist-* | |
| path: dist | |
| merge-multiple: true | |
| - run: npm ci | |
| working-directory: ./editors/code | |
| - name: Publish Extension | |
| if: github.repository == 'rust-lang/rust-analyzer' | |
| env: | |
| PUBLISH_PAT: ${{ (matrix.cmd == 'vsce' && secrets.MARKETPLACE_TOKEN) || (matrix.cmd == 'ovsx' && secrets.OPENVSX_TOKEN) }} | |
| working-directory: ./editors/code | |
| run: npx ${{ matrix.cmd }} publish --skip-duplicate --pat "$PUBLISH_PAT" --packagePath ../../dist/rust-analyzer-*.vsix ${{ github.ref != 'refs/heads/release' && '--pre-release' || '' }} | |
| timeout-minutes: 2 |