serialbench 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/benchmark.yml +273 -228
  3. data/.github/workflows/rake.yml +11 -0
  4. data/.github/workflows/windows-debug.yml +171 -0
  5. data/.gitignore +32 -0
  6. data/.rubocop.yml +1 -0
  7. data/.rubocop_todo.yml +274 -0
  8. data/Gemfile +13 -1
  9. data/README.adoc +36 -0
  10. data/data/schemas/result.yml +29 -0
  11. data/docs/PLATFORM_VALIDATION_FIX.md +79 -0
  12. data/docs/SYCK_YAML_FIX.md +91 -0
  13. data/docs/WEBSITE_COMPLETION_PLAN.md +440 -0
  14. data/docs/WINDOWS_LIBXML_FIX.md +136 -0
  15. data/docs/WINDOWS_SETUP.md +122 -0
  16. data/lib/serialbench/benchmark_runner.rb +3 -3
  17. data/lib/serialbench/cli/benchmark_cli.rb +74 -1
  18. data/lib/serialbench/cli/environment_cli.rb +3 -3
  19. data/lib/serialbench/cli/resultset_cli.rb +72 -26
  20. data/lib/serialbench/cli/ruby_build_cli.rb +75 -88
  21. data/lib/serialbench/cli/validate_cli.rb +88 -0
  22. data/lib/serialbench/cli.rb +6 -2
  23. data/lib/serialbench/config_manager.rb +15 -26
  24. data/lib/serialbench/models/benchmark_config.rb +12 -0
  25. data/lib/serialbench/models/benchmark_result.rb +39 -3
  26. data/lib/serialbench/models/environment_config.rb +3 -2
  27. data/lib/serialbench/models/platform.rb +56 -4
  28. data/lib/serialbench/models/result.rb +28 -1
  29. data/lib/serialbench/models/result_set.rb +8 -0
  30. data/lib/serialbench/ruby_build_manager.rb +19 -23
  31. data/lib/serialbench/runners/asdf_runner.rb +1 -1
  32. data/lib/serialbench/runners/docker_runner.rb +2 -4
  33. data/lib/serialbench/runners/local_runner.rb +71 -0
  34. data/lib/serialbench/serializers/base_serializer.rb +1 -1
  35. data/lib/serialbench/serializers/json/rapidjson_serializer.rb +1 -1
  36. data/lib/serialbench/serializers/toml/base_toml_serializer.rb +0 -2
  37. data/lib/serialbench/serializers/toml/toml_rb_serializer.rb +1 -1
  38. data/lib/serialbench/serializers/toml/tomlib_serializer.rb +1 -1
  39. data/lib/serialbench/serializers/xml/libxml_serializer.rb +4 -8
  40. data/lib/serialbench/serializers/xml/nokogiri_serializer.rb +2 -2
  41. data/lib/serialbench/serializers/xml/oga_serializer.rb +4 -8
  42. data/lib/serialbench/serializers/xml/ox_serializer.rb +2 -2
  43. data/lib/serialbench/serializers/xml/rexml_serializer.rb +3 -3
  44. data/lib/serialbench/serializers/yaml/psych_serializer.rb +1 -1
  45. data/lib/serialbench/serializers/yaml/syck_serializer.rb +1 -1
  46. data/lib/serialbench/serializers.rb +2 -2
  47. data/lib/serialbench/site_generator.rb +180 -2
  48. data/lib/serialbench/templates/assets/css/format_based.css +1 -53
  49. data/lib/serialbench/templates/assets/css/themes.css +5 -4
  50. data/lib/serialbench/templates/assets/js/chart_helpers.js +44 -14
  51. data/lib/serialbench/templates/assets/js/dashboard.js +14 -15
  52. data/lib/serialbench/templates/format_based.liquid +480 -252
  53. data/lib/serialbench/version.rb +1 -1
  54. data/lib/serialbench/yaml_validator.rb +36 -0
  55. data/serialbench.gemspec +11 -2
  56. metadata +34 -23
  57. data/.github/workflows/ci.yml +0 -74
  58. data/.github/workflows/docker.yml +0 -272
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Serialbench
4
- VERSION = '0.1.2'
4
+ VERSION = '0.1.3'
5
5
  end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json-schema'
