Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

first-class support for musl platforms #111

Merged
merged 10 commits into from
Jan 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
193 changes: 144 additions & 49 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,18 +45,26 @@ jobs:
fail-fast: false
matrix:
include:
- platform: aarch64-linux
- platform: arm-linux
- platform: aarch64-linux-gnu
alias: aarch64-linux
- platform: aarch64-linux-musl
- platform: arm-linux-gnu
alias: arm-linux
- platform: arm-linux-musl
- platform: arm64-darwin
- platform: jruby
- platform: x64-mingw-ucrt
static: true
- platform: x64-mingw32
static: true
- platform: x86-linux
- platform: x86-linux-gnu
alias: x86-linux
- platform: x86-linux-musl
- platform: x86-mingw32
- platform: x86_64-darwin
- platform: x86_64-linux
- platform: x86_64-linux-gnu
alias: x86_64-linux
- platform: x86_64-linux-musl
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
Expand Down Expand Up @@ -114,23 +122,29 @@ jobs:
name: gem-${{ matrix.platform }}-static
path: test/rcd_test/pkg/*-*-*.gem

- if: matrix.alias
name: Build native gem ${{ matrix.alias }}
run: |
cd test/rcd_test/
bundle install
bundle exec rake clean clobber
bundle exec rake gem:${{ matrix.alias }}

- if: matrix.alias
name: Upload native gem ${{ matrix.alias }}
uses: actions/upload-artifact@v3
with:
name: gem-${{ matrix.alias }}
path: test/rcd_test/pkg/*-*-*.gem

test_source_gem:
name: test source
name: source gem
needs: build_source_gem
strategy:
fail-fast: false
matrix:
os:
- ubuntu
ruby:
- "3.3"
- "3.2"
- "3.1"
- "3.0"
- "2.7"
- "2.6"
- "2.5"
- "2.4"
os: [ubuntu]
ruby: ["3.3", "3.2", "3.1", "3.0", "2.7", "2.6", "2.5", "2.4"]
runs-on: ${{ matrix.os }}-latest
steps:
- uses: actions/checkout@v3
Expand All @@ -141,37 +155,117 @@ jobs:
uses: actions/download-artifact@v3
with:
name: gem-ruby
- name: Install source gem
run: gem install --local *.gem --verbose
- name: Test source gem
run: |
gem install --local *.gem --verbose
cd test/rcd_test/
bundle install
ruby -rrcd_test -S rake test

test_native_gem:
name: test native
test-x86_64-linux-setup-ruby:
name: "${{ matrix.platform }} setup-ruby(${{ matrix.ruby }})"
needs: build_native_gem
strategy:
fail-fast: false
matrix:
os:
- macos
- ubuntu
ruby:
- "3.3"
- "3.2"
- "3.1"
- "3.0"
- "2.7"
- "2.6"
- "2.5"
- "2.4"
platform: [x86_64-linux, x86_64-linux-gnu]
ruby: ["3.3", "3.2", "3.1", "3.0", "2.7", "2.6", "2.5", "2.4"]
include:
# declare rubygems for each ruby version
- { ruby: "2.7", rubygems: "3.4.22" }
- { ruby: "2.6", rubygems: "3.4.22" }
- { ruby: "2.5", rubygems: "3.3.26" }
- { ruby: "2.4", rubygems: "3.3.26" }
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby }}
- name: Download gem-${{ matrix.platform }}
uses: actions/download-artifact@v3
with:
name: gem-${{ matrix.platform }}
- name: Test gem-${{ matrix.platform }}
run: |
gem update --system ${{ matrix.rubygems }}
gem install --local *.gem --verbose
cd test/rcd_test/
bundle install
ruby -rrcd_test -S rake test

test_architecture_matrix:
name: "${{ matrix.platform }} ${{ matrix.ruby }}"
needs: build_native_gem
strategy:
fail-fast: false
matrix:
platform:
- aarch64-linux
- aarch64-linux-gnu
- aarch64-linux-musl
- arm-linux
- arm-linux-gnu
- arm-linux-musl
- x86-linux
- x86-linux-gnu
- x86-linux-musl
- x86_64-linux
- x86_64-linux-gnu
- x86_64-linux-musl
ruby: ["3.3", "3.2", "3.1", "3.0", "2.7", "2.6", "2.5", "2.4"]
include:
# declare rubygems for each ruby version
- { ruby: "2.7", rubygems: "3.4.22" }
- { ruby: "2.6", rubygems: "3.4.22" }
- { ruby: "2.5", rubygems: "3.3.26" }
- { ruby: "2.4", rubygems: "3.3.26" }
# declare docker image for each platform
- { platform: aarch64-linux-musl, docker_tag: "-alpine" }
- { platform: arm-linux-musl, docker_tag: "-alpine" }
- { platform: x86-linux-musl, docker_tag: "-alpine" }
- { platform: x86_64-linux-musl, docker_tag: "-alpine" }
# declare docker platform for each platform
- { platform: aarch64-linux, docker_platform: "--platform=linux/arm64" }
- { platform: aarch64-linux-gnu, docker_platform: "--platform=linux/arm64" }
- { platform: aarch64-linux-musl, docker_platform: "--platform=linux/arm64" }
- { platform: arm-linux, docker_platform: "--platform=linux/arm/v7" }
- { platform: arm-linux-gnu, docker_platform: "--platform=linux/arm/v7" }
- { platform: arm-linux-musl, docker_platform: "--platform=linux/arm/v7" }
- { platform: x86-linux, docker_platform: "--platform=linux/386" }
- { platform: x86-linux-gnu, docker_platform: "--platform=linux/386" }
- { platform: x86-linux-musl, docker_platform: "--platform=linux/386" }
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Download gem-${{ matrix.platform }}
uses: actions/download-artifact@v3
with:
name: gem-${{ matrix.platform }}
- name: Run tests
run: |
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
docker run --rm -v $PWD:/work -w /work \
${{ matrix.docker_platform}} ruby:${{ matrix.ruby }}${{ matrix.docker_tag }} \
sh -c "
gem update --system ${{ matrix.rubygems }} &&
gem install --local *.gem --verbose &&
cd test/rcd_test/ &&
bundle install &&
ruby -rrcd_test -S rake test
"

test_the_rest:
name: "${{ matrix.platform }} ${{ matrix.ruby }}"
needs: build_native_gem
strategy:
fail-fast: false
matrix:
os: [macos]
ruby: ["3.3", "3.2", "3.1", "3.0", "2.7", "2.6", "2.5", "2.4"]
include:
- os: macos
platform: x86_64-darwin
- os: ubuntu
platform: x86_64-linux
- os: ubuntu
ruby: jruby
platform: jruby
Expand Down Expand Up @@ -213,16 +307,15 @@ jobs:
uses: actions/download-artifact@v3
with:
name: gem-${{ matrix.platform }}
- name: Install gem-${{ matrix.platform }}
run: gem install --local *.gem --verbose
- name: Run tests
- name: Test gem-${{ matrix.platform }}
run: |
gem install --local *.gem --verbose
cd test/rcd_test/
bundle install
ruby -rrcd_test -S rake test

test_static_native_gem:
name: test static
test_windows_static:
name: "static ${{ matrix.platform }} ${{ matrix.ruby }}"
needs: build_native_gem
strategy:
fail-fast: false
Expand Down Expand Up @@ -266,35 +359,37 @@ jobs:
uses: actions/download-artifact@v3
with:
name: gem-${{ matrix.platform }}-static
- name: Install gem-${{ matrix.platform }}-static
run: gem install --local *.gem --verbose
- name: Run tests
- name: Test gem-${{ matrix.platform }}-static
run: |
gem install --local *.gem --verbose
cd test/rcd_test/
bundle install
ruby -rrcd_test -S rake test

test_native_gem_multiarch:
name: ${{ matrix.platform }} on ${{ matrix.from_image }}
test_ad_hoc:
name: "${{ matrix.platform }} on ${{ matrix.from_image }}"
needs: build_native_gem
strategy:
fail-fast: false
matrix:
include:
- from_image: amd64/centos
platform: x86_64-linux
platform: x86_64-linux # centos-8 ships ruby 2.5, rubygems won't recognize -gnu suffix
dockerfile: centos
- from_image: navikey/raspbian-bullseye
platform: arm-linux
platform: arm-linux # bullseye ships ruby 2.7, rubygems won't recognize -gnu suffix
dockerfile: debian
- from_image: arm64v8/ubuntu
platform: aarch64-linux
platform: aarch64-linux # arm64v8 ships ruby 3.0, rubygems won't recognize -gnu suffix
dockerfile: debian
- from_image: i386/alpine
platform: x86-linux
platform: x86-linux-musl
dockerfile: alpine
- from_image: arm32v6/alpine
platform: arm-linux
platform: arm-linux-musl
dockerfile: alpine
- from_image: alpine
platform: x86_64-linux-musl
dockerfile: alpine
runs-on: ubuntu-latest
steps:
Expand Down
12 changes: 6 additions & 6 deletions .github/workflows/publish-images.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ jobs:
fail-fast: false
matrix:
platform:
- x86-mingw32
- aarch64-linux-gnu
- arm-linux-gnu
- arm64-darwin
- x64-mingw-ucrt
- x64-mingw32
- x86-linux
- x86_64-linux
- x86-linux-gnu
- x86-mingw32
- x86_64-darwin
- arm64-darwin
- arm-linux
- aarch64-linux
- x86_64-linux-gnu
- jruby
runs-on: ubuntu-latest
steps:
Expand Down
13 changes: 8 additions & 5 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
/.bundle/
/.yardoc
/Dockerfile.mri.aarch64-linux
/Dockerfile.mri.arm-linux
/Dockerfile.mri.aarch64-linux-gnu
/Dockerfile.mri.aarch64-linux-musl
/Dockerfile.mri.arm-linux-gnu
/Dockerfile.mri.arm-linux-musl
/Dockerfile.mri.arm64-darwin
/Dockerfile.mri.arm64-linux
/Dockerfile.mri.x64-mingw-ucrt
/Dockerfile.mri.x64-mingw32
/Dockerfile.mri.x86-linux
/Dockerfile.mri.x86-linux-gnu
/Dockerfile.mri.x86-linux-musl
/Dockerfile.mri.x86-mingw32
/Dockerfile.mri.x86_64-darwin
/Dockerfile.mri.x86_64-linux
/Dockerfile.mri.x86_64-linux-gnu
/Dockerfile.mri.x86_64-linux-musl
/Gemfile.lock
/_yardoc/
/cache/
Expand Down
20 changes: 11 additions & 9 deletions Dockerfile.mri.erb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<%
image = case platform
when /x86_64-linux/ then "quay.io/pypa/manylinux2014_x86_64"
when /x86-linux/ then "quay.io/pypa/manylinux2014_i686"
when /x86_64-linux-gnu/ then "quay.io/pypa/manylinux2014_x86_64"
when /x86-linux-gnu/ then "quay.io/pypa/manylinux2014_i686"
else "ubuntu:20.04"
end
manylinux = !!(image =~ /manylinux/)
Expand Down Expand Up @@ -64,12 +64,16 @@ COPY --from=larskanis/mingw64-ucrt:20.04 \
/debs/
RUN dpkg -i /debs/*.deb

<% elsif platform =~ /linux-musl/ %>
COPY build/mk_musl_cross.sh /tmp
RUN /tmp/mk_musl_cross.sh <%= target %>

<% elsif !manylinux %>
RUN apt-get -y update && \
apt-get install -y <%
if platform =~ /darwin/ %> clang python lzma-dev libxml2-dev libssl-dev libc++-10-dev <% end %><%
if platform =~ /aarch64-linux/ %> gcc-aarch64-linux-gnu g++-aarch64-linux-gnu <% end %><%
if platform =~ /arm-linux/ %> gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf <% end %><%
if platform =~ /aarch64-linux-gnu/ %> gcc-aarch64-linux-gnu g++-aarch64-linux-gnu <% end %><%
if platform =~ /arm-linux-gnu/ %> gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf <% end %><%
if platform =~ /x86-mingw32/ %> gcc-mingw-w64-i686 g++-mingw-w64-i686 <% end %><%
if platform =~ /x64-mingw32/ %> gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 <% end %> && \
rm -rf /var/lib/apt/lists/*
Expand Down Expand Up @@ -144,11 +148,9 @@ else
]
end

xrubies_build_plan.each do |xrubies, bootstrap_ruby_version| %>
ENV XRUBIES <%= xrubies %>
strip = '-s' if platform !~ /darwin/

<% strip = '-s' if platform !~ /darwin/ %>
# Build xruby versions, then cleanup all build artifacts
xrubies_build_plan.each do |xrubies, bootstrap_ruby_version| %>
RUN bash -c " \
rbenv shell <%= bootstrap_ruby_version %> && \
export CPPFLAGS='<%= "-D__USE_MINGW_ANSI_STDIO=1" if platform =~ /x64-mingw-ucrt/ %>' && \
Expand All @@ -157,7 +159,7 @@ RUN bash -c " \
<%= "export LIBS='-l:libssp.a' &&" if platform =~ /mingw/ %> \
<%= "export CC=#{target}-clang &&" if platform =~ /darwin/ %> \
export MAKE='make V=1' && \
rake-compiler cross-ruby VERSION=$XRUBIES HOST=<%= target %> && \
rake-compiler cross-ruby VERSION=<%= xrubies %> HOST=<%= target %> && \
rm -rf ~/.rake-compiler/builds ~/.rake-compiler/sources \
"
<% end %>
Expand Down
3 changes: 3 additions & 0 deletions History.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
next / unreleased
-----------------

* Linux builds and their images are now fully qualified with the libc flavor. So, `x86_64-linux`
should now be referred to as `x86_64-linux-gnu`, and the generated files are also named with the
libc name.
* Replace `rvm` with `rbenv` and `ruby-build`
- `rvm` has been replaced by `rbenv` and `ruby-build`
- no longer applying sendfile patches to bootstrap rubies
Expand Down
Loading