Skip to content

ci: skip Node.js/UI build for wfctl and lsp-server binary builds#378

Merged
intel352 merged 2 commits intomainfrom
copilot/optimize-build-matrix-setup
Mar 25, 2026
Merged

ci: skip Node.js/UI build for wfctl and lsp-server binary builds#378
intel352 merged 2 commits intomainfrom
copilot/optimize-build-matrix-setup

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Mar 25, 2026

The build-binaries matrix was running Node.js setup and UI asset compilation for all three binaries (server, wfctl, lsp-server), but UI assets are only needed by server (Go embed for the admin UI).

Changes

  • release.ymlbuild-binaries matrix: Added build_ui: true exclusively to the server entry; guards both the Set up Node.js and Build UI assets steps with if: matrix.build_ui
matrix:
  include:
    - name: server
      ...
      build_ui: true   # ← only server needs this
    - name: wfctl
      ...              # build_ui absent → falsy, steps skipped
    - name: lsp-server
      ...              # build_ui absent → falsy, steps skipped

Build time investigation

The 10+ minute wall-clock times for server and wfctl builds are due to sequential cross-compilation across 5 platforms (linux/amd64, linux/arm64, darwin/amd64, darwin/arm64, windows/amd64), each taking ~3 min/platform. The Go build cache (823 MB) is restored, but only contains native linux/amd64 artifacts — cross-compiled targets must be recompiled each run. lsp-server finishes in ~2 min because it has a much smaller dependency tree.

Other workflows were reviewed: pre-release.yml only builds server (no matrix issue); all ci.yml jobs that invoke the Node/UI build legitimately depend on the embedded assets.


⚡ Quickly spin up Copilot coding agent tasks from anywhere on your macOS or Windows machine with Raycast.

The build matrix in release.yml was running the Node.js setup and UI asset
build steps for all binary types (server, wfctl, lsp-server). The UI assets
are only required for the server binary since it uses Go embed to serve the
admin UI.

Add build_ui: true to the server matrix entry and guard the Node.js setup
and UI build steps with `if: matrix.build_ui`. The wfctl and lsp-server
entries omit the flag (evaluates to falsy) so those steps are skipped,
saving unnecessary work on each build.

The 10+ minute build times for server and wfctl are due to sequential
cross-compilation across 5 target platforms (linux/amd64, linux/arm64,
darwin/amd64, darwin/arm64, windows/amd64), each taking ~3 minutes. This
is expected behavior; the Go build cache (823 MB) is restored but does not
include cross-compiled artifacts for non-native targets.

Co-authored-by: intel352 <77607+intel352@users.noreply.github.com>
Agent-Logs-Url: https://github.com/GoCodeAlone/workflow/sessions/f3bf4297-d828-4692-8be5-71cc074a95ae
Copilot AI changed the title [WIP] Optimize build matrix by reducing unnecessary steps ci: skip Node.js/UI build for wfctl and lsp-server binary builds Mar 25, 2026
Copilot AI requested a review from intel352 March 25, 2026 03:22
@intel352 intel352 marked this pull request as ready for review March 25, 2026 04:32
Copilot AI review requested due to automatic review settings March 25, 2026 04:32
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the release workflow to avoid unnecessary Node.js setup and UI asset compilation when building non-server binaries, since only the server binary needs the embedded admin UI assets.

Changes:

  • Adds a build_ui: true flag only to the server entry in the build-binaries matrix.
  • Guards the Set up Node.js and Build UI assets steps with if: matrix.build_ui so they only run for server.

@github-actions
Copy link
Copy Markdown

⏱ Benchmark Results

No significant performance regressions detected.