4
+ require 'yaml'
5
+
6
+ module Serialbench
7
+ # Validates YAML files against YAML Schema definitions
8
+ class YamlValidator
9
+ SCHEMA_DIR = File.join(__dir__, '..', '..', 'data', 'schemas')
10
+
11
+ class << self
12
+ def validate(file_path, schema_name)
13
+ unless File.exist?(file_path)
14
+ raise ArgumentError, "File not found: #{file_path}"
15
+ end
16
+
17
+ data = YAML.load_file(file_path)
18
+ schema_path = File.join(SCHEMA_DIR, "#{schema_name}.yml")
19
+
20
+ unless File.exist?(schema_path)
21
+ raise ArgumentError, "Schema not found: #{schema_path}"
22
+ end
23
+
24
+ schema = YAML.load_file(schema_path)
25
+
26
+ # Validate without strict schema checking (allow additional properties)
27
+ JSON::Validator.validate!(schema, data, strict: false)
28
+
29
+ true
30
+ rescue JSON::Schema::ValidationError => e
31
+ puts "❌ Validation failed: #{e.message}"
32
+ false
33
+ end
34
+ end
35
+ end
36
+ end
data/serialbench.gemspec CHANGED
@@ -26,6 +26,9 @@ Gem::Specification.new do |spec|
26
26
  spec.files = all_files_in_git
27
27
  .reject { |f| f.match(%r{\A(?:spec|features|bin|\.)/}) }
28
28
 
29
+ # Ensure data directory is included
30
+ spec.files += Dir['data/**/*'].select { |f| File.file?(f) }
31
+
29
32
  spec.bindir = 'exe'
30
33
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
31
34
  spec.require_paths = ['lib']
@@ -34,6 +37,7 @@ Gem::Specification.new do |spec|
34
37
  spec.add_dependency 'benchmark-ips'
35
38
  spec.add_dependency 'lutaml-model'
36
39
  spec.add_dependency 'memory_profiler'
40
+ spec.add_dependency 'octokit', '~> 8.0'
37
41
  spec.add_dependency 'thor'
38
42
 
39
43
  # Reporting dependencies
@@ -41,12 +45,14 @@ Gem::Specification.new do |spec|
41
45
  spec.add_dependency 'liquid' # Template engine for HTML reports
42
46
 
43
47
  # XML serializers
44
- spec.add_dependency 'libxml-ruby'
45
- spec.add_dependency 'nokogiri'
46
48
  spec.add_dependency 'oga'
47
49
  spec.add_dependency 'ox'
48
50
  spec.add_dependency 'rexml' # needed for Ruby 3.4+
49
51
 
52
+ # Note: nokogiri and libxml-ruby are defined in Gemfile with platform
53
+ # conditionals to properly exclude them on Windows ARM where libxml2
54
+ # compilation fails
55
+
50
56
  # JSON serializers
51
57
  spec.add_dependency 'oj'
52
58
  spec.add_dependency 'rapidjson'
@@ -59,4 +65,7 @@ Gem::Specification.new do |spec|
59
65
  spec.add_dependency 'tomlib'
60
66
  spec.add_dependency 'toml-rb'
61
67
  spec.add_dependency 'tomlrb'
68
+
69
+ # YAML validation
70
+ spec.add_dependency 'json-schema'
62
71
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: serialbench
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-06-14 00:00:00.000000000 Z
11
+ date: 2025-10-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: benchmark-ips
@@ -53,21 +53,21 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: thor
56
+ name: octokit
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: '8.0'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: '8.0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: csv
70
+ name: thor
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -81,7 +81,7 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: liquid
84
+ name: csv
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
@@ -95,7 +95,7 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: libxml-ruby
98
+ name: liquid
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
@@ -109,7 +109,7 @@ dependencies:
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
- name: nokogiri
112
+ name: oga
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - ">="
@@ -123,7 +123,7 @@ dependencies:
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
- name: oga
126
+ name: ox
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - ">="
@@ -137,7 +137,7 @@ dependencies:
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
139
  - !ruby/object:Gem::Dependency
