add option to set config BUNDLE_FROZEN for bundler install #1656
Workflow file for this run
This file contains hidden or 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: Test this action | |
| on: | |
| pull_request: | |
| push: | |
| branches-ignore: | |
| - v1 | |
| tags-ignore: | |
| - '*' | |
| paths-ignore: | |
| - README.md | |
| workflow_dispatch: | |
| permissions: | |
| contents: read | |
| jobs: | |
| test: | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: [ ubuntu-22.04, ubuntu-24.04, ubuntu-22.04-arm, ubuntu-24.04-arm, macos-13, macos-14, macos-15, macos-15-intel, windows-2022, windows-2025, windows-11-arm ] | |
| ruby: [ | |
| '1.9', '2.0', '2.1', '2.2', '2.3', '2.4', '2.5', '2.6', '2.7', '3.0', '3.1', '3.2', '3.3', '3.4', '4.0', ruby-head, | |
| jruby-9.4, jruby, jruby-head, | |
| truffleruby, truffleruby-head, | |
| truffleruby+graalvm, truffleruby+graalvm-head | |
| ] | |
| include: | |
| - { os: windows-2022, ruby: mingw } | |
| - { os: windows-2022, ruby: mswin } | |
| - { os: windows-2022, ruby: ucrt } | |
| - { os: windows-2025, ruby: mingw } | |
| - { os: windows-2025, ruby: mswin } | |
| - { os: windows-2025, ruby: ucrt } | |
| - { os: ubuntu-24.04, ruby: asan } | |
| - { os: ubuntu-24.04, ruby: 3.4-asan } | |
| exclude: | |
| # https://github.com/ruby/setup-ruby/issues/496 | |
| - { os: ubuntu-22.04, ruby: '2.2' } | |
| - { os: ubuntu-24.04, ruby: '1.9' } | |
| - { os: ubuntu-24.04, ruby: '2.2' } | |
| # These old Rubies fail to compile on macOS arm64 | |
| - { os: macos-14, ruby: '1.9' } | |
| - { os: macos-14, ruby: '2.0' } | |
| - { os: macos-14, ruby: '2.1' } | |
| - { os: macos-14, ruby: '2.2' } | |
| - { os: macos-14, ruby: '2.3' } | |
| - { os: macos-14, ruby: '2.4' } | |
| - { os: macos-14, ruby: '2.5' } | |
| - { os: macos-15, ruby: '1.9' } | |
| - { os: macos-15, ruby: '2.0' } | |
| - { os: macos-15, ruby: '2.1' } | |
| - { os: macos-15, ruby: '2.2' } | |
| - { os: macos-15, ruby: '2.3' } | |
| - { os: macos-15, ruby: '2.4' } | |
| - { os: macos-15, ruby: '2.5' } | |
| # These old Rubies fail to compile or segfault on Linux arm64 | |
| - { os: ubuntu-22.04-arm, ruby: '1.9' } | |
| - { os: ubuntu-22.04-arm, ruby: '2.0' } | |
| - { os: ubuntu-22.04-arm, ruby: '2.1' } | |
| - { os: ubuntu-22.04-arm, ruby: '2.2' } | |
| - { os: ubuntu-24.04-arm, ruby: '1.9' } | |
| - { os: ubuntu-24.04-arm, ruby: '2.0' } | |
| - { os: ubuntu-24.04-arm, ruby: '2.1' } | |
| - { os: ubuntu-24.04-arm, ruby: '2.2' } | |
| # RubyInstaller windows-arm64 builds only exist for Ruby 3.4+ | |
| - { os: windows-11-arm, ruby: '2.0' } | |
| - { os: windows-11-arm, ruby: '2.1' } | |
| - { os: windows-11-arm, ruby: '2.2' } | |
| - { os: windows-11-arm, ruby: '2.3' } | |
| - { os: windows-11-arm, ruby: '2.4' } | |
| - { os: windows-11-arm, ruby: '2.5' } | |
| - { os: windows-11-arm, ruby: '2.6' } | |
| - { os: windows-11-arm, ruby: '2.7' } | |
| - { os: windows-11-arm, ruby: '3.0' } | |
| - { os: windows-11-arm, ruby: '3.1' } | |
| - { os: windows-11-arm, ruby: '3.2' } | |
| - { os: windows-11-arm, ruby: '3.3' } | |
| # RubyInstaller has no 64-bit builds of 1.9 on Windows | |
| - { os: windows-2022, ruby: '1.9' } | |
| - { os: windows-2025, ruby: '1.9' } | |
| - { os: windows-11-arm, ruby: '1.9' } | |
| # No preview builds on Windows | |
| - { os: windows-2022, ruby: '4.0' } | |
| - { os: windows-2025, ruby: '4.0' } | |
| - { os: windows-11-arm, ruby: '4.0' } | |
| # TruffleRuby does not support Windows | |
| - { os: windows-2022, ruby: truffleruby } | |
| - { os: windows-2025, ruby: truffleruby } | |
| - { os: windows-11-arm, ruby: truffleruby } | |
| - { os: windows-2022, ruby: truffleruby-head } | |
| - { os: windows-2025, ruby: truffleruby-head } | |
| - { os: windows-11-arm, ruby: truffleruby-head } | |
| - { os: windows-2022, ruby: truffleruby+graalvm } | |
| - { os: windows-2025, ruby: truffleruby+graalvm } | |
| - { os: windows-11-arm, ruby: truffleruby+graalvm } | |
| - { os: windows-2022, ruby: truffleruby+graalvm-head } | |
| - { os: windows-2025, ruby: truffleruby+graalvm-head } | |
| - { os: windows-11-arm, ruby: truffleruby+graalvm-head } | |
| name: ${{ matrix.os }} ${{ matrix.ruby }} | |
| runs-on: ${{ matrix.os }} | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - uses: ./ | |
| with: | |
| ruby-version: ${{ matrix.ruby }} | |
| bundler-cache: true | |
| - run: ruby -v | |
| - name: PATH | |
| shell: pwsh | |
| run: | | |
| # Show PATH with Powershell | |
| $f, $r = $env:PATH.split([IO.Path]::PathSeparator); $r | |
| - name: build compiler | |
| run: | | |
| ruby -e "puts 'build compiler: ' + RbConfig::CONFIG.fetch('CC_VERSION_MESSAGE', 'unknown').lines.first" | |
| - name: gcc and ridk version (mingw) | |
| if: startsWith(matrix.os, 'windows') | |
| run: | | |
| $abi, $plat = $(ruby -e "STDOUT.write RbConfig::CONFIG['ruby_version'] + ' ' + RUBY_PLATFORM").split(' ') | |
| if ($plat.Contains('mingw')) { | |
| gcc --version | |
| if ($abi -ge '2.4') { | |
| ridk version | |
| } else { | |
| echo 'ridk is unavailable' | |
| } | |
| } elseif ($plat.Contains('mswin')) { | |
| Get-ChildItem "$env:VCPKG_INSTALLATION_ROOT\installed\vcpkg\info" | |
| } | |
| - name: RbConfig::CONFIG | |
| run: ruby -rrbconfig -rpp -e 'pp RbConfig::CONFIG' | |
| - name: RbConfig::MAKEFILE_CONFIG | |
| run: ruby -rrbconfig -rpp -e 'pp RbConfig::MAKEFILE_CONFIG' | |
| - name: Subprocess test | |
| run: ruby test_subprocess.rb | |
| - name: OpenSSL compiled version | |
| run: ruby -ropenssl -e 'puts OpenSSL::OPENSSL_VERSION' | |
| - name: OpenSSL loaded version | |
| run: ruby -ropenssl -e 'puts OpenSSL::OPENSSL_LIBRARY_VERSION' | |
| if: matrix.ruby != '1.9' | |
| - name: OpenSSL test | |
| run: ruby -ropen-uri -e 'puts URI.send(:open, %{https://rubygems.org/}) { |f| f.read(1024) }' | |
| - run: gem env | |
| - name: C extension test | |
| run: gem install json -v 2.2.0 | |
| - run: bundle --version | |
| # This step is redundant with `bundler-cache: true` but is there to check a redundant `bundle install` still works | |
| - run: bundle install | |
| - run: bundle exec rake --version | |
| - run: bundle exec rake | |
| # Ensure the same bundle commands work in bash on Windows | |
| - name: bundle install (bash) | |
| run: bundle install | |
| shell: bash | |
| if: startsWith(matrix.os, 'windows') | |
| - name: bundle exec rake --version (bash) | |
| run: bundle exec rake --version | |
| shell: bash | |
| if: startsWith(matrix.os, 'windows') | |
| - name: bundle exec rake (bash) | |
| run: bundle exec rake | |
| shell: bash | |
| if: startsWith(matrix.os, 'windows') | |
| - name: Test `gem github:` in a Gemfile | |
| run: bundle install | |
| env: | |
| BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/gem_from_github.gemfile | |
| - name: which ruby | |
| shell: bash | |
| run: which -a ruby | |
| - name: which bundle | |
| shell: bash | |
| run: which -a bundle | |
| # https://github.com/ruby/setup-ruby/issues/658 | |
| if: "matrix.ruby != 'mingw' && matrix.ruby != 'mswin' && matrix.ruby != 'ucrt'" | |
| - name: which rake | |
| run: which -a rake | |
| if: "!startsWith(matrix.os, 'windows')" | |
| - name: where ruby, rake, bundle | |
| if: startsWith(matrix.os, 'windows') | |
| run: | | |
| $ErrorActionPreference = 'Continue' | |
| $where = 'ruby', 'rake', 'bundle' | |
| foreach ($e in $where) { | |
| $rslt = where.exe $e 2>&1 | Out-String | |
| if ($rslt.contains($e)) { echo $rslt.Trim() } | |
| else { echo "Can't find $e" } | |
| echo '' | |
| } | |
| - name: bash test | |
| shell: bash | |
| run: echo ~ && bundle install | |
| - name: Windows JRuby | |
| if: startsWith(matrix.os, 'windows') && startsWith(matrix.ruby, 'jruby') | |
| run: gem install sassc | |
| testDotRubyVersion: | |
| name: "Test .ruby-version" | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - run: echo "ruby-3.4.0" > .ruby-version | |
| - uses: ./ | |
| - run: ruby -v | grep -F "ruby 3.4.0" | |
| testToolVersions: | |
| name: "Test .tool-versions" | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - run: echo -e "nodejs 16.0.0\nruby 3.4.0" > .tool-versions | |
| - uses: ./ | |
| - run: ruby -v | grep -F "ruby 3.4.0" | |
| testMise: | |
| name: "Test mise.toml" | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - run: echo -e "[tools]\nnode = '18'\nruby = '3.4.0'" > mise.toml | |
| - uses: ./ | |
| - run: ruby -v | grep -F "ruby 3.4.0" | |
| testNoGemfile: | |
| name: "Test with no Gemfile" | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - run: rm Gemfile | |
| - uses: ./ | |
| with: | |
| ruby-version: '2.6' | |
| - run: ruby -v | |
| testNoGemfileWithBundlerCache: | |
| name: "Test with no Gemfile but with bundler-cache" | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - run: rm Gemfile | |
| - uses: ./ | |
| with: | |
| ruby-version: '2.6' | |
| bundler-cache: true | |
| - run: ruby -v | |
| testLatestRubygemsVersion: | |
| name: "Test rubygems: latest on ${{ matrix.ruby }}" | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - { ruby: '3.2', expected_rubygems_version: '3.6.1' } | |
| - { ruby: '3.0', expected_rubygems_version: '3.5.23' } | |
| - { ruby: '2.7', expected_rubygems_version: '3.4.22' } | |
| - { ruby: '2.6', expected_rubygems_version: '3.4.22' } | |
| - { ruby: '2.5', expected_rubygems_version: '3.3.27' } | |
| - { ruby: '2.3', expected_rubygems_version: '3.3.27' } | |
| - { ruby: '2.0', expected_rubygems_version: '2.7.11' } | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - uses: ./ | |
| with: | |
| ruby-version: ${{ matrix.ruby }} | |
| rubygems: latest | |
| - run: ruby -e 'puts Gem::VERSION; exit(Gem.rubygems_version >= Gem::Version.new("${{ matrix.expected_rubygems_version }}"))' | |
| testFixedRubygemsVersionUpgrades: | |
| name: "Test rubygems: version upgrades RubyGems to that version if the default is older" | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - uses: ./ | |
| with: | |
| ruby-version: '2.6' | |
| rubygems: 3.2.3 | |
| - run: gem --version | grep -F "3.2.3" | |
| testFixedRubygemsVersionNoop: | |
| name: "Test rubygems: version noops if the default is newer" | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - uses: ./ | |
| with: | |
| ruby-version: '3.1.0' | |
| rubygems: 3.2.3 | |
| - run: gem --version | grep -F "3.3.3" | |
| testUseBundlerFromRubyGemsUpdate: | |
| name: "Test rubygems: version uses the Bundler installed by the rubygems update" | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - uses: ./ | |
| with: | |
| ruby-version: '3.1.0' | |
| rubygems: 3.4.0 | |
| - run: gem --version | grep -F "3.4.0" | |
| - run: bundle --version | grep -F "2.4.0" | |
| testFixedBundlerVersionForOldRuby: | |
| name: "Test bundler: 1.x for old Ruby" | |
| runs-on: ubuntu-22.04 | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - uses: ./ | |
| with: | |
| ruby-version: '2.3' | |
| bundler: 1.16.6 | |
| - run: bundle --version | grep -F "1.16.6" # And not 1.17.x from ~> 1 | |
| testMajorBundlerVersion: | |
| name: "Test with a major Bundler version" | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - uses: ./ | |
| with: | |
| ruby-version: '2.6' | |
| bundler: 2 | |
| - run: bundle --version | grep -P "Bundler version 2\.\d+\.\d+" | |
| testMinorBundlerVersion: | |
| name: "Test with a minor Bundler version" | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - uses: ./ | |
| with: | |
| ruby-version: '2.6' | |
| bundler: 2.2 | |
| - run: bundle --version | grep -P "Bundler version 2\.2\.\d+" | |
| testExactBundlerVersion: | |
| name: "Test with an exact Bundler version" | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - uses: ./ | |
| with: | |
| ruby-version: '2.6' | |
| bundler: 2.2.3 | |
| - run: bundle --version | grep -F "Bundler version 2.2.3" | |
| testBundlerPre: | |
| name: "Test with a Bundler pre/rc version" | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - uses: ./ | |
| with: | |
| ruby-version: '2.6' | |
| bundler: 2.2.0.rc.2 | |
| - run: bundle --version | grep -F "Bundler version 2.2.0.rc.2" | |
| testBundlerDev: | |
| name: "Test BUNDLED WITH Bundler dev" | |
| runs-on: ubuntu-latest | |
| env: | |
| BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/bundler-dev.gemfile | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - uses: ./ | |
| with: | |
| ruby-version: ruby-head | |
| bundler-cache: true | |
| testDependencyOnBundler1: | |
| name: "Test gemfile depending on Bundler 1" | |
| runs-on: ubuntu-latest | |
| env: | |
| BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/bundler1.gemfile | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - uses: ./ | |
| with: | |
| ruby-version: '2.7' | |
| bundler: 1 | |
| bundler-cache: true | |
| - run: bundle --version | grep -F "Bundler version 1." | |
| testGemfileMatrix: | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| gemfile: [ rails7, rails8 ] | |
| name: "Test with ${{ matrix.gemfile }} gemfile" | |
| runs-on: ubuntu-latest | |
| env: | |
| BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - uses: ./ | |
| with: | |
| ruby-version: '3.2' | |
| bundler-cache: true | |
| - run: bundle exec rails --version | |
| testWindowsToolchain: | |
| name: "Test windows-toolchain: none" | |
| runs-on: windows-latest | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - uses: ./ | |
| with: | |
| ruby-version: '2.7' | |
| windows-toolchain: none | |
| bundler: none | |
| - name: C:/msys64/mingw64/bin/gcc.exe not installed | |
| run: ruby -e "abort if File.exist?('C:/msys64/mingw64/bin/gcc.exe')" | |
| testBundleFrozen: | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: [ ubuntu-latest, macos-latest, windows-latest ] | |
| ruby: [ '3.1', '3.2', '3.3', '3.4' ] | |
| name: "Test bundle-frozen on ${{ matrix.os }} with Ruby ${{ matrix.ruby }}" | |
| runs-on: ${{ matrix.os }} | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: Create test Gemfile with locked dependencies | |
| shell: bash | |
| run: | | |
| cat > Gemfile <<'EOF' | |
| source 'https://rubygems.org' | |
| gem 'rake', '~> 13.0' | |
| gem 'minitest', '~> 5.16' | |
| EOF | |
| - name: Generate Gemfile.lock | |
| shell: bash | |
| run: | | |
| gem install bundler | |
| bundle lock | |
| - name: Display Gemfile.lock | |
| shell: bash | |
| run: cat Gemfile.lock | |
| - uses: ./ | |
| with: | |
| ruby-version: ${{ matrix.ruby }} | |
| bundler-cache: true | |
| bundle-frozen: true | |
| - name: Verify frozen config was set | |
| shell: bash | |
| run: | | |
| FROZEN_VALUE=$(bundle config frozen) | |
| echo "Bundle frozen config: $FROZEN_VALUE" | |
| if echo "$FROZEN_VALUE" | grep -q "true"; then | |
| echo "✓ Bundle frozen config is set to true" | |
| else | |
| echo "Error: Bundle frozen config was not set to 'true'" | |
| exit 1 | |
| fi | |
| - name: Verify bundle install succeeded with frozen lockfile | |
| shell: bash | |
| run: | | |
| bundle exec ruby -v | |
| echo "✓ Bundle install with frozen lockfile succeeded" | |
| - name: Test that modifying Gemfile causes failure with bundle-frozen | |
| shell: bash | |
| run: | | |
| echo "gem 'json', '~> 2.6'" >> Gemfile | |
| if bundle install 2>&1 | grep -q "frozen"; then | |
| echo "✓ Bundle correctly detected frozen lockfile violation" | |
| else | |
| echo "Warning: Expected bundle install to fail or warn about frozen lockfile" | |
| fi | |
| git checkout Gemfile | |
| testBundleNotFrozen: | |
| name: "Test without bundle-frozen (control)" | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: Create test Gemfile | |
| run: | | |
| cat > Gemfile <<'EOF' | |
| source 'https://rubygems.org' | |
| gem 'rake', '~> 13.0' | |
| EOF | |
| - uses: ./ | |
| with: | |
| ruby-version: '3.4' | |
| bundler-cache: true | |
| bundle-frozen: false | |
| - name: Verify frozen config was not set | |
| run: | | |
| FROZEN_VALUE=$(bundle config frozen) | |
| echo "Bundle frozen config: $FROZEN_VALUE" | |
| if echo "$FROZEN_VALUE" | grep -q "true"; then | |
| echo "Error: Bundle frozen config should not be set when bundle-frozen is false" | |
| exit 1 | |
| fi | |
| echo "✓ Bundle frozen config is not set to true (as expected)" | |
| - name: Verify bundle install succeeded | |
| run: | | |
| bundle exec ruby -v | |
| echo "✓ Bundle install succeeded without frozen flag" | |
| lint: | |
| runs-on: ubuntu-22.04 | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - run: yarn install | |
| - run: yarn run package | |
| - name: Check generated files are up to date | |
| run: git diff --exit-code |