benchstat comparison (baseline → PR)
## benchstat: baseline → PR
baseline-bench.txt:245: parsing iteration count: invalid syntax
baseline-bench.txt:369309: parsing iteration count: invalid syntax
baseline-bench.txt:770074: parsing iteration count: invalid syntax
baseline-bench.txt:1109708: parsing iteration count: invalid syntax
baseline-bench.txt:1456698: parsing iteration count: invalid syntax
baseline-bench.txt:1804849: parsing iteration count: invalid syntax
benchmark-results.txt:245: parsing iteration count: invalid syntax
benchmark-results.txt:296244: parsing iteration count: invalid syntax
benchmark-results.txt:599194: parsing iteration count: invalid syntax
benchmark-results.txt:881270: parsing iteration count: invalid syntax
benchmark-results.txt:1160001: parsing iteration count: invalid syntax
benchmark-results.txt:1474447: parsing iteration count: invalid syntax
goos: linux
goarch: amd64
pkg: github.com/GoCodeAlone/workflow/dynamic
cpu: AMD EPYC 9V74 80-Core Processor                
                            │ benchmark-results.txt │
                            │        sec/op         │
InterpreterCreation-4                  3.053m ± 30%
ComponentLoad-4                        3.555m ±  5%
ComponentExecute-4                     1.898µ ±  1%
PoolContention/workers-1-4             1.036µ ±  2%
PoolContention/workers-2-4             1.033µ ±  4%
PoolContention/workers-4-4             1.044µ ±  2%
PoolContention/workers-8-4             1.039µ ±  0%
PoolContention/workers-16-4            1.043µ ±  1%
ComponentLifecycle-4                   3.587m ±  1%
SourceValidation-4                     2.112µ ±  1%
RegistryConcurrent-4                   793.6n ±  3%
LoaderLoadFromString-4                 3.632m ±  1%
geomean                                16.90µ

                            │ benchmark-results.txt │
                            │         B/op          │
InterpreterCreation-4                  2.027Mi ± 0%
ComponentLoad-4                        2.180Mi ± 0%
ComponentExecute-4                     1.203Ki ± 0%
PoolContention/workers-1-4             1.203Ki ± 0%
PoolContention/workers-2-4             1.203Ki ± 0%
PoolContention/workers-4-4             1.203Ki ± 0%
PoolContention/workers-8-4             1.203Ki ± 0%
PoolContention/workers-16-4            1.203Ki ± 0%
ComponentLifecycle-4                   2.183Mi ± 0%
SourceValidation-4                     1.984Ki ± 0%
RegistryConcurrent-4                   1.133Ki ± 0%
LoaderLoadFromString-4                 2.182Mi ± 0%
geomean                                15.25Ki

                            │ benchmark-results.txt │
                            │       allocs/op       │
InterpreterCreation-4                   15.68k ± 0%
ComponentLoad-4                         18.02k ± 0%
ComponentExecute-4                       25.00 ± 0%
PoolContention/workers-1-4               25.00 ± 0%
PoolContention/workers-2-4               25.00 ± 0%
PoolContention/workers-4-4               25.00 ± 0%
PoolContention/workers-8-4               25.00 ± 0%
PoolContention/workers-16-4              25.00 ± 0%
ComponentLifecycle-4                    18.07k ± 0%
SourceValidation-4                       32.00 ± 0%
RegistryConcurrent-4                     2.000 ± 0%
LoaderLoadFromString-4                  18.06k ± 0%
geomean                                  183.3

cpu: Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz
                            │ baseline-bench.txt │
                            │       sec/op       │
InterpreterCreation-4              3.305m ± 185%
ComponentLoad-4                    3.563m ±   2%
ComponentExecute-4                 2.104µ ±   1%
PoolContention/workers-1-4         1.230µ ±   1%
PoolContention/workers-2-4         1.228µ ±   4%
PoolContention/workers-4-4         1.216µ ±   1%
PoolContention/workers-8-4         1.233µ ±   2%
PoolContention/workers-16-4        1.225µ ±   1%
ComponentLifecycle-4               3.642m ±   2%
SourceValidation-4                 2.325µ ±   1%
RegistryConcurrent-4               890.1n ±  11%
LoaderLoadFromString-4             3.658m ±   1%
geomean                            18.75µ

                            │ baseline-bench.txt │
                            │        B/op        │
