From 24acff24b161f279042f0005da692abbe1c8b60c Mon Sep 17 00:00:00 2001 From: Loic Nageleisen Date: Thu, 27 Jun 2024 15:42:16 +0200 Subject: [PATCH] Nest each matrix dimension --- .github/workflows/test.yml | 39 -------------- .../appraisal.yml} | 37 ++++++------- .github/workflows/unit-test/engine.yml | 52 +++++++++++++++++++ .github/workflows/unit-test/spec.yml | 41 +++++++++++++++ .github/workflows/unit-test/unit-test.yml | 32 ++++++++++++ matrix.rb | 29 +++++++++-- 6 files changed, 167 insertions(+), 63 deletions(-) delete mode 100644 .github/workflows/test.yml rename .github/workflows/{test-callable.yml => unit-test/appraisal.yml} (63%) create mode 100644 .github/workflows/unit-test/engine.yml create mode 100644 .github/workflows/unit-test/spec.yml create mode 100644 .github/workflows/unit-test/unit-test.yml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index dc617865493..00000000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,39 +0,0 @@ -name: Unit Test - -on: - push: - -jobs: - test: - name: Test (${{ matrix.engine.name }} ${{ matrix.engine.version }}) - strategy: - fail-fast: false - matrix: - engine: - - name: ruby - version: '3.4' - - name: ruby - version: '3.3' - - name: ruby - version: '3.2' - - name: ruby - version: '3.1' - - name: ruby - version: '3.0' - - name: ruby - version: '2.7' - - name: ruby - version: '2.6' - - name: ruby - version: '2.5' - - name: jruby - version: '9.4' - - name: jruby - version: '9.3' - - name: jruby - version: '9.2' - uses: ./.github/workflows/test-callable.yml - with: - engine_name: ${{ matrix.engine.name }} - engine_version: ${{ matrix.engine.version }} - diff --git a/.github/workflows/test-callable.yml b/.github/workflows/unit-test/appraisal.yml similarity index 63% rename from .github/workflows/test-callable.yml rename to .github/workflows/unit-test/appraisal.yml index a80d30920fa..40d0384231d 100644 --- a/.github/workflows/test-callable.yml +++ b/.github/workflows/unit-test/appraisal.yml @@ -1,40 +1,36 @@ -name: Unit Test Call +name: Appraisal on: workflow_call: inputs: + spec: + required: true + type: string engine_name: required: true type: string engine_version: required: true type: string + appraisal: + required: true + type: string jobs: - matrix: - runs-on: ubuntu-latest - container: - image: "ruby:3.3" - name: Prepare matrix - outputs: - matrix: ${{ steps.matrix.outputs.matrix }} - steps: - - uses: actions/checkout@v4 - - name: Compute matrix - id: matrix - run: | - matrix="$(ruby matrix.rb engine.name:${{ inputs.engine_name }} engine.version:${{ inputs.engine_version }})" - echo "${matrix}" - echo "${matrix}" | ruby -rjson -0777 -ne 'pp JSON.parse($_)' - echo "matrix=${matrix}" >> $GITHUB_OUTPUT - test: runs-on: ubuntu-latest - name: Test ${{ matrix.spec.task }} ${{ matrix.spec.appraisal }} (${{ inputs.engine_name }} ${{ inputs.engine_version }}) + name: "Test ${{ matrix.appraisal }} (${{ matrix.engine.name }}:${{ matrix.engine.version }} ${{ matrix.spec }})" needs: matrix strategy: fail-fast: false - matrix: ${{ fromJSON(needs.matrix.outputs.matrix) }} + matrix: + spec: + - ${{ inputs.spec }} + engine: + - name: $${ inputs.engine_name }} + version: $${ inputs.engine_version }} + appraisal: + - ${{ inputs.appraisal }} env: SKIP_SIMPLECOV: 1 DD_INSTRUMENTATION_TELEMETRY_ENABLED: false @@ -60,4 +56,3 @@ jobs: export BUNDLE_GEMFILE fi bundle exec rake spec:${{ matrix.spec.task }} - diff --git a/.github/workflows/unit-test/engine.yml b/.github/workflows/unit-test/engine.yml new file mode 100644 index 00000000000..94a29e89ef5 --- /dev/null +++ b/.github/workflows/unit-test/engine.yml @@ -0,0 +1,52 @@ +name: Engine + +on: + workflow_call: + inputs: + engine_name: + required: true + type: string + engine_version: + required: true + type: string + spec: + required: true + type: string + +jobs: + matrix: + runs-on: ubuntu-latest + container: + image: "ruby:3.3" + name: Prepare matrix + outputs: + matrix: ${{ steps.matrix.outputs.matrix }} + steps: + - uses: actions/checkout@v4 + - name: Compute matrix + id: matrix + run: | + matrix="$(ruby matrix.rb --json appraisals spec:#{{ inputs.spec }} engine.name:${{ inputs.engine_name }} engine.version:${{ inputs.engine_version }})" + echo "${matrix}" | ruby -rjson -0777 -ne 'puts JSON.pretty_generate JSON.parse($_)' + echo "matrix=${matrix}" >> $GITHUB_OUTPUT + + test: + runs-on: ubuntu-latest + name: "${{ matrix.appraisal }} (${{ matrix.engine.name }}:${{ matrix.engine.version }} ${{ matrix.spec }})" + needs: matrix + strategy: + fail-fast: false + matrix: + spec: + - ${{ inputs.spec }} + engine: + - name: $${ inputs.engine_name }} + version: $${ inputs.engine_version }} + appraisal: ${{ fromJSON(needs.matrix.outputs.matrix) }} + uses: ./.github/workflows/unit-test/appraisal.yml + with: + spec: ${{ matrix.spec }} + engine_name: ${{ matrix.engine.name }} + engine_version: ${{ matrix.engine.version }} + appraisal: ${{ matrix.appraisal }} + diff --git a/.github/workflows/unit-test/spec.yml b/.github/workflows/unit-test/spec.yml new file mode 100644 index 00000000000..d1073a213a1 --- /dev/null +++ b/.github/workflows/unit-test/spec.yml @@ -0,0 +1,41 @@ +name: Spec + +on: + workflow_call: + inputs: + spec: + required: true + type: string + +jobs: + matrix: + runs-on: ubuntu-latest + container: + image: "ruby:3.3" + name: Prepare matrix + outputs: + matrix: ${{ steps.matrix.outputs.matrix }} + steps: + - uses: actions/checkout@v4 + - name: Compute matrix + id: matrix + run: | + matrix="$(ruby matrix.rb --json engines spec:${{ inputs.spec }})" + echo "${matrix}" | ruby -rjson -0777 -ne 'puts JSON.pretty_generate JSON.parse($_)' + echo "matrix=${matrix}" >> $GITHUB_OUTPUT + + test: + runs-on: ubuntu-latest + name: "${{ matrix.engine.name }}:${{ matrix.engine.version }} (${{ matrix.spec }})" + needs: matrix + strategy: + fail-fast: false + matrix: + spec: + - ${{ inputs.spec }} + engine: ${{ fromJSON(needs.matrix.outputs.matrix) }} + uses: ./.github/workflows/unit-test/engine.yml + with: + spec: ${{ matrix.spec }} + engine_name: ${{ matrix.engine.name }} + engine_version: ${{ matrix.engine.version }} diff --git a/.github/workflows/unit-test/unit-test.yml b/.github/workflows/unit-test/unit-test.yml new file mode 100644 index 00000000000..ae1f9dfc6f9 --- /dev/null +++ b/.github/workflows/unit-test/unit-test.yml @@ -0,0 +1,32 @@ +name: Unit Test + +on: + push: + +jobs: + matrix: + runs-on: ubuntu-latest + container: + image: "ruby:3.3" + name: Prepare matrix + outputs: + matrix: ${{ steps.matrix.outputs.matrix }} + steps: + - uses: actions/checkout@v4 + - name: Compute matrix + id: matrix + run: | + matrix="$(ruby matrix.rb --json specs)" + echo "${matrix}" | ruby -rjson -0777 -ne 'puts JSON.pretty_generate JSON.parse($_)' + echo "matrix=${matrix}" >> $GITHUB_OUTPUT + test: + name: "${{ matrix.spec }}" + needs: matrix + strategy: + fail-fast: false + matrix: + spec: ${{ needs.matrix.outputs.matrix }} + uses: ./.github/workflows/unit-test/spec.yml + with: + spec: ${{ matrix.spec }} + diff --git a/matrix.rb b/matrix.rb index fecad9309ff..7fbc4f8c5a9 100644 --- a/matrix.rb +++ b/matrix.rb @@ -2,6 +2,7 @@ require 'json' map = eval(File.open('Matrixfile', 'r:UTF-8').read) + ruby_to_jruby = { '2.5' => ['9.2'], '2.6' => ['9.3'], @@ -50,12 +51,18 @@ selected_engine_version = nil selected_spec_task = nil selected_spec_appraisal = nil +output = nil +format = nil ARGV.each do |arg| case arg when /^engine.name:(\S+)/ then selected_engine_name = $1 when /^engine.version:(\S+)/ then selected_engine_version = $1 - when /^spec.task:(\S+)/ then selected_spec_task = $1 - when /^spec.appraisal:(\S+)/ then selected_spec_appraisal = $1 + when /^spec:(\S+)/ then selected_spec_task = $1 + when /^appraisal:(\S*)/ then selected_spec_appraisal = $1 + when 'engines' then output = 'engines' + when 'specs' then output = 'specs' + when 'appraisals' then output = 'appraisals' + when '--json' then format = 'json' end end @@ -75,4 +82,20 @@ matrix.select! { |e| e[:spec][:appraisal] == selected_spec_appraisal } end -puts(JSON.dump({ include: matrix })) +out = case output + when 'engines' + matrix.each_with_object([]) { |e, a| a << e[:engine] }.uniq + when 'specs' + matrix.each_with_object([]) { |e, a| a << e[:spec][:task] }.uniq + when 'appraisals' + matrix.each_with_object([]) { |e, a| a << e[:spec][:appraisal] }.uniq + else + { include: matrix } + end + +case format +when 'json' + puts(JSON.dump(out)) +else + out.each { |e| puts e } +end