Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: install tools using go.mod for versioning #2562

Merged

Conversation

liam-verta
Copy link
Contributor

@liam-verta liam-verta commented Jun 12, 2023

Description

Fixes #2561

Instead of hacking wildly to side step issues created by go install <tool>@<version>, switch to go install <tool> with placeholder imports to make go mod include the tools in the dependency graph.

Already being used in https://github.com/vertaai/kaniko . Works great.

Submitter Checklist

These are the criteria that every PR should meet, please check them off as you
review them:

  • Includes unit tests - N/A dependencies should be unchanged.
  • Adds integration tests if needed. - N/A dependencies should be unchanged.

See the contribution guide for more details.

Reviewer Notes

  • The code flow looks good.
  • Unit tests and or integration tests added.

Release Notes

Describe any changes here so maintainer can include it in the release notes, or delete this block.

Examples of user facing changes:
- kaniko adds a new flag `--registry-repo` to override registry

@google-cla
Copy link

google-cla bot commented Jun 12, 2023

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

Comment on lines 25 to 31
# Add .docker config dir
RUN mkdir -p /kaniko/.docker

# Checksums can be obtained from https://github.com/GoogleCloudPlatform/docker-credential-gcr/releases/download/v2.1.8/checksums.txt
ARG GCR_HELPER_SHA_linux_amd64="0da9a0878d34dc8b38ae76519b7137f3179f573cf9c84fec1b81e973b565e2f9"
ARG GCR_HELPER_SHA_linux_386="2421d3242beb239eb640daf9dbfa4582416049a92ed93a207a0a3102fde4ea11"
ARG GCR_HELPER_SHA_linux_s390x="5d18e62c5952d43993b7ee292f87d812ccd161d4e9d932fbc1567eb5d5013632"
ARG GCR_HELPER_SHA_linux_arm64="9d0e67c18fb3e1e048120d06edb9e54e1c11f88139ec77dbc9830e8a8b31745c"
COPY . .
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Move this step before the go install calls so that go.mod, go.sum and vendor are present when go install is called.

# Get GCR credential helper
# Until https://github.com/GoogleCloudPlatform/docker-credential-gcr/issues/128 is addressed, we need to use
# the existing compiled versions distributed in GitHub releases
ARG GCR_HELPER_VERSION="2.1.8"
Copy link
Contributor Author

@liam-verta liam-verta Jun 12, 2023

Choose a reason for hiding this comment

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

All this hackery is no longer needed. go install github.com/GoogleCloudPlatform/docker-credential-gcr will install the local vendor version of the tool. That version is controlled via go.mod and go.sum.

"europe-west8-docker.pkg.dev",
"europe-west9-docker.pkg.dev",
"europe-west12-docker.pkg.dev",
"me-central1-docker.pkg.dev",
Copy link
Contributor Author

Choose a reason for hiding this comment

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

This line is the same as the change in GoogleCloudPlatform/docker-credential-gcr@62afb27

Showing that the vendoring is getting the right tool version.

Comment on lines +160 to +182
github.com/aws/aws-sdk-go-v2/service/ecr v1.18.10 // indirect
github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.16.1 // indirect
github.com/cloudflare/circl v1.3.3 // indirect
github.com/fsnotify/fsnotify v1.6.0 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/google/s2a-go v0.1.4 // indirect
github.com/google/subcommands v1.2.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/magiconair/properties v1.8.5 // indirect
github.com/mitchellh/mapstructure v1.4.1 // indirect
github.com/moby/swarmkit/v2 v2.0.0-20230315203717-e28e8ba9bc83 // indirect
github.com/pelletier/go-toml v1.9.5 // indirect
github.com/pjbgf/sha1cd v0.3.0 // indirect
github.com/skeema/knownhosts v1.1.1 // indirect
github.com/spf13/cast v1.3.1 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/viper v1.8.1 // indirect
github.com/subosito/gotenv v1.2.0 // indirect
github.com/toqueteos/webbrowser v1.2.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect
gopkg.in/ini.v1 v1.62.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
Copy link
Contributor Author

