From 86a60685462107188c0e9dfbe7d3f80431402690 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Thu, 16 Jan 2025 10:46:13 -0800 Subject: [PATCH] Add support for Docker aliases rake-compiler-dock now makes a clear distinction between GNU and Musl builds: https://github.com/rake-compiler/rake-compiler-dock?tab=readme-ov-file#linux-gnu-and-musl-important-details This change makes it possible to build images using the explicit aarch64-linux-gnu and x86_64-linux-gnu targets needed by rake-compiler-dock. --- .github/workflows/docker.yml | 66 ++++++++++++++++++--------- data/toolchains.json | 2 + gem/lib/rb_sys/toolchain_info/data.rb | 2 +- 3 files changed, 47 insertions(+), 23 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index badb6a05..f0ced742 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -18,22 +18,23 @@ permissions: packages: write jobs: + fetch_ci_data: + name: 📥 Fetch CI data + runs-on: ubuntu-latest + outputs: + toolchains-data: ${{ steps.data.outputs.toolchains-data }} + steps: + - id: data + run: | + curl -s https://raw.githubusercontent.com/oxidize-rb/rb-sys/$GITHUB_SHA/data/toolchains.json > toolchains.json + echo "toolchains-data=$(cat toolchains.json | jq -c '.toolchains')" >> $GITHUB_OUTPUT docker_images: + needs: fetch_ci_data runs-on: ubuntu-latest strategy: fail-fast: false matrix: - platform: - - ruby_target: x86_64-linux - - ruby_target: x86_64-linux-musl - - ruby_target: aarch64-linux - - ruby_target: aarch64-linux-musl - - ruby_target: arm-linux - - ruby_target: x86_64-darwin - - ruby_target: arm64-darwin - - ruby_target: x64-mingw32 - - ruby_target: x64-mingw-ucrt - # - ruby_target: x86-linux + toolchain: ${{ fromJSON(needs.fetch_ci_data.outputs.toolchains-data) }} steps: - uses: actions/checkout@v4 @@ -43,6 +44,14 @@ jobs: version="$(ruby -r $PWD/gem/lib/rb_sys/version.rb -e 'puts RbSys::VERSION')" echo "rb-sys-version=$version" >> $GITHUB_OUTPUT + - name: Set platform and aliases + id: setup_platform + run: | + ruby_platform=$(echo '${{ matrix.toolchain }}' | jq -r '.["ruby-platform"]') + aliases=$(echo '${{ matrix.toolchain }}' | jq -r '.aliases | join(",")') + echo "ruby_platform=$ruby_platform" >> $GITHUB_ENV + echo "aliases=$aliases" >> $GITHUB_ENV + # Test the container - uses: actions/checkout@v4 with: @@ -72,7 +81,7 @@ jobs: uses: docker/metadata-action@v5 with: images: | - ${{ secrets.DOCKER_HUB_USERNAME }}/${{ matrix.platform.ruby_target }} + ${{ secrets.DOCKER_HUB_USERNAME }}/${{ env.ruby_platform }} flavor: | latest=auto tags: | @@ -81,22 +90,22 @@ jobs: type=semver,pattern={{version}} type=sha,format=long labels: - org.opencontainers.image.description=Image for building native Rust extensions for Ruby on ${{ matrix.platform.ruby_target }} + org.opencontainers.image.description=Image for building native Rust extensions for Ruby on ${{ env.ruby_platform }} org.opencontainers.image.vendor=oxidize-rb - org.oxidize-rb.ruby.platform=${{ matrix.platform.ruby_target }} + org.oxidize-rb.ruby.platform=${{ env.ruby_platform }} - name: Docker build uses: docker/build-push-action@v6 with: builder: ${{ steps.buildx.outputs.name }} context: ./docker - file: ./docker/Dockerfile.${{ matrix.platform.ruby_target }} + file: ./docker/Dockerfile.${{ env.ruby_platform }} platforms: linux/amd64 load: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} - cache-from: ${{ secrets.DOCKER_HUB_USERNAME }}/${{ matrix.platform.ruby_target }}:cache-${{ steps.vars.outputs.rb-sys-version }} - cache-to: ${{ secrets.DOCKER_HUB_USERNAME }}/${{ matrix.platform.ruby_target }}:cache-${{ steps.vars.outputs.rb-sys-version }} + cache-from: ${{ secrets.DOCKER_HUB_USERNAME }}/${{ env.ruby_platform }}:cache-${{ steps.vars.outputs.rb-sys-version }} + cache-to: ${{ secrets.DOCKER_HUB_USERNAME }}/${{ env.ruby_platform }}:cache-${{ steps.vars.outputs.rb-sys-version }} - name: Run tests shell: bash @@ -122,7 +131,7 @@ jobs: echo "::endgroup::" echo "::group::Cross build oxi-test gem (sha-$GITHUB_SHA)" - bundle exec rb-sys-dock --platform ${{ matrix.platform.ruby_target }} --build --tag "sha-$GITHUB_SHA" --verbose + bundle exec rb-sys-dock --platform ${{ env.ruby_platform }} --build --tag "sha-$GITHUB_SHA" --verbose echo "::endgroup::" if [ -f pkg/oxi-test-0.1.0-${{ matrix.platform.ruby_target }}.gem ]; then @@ -164,20 +173,33 @@ jobs: with: builder: ${{ steps.buildx.outputs.name }} context: ./docker - file: ./docker/Dockerfile.${{ matrix.platform.ruby_target }} + file: ./docker/Dockerfile.${{ env.ruby_platform }} platforms: linux/amd64 push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} - cache-from: ${{ secrets.DOCKER_HUB_USERNAME }}/${{ matrix.platform.ruby_target }}:cache-${{ steps.vars.outputs.rb-sys-version }} - cache-to: ${{ secrets.DOCKER_HUB_USERNAME }}/${{ matrix.platform.ruby_target }}:cache-${{ steps.vars.outputs.rb-sys-version }} + cache-from: ${{ secrets.DOCKER_HUB_USERNAME }}/${{ env.ruby_platform }}:cache-${{ steps.vars.outputs.rb-sys-version }} + cache-to: ${{ secrets.DOCKER_HUB_USERNAME }}/${{ env.ruby_platform }}:cache-${{ steps.vars.outputs.rb-sys-version }} + + - name: Docker push aliases + uses: docker/build-push-action@v6 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ./docker + file: ./docker/Dockerfile.${{ env.ruby_platform }} + platforms: linux/amd64 + push: true + tags: ${{ env.aliases }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: ${{ secrets.DOCKER_HUB_USERNAME }}/${{ env.ruby_platform }}:cache-${{ steps.vars.outputs.rb-sys-version }} + cache-to: ${{ secrets.DOCKER_HUB_USERNAME }}/${{ env.ruby_platform }}:cache-${{ steps.vars.outputs.rb-sys-version }} - name: Docker Hub Description uses: peter-evans/dockerhub-description@v4 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - repository: rbsys/${{ matrix.platform.ruby_target }} + repository: rbsys/${{ env.ruby_platform }} readme-filepath: ./readme.md - name: Slack Noti on Failure diff --git a/data/toolchains.json b/data/toolchains.json index 75596442..19f467f0 100644 --- a/data/toolchains.json +++ b/data/toolchains.json @@ -16,6 +16,7 @@ }, { "ruby-platform": "aarch64-linux", + "aliases": ["aarch64-linux-gnu", "aarch64-unknown-linux-gnu"], "rust-target": "aarch64-unknown-linux-gnu", "dockerfile": "docker/Dockerfile.aarch64-linux", "rake-compiler-dock": { @@ -96,6 +97,7 @@ }, { "ruby-platform": "x86_64-linux", + "aliases": ["x86-linux-gnu", "x86-unknown-linux-gnu"], "rust-target": "x86_64-unknown-linux-gnu", "dockerfile": "docker/Dockerfile.x86_64-linux", "rake-compiler-dock": { diff --git a/gem/lib/rb_sys/toolchain_info/data.rb b/gem/lib/rb_sys/toolchain_info/data.rb index 79df69c0..9395d315 100644 --- a/gem/lib/rb_sys/toolchain_info/data.rb +++ b/gem/lib/rb_sys/toolchain_info/data.rb @@ -5,6 +5,6 @@ module RbSys class ToolchainInfo # @private - DATA = {"arm-linux" => {"rust-target" => "arm-unknown-linux-gnueabihf", "rake-compiler-dock" => {"cc" => "arm-linux-gnueabihf-gcc"}, "docker-platform" => "linux/arm/v7", "supported" => true}, "aarch64-linux" => {"rust-target" => "aarch64-unknown-linux-gnu", "rake-compiler-dock" => {"cc" => "aarch64-linux-gnu-gcc"}, "docker-platform" => "linux/arm64/v8", "supported" => true}, "aarch64-linux-musl" => {"rust-target" => "aarch64-unknown-linux-musl", "rake-compiler-dock" => {"cc" => "aarch64-linux-musl-gcc"}, "docker-platform" => "linux/arm64/v8", "supported" => true}, "arm64-darwin" => {"rust-target" => "aarch64-apple-darwin", "rake-compiler-dock" => {"cc" => "aarch64-apple-darwin-clang"}, "docker-platform" => "linux/arm64/v8", "supported" => true}, "x64-mingw-ucrt" => {"rust-target" => "x86_64-pc-windows-gnu", "rake-compiler-dock" => {"cc" => "x86_64-windows-gnu-gcc"}, "docker-platform" => "linux/amd64", "supported" => true}, "x64-mingw32" => {"rust-target" => "x86_64-pc-windows-gnu", "rake-compiler-dock" => {"cc" => "x86_64-windows-gnu-gcc"}, "docker-platform" => "linux/amd64", "supported" => true}, "x86-linux" => {"rust-target" => "i686-unknown-linux-gnu", "rake-compiler-dock" => {"cc" => "i686-redhat-linux-gcc"}, "docker-platform" => "linux/i386", "supported" => false}, "x86-mingw32" => {"rust-target" => "i686-pc-windows-gnu", "rake-compiler-dock" => {"cc" => "i686-w64-mingw32-gcc"}, "docker-platform" => "linux/i386", "supported" => false}, "x86_64-darwin" => {"rust-target" => "x86_64-apple-darwin", "rake-compiler-dock" => {"cc" => "x86_64-apple-darwin-clang"}, "docker-platform" => "linux/amd64", "supported" => true}, "x86_64-linux" => {"rust-target" => "x86_64-unknown-linux-gnu", "rake-compiler-dock" => {"cc" => "x86_64-redhat-linux-gcc"}, "docker-platform" => "linux/amd64", "supported" => true}, "x86_64-linux-musl" => {"rust-target" => "x86_64-unknown-linux-musl", "rake-compiler-dock" => {"cc" => "x86_64-unknown-linux-musl-gcc"}, "docker-platform" => "linux/amd64", "supported" => true}} + DATA = {"arm-linux" => {"rust-target" => "arm-unknown-linux-gnueabihf", "rake-compiler-dock" => {"cc" => "arm-linux-gnueabihf-gcc"}, "docker-platform" => "linux/arm/v7", "supported" => true}, "aarch64-linux" => {"aliases" => ["aarch64-linux-gnu", "aarch64-unknown-linux-gnu"], "rust-target" => "aarch64-unknown-linux-gnu", "rake-compiler-dock" => {"cc" => "aarch64-linux-gnu-gcc"}, "docker-platform" => "linux/arm64/v8", "supported" => true}, "aarch64-linux-musl" => {"rust-target" => "aarch64-unknown-linux-musl", "rake-compiler-dock" => {"cc" => "aarch64-linux-musl-gcc"}, "docker-platform" => "linux/arm64/v8", "supported" => true}, "arm64-darwin" => {"rust-target" => "aarch64-apple-darwin", "rake-compiler-dock" => {"cc" => "aarch64-apple-darwin-clang"}, "docker-platform" => "linux/arm64/v8", "supported" => true}, "x64-mingw-ucrt" => {"rust-target" => "x86_64-pc-windows-gnu", "rake-compiler-dock" => {"cc" => "x86_64-windows-gnu-gcc"}, "docker-platform" => "linux/amd64", "supported" => true}, "x64-mingw32" => {"rust-target" => "x86_64-pc-windows-gnu", "rake-compiler-dock" => {"cc" => "x86_64-windows-gnu-gcc"}, "docker-platform" => "linux/amd64", "supported" => true}, "x86-linux" => {"rust-target" => "i686-unknown-linux-gnu", "rake-compiler-dock" => {"cc" => "i686-redhat-linux-gcc"}, "docker-platform" => "linux/i386", "supported" => false}, "x86-mingw32" => {"rust-target" => "i686-pc-windows-gnu", "rake-compiler-dock" => {"cc" => "i686-w64-mingw32-gcc"}, "docker-platform" => "linux/i386", "supported" => false}, "x86_64-darwin" => {"rust-target" => "x86_64-apple-darwin", "rake-compiler-dock" => {"cc" => "x86_64-apple-darwin-clang"}, "docker-platform" => "linux/amd64", "supported" => true}, "x86_64-linux" => {"aliases" => ["x86-linux-gnu", "x86-unknown-linux-gnu"], "rust-target" => "x86_64-unknown-linux-gnu", "rake-compiler-dock" => {"cc" => "x86_64-redhat-linux-gcc"}, "docker-platform" => "linux/amd64", "supported" => true}, "x86_64-linux-musl" => {"rust-target" => "x86_64-unknown-linux-musl", "rake-compiler-dock" => {"cc" => "x86_64-unknown-linux-musl-gcc"}, "docker-platform" => "linux/amd64", "supported" => true}} end end