140
- name: ox
140
+ name: rexml
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
143
  - - ">="
@@ -151,7 +151,7 @@ dependencies:
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
153
  - !ruby/object:Gem::Dependency
154
- name: rexml
154
+ name: oj
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
157
  - - ">="
@@ -165,7 +165,7 @@ dependencies:
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
167
  - !ruby/object:Gem::Dependency
168
- name: oj
168
+ name: rapidjson
169
169
  requirement: !ruby/object:Gem::Requirement
170
170
  requirements:
171
171
  - - ">="
@@ -179,7 +179,7 @@ dependencies:
179
179
  - !ruby/object:Gem::Version
180
180
  version: '0'
181
181
  - !ruby/object:Gem::Dependency
182
- name: rapidjson
182
+ name: yajl-ruby
183
183
  requirement: !ruby/object:Gem::Requirement
184
184
  requirements:
185
185
  - - ">="
@@ -193,7 +193,7 @@ dependencies:
193
193
  - !ruby/object:Gem::Version
194
194
  version: '0'
195
195
  - !ruby/object:Gem::Dependency
196
- name: yajl-ruby
196
+ name: syck
197
197
  requirement: !ruby/object:Gem::Requirement
198
198
  requirements:
199
199
  - - ">="
@@ -207,7 +207,7 @@ dependencies:
207
207
  - !ruby/object:Gem::Version
208
208
  version: '0'
209
209
  - !ruby/object:Gem::Dependency
210
- name: syck
210
+ name: tomlib
211
211
  requirement: !ruby/object:Gem::Requirement
212
212
  requirements:
213
213
  - - ">="
@@ -221,7 +221,7 @@ dependencies:
221
221
  - !ruby/object:Gem::Version
222
222
  version: '0'
223
223
  - !ruby/object:Gem::Dependency
224
- name: tomlib
224
+ name: toml-rb
225
225
  requirement: !ruby/object:Gem::Requirement
226
226
  requirements:
227
227
  - - ">="
@@ -235,7 +235,7 @@ dependencies:
235
235
  - !ruby/object:Gem::Version
236
236
  version: '0'
237
237
  - !ruby/object:Gem::Dependency
238
- name: toml-rb
238
+ name: tomlrb
239
239
  requirement: !ruby/object:Gem::Requirement
240
240
  requirements:
241
241
  - - ">="
@@ -249,7 +249,7 @@ dependencies:
249
249
  - !ruby/object:Gem::Version
250
250
  version: '0'
251
251
  - !ruby/object:Gem::Dependency
252
- name: tomlrb
252
+ name: json-schema
253
253
  requirement: !ruby/object:Gem::Requirement
254
254
  requirements:
255
255
  - - ">="
@@ -272,11 +272,13 @@ extensions: []
272
272
  extra_rdoc_files: []
273
273
  files:
274
274
  - ".github/workflows/benchmark.yml"
275
- - ".github/workflows/ci.yml"
276
- - ".github/workflows/docker.yml"
277
275
  - ".github/workflows/rake.yml"
278
276
  - ".github/workflows/release.yml"
277
+ - ".github/workflows/windows-debug.yml"
278
+ - ".gitignore"
279
279
  - ".rspec"
280
+ - ".rubocop.yml"
281
+ - ".rubocop_todo.yml"
280
282
  - Gemfile
281
283
  - README.adoc
282
284
  - Rakefile
@@ -289,9 +291,15 @@ files:
289
291
  - config/environments/docker-ruby-3.2.yml
290
292
  - config/environments/docker-ruby-3.3.yml
291
293
  - config/environments/docker-ruby-3.4.yml
294
+ - data/schemas/result.yml
292
295
  - docker/Dockerfile.alpine
293
296
  - docker/Dockerfile.ubuntu
294
297
  - docker/README.md
298
+ - docs/PLATFORM_VALIDATION_FIX.md
299
+ - docs/SYCK_YAML_FIX.md
300
+ - docs/WEBSITE_COMPLETION_PLAN.md
301
+ - docs/WINDOWS_LIBXML_FIX.md
302
+ - docs/WINDOWS_SETUP.md
295
303
  - exe/serialbench