InterpreterCreation-4               2.027Mi ± 0%
ComponentLoad-4                     2.180Mi ± 0%
ComponentExecute-4                  1.203Ki ± 0%
PoolContention/workers-1-4          1.203Ki ± 0%
PoolContention/workers-2-4          1.203Ki ± 0%
PoolContention/workers-4-4          1.203Ki ± 0%
PoolContention/workers-8-4          1.203Ki ± 0%
PoolContention/workers-16-4         1.203Ki ± 0%
ComponentLifecycle-4                2.183Mi ± 0%
SourceValidation-4                  1.984Ki ± 0%
RegistryConcurrent-4                1.133Ki ± 0%
LoaderLoadFromString-4              2.182Mi ± 0%
geomean                             15.25Ki

                            │ baseline-bench.txt │
                            │     allocs/op      │
InterpreterCreation-4                15.68k ± 0%
ComponentLoad-4                      18.02k ± 0%
ComponentExecute-4                    25.00 ± 0%
PoolContention/workers-1-4            25.00 ± 0%
PoolContention/workers-2-4            25.00 ± 0%
PoolContention/workers-4-4            25.00 ± 0%
PoolContention/workers-8-4            25.00 ± 0%
PoolContention/workers-16-4           25.00 ± 0%
ComponentLifecycle-4                 18.07k ± 0%
SourceValidation-4                    32.00 ± 0%
RegistryConcurrent-4                  2.000 ± 0%
LoaderLoadFromString-4               18.06k ± 0%
geomean                               183.3

pkg: github.com/GoCodeAlone/workflow/middleware
cpu: AMD EPYC 9V74 80-Core Processor                
                                  │ benchmark-results.txt │
                                  │        sec/op         │
CircuitBreakerDetection-4                     296.5n ± 7%
CircuitBreakerExecution_Success-4             22.68n ± 0%
CircuitBreakerExecution_Failure-4             70.64n ± 0%
geomean                                       78.02n

                                  │ benchmark-results.txt │
                                  │         B/op          │
CircuitBreakerDetection-4                    144.0 ± 0%
CircuitBreakerExecution_Success-4            0.000 ± 0%
CircuitBreakerExecution_Failure-4            0.000 ± 0%
geomean                                                 ¹
¹ summaries must be >0 to compute geomean

                                  │ benchmark-results.txt │
                                  │       allocs/op       │
CircuitBreakerDetection-4                    1.000 ± 0%
CircuitBreakerExecution_Success-4            0.000 ± 0%
CircuitBreakerExecution_Failure-4            0.000 ± 0%
geomean                                                 ¹
¹ summaries must be >0 to compute geomean

cpu: Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz
                                  │ baseline-bench.txt │
                                  │       sec/op       │
CircuitBreakerDetection-4                  463.9n ± 1%
CircuitBreakerExecution_Success-4          59.78n ± 0%
CircuitBreakerExecution_Failure-4          64.49n ± 1%
geomean                                    121.4n

                                  │ baseline-bench.txt │
                                  │        B/op        │
CircuitBreakerDetection-4                 144.0 ± 0%
CircuitBreakerExecution_Success-4         0.000 ± 0%
CircuitBreakerExecution_Failure-4         0.000 ± 0%
geomean                                              ¹
¹ summaries must be >0 to compute geomean

                                  │ baseline-bench.txt │
                                  │     allocs/op      │
CircuitBreakerDetection-4                 1.000 ± 0%
CircuitBreakerExecution_Success-4         0.000 ± 0%
CircuitBreakerExecution_Failure-4         0.000 ± 0%
geomean                                              ¹
¹ summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/module
cpu: AMD EPYC 9V74 80-Core Processor                
                                 │ benchmark-results.txt │
                                 │        sec/op         │
