fix(ruby): Enable ruby-sdk to be cross compiled ahead of time #18
Workflow file for this run
This file contains 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 Ruby gems | |
on: | |
push: | |
branches: | |
- main | |
pull_request: | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.ref }} | |
cancel-in-progress: true | |
jobs: | |
cross_gems: | |
name: Cross compile | |
runs-on: ubuntu-latest | |
defaults: | |
run: | |
working-directory: ruby-sdk | |
strategy: | |
fail-fast: false | |
matrix: | |
_: | |
- platform: x86_64-linux | |
# This is necessary because rb-sys-dock depends on manylinux2014, | |
# which is based on CentOS 7 which is EOL as of July 2024 Once | |
# rake-compiler-dock switches to manylinux_2_28 and rb-sys-dock | |
# picks that up, we can pick their updates up and then drop this. | |
# See https://github.com/oxidize-rb/rb-sys/issues/402 and | |
# https://github.com/rake-compiler/rake-compiler-dock/issues/122 | |
# for more details. | |
rb-sys-dock-setup: ./build/x86-64_linux-setup.sh | |
- platform: x86_64-linux-musl | |
- platform: aarch64-linux | |
- platform: aarch64-linux-musl | |
- platform: arm-linux | |
- platform: arm64-darwin | |
# - platform: x64-mingw32 | |
# - platform: x86-mingw-ucrt | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: oxidize-rb/actions/setup-ruby-and-rust@v1 | |
with: | |
ruby-version: "3.3" | |
bundler-cache: true | |
cargo-cache: true | |
cargo-vendor: true | |
cache-version: v2-${{ matrix._.platform }} | |
- name: Set vars | |
id: vars | |
run: | | |
echo "rb-sys-version=$(bundle exec ruby -rrb_sys -e 'puts RbSys::VERSION')" >> $GITHUB_OUTPUT | |
- uses: "ruby/setup-ruby@v1" | |
with: | |
ruby-version: "3.2" | |
bundler-cache: true | |
- name: Configure environment | |
shell: bash | |
id: configure | |
run: | | |
: Configure environment | |
echo "RB_SYS_DOCK_UID=$(id -u)" >> $GITHUB_ENV | |
echo "RB_SYS_DOCK_GID=$(id -g)" >> $GITHUB_ENV | |
rb_sys_version="$((grep rb_sys Gemfile.lock | head -n 1 | grep -oE '[0-9]+\.[0-9]+\.[0-9]+') || (gem info rb_sys --remote | grep -oE '[0-9]+\.[0-9]+\.[0-9]+') || echo "latest")" | |
rb_sys_dock_cache_dir="$HOME/.cache/rb-sys-$rb_sys_version" | |
mkdir -p "$rb_sys_dock_cache_dir" | |
echo "RB_SYS_DOCK_CACHE_DIR=$rb_sys_dock_cache_dir" >> $GITHUB_ENV | |
echo "rb_sys_version=$rb_sys_version" >> $GITHUB_OUTPUT | |
- name: Setup caching | |
uses: actions/cache@v4 | |
with: | |
path: | | |
${{ env.RB_SYS_DOCK_CACHE_DIR }} | |
ruby-sdk/tmp/rb-sys-dock/${{ matrix._.platform }}/target | |
key: rb-sys-dock-v0-${{ matrix._.platform }}-${{ hashFiles('**/Gemfile.lock', '**/Cargo.lock') }} | |
save-always: true | |
restore-keys: | | |
rb-sys-dock-v0-${{ matrix._.platform }}- | |
- name: Install cargo-cache | |
uses: oxidize-rb/actions/cargo-binstall@v1 | |
id: install-cargo-cache | |
with: | |
crate: cargo-cache | |
version: 0.8.3 | |
strategies: quick-install | |
- name: Clean the cargo cache | |
uses: oxidize-rb/actions/post-run@v1 | |
with: | |
run: cargo-cache --autoclean | |
cwd: ruby-sdk | |
always: true | |
- name: Setup rb-sys | |
shell: bash | |
working-directory: ruby-sdk | |
run: | | |
version="${{ steps.configure.outputs.rb_sys_version }}" | |
echo "Installing rb_sys@$version" | |
if [ "$version" = "latest" ]; then | |
gem install rb_sys | |
else | |
gem install rb_sys -v $version | |
fi | |
- name: Build gem | |
shell: bash | |
run: | | |
: Compile gem | |
echo "Docker Working Directory: $(pwd)" | |
set -x | |
# We can't actually parallelize the Ruby versions because | |
# they get bundled into the same gem. | |
# | |
# However, not parallelizing versions is actually helpful | |
# because Cargo is able to reuse most of compile work | |
# between versions. | |
rb-sys-dock \ | |
--platform ${{ matrix._.platform }} \ | |
--mount-toolchains \ | |
--ruby-versions 3.3,3.2,3.1,3.0 \ | |
--build \ | |
-- ${{ matrix._.rb-sys-dock-setup }} |