From 6bbbfece310ee99a629d2ca02a388c2f3d030b1f Mon Sep 17 00:00:00 2001 From: Oleg Bespalov Date: Thu, 24 Aug 2023 14:36:09 +0200 Subject: [PATCH 1/2] Refactor test to remove vendor dependency --- .github/workflows/all.yml | 1 - Makefile | 1 - README.md | 3 - grpc/client_test.go | 52 +++--- grpc/stream_test.go | 2 +- grpc/testdata/grpc_any_testing/any_test.proto | 31 ++++ grpc/testdata/grpc_testing/test.proto | 156 ++++++++++++++++++ 7 files changed, 214 insertions(+), 32 deletions(-) create mode 100644 grpc/testdata/grpc_any_testing/any_test.proto create mode 100644 grpc/testdata/grpc_testing/test.proto diff --git a/.github/workflows/all.yml b/.github/workflows/all.yml index 0d57d5b..e329e9f 100644 --- a/.github/workflows/all.yml +++ b/.github/workflows/all.yml @@ -75,7 +75,6 @@ jobs: run: | which go go version - go mod vendor go test -race -timeout 60s ./... test-build: diff --git a/Makefile b/Makefile index 939defa..dbd6c63 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,6 @@ grpc-server-run: ## test: Executes any tests. test: - test -s vendor || (echo "No vendored dependencies, but they required for tests, running 'go mod vendor'..." && go mod vendor) echo "Running tests..." go test -race -timeout 30s ./... diff --git a/README.md b/README.md index 170aa4b..5d7a295 100644 --- a/README.md +++ b/README.md @@ -75,9 +75,6 @@ We don't expect every contributor to do that and are happy to do that for you, b To run the test you can use the `make test` target. -> [!IMPORTANT] -> Our tests uses some proto definition files from the vendor folder. The first of the `make test` will check if the folder exists and if not try to download it. If you want to do that manually you can run `go mod vendor`. - ### Linting To run the linter you can use the `make lint` target. diff --git a/grpc/client_test.go b/grpc/client_test.go index 51e2051..d583a0f 100644 --- a/grpc/client_test.go +++ b/grpc/client_test.go @@ -76,7 +76,7 @@ func TestClient(t *testing.T) { initString: codeBlock{ code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_testing/test.proto");`, + client.load([], "../grpc/testdata/grpc_testing/test.proto");`, val: []MethodInfo{{MethodInfo: grpc.MethodInfo{Name: "EmptyCall", IsClientStream: false, IsServerStream: false}, Package: "grpc.testing", Service: "TestService", FullMethod: "/grpc.testing.TestService/EmptyCall"}, {MethodInfo: grpc.MethodInfo{Name: "UnaryCall", IsClientStream: false, IsServerStream: false}, Package: "grpc.testing", Service: "TestService", FullMethod: "/grpc.testing.TestService/UnaryCall"}, {MethodInfo: grpc.MethodInfo{Name: "StreamingOutputCall", IsClientStream: false, IsServerStream: true}, Package: "grpc.testing", Service: "TestService", FullMethod: "/grpc.testing.TestService/StreamingOutputCall"}, {MethodInfo: grpc.MethodInfo{Name: "StreamingInputCall", IsClientStream: true, IsServerStream: false}, Package: "grpc.testing", Service: "TestService", FullMethod: "/grpc.testing.TestService/StreamingInputCall"}, {MethodInfo: grpc.MethodInfo{Name: "FullDuplexCall", IsClientStream: true, IsServerStream: true}, Package: "grpc.testing", Service: "TestService", FullMethod: "/grpc.testing.TestService/FullDuplexCall"}, {MethodInfo: grpc.MethodInfo{Name: "HalfDuplexCall", IsClientStream: true, IsServerStream: true}, Package: "grpc.testing", Service: "TestService", FullMethod: "/grpc.testing.TestService/HalfDuplexCall"}}, }, }, @@ -117,7 +117,7 @@ func TestClient(t *testing.T) { initString: codeBlock{ code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_testing/test.proto"); + client.load([], "../grpc/testdata/grpc_testing/test.proto"); client.connect();`, err: "connecting to a gRPC server in the init context is not supported", }, @@ -127,7 +127,7 @@ func TestClient(t *testing.T) { initString: codeBlock{ code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_testing/test.proto"); + client.load([], "../grpc/testdata/grpc_testing/test.proto"); var err = client.invoke(); throw new Error(err)`, err: "invoking RPC methods in the init context is not supported", @@ -138,7 +138,7 @@ func TestClient(t *testing.T) { initString: codeBlock{ code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_testing/test.proto"); + client.load([], "../grpc/testdata/grpc_testing/test.proto"); client.invoke("grpc.testing.TestService/EmptyCall", {})`, err: "invoking RPC methods in the init context is not supported", }, @@ -147,7 +147,7 @@ func TestClient(t *testing.T) { name: "UnknownConnectParam", initString: codeBlock{code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_testing/test.proto");`}, + client.load([], "../grpc/testdata/grpc_testing/test.proto");`}, vuString: codeBlock{ code: `client.connect("GRPCBIN_ADDR", { name: "k6" });`, err: `unknown connect param: "name"`, @@ -158,7 +158,7 @@ func TestClient(t *testing.T) { initString: codeBlock{ code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_testing/test.proto");`, + client.load([], "../grpc/testdata/grpc_testing/test.proto");`, }, vuString: codeBlock{ code: `client.connect("GRPCBIN_ADDR", { timeout: "k6" });`, @@ -169,35 +169,35 @@ func TestClient(t *testing.T) { name: "ConnectStringTimeout", initString: codeBlock{code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_testing/test.proto");`}, + client.load([], "../grpc/testdata/grpc_testing/test.proto");`}, vuString: codeBlock{code: `client.connect("GRPCBIN_ADDR", { timeout: "1h3s" });`}, }, { name: "ConnectIntegerTimeout", initString: codeBlock{code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_testing/test.proto");`}, + client.load([], "../grpc/testdata/grpc_testing/test.proto");`}, vuString: codeBlock{code: `client.connect("GRPCBIN_ADDR", { timeout: 3000 });`}, }, { name: "ConnectFloatTimeout", initString: codeBlock{code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_testing/test.proto");`}, + client.load([], "../grpc/testdata/grpc_testing/test.proto");`}, vuString: codeBlock{code: `client.connect("GRPCBIN_ADDR", { timeout: 3456.3 });`}, }, { name: "Connect", initString: codeBlock{code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_testing/test.proto");`}, + client.load([], "../grpc/testdata/grpc_testing/test.proto");`}, vuString: codeBlock{code: `client.connect("GRPCBIN_ADDR");`}, }, { name: "InvokeNotFound", initString: codeBlock{code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_testing/test.proto");`}, + client.load([], "../grpc/testdata/grpc_testing/test.proto");`}, vuString: codeBlock{ code: ` client.connect("GRPCBIN_ADDR"); @@ -209,7 +209,7 @@ func TestClient(t *testing.T) { name: "InvokeNilRequest", initString: codeBlock{code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_testing/test.proto");`}, + client.load([], "../grpc/testdata/grpc_testing/test.proto");`}, vuString: codeBlock{ code: ` client.connect("GRPCBIN_ADDR"); @@ -221,7 +221,7 @@ func TestClient(t *testing.T) { name: "Invoke", initString: codeBlock{code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_testing/test.proto");`}, + client.load([], "../grpc/testdata/grpc_testing/test.proto");`}, setup: func(tb *httpmultibin.HTTPMultiBin) { tb.GRPCStub.EmptyCallFunc = func(context.Context, *grpc_testing.Empty) (*grpc_testing.Empty, error) { return &grpc_testing.Empty{}, nil @@ -244,7 +244,7 @@ func TestClient(t *testing.T) { name: "InvokeAnyProto", initString: codeBlock{code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_any_testing/any_test.proto");`}, + client.load([], "../grpc/testdata/grpc_any_testing/any_test.proto");`}, setup: func(tb *httpmultibin.HTTPMultiBin) { tb.GRPCAnyStub.SumFunc = func(ctx context.Context, req *grpcanytesting.SumRequest) (*grpcanytesting.SumReply, error) { var sumRequestData grpcanytesting.SumRequestData @@ -293,7 +293,7 @@ func TestClient(t *testing.T) { initString: codeBlock{ code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_testing/test.proto");`, + client.load([], "../grpc/testdata/grpc_testing/test.proto");`, }, setup: func(tb *httpmultibin.HTTPMultiBin) { tb.GRPCStub.UnaryCallFunc = func(_ context.Context, req *grpc_testing.SimpleRequest) (*grpc_testing.SimpleResponse, error) { @@ -315,7 +315,7 @@ func TestClient(t *testing.T) { initString: codeBlock{ code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_testing/test.proto");`, + client.load([], "../grpc/testdata/grpc_testing/test.proto");`, }, setup: func(tb *httpmultibin.HTTPMultiBin) { tb.GRPCStub.EmptyCallFunc = func(ctx context.Context, _ *grpc_testing.Empty) (*grpc_testing.Empty, error) { @@ -340,7 +340,7 @@ func TestClient(t *testing.T) { initString: codeBlock{ code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_testing/test.proto");`, + client.load([], "../grpc/testdata/grpc_testing/test.proto");`, }, setup: func(tb *httpmultibin.HTTPMultiBin) { tb.GRPCStub.UnaryCallFunc = func(context.Context, *grpc_testing.SimpleRequest) (*grpc_testing.SimpleResponse, error) { @@ -367,7 +367,7 @@ func TestClient(t *testing.T) { initString: codeBlock{ code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_testing/test.proto");`, + client.load([], "../grpc/testdata/grpc_testing/test.proto");`, }, setup: func(tb *httpmultibin.HTTPMultiBin) { tb.GRPCStub.EmptyCallFunc = func(context.Context, *grpc_testing.Empty) (*grpc_testing.Empty, error) { @@ -395,7 +395,7 @@ func TestClient(t *testing.T) { initString: codeBlock{ code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_testing/test.proto");`, + client.load([], "../grpc/testdata/grpc_testing/test.proto");`, }, setup: func(tb *httpmultibin.HTTPMultiBin) { tb.GRPCStub.EmptyCallFunc = func(ctx context.Context, _ *grpc_testing.Empty) (*grpc_testing.Empty, error) { @@ -425,7 +425,7 @@ func TestClient(t *testing.T) { initString: codeBlock{ code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_testing/test.proto");`, + client.load([], "../grpc/testdata/grpc_testing/test.proto");`, }, setup: func(tb *httpmultibin.HTTPMultiBin) { tb.GRPCStub.EmptyCallFunc = func(ctx context.Context, _ *grpc_testing.Empty) (*grpc_testing.Empty, error) { @@ -462,7 +462,7 @@ func TestClient(t *testing.T) { initString: codeBlock{ code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_testing/test.proto");`, + client.load([], "../grpc/testdata/grpc_testing/test.proto");`, }, vuString: codeBlock{ code: `client.load()`, @@ -572,7 +572,7 @@ func TestClient(t *testing.T) { initString: codeBlock{ code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_testing/test.proto");`, + client.load([], "../grpc/testdata/grpc_testing/test.proto");`, }, setup: func(tb *httpmultibin.HTTPMultiBin) { tb.GRPCStub.UnaryCallFunc = func(_ context.Context, req *grpc_testing.SimpleRequest) (*grpc_testing.SimpleResponse, error) { @@ -623,7 +623,7 @@ func TestClient(t *testing.T) { initString: codeBlock{ code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_testing/test.proto");`, + client.load([], "../grpc/testdata/grpc_testing/test.proto");`, }, setup: func(tb *httpmultibin.HTTPMultiBin) { tb.GRPCStub.UnaryCallFunc = func(context.Context, *grpc_testing.SimpleRequest) (*grpc_testing.SimpleResponse, error) { @@ -646,7 +646,7 @@ func TestClient(t *testing.T) { initString: codeBlock{ code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_testing/test.proto");`, + client.load([], "../grpc/testdata/grpc_testing/test.proto");`, }, vuString: codeBlock{ code: ` @@ -825,7 +825,7 @@ func TestClient_TlsParameters(t *testing.T) { }, initString: codeBlock{code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_testing/test.proto");`}, + client.load([], "../grpc/testdata/grpc_testing/test.proto");`}, vuString: codeBlock{ code: fmt.Sprintf(` client.connect("GRPCBIN_ADDR", { timeout: '5s', tls: { cacerts: ["%s"], cert: "%s", key: "%s" }}); @@ -851,7 +851,7 @@ func TestClient_TlsParameters(t *testing.T) { }, initString: codeBlock{code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_testing/test.proto");`}, + client.load([], "../grpc/testdata/grpc_testing/test.proto");`}, vuString: codeBlock{ code: fmt.Sprintf(` client.connect("GRPCBIN_ADDR", { timeout: '2s', tls: { cacerts: ["%s"], cert: "%s", key: "%s" }}); diff --git a/grpc/stream_test.go b/grpc/stream_test.go index 197a147..fb8ba69 100644 --- a/grpc/stream_test.go +++ b/grpc/stream_test.go @@ -24,7 +24,7 @@ func TestStream_InvalidHeader(t *testing.T) { initString := codeBlock{ code: ` var client = new grpc.Client(); - client.load([], "../vendor/go.k6.io/k6/lib/testutils/httpmultibin/grpc_testing/test.proto");`, + client.load([], "../grpc/testdata/grpc_testing/test.proto");`, } val, err := replace(initString.code) diff --git a/grpc/testdata/grpc_any_testing/any_test.proto b/grpc/testdata/grpc_any_testing/any_test.proto new file mode 100644 index 0000000..cee3915 --- /dev/null +++ b/grpc/testdata/grpc_any_testing/any_test.proto @@ -0,0 +1,31 @@ + + +syntax = "proto3"; + +package grpc.any.testing; + +import "google/protobuf/any.proto"; + +option go_package ="./grpc_any_testing"; + +service AnyTestService { + rpc Sum (SumRequest) returns (SumReply) {} +} + +message SumRequest { + google.protobuf.Any data = 1; +} + +message SumRequestData { + int64 a = 1; + int64 b = 2; +} + +message SumReply { + google.protobuf.Any data = 1; +} + +message SumReplyData { + int64 v = 1; + string err = 2; +} diff --git a/grpc/testdata/grpc_testing/test.proto b/grpc/testdata/grpc_testing/test.proto new file mode 100644 index 0000000..3536667 --- /dev/null +++ b/grpc/testdata/grpc_testing/test.proto @@ -0,0 +1,156 @@ +// Copyright 2017 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// An integration test service that covers all the method signature permutations +// of unary/streaming requests/responses. +syntax = "proto3"; + +option go_package = "./grpc_testing"; + +package grpc.testing; + +message Empty {} + +// The type of payload that should be returned. +enum PayloadType { + // Compressable text format. + COMPRESSABLE = 0; + + // Uncompressable binary format. + UNCOMPRESSABLE = 1; + + // Randomly chosen from all other formats defined in this enum. + RANDOM = 2; +} + +// A block of data, to simply increase gRPC message size. +message Payload { + // The type of data in body. + PayloadType type = 1; + // Primary contents of payload. + bytes body = 2; +} + +// Unary request. +message SimpleRequest { + // Desired payload type in the response from the server. + // If response_type is RANDOM, server randomly chooses one from other formats. + PayloadType response_type = 1; + + // Desired payload size in the response from the server. + // If response_type is COMPRESSABLE, this denotes the size before compression. + int32 response_size = 2; + + // Optional input payload sent along with the request. + Payload payload = 3; + + // Whether SimpleResponse should include username. + bool fill_username = 4; + + // Whether SimpleResponse should include OAuth scope. + bool fill_oauth_scope = 5; +} + +// Unary response, as configured by the request. +message SimpleResponse { + // Payload to increase message size. + Payload payload = 1; + + // The user the request came from, for verifying authentication was + // successful when the client expected it. + string username = 2; + + // OAuth scope. + string oauth_scope = 3; +} + +// Client-streaming request. +message StreamingInputCallRequest { + // Optional input payload sent along with the request. + Payload payload = 1; + + // Not expecting any payload from the response. +} + +// Client-streaming response. +message StreamingInputCallResponse { + // Aggregated size of payloads received from the client. + int32 aggregated_payload_size = 1; +} + +// Configuration for a particular response. +message ResponseParameters { + // Desired payload sizes in responses from the server. + // If response_type is COMPRESSABLE, this denotes the size before compression. + int32 size = 1; + + // Desired interval between consecutive responses in the response stream in + // microseconds. + int32 interval_us = 2; +} + +// Server-streaming request. +message StreamingOutputCallRequest { + // Desired payload type in the response from the server. + // If response_type is RANDOM, the payload from each response in the stream + // might be of different types. This is to simulate a mixed type of payload + // stream. + PayloadType response_type = 1; + + // Configuration for each expected response message. + repeated ResponseParameters response_parameters = 2; + + // Optional input payload sent along with the request. + Payload payload = 3; +} + +// Server-streaming response, as configured by the request and parameters. +message StreamingOutputCallResponse { + // Payload to increase response size. + Payload payload = 1; +} + +// A simple service to test the various types of RPCs and experiment with +// performance with various types of payload. +service TestService { + // One empty request followed by one empty response. + rpc EmptyCall(Empty) returns (Empty); + + // One request followed by one response. + // The server returns the client payload as-is. + rpc UnaryCall(SimpleRequest) returns (SimpleResponse); + + // One request followed by a sequence of responses (streamed download). + // The server returns the payload with client desired type and sizes. + rpc StreamingOutputCall(StreamingOutputCallRequest) + returns (stream StreamingOutputCallResponse); + + // A sequence of requests followed by one response (streamed upload). + // The server returns the aggregated size of client payload as the result. + rpc StreamingInputCall(stream StreamingInputCallRequest) + returns (StreamingInputCallResponse); + + // A sequence of requests with each request served by the server immediately. + // As one request could lead to multiple responses, this interface + // demonstrates the idea of full duplexing. + rpc FullDuplexCall(stream StreamingOutputCallRequest) + returns (stream StreamingOutputCallResponse); + + // A sequence of requests followed by a sequence of responses. + // The server buffers all the client requests and then serves them in order. A + // stream of responses are returned to the client when the server starts with + // first request. + rpc HalfDuplexCall(stream StreamingOutputCallRequest) + returns (stream StreamingOutputCallResponse); +} From f04298ca6f6861ce822c086223435dd3270ea340 Mon Sep 17 00:00:00 2001 From: Oleg Bespalov Date: Thu, 24 Aug 2023 14:37:19 +0200 Subject: [PATCH 2/2] Use re-usable workflow --- .github/workflows/all.yml | 90 +-------------------------------------- 1 file changed, 2 insertions(+), 88 deletions(-) diff --git a/.github/workflows/all.yml b/.github/workflows/all.yml index e329e9f..c27b083 100644 --- a/.github/workflows/all.yml +++ b/.github/workflows/all.yml @@ -9,92 +9,6 @@ on: - v* pull_request: -defaults: - run: - shell: bash - jobs: - deps: - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - name: Install Go - uses: actions/setup-go@v3 - with: - go-version: 1.20.x - - name: Check dependencies - run: | - go version - test -z "$(go mod tidy && git status --porcelain)" - go mod verify - - lint: - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - name: Run k6 golangci-lint CI - uses: grafana/k6/.github/actions/lint@master - - test-go-versions: - strategy: - fail-fast: false - matrix: - go-version: [1.19.x, 1.20.x, tip] - platform: [ubuntu-latest, windows-latest] - runs-on: ${{ matrix.platform }} - steps: - - name: Checkout code - uses: actions/checkout@v3 - - name: Install Go ${{ matrix.go-version }} - if: matrix.go-version != 'tip' - uses: actions/setup-go@v3 - with: - go-version: ${{ matrix.go-version }} - - name: Install Go stable - if: matrix.go-version == 'tip' - uses: actions/setup-go@v3 - with: - go-version: 1.x - - name: Install Go tip - shell: bash - if: matrix.go-version == 'tip' - run: | - go install golang.org/dl/gotip@latest - gotip download - echo "GOROOT=$HOME/sdk/gotip" >> "$GITHUB_ENV" - echo "GOPATH=$HOME/go" >> "$GITHUB_ENV" - echo "$HOME/go/bin" >> "$GITHUB_PATH" - echo "$HOME/sdk/gotip/bin" >> "$GITHUB_PATH" - - name: Run tests - run: | - which go - go version - go test -race -timeout 60s ./... - - test-build: - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v3 - - name: Install Go - uses: actions/setup-go@v3 - with: - go-version: 1.20.x - - name: Check build - run: | - go version - pwd && ls -l - - go install go.k6.io/xk6/cmd/xk6@master - MODULE_NAME=`go list -m` - - GOPRIVATE="go.k6.io/k6" xk6 build \ - --output ./k6ext \ - --with $MODULE_NAME="." - ./k6ext version \ No newline at end of file + checks: + uses: grafana/k6-ci/.github/workflows/all.yml@main \ No newline at end of file