JQTransform_Simple-4                        856.6n ± 23%
JQTransform_ObjectConstruction-4            1.362µ ±  1%
JQTransform_ArraySelect-4                   3.316µ ±  0%
JQTransform_Complex-4                       40.82µ ±  1%
JQTransform_Throughput-4                    1.677µ ±  1%
SSEPublishDelivery-4                        58.33n ±  1%
geomean                                     1.578µ

                                 │ benchmark-results.txt │
                                 │         B/op          │
JQTransform_Simple-4                      1.273Ki ± 0%
JQTransform_ObjectConstruction-4          1.773Ki ± 0%
JQTransform_ArraySelect-4                 2.625Ki ± 0%
JQTransform_Complex-4                     16.22Ki ± 0%
JQTransform_Throughput-4                  1.984Ki ± 0%
SSEPublishDelivery-4                        0.000 ± 0%
geomean                                                ¹
¹ summaries must be >0 to compute geomean

                                 │ benchmark-results.txt │
                                 │       allocs/op       │
JQTransform_Simple-4                        10.00 ± 0%
JQTransform_ObjectConstruction-4            15.00 ± 0%
JQTransform_ArraySelect-4                   30.00 ± 0%
JQTransform_Complex-4                       324.0 ± 0%
JQTransform_Throughput-4                    17.00 ± 0%
SSEPublishDelivery-4                        0.000 ± 0%
geomean                                                ¹
¹ summaries must be >0 to compute geomean

cpu: Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz
                                 │ baseline-bench.txt │
                                 │       sec/op       │
JQTransform_Simple-4                     956.6n ± 22%
JQTransform_ObjectConstruction-4         1.527µ ±  2%
JQTransform_ArraySelect-4                3.300µ ±  3%
JQTransform_Complex-4                    36.29µ ±  1%
JQTransform_Throughput-4                 1.847µ ±  2%
SSEPublishDelivery-4                     72.36n ±  1%
geomean                                  1.691µ

                                 │ baseline-bench.txt │
                                 │        B/op        │
JQTransform_Simple-4                   1.273Ki ± 0%
JQTransform_ObjectConstruction-4       1.773Ki ± 0%
JQTransform_ArraySelect-4              2.625Ki ± 0%
JQTransform_Complex-4                  16.22Ki ± 0%
JQTransform_Throughput-4               1.984Ki ± 0%
SSEPublishDelivery-4                     0.000 ± 0%
geomean                                             ¹
¹ summaries must be >0 to compute geomean

                                 │ baseline-bench.txt │
                                 │     allocs/op      │
JQTransform_Simple-4                     10.00 ± 0%
JQTransform_ObjectConstruction-4         15.00 ± 0%
JQTransform_ArraySelect-4                30.00 ± 0%
JQTransform_Complex-4                    324.0 ± 0%
JQTransform_Throughput-4                 17.00 ± 0%
SSEPublishDelivery-4                     0.000 ± 0%
geomean                                             ¹
¹ summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/schema
cpu: AMD EPYC 9V74 80-Core Processor                
                                    │ benchmark-results.txt │
                                    │        sec/op         │
SchemaValidation_Simple-4                      1.100µ ± 10%
SchemaValidation_AllFields-4                   1.705µ ±  5%
SchemaValidation_FormatValidation-4            1.613µ ±  4%
SchemaValidation_ManySchemas-4                 1.596µ ±  6%
geomean                                        1.482µ

                                    │ benchmark-results.txt │
                                    │         B/op          │
SchemaValidation_Simple-4                      0.000 ± 0%
SchemaValidation_AllFields-4                   0.000 ± 0%
SchemaValidation_FormatValidation-4            0.000 ± 0%
SchemaValidation_ManySchemas-4                 0.000 ± 0%
geomean                                                   ¹
¹ summaries must be >0 to compute geomean

                                    │ benchmark-results.txt │
                                    │       allocs/op       │
