Skip to content

Commit daf76a8

Browse files
Tit PetricTit Petric
Tit Petric
and
Tit Petric
authored
[TT-13723] Update to Go 1.23 (#6812)
### **User description** <details open> <summary><a href="https://tyktech.atlassian.net/browse/TT-13723" title="TT-13723" target="_blank">TT-13723</a></summary> <br /> <table> <tr> <th>Summary</th> <td>Update to Go 1.23</td> </tr> <tr> <th>Type</th> <td> <img alt="Story" src="https://tyktech.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium" /> Story </td> </tr> <tr> <th>Status</th> <td>In Dev</td> </tr> <tr> <th>Points</th> <td>N/A</td> </tr> <tr> <th>Labels</th> <td>-</td> </tr> </table> </details> <!-- do not remove this marker as it will break jira-lint's functionality. added_by_jira_lint --> --- https://tyktech.atlassian.net/browse/TT-13723 It seems some tests detect goroutine leaks now. The detected goroutines leaked have been listed in the ignores of a debug2.Record; both goroutine leak tests detect goroutines in background reliably. Both are flaky otherwise, this passes a -count=100 run, with and without -race. ___ ### **PR Type** Enhancement, Tests, Configuration changes ___ ### **Description** - Introduced `debug2.Record` to enhance goroutine state tracking and comparison. - Improved goroutine leak detection tests using `debug2.Record`. - Added unit and benchmark tests for `debug2.Record`. - Updated CI workflows to use Go 1.23.x. - Simplified Dockerfile by switching to Go 1.23-bullseye base image and optimizing build steps. - Updated plugin compiler and release workflows to support Go 1.23. - Enhanced Taskfile to dynamically use the Go version from `go.mod`. - Bumped Go version in `go.mod` to 1.23.4. ___ ### **Changes walkthrough** 📝 <table><thead><tr><th></th><th align="left">Relevant files</th></tr></thead><tbody><tr><td><strong>Tests</strong></td><td><details><summary>2 files</summary><table> <tr> <td> <details> <summary><strong>gateway_test.go</strong><dd><code>Improved goroutine leak detection in tests.</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></summary> <hr> gateway/gateway_test.go <li>Enhanced goroutine leak tests with <code>debug2.Record</code> for better <br>reliability.<br> <li> Introduced <code>newRecord</code> helper function to manage ignored goroutines.<br> <li> Updated assertions to use <code>debug2.Record</code> for goroutine count <br>validation.<br> </details> </td> <td><a href="https://github.com/TykTechnologies/tyk/pull/6812/files#diff-d34c7069ce5e81d45082b19eb3e869ee1a086e185dcd6630e75e3ed0d368b546">+37/-15</a>&nbsp; </td> </tr> <tr> <td> <details> <summary><strong>goroutine_test.go</strong><dd><code>Added unit and benchmark tests for `debug2.Record`.</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></summary> <hr> internal/debug2/goroutine_test.go <li>Added unit tests for <code>debug2.Record</code> to validate goroutine tracking.<br> <li> Included benchmark tests for performance evaluation.<br> <li> Verified goroutine cleanup using <code>Since</code> method.<br> </details> </td> <td><a href="https://github.com/TykTechnologies/tyk/pull/6812/files#diff-763a0643c49a4bbfa70fbf12088045a74be7fc5f4789d09f14a9298d0b65c226">+103/-0</a>&nbsp; </td> </tr> </table></details></td></tr><tr><td><strong>Enhancement</strong></td><td><details><summary>4 files</summary><table> <tr> <td> <details> <summary><strong>goroutine.go</strong><dd><code>Introduced `debug2.Record` for goroutine state tracking.</code>&nbsp; </dd></summary> <hr> internal/debug2/goroutine.go <li>Added <code>debug2.Record</code> to capture and compare goroutine states.<br> <li> Implemented methods for parsing, counting, and filtering goroutines.<br> <li> Introduced functionality to ignore specific goroutines during <br>comparison.<br> </details> </td> <td><a href="https://github.com/TykTechnologies/tyk/pull/6812/files#diff-c6edbd39849f1acdcae221ef5e8b6a5886d644ec719064cf051be79f8c9377f8">+124/-0</a>&nbsp; </td> </tr> <tr> <td> <details> <summary><strong>Dockerfile</strong><dd><code>Simplified Dockerfile with Go 1.23 base image.</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></summary> <hr> Dockerfile <li>Simplified Dockerfile by using Go 1.23-bullseye base image.<br> <li> Removed redundant Python installation steps.<br> <li> Optimized build process with caching for Go modules.<br> </details> </td> <td><a href="https://github.com/TykTechnologies/tyk/pull/6812/files#diff-dd2c0eb6ea5cfc6c4bd4eac30934e2d5746747af48fef6da689e85b752f39557">+11/-51</a>&nbsp; </td> </tr> <tr> <td> <details> <summary><strong>Taskfile.yml</strong><dd><code>Enhanced Taskfile to support dynamic Go version.</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></summary> <hr> Taskfile.yml - Added dynamic Go version argument for Docker builds. </details> </td> <td><a href="https://github.com/TykTechnologies/tyk/pull/6812/files#diff-cd2d359855d0301ce190f1ec3b4c572ea690c83747f6df61c9340720e3d2425e">+1/-1</a>&nbsp; &nbsp; &nbsp; </td> </tr> <tr> <td> <details> <summary><strong>go.mod</strong><dd><code>Bumped Go version in module to 1.23.4.</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></summary> <hr> go.mod - Updated Go version requirement to 1.23.4. </details> </td> <td><a href="https://github.com/TykTechnologies/tyk/pull/6812/files#diff-33ef32bf6c23acb95f5902d7097b7a1d5128ca061167ec0716715b0b9eeaa5f6">+1/-1</a>&nbsp; &nbsp; &nbsp; </td> </tr> </table></details></td></tr><tr><td><strong>Configuration changes</strong></td><td><details><summary>4 files</summary><table> <tr> <td> <details> <summary><strong>ci-tests.yml</strong><dd><code>Updated CI workflow to use Go 1.23.x.</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></summary> <hr> .github/workflows/ci-tests.yml - Updated Go version in CI matrix to 1.23.x. </details> </td> <td><a href="https://github.com/TykTechnologies/tyk/pull/6812/files#diff-03609cb60b0c6e92fb771eb8787d6722b8c31ca4c03eabc788e147acd8c6fb43">+1/-1</a>&nbsp; &nbsp; &nbsp; </td> </tr> <tr> <td> <details> <summary><strong>plugin-compiler-build.yml</strong><dd><code>Updated plugin compiler workflow for Go 1.23.</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></summary> <hr> .github/workflows/plugin-compiler-build.yml <li>Updated base image to use Go 1.23-bullseye.<br> <li> Fixed <code>BASE_IMAGE</code> argument in Docker build steps.<br> </details> </td> <td><a href="https://github.com/TykTechnologies/tyk/pull/6812/files#diff-f3a95a900eb0ac23af6314e9cdea29fa16af0a9bcb61793a83a32ff13d4c4e79">+3/-3</a>&nbsp; &nbsp; &nbsp; </td> </tr> <tr> <td> <details> <summary><strong>release.yml</strong><dd><code>Updated release workflow to support Go 1.23.</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></summary> <hr> .github/workflows/release.yml <li>Updated Go version in release workflow to 1.23-bullseye.<br> <li> Adjusted Docker build conditions for the new Go version.<br> </details> </td> <td><a href="https://github.com/TykTechnologies/tyk/pull/6812/files#diff-87db21a973eed4fef5f32b267aa60fcee5cbdf03c67fafdc2a9b553bb0b15f34">+11/-11</a>&nbsp; </td> </tr> <tr> <td> <details> <summary><strong>Dockerfile</strong><dd><code>Updated plugin compiler Dockerfile for Go 1.23.</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></summary> <hr> ci/images/plugin-compiler/Dockerfile - Updated base image to Go 1.23-bullseye. </details> </td> <td><a href="https://github.com/TykTechnologies/tyk/pull/6812/files#diff-0ded1ed63ca128bd2d22721b0bc19dc85e440e4922164f465ac647917321971e">+1/-1</a>&nbsp; &nbsp; &nbsp; </td> </tr> </table></details></td></tr></tr></tbody></table> ___ > 💡 **PR-Agent usage**: Comment `/help "your question"` on any pull request to receive relevant information --------- Co-authored-by: Tit Petric <[email protected]>
1 parent 4304645 commit daf76a8

File tree

14 files changed

+360
-127
lines changed

14 files changed

+360
-127
lines changed

.github/workflows/ci-tests.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ jobs:
9494
fail-fast: false
9595
matrix:
9696
redis-version: [7]
97-
go-version: [1.22.x]
97+
go-version: [1.23.x]
9898

9999
env:
100100
REDIS_IMAGE: redis:${{ matrix.redis-version }}

.github/workflows/plugin-compiler-build.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ on:
1111
- "v*"
1212

1313
env:
14-
GOLANG_CROSS: 1.22-bullseye
14+
GOLANG_CROSS: 1.23-bullseye
1515

1616
concurrency:
1717
group: ${{ github.workflow }}-${{ github.ref }}
@@ -77,7 +77,7 @@ jobs:
7777
labels: ${{ steps.set-metadata.outputs.labels }}
7878
tags: ${{ steps.set-metadata.outputs.tags }}
7979
build-args: |
80-
BASE-IMAGE=tykio/golang-cross:${{ env.GOLANG_CROSS }}
80+
BASE_IMAGE=tykio/golang-cross:${{ env.GOLANG_CROSS }}
8181
GITHUB_SHA=${{ github.sha }}
8282
GITHUB_TAG=${{ github.ref_name }}
8383
@@ -108,7 +108,7 @@ jobs:
108108
labels: ${{ steps.set-metadata-ee.outputs.labels }}
109109
tags: ${{ steps.set-metadata-ee.outputs.tags }}
110110
build-args: |
111-
BASE-IMAGE=tykio/golang-cross:${{ env.GOLANG_CROSS }}
111+
BASE_IMAGE=tykio/golang-cross:${{ env.GOLANG_CROSS }}
112112
GITHUB_SHA=${{ github.sha }}
113113
GITHUB_TAG=${{ github.ref_name }}
114114
BUILD_TAG=ee

.github/workflows/release.yml

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ jobs:
4141
fail-fast: false
4242
matrix:
4343
golang_cross:
44-
- 1.22-bullseye
44+
- 1.23-bullseye
4545
include:
46-
- golang_cross: 1.22-bullseye
46+
- golang_cross: 1.23-bullseye
4747
goreleaser: 'ci/goreleaser/goreleaser.yml'
4848
cgo: 1
4949
rpmvers: 'el/7 el/8 el/9 amazon/2 amazon/2023'
@@ -127,12 +127,12 @@ jobs:
127127
mask-aws-account-id: false
128128
- uses: aws-actions/amazon-ecr-login@v2
129129
id: ecr
130-
if: ${{ matrix.golang_cross == '1.22-bullseye' }}
130+
if: ${{ matrix.golang_cross == '1.23-bullseye' }}
131131
with:
132132
mask-password: 'true'
133133
- name: Docker metadata for CI
134134
id: ci_metadata_
135-
if: ${{ matrix.golang_cross == '1.22-bullseye' }}
135+
if: ${{ matrix.golang_cross == '1.23-bullseye' }}
136136
uses: docker/metadata-action@v5
137137
with:
138138
images: ${{ steps.ecr.outputs.registry }}/tyk
@@ -146,7 +146,7 @@ jobs:
146146
type=semver,pattern={{major}}.{{minor}},prefix=v
147147
type=semver,pattern={{version}},prefix=v
148148
- name: push image to CI
149-
if: ${{ matrix.golang_cross == '1.22-bullseye' }}
149+
if: ${{ matrix.golang_cross == '1.23-bullseye' }}
150150
uses: docker/build-push-action@v6
151151
with:
152152
context: "dist"
@@ -163,7 +163,7 @@ jobs:
163163
EDITION=
164164
- name: Docker metadata for CI ee
165165
id: ci_metadata_ee
166-
if: ${{ matrix.golang_cross == '1.22-bullseye' }}
166+
if: ${{ matrix.golang_cross == '1.23-bullseye' }}
167167
uses: docker/metadata-action@v5
168168
with:
169169
images: ${{ steps.ecr.outputs.registry }}/tyk-ee
@@ -177,7 +177,7 @@ jobs:
177177
type=semver,pattern={{major}}.{{minor}},prefix=v
178178
type=semver,pattern={{version}},prefix=v
179179
- name: push image to CI ee
180-
if: ${{ matrix.golang_cross == '1.22-bullseye' }}
180+
if: ${{ matrix.golang_cross == '1.23-bullseye' }}
181181
uses: docker/build-push-action@v6
182182
with:
183183
context: "dist"
@@ -207,7 +207,7 @@ jobs:
207207
type=semver,pattern={{version}}
208208
labels: "org.opencontainers.image.title=tyk-gateway (distroless) \norg.opencontainers.image.description=Tyk Open Source API Gateway written in Go, supporting REST, GraphQL, TCP and gRPC protocols\norg.opencontainers.image.vendor=tyk.io\norg.opencontainers.image.version=${{ github.ref_name }}\n"
209209
- name: push image to prod
210-
if: ${{ matrix.golang_cross == '1.22-bullseye' }}
210+
if: ${{ matrix.golang_cross == '1.23-bullseye' }}
211211
uses: docker/build-push-action@v6
212212
with:
213213
context: "dist"
@@ -236,7 +236,7 @@ jobs:
236236
type=semver,pattern={{version}}
237237
labels: "org.opencontainers.image.title=tyk-gateway Enterprise Edition (distroless) \norg.opencontainers.image.description=Tyk Open Source API Gateway written in Go, supporting REST, GraphQL, TCP and gRPC protocols\norg.opencontainers.image.vendor=tyk.io\norg.opencontainers.image.version=${{ github.ref_name }}\n"
238238
- name: push image to prod ee
239-
if: ${{ matrix.golang_cross == '1.22-bullseye' }}
239+
if: ${{ matrix.golang_cross == '1.23-bullseye' }}
240240
uses: docker/build-push-action@v6
241241
with:
242242
context: "dist"
@@ -253,7 +253,7 @@ jobs:
253253
EDITION=-ee
254254
- name: save deb
255255
uses: actions/upload-artifact@v4
256-
if: ${{ matrix.golang_cross == '1.22-bullseye' }}
256+
if: ${{ matrix.golang_cross == '1.23-bullseye' }}
257257
with:
258258
name: deb
259259
retention-days: 1
@@ -263,7 +263,7 @@ jobs:
263263
!dist/*fips*.deb
264264
- name: save rpm
265265
uses: actions/upload-artifact@v4
266-
if: ${{ matrix.golang_cross == '1.22-bullseye' }}
266+
if: ${{ matrix.golang_cross == '1.23-bullseye' }}
267267
with:
268268
name: rpm
269269
retention-days: 1
File renamed without changes.

.taskfiles/test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
version: "3"
33

44
includes:
5-
deps: ./deps/Taskfile.yml
5+
deps: ./deps.yml
66
services:
77
taskfile: ../docker/services/Taskfile.yml
88
dir: ../docker/services

Dockerfile

Lines changed: 11 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,28 @@
1-
FROM debian:bookworm AS assets
2-
3-
# This Dockerfile facilitates bleeding edge development docker image builds
4-
# directly from source. To build a development image, run `make docker`.
5-
# If you need to tweak the environment for testing, you can override the
6-
# `GO_VERSION` and `PYTHON_VERSION` as docker build arguments.
7-
8-
ARG GO_VERSION=1.22.6
9-
ARG PYTHON_VERSION=3.11.6
10-
11-
WORKDIR /assets
12-
13-
RUN apt update && apt install wget -y && \
14-
wget -q https://dl.google.com/go/go${GO_VERSION}.linux-amd64.tar.gz && \
15-
wget -q https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tar.xz
16-
17-
FROM debian:bookworm
18-
19-
ARG GO_VERSION=1.22.6
20-
ARG PYTHON_VERSION=3.11.6
21-
22-
COPY --from=assets /assets/ /tmp/
23-
WORKDIR /tmp
24-
25-
# Install Go
26-
27-
ENV PATH=$PATH:/usr/local/go/bin
28-
29-
RUN tar -C /usr/local -xzf go${GO_VERSION}.linux-amd64.tar.gz && \
30-
go version
1+
ARG GO_VERSION=1.23
2+
FROM golang:${GO_VERSION}-bullseye
313

324
# Build essentials
335

346
RUN apt update && apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libsqlite3-dev libreadline-dev libffi-dev curl wget libbz2-dev -y
357

36-
# Install $PYTHON_VERSION
37-
388
## This just installs whatever is is bullseye, makes docker build (fast/small)-(er)
399
RUN apt install python3 -y
4010

41-
## This runs python code slower, but the process finishes quicker
42-
# RUN tar -xf Python-${PYTHON_VERSION}.tar.xz && ls -la && \
43-
# cd Python-${PYTHON_VERSION}/ && \
44-
# ./configure --enable-shared && make build_all && \
45-
# make altinstall && \
46-
# ldconfig $PWD
47-
48-
## This runs python code faster, but is expensive to build and runs regression tests
49-
# RUN tar -xf Python-${PYTHON_VERSION}.tar.xz && ls -la && \
50-
# cd Python-${PYTHON_VERSION}/ && \
51-
# ./configure --enable-shared --enable-optimizations && make -j 2 && \
52-
# make altinstall && \
53-
# ldconfig $PWD
54-
55-
# Clean up build assets
56-
RUN find /tmp -type f -delete
57-
5811
# Build gateway
5912
RUN mkdir /opt/tyk-gateway
6013
WORKDIR /opt/tyk-gateway
14+
6115
ADD go.mod go.sum /opt/tyk-gateway/
62-
RUN go mod download
16+
17+
RUN --mount=type=cache,mode=0755,target=/go/pkg/mod \
18+
--mount=type=cache,mode=0755,target=/root/.cache/go-build \
19+
go mod download
20+
6321
ADD . /opt/tyk-gateway
6422

65-
RUN make build
23+
RUN --mount=type=cache,mode=0755,target=/go/pkg/mod \
24+
--mount=type=cache,mode=0755,target=/root/.cache/go-build \
25+
make build
6626

6727
COPY tyk.conf.example tyk.conf
6828

Taskfile.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ version: "3"
33

44
includes:
55
test: .taskfiles/test.yml
6-
deps: .taskfiles/deps/Taskfile.yml
6+
deps: .taskfiles/deps.yml
77
hooks: .taskfiles/hooks.yml
88
opentelemetry:
99
taskfile: ci/tests/tracing/Taskfile.yml
@@ -25,7 +25,7 @@ tasks:
2525
docker:
2626
desc: "build Tyk gateway internal/tyk-gateway"
2727
cmds:
28-
- docker build --platform "linux/amd64" --rm -t internal/tyk-gateway .
28+
- docker build --build-arg GO_VERSION="$(go mod edit -json | jq .Go -r)" --platform "linux/amd64" --rm -t internal/tyk-gateway .
2929
sources:
3030
- go.mod
3131
- go.sum

ci/images/plugin-compiler/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
ARG BASE_IMAGE=tykio/golang-cross:1.22-bullseye
1+
ARG BASE_IMAGE=tykio/golang-cross:1.23-bullseye
22
FROM ${BASE_IMAGE}
33

44
LABEL description="Image for plugin development"

gateway/gateway_test.go

Lines changed: 0 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"net/http/httptest"
1212
"net/url"
1313
"os"
14-
"runtime"
1514
"strconv"
1615
"strings"
1716
"sync/atomic"
@@ -642,61 +641,6 @@ func TestListenPathTykPrefix(t *testing.T) {
642641
})
643642
}
644643

645-
func TestReloadGoroutineLeakWithTest(t *testing.T) {
646-
test.Flaky(t)
647-
648-
before := runtime.NumGoroutine()
649-
650-
ts := StartTest(nil)
651-
ts.Close()
652-
653-
time.Sleep(time.Second)
654-
655-
after := runtime.NumGoroutine()
656-
657-
if before < after {
658-
t.Errorf("Goroutine leak, was: %d, after reload: %d", before, after)
659-
}
660-
}
661-
662-
func TestReloadGoroutineLeakWithCircuitBreaker(t *testing.T) {
663-
ts := StartTest(nil)
664-
t.Cleanup(ts.Close)
665-
666-
globalConf := ts.Gw.GetConfig()
667-
globalConf.EnableJSVM = false
668-
ts.Gw.SetConfig(globalConf)
669-
670-
specs := ts.Gw.BuildAndLoadAPI(func(spec *APISpec) {
671-
spec.Proxy.ListenPath = "/"
672-
UpdateAPIVersion(spec, "v1", func(version *apidef.VersionInfo) {
673-
version.ExtendedPaths = apidef.ExtendedPathsSet{
674-
CircuitBreaker: []apidef.CircuitBreakerMeta{
675-
{
676-
Path: "/",
677-
Method: http.MethodGet,
678-
ThresholdPercent: 0.5,
679-
Samples: 5,
680-
ReturnToServiceAfter: 10,
681-
},
682-
},
683-
}
684-
})
685-
})
686-
687-
before := runtime.NumGoroutine()
688-
689-
ts.Gw.LoadAPI(specs...) // just doing globalGateway.DoReload() doesn't load anything as BuildAndLoadAPI cleans up folder with API specs
690-
691-
time.Sleep(100 * time.Millisecond)
692-
693-
after := runtime.NumGoroutine()
694-
695-
if before < after {
696-
t.Errorf("Goroutine leak, was: %d, after reload: %d", before, after)
697-
}
698-
}
699-
700644
func listenProxyProto(ls net.Listener) error {
701645
pl := &proxyproto.Listener{Listener: ls}
702646
for {

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/TykTechnologies/tyk
22

3-
go 1.22.6
3+
go 1.23.4
44

55
require (
66
github.com/Jeffail/tunny v0.1.4

0 commit comments

Comments
 (0)