296
304
  - lib/serialbench.rb
297
305
  - lib/serialbench/benchmark_runner.rb
@@ -301,6 +309,7 @@ files:
301
309
  - lib/serialbench/cli/environment_cli.rb
302
310
  - lib/serialbench/cli/resultset_cli.rb
303
311
  - lib/serialbench/cli/ruby_build_cli.rb
312
+ - lib/serialbench/cli/validate_cli.rb
304
313
  - lib/serialbench/config_manager.rb
305
314
  - lib/serialbench/memory_profiler.rb
306
315
  - lib/serialbench/models.rb
@@ -315,6 +324,7 @@ files:
315
324
  - lib/serialbench/runners/asdf_runner.rb
316
325
  - lib/serialbench/runners/base.rb
317
326
  - lib/serialbench/runners/docker_runner.rb
327
+ - lib/serialbench/runners/local_runner.rb
318
328
  - lib/serialbench/serializers.rb
319
329
  - lib/serialbench/serializers/base_serializer.rb
320
330
  - lib/serialbench/serializers/json/base_json_serializer.rb
@@ -346,6 +356,7 @@ files:
346
356
  - lib/serialbench/templates/format_based.liquid
347
357
  - lib/serialbench/templates/partials/chart_section.liquid
348
358
  - lib/serialbench/version.rb
359
+ - lib/serialbench/yaml_validator.rb
349
360
  - serialbench.gemspec
350
361
  homepage: https://github.com/metanorma/serialbench
351
362
  licenses:
@@ -1,74 +0,0 @@
1
- name: ci
2
-
3
- on:
4
- push:
5
- branches: [ main, master ]
6
- pull_request:
7
- branches: [ main, master ]
8
-
9
- jobs:
10
- setup:
11
- runs-on: ubuntu-latest
12
- outputs:
13
- ruby-versions: ${{ steps.set-matrix.outputs.ruby-versions }}
14
- steps:
15
- - name: Set Ruby version matrix
16
- id: set-matrix
17
- run: |
18
- echo 'ruby-versions=["3.1", "3.2", "3.3", "3.4"]' >> $GITHUB_OUTPUT
19
-
20
- test:
21
- runs-on: ubuntu-latest
22
- needs: setup
23
- strategy:
24
- matrix:
25
- ruby-version: ${{ fromJson(needs.setup.outputs.ruby-versions) }}
26
- fail-fast: false
27
-
28
- steps:
29
- - uses: actions/checkout@v4
30
-
31
- - name: Set up Ruby ${{ matrix.ruby-version }}
32
- uses: ruby/setup-ruby@v1
33
- with:
34
- ruby-version: ${{ matrix.ruby-version }}
35
- bundler-cache: true
36
-
37
- - name: Install system dependencies
38
- run: |
39
- sudo apt-get update
40
- sudo apt-get install -y libxml2-dev libxslt1-dev
41
-
42
- - name: List available serializers
43
- run: bundle exec serialbench list
44
-
45
- - name: Run tests
46
- run: bundle exec rspec
47
-
48
- - name: Run quick benchmark test
49
- run: |
50
- # Run a quick benchmark to ensure the CLI works
51
- bundle exec serialbench benchmark --formats xml --data-sizes small --iterations 5
52
-
53
- lint:
54
- runs-on: ubuntu-latest
55
- steps:
56
- - uses: actions/checkout@v4
57
-
58
- - name: Set up Ruby
59
- uses: ruby/setup-ruby@v1
60
- with:
61
- ruby-version: '3.3'
62
- bundler-cache: true
63
-
64
- - name: Run RuboCop (if available)
65
- run: |
66
- if bundle list | grep -q rubocop; then
67
- bundle exec rubocop
68
- else
69
- echo "RuboCop not found, skipping linting"
70
- fi
71
- continue-on-error: true
72
-
73
- - name: Check gemspec
74
- run: gem build serialbench.gemspec
@@ -1,272 +0,0 @@
1
- name: docker
2
-
3
- on:
4
- push:
5
- branches: [ main, master ]
6
- pull_request:
7
- branches: [ main, master ]
8
- schedule:
9
- # Build Docker images weekly on Saturdays at 1 AM UTC
10
- - cron: '0 1 * * 6'
11
- workflow_dispatch:
12
- # Allow manual triggering
13
-
14
- permissions:
15
- contents: read
16
- packages: write
17
-
18
- env:
19
- REGISTRY: ghcr.io
20
- IMAGE_NAME: ${{ github.repository }}/serialbench
21
-
22
- jobs:
23
- setup:
24
- runs-on: ubuntu-latest
25
- outputs:
26
- ruby-versions: ${{ steps.set-matrix.outputs.ruby-versions }}
27
- should-build: ${{ steps.check-changes.outputs.should-build }}
28
- steps:
29
- - name: Checkout repository
30
- uses: actions/checkout@v4
31
- with:
32
- fetch-depth: 2
33
-
34
- - name: Set Ruby version matrix
35
- id: set-matrix
36
- run: |
37
- echo 'ruby-versions=["3.1", "3.2", "3.3", "3.4"]' >> $GITHUB_OUTPUT
38
-
39
- - name: Check if Docker build is needed
40
- id: check-changes
41
- run: |
42
- # Always build on workflow_dispatch or schedule
43
- if [ "${{ github.event_name }}" == "workflow_dispatch" ] || [ "${{ github.event_name }}" == "schedule" ]; then
44
- echo "should-build=true" >> $GITHUB_OUTPUT
45
- echo "Manual or scheduled build triggered"
46
- exit 0
47
- fi
48
-
49
- # Check if code has changed since last commit
50
- if git diff --name-only HEAD~1 | grep -E '\.(rb|gemspec|yml|yaml)$|Gemfile|Dockerfile' > /dev/null; then
51
- echo "should-build=true" >> $GITHUB_OUTPUT
52
- echo "Code changes detected, will build new Docker images"
53
- else
54
- echo "should-build=false" >> $GITHUB_OUTPUT
55
- echo "No relevant code changes, skipping Docker build"
56
- fi
57
-
58
- build-docker-images:
59
- runs-on: ubuntu-latest
60
- needs: setup
61
- if: needs.setup.outputs.should-build == 'true'
62
- strategy:
63
- matrix:
64
- ruby-version: ${{ fromJson(needs.setup.outputs.ruby-versions) }}
65
- fail-fast: false
66
-
67
- steps:
68
- - name: Checkout repository
69
- uses: actions/checkout@v4
70
-
71
- - name: Set up Docker Buildx
72
- uses: docker/setup-buildx-action@v3
73
-
74
- - name: Log in to Container Registry
75
- uses: docker/login-action@v3
76
- with:
77
- registry: ${{ env.REGISTRY }}
78
- username: ${{ github.actor }}
79
- password: ${{ secrets.GITHUB_TOKEN }}
80
-
81
- - name: Extract metadata
82
- id: meta
83
- uses: docker/metadata-action@v5
84
- with:
85
- images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
86
- tags: |
87
- type=ref,event=branch,suffix=-ruby-${{ matrix.ruby-version }}
88
- type=ref,event=pr,prefix=pr-,suffix=-ruby-${{ matrix.ruby-version }}
89
- type=sha,suffix=-ruby-${{ matrix.ruby-version }}
90
- type=raw,value=latest,suffix=-ruby-${{ matrix.ruby-version }},enable={{is_default_branch}}
91
-
92
- - name: Build and push Docker image
93
- uses: docker/build-push-action@v5
94
- with:
95
- context: .
96
- file: docker/Dockerfile.ubuntu
97
- build-args: |
98
- RUBY_VERSION=${{ matrix.ruby-version }}
99
- push: true
100
- tags: ${{ steps.meta.outputs.tags }}
101
- labels: ${{ steps.meta.outputs.labels }}
102
- cache-from: type=gha
103
- cache-to: type=gha,mode=max
104
- platforms: linux/amd64,linux/arm64
105
-
106
- - name: Test Docker image
107
- run: |
108
- # Get the first tag from the metadata output
109
- IMAGE_TAG=$(echo "${{ steps.meta.outputs.tags }}" | head -n1)
110
- echo "Testing image: $IMAGE_TAG"
111
-
112
- # Test that the image works correctly
113
- docker run --rm "$IMAGE_TAG" \
114
- bundle exec serialbench list
115
-
116
- - name: Run basic functionality test
117
- run: |
118
- # Get the first tag from the metadata output
119
- IMAGE_TAG=$(echo "${{ steps.meta.outputs.tags }}" | head -n1)
120
- echo "Testing functionality with image: $IMAGE_TAG"
121
-
122
- # Create a temporary results directory
123
- mkdir -p test-results
124
-
125
- # Run a quick benchmark test
126
- docker run --rm \
127
- -v $(pwd)/test-results:/app/results \
128
- "$IMAGE_TAG" \
129
- bundle exec serialbench benchmark \
130
- --formats json \
131
- --iterations 1 \
132
- --warmup 0 \
133
- --output-dir /app/results
134
-
135
- # Verify results were generated
136
- ls -la test-results/
137
-
138
- # Clean up
139
- rm -rf test-results
140
-
141
- test-docker-images:
142
- runs-on: ubuntu-latest
143
- needs: [setup, build-docker-images]
144
- if: needs.setup.outputs.should-build == 'true'
145
- strategy:
146
- matrix:
147
- ruby-version: ${{ fromJson(needs.setup.outputs.ruby-versions) }}
148
- fail-fast: false
149
-
150
- steps:
151
- - name: Checkout repository
152
- uses: actions/checkout@v4
153
-
154
- - name: Set up Docker Buildx
155
- uses: docker/setup-buildx-action@v3
156
-
157
- - name: Log in to Container Registry
158
- uses: docker/login-action@v3
159
- with:
160
- registry: ${{ env.REGISTRY }}
161
- username: ${{ github.actor }}
162
- password: ${{ secrets.GITHUB_TOKEN }}
163
-
164
- - name: Extract metadata for testing
165
- id: meta
166
- uses: docker/metadata-action@v5
167
- with:
168
- images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
169
- tags: |
170
- type=ref,event=branch,suffix=-ruby-${{ matrix.ruby-version }}
171
- type=ref,event=pr,prefix=pr-,suffix=-ruby-${{ matrix.ruby-version }}
172
- type=sha,suffix=-ruby-${{ matrix.ruby-version }}
173
- type=raw,value=latest,suffix=-ruby-${{ matrix.ruby-version }},enable={{is_default_branch}}
174
-
175
- - name: Pull Docker image
176
- run: |
177
- IMAGE_TAG=$(echo "${{ steps.meta.outputs.tags }}" | head -n1)
178
- echo "Pulling image: $IMAGE_TAG"
179
- docker pull "$IMAGE_TAG"
180
-
181
- - name: Test serializer availability
182
- run: |
183
- IMAGE_TAG=$(echo "${{ steps.meta.outputs.tags }}" | head -n1)
184
- echo "Testing Ruby ${{ matrix.ruby-version }} container: $IMAGE_TAG"
185
- docker run --rm "$IMAGE_TAG" \
186
- bundle exec ruby -e "
187
- require 'serialbench'
188
- puts 'Available serializers:'
189
- Serialbench::Serializers.available.each do |s|
190
- serializer = s.new
191
- puts \" #{serializer.format}: #{serializer.name} v#{serializer.version}\"
192
- end
193
- "
194
-
195
- - name: Run comprehensive tests
196
- run: |
197
- IMAGE_TAG=$(echo "${{ steps.meta.outputs.tags }}" | head -n1)
198
- echo "Running tests with image: $IMAGE_TAG"
199
- docker run --rm "$IMAGE_TAG" \
200
- bundle exec rspec --format progress
201
-
202
- - name: Test benchmark execution
203
- run: |
204
- IMAGE_TAG=$(echo "${{ steps.meta.outputs.tags }}" | head -n1)
205
- echo "Testing benchmark execution with image: $IMAGE_TAG"
206
- mkdir -p docker-test-results
207
-
208
- # Run a comprehensive but quick benchmark
209
- docker run --rm \
210
- -v $(pwd)/docker-test-results:/app/results \
211
- "$IMAGE_TAG" \
212
- bundle exec serialbench benchmark \
213
- --formats xml json yaml toml \
214
- --iterations 2 \
215
- --warmup 1 \
216
- --output-dir /app/results
217
-
218
- # Verify all expected files were created
219
- echo "Generated files:"
220
- find docker-test-results -type f -name "*.json" -o -name "*.html" -o -name "*.csv"
221
-
222
- # Clean up
223
- rm -rf docker-test-results
224
-
225
- cleanup:
226
- runs-on: ubuntu-latest
227
- needs: [setup, build-docker-images, test-docker-images]
228
- if: always() && github.event_name != 'pull_request'
229
- steps:
230
- - name: Log in to Container Registry
231
- uses: docker/login-action@v3
232
- with:
233
- registry: ${{ env.REGISTRY }}
234
- username: ${{ github.actor }}
235
- password: ${{ secrets.GITHUB_TOKEN }}
236
-
237
- - name: Clean up old Docker images
238
- run: |
239
- echo "Docker image cleanup would be implemented here"
240
- # Note: Actual cleanup requires additional GitHub API calls
241
- # For now, we rely on GitHub's automatic cleanup policies
242
- echo "Current images are tagged and will be managed by GitHub's retention policies"
243
-
244
- summary:
245
- runs-on: ubuntu-latest
246
- needs: [setup, build-docker-images, test-docker-images]
247
- if: always()
248
- steps:
249
- - name: Build Summary
250
- run: |
251
- echo "## Docker Build Summary" >> $GITHUB_STEP_SUMMARY
252
- echo "" >> $GITHUB_STEP_SUMMARY
253
- echo "**Build Status**: ${{ needs.build-docker-images.result }}" >> $GITHUB_STEP_SUMMARY
254
- echo "**Test Status**: ${{ needs.test-docker-images.result }}" >> $GITHUB_STEP_SUMMARY
255
- echo "**Should Build**: ${{ needs.setup.outputs.should-build }}" >> $GITHUB_STEP_SUMMARY
256
- echo "" >> $GITHUB_STEP_SUMMARY
257
- echo "### Available Images" >> $GITHUB_STEP_SUMMARY
258
- echo "" >> $GITHUB_STEP_SUMMARY
259
- echo "| Ruby Version | Image Tag |" >> $GITHUB_STEP_SUMMARY
260
- echo "|--------------|-----------|" >> $GITHUB_STEP_SUMMARY
261
- echo "| 3.1 | \`ghcr.io/metanorma/serialbench:main-ruby-3.1\` |" >> $GITHUB_STEP_SUMMARY
262
- echo "| 3.2 | \`ghcr.io/metanorma/serialbench:main-ruby-3.2\` |" >> $GITHUB_STEP_SUMMARY
263
- echo "| 3.3 | \`ghcr.io/metanorma/serialbench:main-ruby-3.3\` |" >> $GITHUB_STEP_SUMMARY
264
- echo "| 3.4 | \`ghcr.io/metanorma/serialbench:main-ruby-3.4\` |" >> $GITHUB_STEP_SUMMARY
265
- echo "" >> $GITHUB_STEP_SUMMARY
266
- echo "### Usage" >> $GITHUB_STEP_SUMMARY
267
- echo "" >> $GITHUB_STEP_SUMMARY
268
- echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY
269
- echo "# Pull and run latest Ruby 3.3 container" >> $GITHUB_STEP_SUMMARY
270
- echo "docker pull ghcr.io/metanorma/serialbench:main-ruby-3.3" >> $GITHUB_STEP_SUMMARY
271
- echo "docker run --rm -v \$(pwd)/results:/app/results ghcr.io/metanorma/serialbench:main-ruby-3.3" >> $GITHUB_STEP_SUMMARY
272
- echo "\`\`\`" >> $GITHUB_STEP_SUMMARY