SchemaValidation_Simple-4                      0.000 ± 0%
SchemaValidation_AllFields-4                   0.000 ± 0%
SchemaValidation_FormatValidation-4            0.000 ± 0%
SchemaValidation_ManySchemas-4                 0.000 ± 0%
geomean                                                   ¹
¹ summaries must be >0 to compute geomean

cpu: Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz
                                    │ baseline-bench.txt │
                                    │       sec/op       │
SchemaValidation_Simple-4                   1.032µ ±  5%
SchemaValidation_AllFields-4                1.555µ ± 17%
SchemaValidation_FormatValidation-4         1.479µ ±  2%
SchemaValidation_ManySchemas-4              1.480µ ±  5%
geomean                                     1.369µ

                                    │ baseline-bench.txt │
                                    │        B/op        │
SchemaValidation_Simple-4                   0.000 ± 0%
SchemaValidation_AllFields-4                0.000 ± 0%
SchemaValidation_FormatValidation-4         0.000 ± 0%
SchemaValidation_ManySchemas-4              0.000 ± 0%
geomean                                                ¹
¹ summaries must be >0 to compute geomean

                                    │ baseline-bench.txt │
                                    │     allocs/op      │
SchemaValidation_Simple-4                   0.000 ± 0%
SchemaValidation_AllFields-4                0.000 ± 0%
SchemaValidation_FormatValidation-4         0.000 ± 0%
SchemaValidation_ManySchemas-4              0.000 ± 0%
geomean                                                ¹
¹ summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/store
cpu: AMD EPYC 9V74 80-Core Processor                
                                   │ benchmark-results.txt │
                                   │        sec/op         │
EventStoreAppend_InMemory-4                   1.095µ ± 13%
EventStoreAppend_SQLite-4                     1.053m ±  4%
GetTimeline_InMemory/events-10-4              12.51µ ± 19%
GetTimeline_InMemory/events-50-4              56.89µ ±  1%
GetTimeline_InMemory/events-100-4             113.4µ ±  1%
GetTimeline_InMemory/events-500-4             583.5µ ±  1%
GetTimeline_InMemory/events-1000-4            1.198m ±  1%
GetTimeline_SQLite/events-10-4                91.22µ ±  1%
GetTimeline_SQLite/events-50-4                231.6µ ±  1%
GetTimeline_SQLite/events-100-4               411.1µ ±  1%
GetTimeline_SQLite/events-500-4               1.748m ±  0%
GetTimeline_SQLite/events-1000-4              3.380m ±  0%
geomean                                       196.6µ

                                   │ benchmark-results.txt │
                                   │         B/op          │
EventStoreAppend_InMemory-4                     750.0 ± 3%
EventStoreAppend_SQLite-4                     1.984Ki ± 2%
GetTimeline_InMemory/events-10-4              7.953Ki ± 0%
GetTimeline_InMemory/events-50-4              46.62Ki ± 0%
GetTimeline_InMemory/events-100-4             94.48Ki ± 0%
GetTimeline_InMemory/events-500-4             472.8Ki ± 0%
GetTimeline_InMemory/events-1000-4            944.3Ki ± 0%
GetTimeline_SQLite/events-10-4                16.74Ki ± 0%
GetTimeline_SQLite/events-50-4                87.14Ki ± 0%
GetTimeline_SQLite/events-100-4               175.4Ki ± 0%
GetTimeline_SQLite/events-500-4               846.1Ki ± 0%
GetTimeline_SQLite/events-1000-4              1.639Mi ± 0%
geomean                                       67.05Ki

                                   │ benchmark-results.txt │
                                   │       allocs/op       │
