ensure-rust: rework global install

I think the secondary "rustup default" was intended to make sure the
Zuul user sets up to use the installed rust toolchain
(I32f9b285904a7036f9a80ada8a49fa9cf31b5163) but actually results in a
re-download of components and another local installation.  This isn't
really the intention, and also doubles the time spent installing.

From the linked comment, it seems like we're not doing our global
install correctly; even putting it in /usr doesn't avoid the need for
RUST_HOME to be set.  Take it's suggestion and install out-of-the-way
in /opt, use a small /usr/local/bin wrapper to call with correct env
vars set and then setup the installed global binary names to be called
via that.

Change-Id: I28ef747b809a17664305bfd9754022251390647b
This commit is contained in:
Ian Wienand 2021-10-04 09:57:49 +11:00
parent 3668acc723
commit 67ae84ce39
4 changed files with 39 additions and 8 deletions

View File

@ -7,7 +7,8 @@ Install the Rust toolchain
.. zuul:rolevar:: ensure_rust_rustup .. zuul:rolevar:: ensure_rust_rustup
:default: True :default: True
Install Rust via the ``rustup`` installer. Install Rust via the ``rustup`` installer. This installs the toolchain
globally (for all users).
.. zuul:rolevar:: ensure_rust_rustup_toolchain .. zuul:rolevar:: ensure_rust_rustup_toolchain
:default: stable :default: stable
@ -15,11 +16,11 @@ Install the Rust toolchain
The Rust toolchain to install with ``rustup``. The Rust toolchain to install with ``rustup``.
.. zuul:rolevar:: ensure_rust_rustup_path .. zuul:rolevar:: ensure_rust_rustup_path
:default: /usr :default: /opt/rust
Where to install Rust/Cargo with ``rustup``. ``/usr`` provides the Where to install Rust/Cargo with ``rustup``. Wrappers will
tools globally. This may conflict with distribution Rust packages be installed in ``/usr/local/bin/`` to make them available for
if installed. all users.
.. zuul:rolevar:: ensure_rust_packages .. zuul:rolevar:: ensure_rust_packages
:default: False :default: False

View File

@ -1,4 +1,4 @@
ensure_rust_rustup: true ensure_rust_rustup: true
ensure_rust_packages: false ensure_rust_packages: false
ensure_rust_rustup_toolchain: stable ensure_rust_rustup_toolchain: stable
ensure_rust_rustup_path: /usr ensure_rust_rustup_path: /opt/rust

View File

@ -9,5 +9,19 @@
executable: /bin/bash executable: /bin/bash
become: yes become: yes
- name: Use as selected Rust toolchain # Install wrappers that set env vars for global usage. See
command: rustup default {{ ensure_rust_rustup_toolchain }} # https://github.com/rust-lang/rustup/issues/1085#issuecomment-296604244
- name: Install wrapper helper script
template:
src: rust-wrap-setup.sh.j2
dest: /usr/local/bin/rust-wrap-setup
owner: root
group: root
mode: 0755
become: yes
- name: Run wrapper installation
shell: |
/usr/local/bin/rust-wrap-setup
become: yes

View File

@ -0,0 +1,16 @@
#!/bin/bash
cat <<'EOF' > /usr/local/bin/rust-wrap
#!/bin/sh
RUSTUP_HOME={{ ensure_rust_rustup_path }} exec {{ ensure_rust_rustup_path }}/bin/${0##*/} "$@"
EOF
chmod 0755 /usr/local/bin/rust-wrap
for f in {{ ensure_rust_rustup_path }}/bin/*
do
name=$(basename ${f})
echo "Install link for ${name}"
ln -f /usr/local/bin/rust-wrap /usr/local/bin/${name}
done