Choose a reason for hiding this comment

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

These are transitive dependencies that were being pulled dynamically, bypassing the local go.mod, go.sum, and vendor.

github.com/aws/aws-sdk-go-v2 v1.18.0
github.com/aws/aws-sdk-go-v2/config v1.18.25
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.67
github.com/aws/aws-sdk-go-v2/service/s3 v1.33.1
github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20220228164355-396b2034c795
github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20230522190001-adf1bafd791a
Copy link
Contributor Author

@liam-verta liam-verta Jun 12, 2023

Choose a reason for hiding this comment

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

You can verify the versions of the tools by comparing the commits strings on the ends here with the commit sha's that were in the docker file.

go.mod Show resolved Hide resolved
@aaron-prindle
Copy link
Collaborator

aaron-prindle commented Jun 13, 2023

Thank you very much for the PR @liam-verta! +1 to the idea here, in attempting to build kaniko images (via make images )from this PR though I am seeing that the version of docker-credential-gcr is v1.5.1 which is a downgrade from the v2.1.8 it currently is at HEAD. Any ideas as to why this version might be being downgraded?

Logs showing docker-credential-gcr is downgraded to v1.5.1 at this PR:

aprindle@aprindle-ssd ~/kaniko  [main]gh pr checkout 2562
Switched to branch 'ln/verta/tools-versioning'
aprindle@aprindle-ssd ~/kaniko  [ln/verta/tools-versioning]make images
docker build  --build-arg=TARGETARCH=amd64 --build-arg=TARGETOS=linux -t gcr.io/kaniko-project/executor:latest -f deploy/Dockerfile --target kaniko-executor .
[+] Building 16.3s (27/27) FINISHED                                                                                   
 => [internal] load build definition from Dockerfile                                                             0.0s
 => => transferring dockerfile: 3.72kB                                                                           0.0s
 => [internal] load .dockerignore                                                                                0.0s
 => => transferring context: 34B                                                                                 0.0s
 => [internal] load metadata for docker.io/library/busybox:musl                                                  0.3s
 => [internal] load metadata for docker.io/library/golang:1.20                                                   0.0s
 => [internal] load metadata for docker.io/library/debian:bullseye-slim                                          0.2s
 => [certs 1/2] FROM docker.io/library/debian:bullseye-slim@sha256:924df86f8aad741a0134b2de7d8e70c5c6863f839caa  0.0s
 => [builder 1/8] FROM docker.io/library/golang:1.20                                                             0.0s
 => [busybox 1/1] FROM docker.io/library/busybox:musl@sha256:2ab985cfbe36bed1ca11c4520ccd8ea5701b792234029c34e0  0.0s
 => [internal] load build context                                                                                0.2s
 => => transferring context: 3.64MB                                                                              0.2s
 => CACHED [builder 2/8] WORKDIR /src                                                                            0.0s
 => CACHED [builder 3/8] RUN mkdir -p /kaniko/.docker                                                            0.0s
 => [builder 4/8] COPY . .                                                                                       1.0s
 => [builder 5/8] RUN go install github.com/GoogleCloudPlatform/docker-credential-gcr                            6.5s
 => [builder 6/8] RUN go install github.com/awslabs/amazon-ecr-credential-helper/ecr-login/cli/docker-credentia  2.8s
 => [builder 7/8] RUN go install github.com/chrismellard/docker-credential-acr-env                               2.1s
 => [builder 8/8] RUN   --mount=type=cache,target=/root/.cache/go-build   --mount=type=cache,target=/go/pkg   m  3.1s
 => CACHED [kaniko-base-slim 1/3] RUN --mount=from=busybox,dst=/usr/ ["busybox", "sh", "-c", "mkdir -p /kaniko   0.0s 
 => CACHED [certs 2/2] RUN apt update && apt install -y ca-certificates                                          0.0s
 => CACHED [kaniko-base-slim 2/3] COPY --from=certs /etc/ssl/certs/ca-certificates.crt /kaniko/ssl/certs/        0.0s
 => CACHED [kaniko-base-slim 3/3] COPY files/nsswitch.conf /etc/nsswitch.conf                                    0.0s
 => CACHED [kaniko-base 1/5] COPY --from=builder --chown=0:0 /usr/local/bin/docker-credential-gcr /kaniko/docke  0.0s
 => CACHED [kaniko-base 2/5] COPY --from=builder --chown=0:0 /usr/local/bin/docker-credential-ecr-login /kaniko  0.0s
 => CACHED [kaniko-base 3/5] COPY --from=builder --chown=0:0 /usr/local/bin/docker-credential-acr-env /kaniko/d  0.0s
 => CACHED [kaniko-base 4/5] COPY --from=builder /kaniko/.docker /kaniko/.docker                                 0.0s
 => CACHED [kaniko-base 5/5] WORKDIR /workspace                                                                  0.0s
 => CACHED [kaniko-executor 1/1] COPY --from=builder /src/out/executor /kaniko/executor                          0.0s
 => exporting to image                                                                                           0.0s
 => => exporting layers                                                                                          0.0s
 => => writing image sha256:c8ca7aaf84e4e744131fb15a331e0d901059d0a5966782ce9717f1e4957df3e6                     0.0s
 => => naming to gcr.io/kaniko-project/executor:latest                                                           0.0s
docker build  --build-arg=TARGETARCH=amd64 --build-arg=TARGETOS=linux -t gcr.io/kaniko-project/executor:debug -f deploy/Dockerfile --target kaniko-debug .
[+] Building 0.6s (31/31) FINISHED                                                                                    
 => [internal] load build definition from Dockerfile                                                             0.0s
 => => transferring dockerfile: 40B                                                                              0.0s
 => [internal] load .dockerignore                                                                                0.0s
 => => transferring context: 34B                                                                                 0.0s
 => [internal] load metadata for docker.io/library/busybox:musl                                                  0.3s
 => [internal] load metadata for docker.io/library/golang:1.20                                                   0.0s
 => [internal] load metadata for docker.io/library/debian:bullseye-slim                                          0.3s
 => [builder 1/8] FROM docker.io/library/golang:1.20                                                             0.0s
 => [internal] load build context                                                                                0.2s
 => => transferring context: 519.81kB                                                                            0.2s
 => [certs 1/2] FROM docker.io/library/debian:bullseye-slim@sha256:924df86f8aad741a0134b2de7d8e70c5c6863f839caa  0.0s
 => [busybox 1/1] FROM docker.io/library/busybox:musl@sha256:2ab985cfbe36bed1ca11c4520ccd8ea5701b792234029c34e0  0.0s
 => CACHED [builder 2/8] WORKDIR /src                                                                            0.0s
 => CACHED [builder 3/8] RUN mkdir -p /kaniko/.docker                                                            0.0s
 => CACHED [builder 4/8] COPY . .                                                                                0.0s
 => CACHED [builder 5/8] RUN go install github.com/GoogleCloudPlatform/docker-credential-gcr                     0.0s
 => CACHED [builder 6/8] RUN go install github.com/awslabs/amazon-ecr-credential-helper/ecr-login/cli/docker-cr  0.0s
 => CACHED [builder 7/8] RUN go install github.com/chrismellard/docker-credential-acr-env                        0.0s
 => CACHED [builder 8/8] RUN   --mount=type=cache,target=/root/.cache/go-build   --mount=type=cache,target=/go/  0.0s
 => CACHED [kaniko-base-slim 1/3] RUN --mount=from=busybox,dst=/usr/ ["busybox", "sh", "-c", "mkdir -p /kaniko   0.0s
 => CACHED [certs 2/2] RUN apt update && apt install -y ca-certificates                                          0.0s
 => CACHED [kaniko-base-slim 2/3] COPY --from=certs /etc/ssl/certs/ca-certificates.crt /kaniko/ssl/certs/        0.0s
 => CACHED [kaniko-base-slim 3/3] COPY files/nsswitch.conf /etc/nsswitch.conf                                    0.0s
 => CACHED [kaniko-base 1/5] COPY --from=builder --chown=0:0 /usr/local/bin/docker-credential-gcr /kaniko/docke  0.0s
 => CACHED [kaniko-base 2/5] COPY --from=builder --chown=0:0 /usr/local/bin/docker-credential-ecr-login /kaniko  0.0s
 => CACHED [kaniko-base 3/5] COPY --from=builder --chown=0:0 /usr/local/bin/docker-credential-acr-env /kaniko/d  0.0s
 => CACHED [kaniko-base 4/5] COPY --from=builder /kaniko/.docker /kaniko/.docker                                 0.0s
 => CACHED [kaniko-base 5/5] WORKDIR /workspace                                                                  0.0s
 => CACHED [kaniko-executor 1/1] COPY --from=builder /src/out/executor /kaniko/executor                          0.0s
 => CACHED [kaniko-debug 1/4] COPY --from=builder /src/out/warmer /kaniko/warmer                                 0.0s
 => CACHED [kaniko-debug 2/4] COPY --from=busybox /bin /busybox                                                  0.0s
 => CACHED [kaniko-debug 3/4] RUN ["/busybox/mkdir", "-p", "/bin"]                                               0.0s
 => CACHED [kaniko-debug 4/4] RUN ["/busybox/ln", "-s", "/busybox/sh", "/bin/sh"]                                0.0s
 => exporting to image                                                                                           0.0s
 => => exporting layers                                                                                          0.0s
 => => writing image sha256:125bc7bf427e2a4d7cc55100bba21169edad6e0265c74dfc0aac24672af58db8                     0.0s
 => => naming to gcr.io/kaniko-project/executor:debug                                                            0.0s
docker build  --build-arg=TARGETARCH=amd64 --build-arg=TARGETOS=linux -t gcr.io/kaniko-project/executor:slim -f deploy/Dockerfile --target kaniko-slim .
[+] Building 0.9s (22/22) FINISHED                                                                                    
 => [internal] load build definition from Dockerfile                                                             0.0s
 => => transferring dockerfile: 40B                                                                              0.0s
 => [internal] load .dockerignore                                                                                0.0s
 => => transferring context: 34B                                                                                 0.0s
 => [internal] load metadata for docker.io/library/busybox:musl                                                  0.3s
 => [internal] load metadata for docker.io/library/golang:1.20                                                   0.0s
 => [internal] load metadata for docker.io/library/debian:bullseye-slim                                          0.6s
 => [builder 1/8] FROM docker.io/library/golang:1.20                                                             0.0s
 => [internal] load build context                                                                                0.2s
 => => transferring context: 519.81kB                                                                            0.2s
 => [busybox 1/1] FROM docker.io/library/busybox:musl@sha256:2ab985cfbe36bed1ca11c4520ccd8ea5701b792234029c34e0  0.0s
 => [certs 1/2] FROM docker.io/library/debian:bullseye-slim@sha256:924df86f8aad741a0134b2de7d8e70c5c6863f839caa  0.0s
 => CACHED [kaniko-base-slim 1/3] RUN --mount=from=busybox,dst=/usr/ ["busybox", "sh", "-c", "mkdir -p /kaniko   0.0s
 => CACHED [certs 2/2] RUN apt update && apt install -y ca-certificates                                          0.0s
 => CACHED [kaniko-base-slim 2/3] COPY --from=certs /etc/ssl/certs/ca-certificates.crt /kaniko/ssl/certs/        0.0s
 => CACHED [kaniko-base-slim 3/3] COPY files/nsswitch.conf /etc/nsswitch.conf                                    0.0s
 => CACHED [builder 2/8] WORKDIR /src                                                                            0.0s
 => CACHED [builder 3/8] RUN mkdir -p /kaniko/.docker                                                            0.0s
 => CACHED [builder 4/8] COPY . .                                                                                0.0s
 => CACHED [builder 5/8] RUN go install github.com/GoogleCloudPlatform/docker-credential-gcr                     0.0s
 => CACHED [builder 6/8] RUN go install github.com/awslabs/amazon-ecr-credential-helper/ecr-login/cli/docker-cr  0.0s
 => CACHED [builder 7/8] RUN go install github.com/chrismellard/docker-credential-acr-env                        0.0s
 => CACHED [builder 8/8] RUN   --mount=type=cache,target=/root/.cache/go-build   --mount=type=cache,target=/go/  0.0s
 => CACHED [kaniko-slim 1/1] COPY --from=builder /src/out/executor /kaniko/executor                              0.0s
 => exporting to image                                                                                           0.0s
 => => exporting layers                                                                                          0.0s
 => => writing image sha256:04a6aad6a74bc2fd2f5f9b37324a6d5384686d94c58a4c916c797eb727281eda                     0.0s
 => => naming to gcr.io/kaniko-project/executor:slim                                                             0.0s
docker build  --build-arg=TARGETARCH=amd64 --build-arg=TARGETOS=linux -t gcr.io/kaniko-project/warmer:latest -f deploy/Dockerfile --target kaniko-warmer .
[+] Building 0.6s (27/27) FINISHED                                                                                    
 => [internal] load build definition from Dockerfile                                                             0.0s
 => => transferring dockerfile: 40B                                                                              0.0s
 => [internal] load .dockerignore                                                                                0.0s
 => => transferring context: 34B                                                                                 0.0s
 => [internal] load metadata for docker.io/library/busybox:musl                                                  0.2s
 => [internal] load metadata for docker.io/library/debian:bullseye-slim                                          0.3s
 => [internal] load metadata for docker.io/library/golang:1.20                                                   0.0s
 => [builder 1/8] FROM docker.io/library/golang:1.20                                                             0.0s
 => [certs 1/2] FROM docker.io/library/debian:bullseye-slim@sha256:924df86f8aad741a0134b2de7d8e70c5c6863f839caa  0.0s
 => [internal] load build context                                                                                0.2s
 => => transferring context: 519.81kB                                                                            0.2s
 => [busybox 1/1] FROM docker.io/library/busybox:musl@sha256:2ab985cfbe36bed1ca11c4520ccd8ea5701b792234029c34e0  0.0s
 => CACHED [kaniko-base-slim 1/3] RUN --mount=from=busybox,dst=/usr/ ["busybox", "sh", "-c", "mkdir -p /kaniko   0.0s
 => CACHED [certs 2/2] RUN apt update && apt install -y ca-certificates                                          0.0s
 => CACHED [kaniko-base-slim 2/3] COPY --from=certs /etc/ssl/certs/ca-certificates.crt /kaniko/ssl/certs/        0.0s
 => CACHED [kaniko-base-slim 3/3] COPY files/nsswitch.conf /etc/nsswitch.conf                                    0.0s
 => CACHED [builder 2/8] WORKDIR /src                                                                            0.0s
 => CACHED [builder 3/8] RUN mkdir -p /kaniko/.docker                                                            0.0s
 => CACHED [builder 4/8] COPY . .                                                                                0.0s
 => CACHED [builder 5/8] RUN go install github.com/GoogleCloudPlatform/docker-credential-gcr                     0.0s
 => CACHED [builder 6/8] RUN go install github.com/awslabs/amazon-ecr-credential-helper/ecr-login/cli/docker-cr  0.0s
 => CACHED [builder 7/8] RUN go install github.com/chrismellard/docker-credential-acr-env                        0.0s
 => CACHED [builder 8/8] RUN   --mount=type=cache,target=/root/.cache/go-build   --mount=type=cache,target=/go/  0.0s
 => CACHED [kaniko-base 1/5] COPY --from=builder --chown=0:0 /usr/local/bin/docker-credential-gcr /kaniko/docke  0.0s
 => CACHED [kaniko-base 2/5] COPY --from=builder --chown=0:0 /usr/local/bin/docker-credential-ecr-login /kaniko  0.0s
 => CACHED [kaniko-base 3/5] COPY --from=builder --chown=0:0 /usr/local/bin/docker-credential-acr-env /kaniko/d  0.0s
 => CACHED [kaniko-base 4/5] COPY --from=builder /kaniko/.docker /kaniko/.docker                                 0.0s
 => CACHED [kaniko-base 5/5] WORKDIR /workspace                                                                  0.0s
 => CACHED [kaniko-warmer 1/1] COPY --from=builder /src/out/warmer /kaniko/warmer                                0.0s
 => exporting to image                                                                                           0.0s
 => => exporting layers                                                                                          0.0s
 => => writing image sha256:27b44f226f54940da3876ae96107b0ba8cd08020ed5444d89af9382a54a50d8e                     0.0s
 => => naming to gcr.io/kaniko-project/warmer:latest                                                             0.0s
aprindle@aprindle-ssd ~/kaniko  [ln/verta/tools-versioning]docker run -it --entrypoint=/bin/sh gcr.io/kaniko-project/executor:debug
/workspace # 
/workspace # cd /kaniko
/kaniko # ./docker-credential-gcr version
Google Container Registry Docker credential helper v1.5.1-0.20230328182921-62afb2723512

Same command from the debug image @ HEAD:

/kaniko # ./docker-credential-gcr version
Google Container Registry Docker credential helper 2.1.8
/kaniko # 

@liam-verta
Copy link
Contributor Author

liam-verta commented Jun 13, 2023

@aaron-prindle
We can't use v2.1.8 because then the Go module system bails because the major version is not in the package as noted in GoogleCloudPlatform/docker-credential-gcr#128 .

However, the commit being used for v1.5.1-0.20230328182921-62afb2723512 is 62afb2723512 which matches the tag v2.1.8.

I've diffed the vendor folder from this PR with the docker-credential-gcr source at v2.1.8 and they match (only diffs are tests and other non-product files):

It looks like the v.1.5.1 in the version string is an artifact of calling go get github.com/GoogleCloudPlatform/docker-credential-gcr@62afb2723512fd6572c6300024e0c94f734b0ae3, caused by the same major version requirement as above: since github.com/GoogleCloudPlatform/docker-credential-gcr doesn't have /v2/ in it, the Go module system forces it the next reasonable v1 increment. There's already a v1.5.0, so commits after that tag the aren't must be at least v1.5.1-<something>.

@aaron-prindle
Copy link
Collaborator

Ah I see, thank you for explaining what was occuring @liam-verta. I think this should good to merge then as an improvement over our current setup once we get CI/CD green. Currently this PR has a gofmt lint error that our unit tests are flagging:

link to full logs:
https://github.com/GoogleContainerTools/kaniko/actions/runs/5260264095/jobs/9508257115?pr=2562#step:4:1375

relevant log snippet:

Gofmt errors in files:
./tools/tools.go
diff ./tools/tools.go.orig ./tools/tools.go
--- ./tools/tools.go.orig
+++ ./tools/tools.go
@@ -1,3 +1,4 @@
+//go:build tools
 // +build tools
 
 /*

@liam-verta
Copy link
Contributor Author

@aaron-prindle
Great! This should be good now.

Copy link
Collaborator

@aaron-prindle aaron-prindle left a comment

Choose a reason for hiding this comment

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

LGTM, thanks for the PR here @liam-verta!

@aaron-prindle aaron-prindle merged commit 5cbc063 into GoogleContainerTools:main Jun 14, 2023
@liam-verta liam-verta deleted the ln/verta/tools-versioning branch June 14, 2023 17:27
kylecarbs pushed a commit to coder/kaniko that referenced this pull request Jul 12, 2023
…2562)

* fix: install tools using go.mod for versioning

* Add helpful instructions for tool updates.

* Add comment

* Add boilerplate

* Update go.mod

* Gofmt feedback
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.

Installing tools using commit specification bypassing go.mod and vendoring
2 participants