From dd05e718e1b12eaf0b26c670a7bd2696e6be100b Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Sat, 15 Jul 2023 21:56:44 -0700 Subject: [PATCH] Add round-trip tests for precompiled gems This ensures that all precompiled gems are built properly and can be run on their target operating systems. Closes #69 --- .github/workflows/precompiled.yml | 332 ++++++++++++++++++++++++++++++ bin/test-gem-build | 32 +++ bin/test-gem-install | 33 +++ 3 files changed, 397 insertions(+) create mode 100644 .github/workflows/precompiled.yml create mode 100755 bin/test-gem-build create mode 100755 bin/test-gem-install diff --git a/.github/workflows/precompiled.yml b/.github/workflows/precompiled.yml new file mode 100644 index 0000000..9b7bf5f --- /dev/null +++ b/.github/workflows/precompiled.yml @@ -0,0 +1,332 @@ +name: precompiled +concurrency: + group: "${{github.workflow}}-${{github.ref}}" + cancel-in-progress: true +on: + workflow_dispatch: + schedule: + - cron: "0 8 * * 3" # At 08:00 on Wednesday # https://crontab.guru/#0_8_*_*_3 + push: + branches: + - main + - v*.*.x + tags: + - v*.*.* + pull_request: + types: [opened, synchronize] + branches: + - '*' + +jobs: + precompiled: + strategy: + fail-fast: false + matrix: + runs-on: ["ubuntu-latest", "macos-latest"] + ruby: ["2.7", "3.0", "3.1", "3.2"] + include: + - ruby: "2.7" + runs-on: "windows-2019" + - ruby: "3.0" + runs-on: "windows-2019" + - ruby: "3.1" + runs-on: "windows-2022" + - ruby: "3.2" + runs-on: "windows-2022" + runs-on: ${{matrix.runs-on}} + steps: + - uses: actions/checkout@v2 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: ${{matrix.ruby}} + bundler-cache: true + - uses: actions/cache@v2 + with: + path: ports + key: ports-${{matrix.runs-on}}-${{hashFiles('ext/re2/extconf.rb')}} + - run: bundle exec rake compile spec + + cruby-package: + runs-on: "ubuntu-latest" + steps: + - uses: actions/checkout@v2 + - uses: actions/cache@v2 + with: + path: ports/archives + key: archives-ubuntu-${{hashFiles('ext/re2/extconf.rb')}} + - uses: ruby/setup-ruby@v1 + with: + ruby-version: "3.2" + bundler-cache: true + - run: ./bin/test-gem-build gems ruby + - uses: actions/upload-artifact@v2 + with: + name: cruby-gem + path: gems + retention-days: 1 + + cruby-linux-install: + needs: ["cruby-package"] + strategy: + fail-fast: false + matrix: + ruby: ["2.7", "3.0", "3.1", "3.2"] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: "${{matrix.ruby}}" + - uses: actions/download-artifact@v2 + with: + name: cruby-gem + path: gems + - run: ./bin/test-gem-install gems + + cruby-osx-install: + needs: ["cruby-package"] + strategy: + fail-fast: false + matrix: + ruby: ["3.2"] + sys: ["enable", "disable"] + runs-on: macos-latest + steps: + - uses: actions/checkout@v2 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: "${{matrix.ruby}}" + - uses: actions/download-artifact@v2 + with: + name: cruby-gem + path: gems + - run: ./bin/test-gem-install gems + + cruby-windows-install: + needs: ["cruby-package"] + strategy: + fail-fast: false + matrix: + ruby: ["3.0"] + sys: ["enable", "disable"] + runs-on: windows-latest + steps: + - uses: actions/checkout@v2 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: "3.1" + - uses: actions/download-artifact@v2 + with: + name: cruby-gem + path: gems + - run: | + gem install --verbose --no-document gems/*.gem + gem list -d re2 + ruby -r re2 -e "puts RE2::Regexp.new('(\d+)').match(\"bob 123\")" + + cruby-windows-install-ucrt: + needs: ["cruby-package"] + strategy: + fail-fast: false + matrix: + ruby: ["3.2"] + sys: ["enable", "disable"] + runs-on: windows-2022 + steps: + - uses: actions/checkout@v2 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: "3.2" + - uses: actions/download-artifact@v2 + with: + name: cruby-gem + path: gems + - run: | + gem install --verbose --no-document gems/*.gem + gem list -d re2 + ruby -r re2 -e "puts RE2::Regexp.new('(\d+)').match(\"bob 123\")" + + cruby-native-package: + strategy: + fail-fast: false + matrix: + plat: + - "aarch64-linux" + - "arm-linux" + - "arm64-darwin" + - "x64-mingw-ucrt" + - "x64-mingw32" + - "x86-linux" + - "x86_64-darwin" + - "x86_64-linux" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/cache@v2 + with: + path: ports/archives + key: archives-ubuntu-${{hashFiles('ext/re2/extconf.rb')}} + - uses: ruby/setup-ruby@v1 + with: + ruby-version: "3.1" + bundler-cache: true + - run: ./bin/test-gem-build gems ${{matrix.plat}} + - uses: actions/upload-artifact@v2 + with: + name: "cruby-${{matrix.plat}}-gem" + path: gems + retention-days: 1 + + cruby-x86_64-linux-install: + needs: ["cruby-native-package"] + strategy: + fail-fast: false + matrix: + ruby: ["2.7", "3.0", "3.1", "3.2"] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: "${{matrix.ruby}}" + - uses: actions/download-artifact@v2 + with: + name: cruby-x86_64-linux-gem + path: gems + - run: ./bin/test-gem-install gems + + cruby-x86-linux-install: + needs: ["cruby-native-package"] + strategy: + fail-fast: false + matrix: + ruby: ["2.7", "3.0", "3.1", "3.2"] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/download-artifact@v2 + with: + name: cruby-x86-linux-gem + path: gems + - run: | + docker run --rm --privileged multiarch/qemu-user-static --reset -p yes + docker run --rm -v "$(pwd):/re2" -w /re2 \ + --platform=linux/386 \ + ruby:${{matrix.ruby}} \ + ./bin/test-gem-install ./gems + + cruby-aarch64-linux-install: + needs: ["cruby-native-package"] + strategy: + fail-fast: false + matrix: + ruby: ["2.7", "3.0", "3.1", "3.2"] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/download-artifact@v2 + with: + name: cruby-aarch64-linux-gem + path: gems + - run: | + docker run --rm --privileged multiarch/qemu-user-static --reset -p yes + docker run --rm -v "$(pwd):/re2" -w /re2 \ + --platform=linux/arm64/v8 \ + ruby:${{matrix.ruby}} \ + ./bin/test-gem-install ./gems + + cruby-arm-linux-install: + needs: ["cruby-native-package"] + strategy: + fail-fast: false + matrix: + ruby: ["2.7", "3.0", "3.1", "3.2"] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/download-artifact@v2 + with: + name: cruby-arm-linux-gem + path: gems + - run: | + docker run --rm --privileged multiarch/qemu-user-static --reset -p yes + docker run --rm -v "$(pwd):/re2" -w /re2 \ + --platform=linux/arm/v7 \ + ruby:${{matrix.ruby}} \ + ./bin/test-gem-install ./gems + + cruby-x86_64-musl-install: + needs: ["cruby-native-package"] + strategy: + fail-fast: false + matrix: + ruby: ["2.7", "3.0", "3.1", "3.2"] + runs-on: ubuntu-latest + container: + image: "ruby:${{matrix.ruby}}-alpine" + steps: + - uses: actions/checkout@v2 + - uses: actions/download-artifact@v2 + with: + name: cruby-x86_64-linux-gem + path: gems + - run: apk add bash + - run: ./bin/test-gem-install gems + + cruby-x86_64-darwin-install: + needs: ["cruby-native-package"] + strategy: + fail-fast: false + matrix: + ruby: ["2.7", "3.0", "3.1", "3.2"] + runs-on: macos-latest + steps: + - uses: actions/checkout@v2 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: "${{matrix.ruby}}" + - uses: actions/download-artifact@v2 + with: + name: cruby-x86_64-darwin-gem + path: gems + - run: ./bin/test-gem-install gems + +## arm64-darwin installation testing is omitted until github actions supports it +# cruby-arm64-darwin-install: +# ... + + cruby-x64-mingw32-install: + needs: ["cruby-native-package"] + strategy: + fail-fast: false + matrix: + ruby: ["2.7", "3.0", "3.1", "3.2"] + runs-on: windows-2019 + steps: + - uses: actions/checkout@v2 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: "${{matrix.ruby}}" + - uses: actions/download-artifact@v2 + with: + name: cruby-x64-mingw32-gem + path: gems + - run: ./bin/test-gem-install gems + + cruby-x64-mingw-ucrt-install: + needs: ["cruby-native-package"] + strategy: + fail-fast: false + matrix: + ruby: ["3.2"] + runs-on: windows-2022 + steps: + - uses: actions/checkout@v2 + - uses: MSP-Greg/setup-ruby-pkgs@v1 + with: + ruby-version: "${{matrix.ruby}}" + - uses: actions/download-artifact@v2 + with: + name: cruby-x64-mingw-ucrt-gem + path: gems + - run: ./bin/test-gem-install gems diff --git a/bin/test-gem-build b/bin/test-gem-build new file mode 100755 index 0000000..21ebcbd --- /dev/null +++ b/bin/test-gem-build @@ -0,0 +1,32 @@ +#! /usr/bin/env bash +# +# run as part of CI +# +if [[ $# -lt 2 ]] ; then + echo "usage: $(basename $0) " + exit 1 +fi + +set -e -u + +OUTPUT_DIR=$1 +BUILD_NATIVE_GEM=$2 + +test -e /etc/os-release && cat /etc/os-release + +set -x + +bundle install --local || bundle install +bundle exec rake set-version-to-timestamp + +if [[ "${BUILD_NATIVE_GEM}" == "ruby" ]] ; then + # TODO we're only compiling so that we retrieve tarballs, we can do better. + bundle exec rake clean compile + bundle exec rake gem +else + bundle exec rake gem:${BUILD_NATIVE_GEM} +fi + +mkdir -p ${OUTPUT_DIR} +cp -v pkg/*.gem ${OUTPUT_DIR} +ls -l ${OUTPUT_DIR}/* diff --git a/bin/test-gem-install b/bin/test-gem-install new file mode 100755 index 0000000..19f5c45 --- /dev/null +++ b/bin/test-gem-install @@ -0,0 +1,33 @@ +#! /usr/bin/env bash +# +# run as part of CI +# +if [[ $# -lt 1 ]] ; then + echo "usage: $(basename $0) [install_flags]" + exit 1 +fi + +GEMS_DIR=$1 +shift +INSTALL_FLAGS=$* + +test -e /etc/os-release && cat /etc/os-release + +set -e -x -u + +pushd $GEMS_DIR + + gemfile=$(ls *.gem | head -n1) + ls -l ${gemfile} + gem install --no-document ${gemfile} -- ${INSTALL_FLAGS} + gem list -d re2 +popd + +if [ -n "${BUNDLE_APP_CONFIG:-}" ] ; then + export BUNDLE_CACHE_PATH="${BUNDLE_APP_CONFIG}/cache" +fi + +bundle install --local || bundle install + +rm -rf lib ext # ensure we don't use the local files +rake spec