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.
- checksums.yaml +4 -4
- data/.github/workflows/benchmark.yml +273 -228
- data/.github/workflows/rake.yml +11 -0
- data/.github/workflows/windows-debug.yml +171 -0
- data/.gitignore +32 -0
- data/.rubocop.yml +1 -0
- data/.rubocop_todo.yml +274 -0
- data/Gemfile +13 -1
- data/README.adoc +36 -0
- data/data/schemas/result.yml +29 -0
- data/docs/PLATFORM_VALIDATION_FIX.md +79 -0
- data/docs/SYCK_YAML_FIX.md +91 -0
- data/docs/WEBSITE_COMPLETION_PLAN.md +440 -0
- data/docs/WINDOWS_LIBXML_FIX.md +136 -0
- data/docs/WINDOWS_SETUP.md +122 -0
- data/lib/serialbench/benchmark_runner.rb +3 -3
- data/lib/serialbench/cli/benchmark_cli.rb +74 -1
- data/lib/serialbench/cli/environment_cli.rb +3 -3
- data/lib/serialbench/cli/resultset_cli.rb +72 -26
- data/lib/serialbench/cli/ruby_build_cli.rb +75 -88
- data/lib/serialbench/cli/validate_cli.rb +88 -0
- data/lib/serialbench/cli.rb +6 -2
- data/lib/serialbench/config_manager.rb +15 -26
- data/lib/serialbench/models/benchmark_config.rb +12 -0
- data/lib/serialbench/models/benchmark_result.rb +39 -3
- data/lib/serialbench/models/environment_config.rb +3 -2
- data/lib/serialbench/models/platform.rb +56 -4
- data/lib/serialbench/models/result.rb +28 -1
- data/lib/serialbench/models/result_set.rb +8 -0
- data/lib/serialbench/ruby_build_manager.rb +19 -23
- data/lib/serialbench/runners/asdf_runner.rb +1 -1
- data/lib/serialbench/runners/docker_runner.rb +2 -4
- data/lib/serialbench/runners/local_runner.rb +71 -0
- data/lib/serialbench/serializers/base_serializer.rb +1 -1
- data/lib/serialbench/serializers/json/rapidjson_serializer.rb +1 -1
- data/lib/serialbench/serializers/toml/base_toml_serializer.rb +0 -2
- data/lib/serialbench/serializers/toml/toml_rb_serializer.rb +1 -1
- data/lib/serialbench/serializers/toml/tomlib_serializer.rb +1 -1
- data/lib/serialbench/serializers/xml/libxml_serializer.rb +4 -8
- data/lib/serialbench/serializers/xml/nokogiri_serializer.rb +2 -2
- data/lib/serialbench/serializers/xml/oga_serializer.rb +4 -8
- data/lib/serialbench/serializers/xml/ox_serializer.rb +2 -2
- data/lib/serialbench/serializers/xml/rexml_serializer.rb +3 -3
- data/lib/serialbench/serializers/yaml/psych_serializer.rb +1 -1
- data/lib/serialbench/serializers/yaml/syck_serializer.rb +1 -1
- data/lib/serialbench/serializers.rb +2 -2
- data/lib/serialbench/site_generator.rb +180 -2
- data/lib/serialbench/templates/assets/css/format_based.css +1 -53
- data/lib/serialbench/templates/assets/css/themes.css +5 -4
- data/lib/serialbench/templates/assets/js/chart_helpers.js +44 -14
- data/lib/serialbench/templates/assets/js/dashboard.js +14 -15
- data/lib/serialbench/templates/format_based.liquid +480 -252
- data/lib/serialbench/version.rb +1 -1
- data/lib/serialbench/yaml_validator.rb +36 -0
- data/serialbench.gemspec +11 -2
- metadata +34 -23
- data/.github/workflows/ci.yml +0 -74
- data/.github/workflows/docker.yml +0 -272
data/lib/serialbench/version.rb
CHANGED
|
@@ -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.
|
|
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-
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
data/.github/workflows/ci.yml
DELETED
|
@@ -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
|