EventStoreAppend_InMemory-4                     7.000 ± 0%
EventStoreAppend_SQLite-4                       53.00 ± 0%
GetTimeline_InMemory/events-10-4                125.0 ± 0%
GetTimeline_InMemory/events-50-4                653.0 ± 0%
GetTimeline_InMemory/events-100-4              1.306k ± 0%
GetTimeline_InMemory/events-500-4              6.514k ± 0%
GetTimeline_InMemory/events-1000-4             13.02k ± 0%
GetTimeline_SQLite/events-10-4                  382.0 ± 0%
GetTimeline_SQLite/events-50-4                 1.852k ± 0%
GetTimeline_SQLite/events-100-4                3.681k ± 0%
GetTimeline_SQLite/events-500-4                18.54k ± 0%
GetTimeline_SQLite/events-1000-4               37.29k ± 0%
geomean                                        1.162k

cpu: Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz
                                   │ baseline-bench.txt │
                                   │       sec/op       │
EventStoreAppend_InMemory-4                1.117µ ± 19%
EventStoreAppend_SQLite-4                  1.934m ± 10%
GetTimeline_InMemory/events-10-4           13.98µ ±  3%
GetTimeline_InMemory/events-50-4           79.38µ ±  4%
GetTimeline_InMemory/events-100-4          155.6µ ±  4%
GetTimeline_InMemory/events-500-4          632.0µ ±  7%
GetTimeline_InMemory/events-1000-4         1.273m ±  1%
GetTimeline_SQLite/events-10-4             87.48µ ±  1%
GetTimeline_SQLite/events-50-4             245.0µ ±  2%
GetTimeline_SQLite/events-100-4            440.8µ ±  1%
GetTimeline_SQLite/events-500-4            1.946m ±  3%
GetTimeline_SQLite/events-1000-4           3.843m ±  1%
geomean                                    229.4µ

                                   │ baseline-bench.txt │
                                   │        B/op        │
EventStoreAppend_InMemory-4                 757.5 ± 15%
EventStoreAppend_SQLite-4                 1.981Ki ±  2%
GetTimeline_InMemory/events-10-4          7.953Ki ±  0%
GetTimeline_InMemory/events-50-4          46.62Ki ±  0%
GetTimeline_InMemory/events-100-4         94.48Ki ±  0%
GetTimeline_InMemory/events-500-4         472.8Ki ±  0%
GetTimeline_InMemory/events-1000-4        944.3Ki ±  0%
GetTimeline_SQLite/events-10-4            16.74Ki ±  0%
GetTimeline_SQLite/events-50-4            87.14Ki ±  0%
GetTimeline_SQLite/events-100-4           175.4Ki ±  0%
GetTimeline_SQLite/events-500-4           846.1Ki ±  0%
GetTimeline_SQLite/events-1000-4          1.639Mi ±  0%
geomean                                   67.10Ki

                                   │ baseline-bench.txt │
                                   │     allocs/op      │
EventStoreAppend_InMemory-4                  7.000 ± 0%
EventStoreAppend_SQLite-4                    53.00 ± 0%
GetTimeline_InMemory/events-10-4             125.0 ± 0%
GetTimeline_InMemory/events-50-4             653.0 ± 0%
GetTimeline_InMemory/events-100-4           1.306k ± 0%
GetTimeline_InMemory/events-500-4           6.514k ± 0%
GetTimeline_InMemory/events-1000-4          13.02k ± 0%
GetTimeline_SQLite/events-10-4               382.0 ± 0%
GetTimeline_SQLite/events-50-4              1.852k ± 0%
GetTimeline_SQLite/events-100-4             3.681k ± 0%
GetTimeline_SQLite/events-500-4             18.54k ± 0%
GetTimeline_SQLite/events-1000-4            37.29k ± 0%
geomean                                     1.162k

Benchmarks run with go test -bench=. -benchmem -count=6.
Regressions ≥ 20% are flagged. Results compared via benchstat.

@intel352 intel352 merged commit a3c81e7 into main Mar 25, 2026
22 checks passed
@intel352 intel352 deleted the copilot/optimize-build-matrix-setup branch March 25, 2026 15:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants