Showing preview only (639K chars total). Download the full file or copy to clipboard to get everything.
Repository: ko-build/ko
Branch: main
Commit: 757161aaa19e
Files: 186
Total size: 594.7 KB
Directory structure:
gitextract_aa0jajfb/
├── .github/
│ ├── dependabot.yml
│ └── workflows/
│ ├── analyze.yaml
│ ├── boilerplate.yaml
│ ├── build.yaml
│ ├── donotsubmit.yaml
│ ├── e2e.yaml
│ ├── image.yaml
│ ├── kind-e2e.yaml
│ ├── modules-integration-test.yaml
│ ├── publish-site.yaml
│ ├── registries.yaml
│ ├── release.yml
│ ├── sbom.yaml
│ ├── stale.yaml
│ ├── style.yaml
│ ├── test.yaml
│ └── verify.yaml
├── .gitignore
├── .golangci.yaml
├── .goreleaser.yml
├── .ko.yaml
├── .wokeignore
├── CNAME
├── CONTRIBUTING.md
├── LICENSE
├── MAINTAINERS.md
├── README.md
├── ROADMAP.md
├── cmd/
│ └── help/
│ └── main.go
├── code-of-conduct.md
├── docs/
│ ├── CNAME
│ ├── README.md
│ ├── advanced/
│ │ ├── faq.md
│ │ ├── go-packages.md
│ │ ├── lambda.md
│ │ ├── limitations.md
│ │ ├── linux-capabilities.md
│ │ ├── migrating-from-dockerfile.md
│ │ ├── root-ca-certificates.md
│ │ └── terraform.md
│ ├── community.md
│ ├── configuration.md
│ ├── custom/
│ │ ├── main.html
│ │ └── partials/
│ │ └── copyright.html
│ ├── deployment.md
│ ├── features/
│ │ ├── build-cache.md
│ │ ├── debugging.md
│ │ ├── k8s.md
│ │ ├── multi-platform.md
│ │ ├── sboms.md
│ │ └── static-assets.md
│ ├── get-started.md
│ ├── index.md
│ ├── install.md
│ └── reference/
│ ├── ko.md
│ ├── ko_apply.md
│ ├── ko_build.md
│ ├── ko_create.md
│ ├── ko_delete.md
│ ├── ko_login.md
│ ├── ko_resolve.md
│ ├── ko_run.md
│ └── ko_version.md
├── go.mod
├── go.sum
├── hack/
│ ├── boilerplate/
│ │ ├── boilerplate.go.txt
│ │ └── boilerplate.sh.txt
│ ├── presubmit.sh
│ ├── tools.go
│ ├── update-codegen.sh
│ └── update-deps.sh
├── integration_test.sh
├── internal/
│ └── sbom/
│ ├── sbom.go
│ └── spdx.go
├── main.go
├── mkdocs.yml
├── pkg/
│ ├── build/
│ │ ├── build.go
│ │ ├── cache.go
│ │ ├── config.go
│ │ ├── doc.go
│ │ ├── future.go
│ │ ├── future_test.go
│ │ ├── gobuild.go
│ │ ├── gobuild_test.go
│ │ ├── gobuilds.go
│ │ ├── gobuilds_test.go
│ │ ├── layer.go
│ │ ├── limit.go
│ │ ├── limit_test.go
│ │ ├── options.go
│ │ ├── recorder.go
│ │ ├── recorder_test.go
│ │ ├── shared.go
│ │ ├── shared_test.go
│ │ ├── strict.go
│ │ └── strict_test.go
│ ├── caps/
│ │ ├── caps.go
│ │ ├── caps_dd_test.go
│ │ ├── caps_test.go
│ │ ├── gen.sh
│ │ └── new_file_caps_test.go
│ ├── commands/
│ │ ├── apply.go
│ │ ├── build.go
│ │ ├── cache.go
│ │ ├── commands.go
│ │ ├── config.go
│ │ ├── config_test.go
│ │ ├── create.go
│ │ ├── delete.go
│ │ ├── options/
│ │ │ ├── build.go
│ │ │ ├── build_test.go
│ │ │ ├── filestuff.go
│ │ │ ├── namer_test.go
│ │ │ ├── publish.go
│ │ │ ├── selector.go
│ │ │ ├── testdata/
│ │ │ │ ├── bad-config/
│ │ │ │ │ └── .ko.yaml/
│ │ │ │ │ └── .gitignore
│ │ │ │ ├── config/
│ │ │ │ │ ├── .ko.yaml
│ │ │ │ │ └── my-ko.yaml
│ │ │ │ ├── multiple-platforms/
│ │ │ │ │ └── .ko.yaml
│ │ │ │ └── paths/
│ │ │ │ ├── .ko.yaml
│ │ │ │ └── app/
│ │ │ │ ├── cmd/
│ │ │ │ │ └── foo/
│ │ │ │ │ └── main.go
│ │ │ │ └── go.mod
│ │ │ └── validate.go
│ │ ├── publisher.go
│ │ ├── publisher_test.go
│ │ ├── resolve.go
│ │ ├── resolver.go
│ │ ├── resolver_test.go
│ │ ├── root.go
│ │ ├── run.go
│ │ └── version.go
│ ├── doc.go
│ ├── internal/
│ │ ├── git/
│ │ │ ├── clone.go
│ │ │ ├── errors.go
│ │ │ ├── git.go
│ │ │ ├── info.go
│ │ │ └── info_test.go
│ │ ├── gittesting/
│ │ │ ├── git.go
│ │ │ └── git_test.go
│ │ └── testing/
│ │ ├── daemon.go
│ │ ├── doc.go
│ │ ├── fixed.go
│ │ └── fixed_test.go
│ ├── publish/
│ │ ├── daemon.go
│ │ ├── daemon_test.go
│ │ ├── default.go
│ │ ├── default_test.go
│ │ ├── doc.go
│ │ ├── future.go
│ │ ├── future_test.go
│ │ ├── kind/
│ │ │ ├── doc.go
│ │ │ ├── write.go
│ │ │ └── write_test.go
│ │ ├── kind.go
│ │ ├── layout.go
│ │ ├── layout_test.go
│ │ ├── multi.go
│ │ ├── multi_test.go
│ │ ├── options.go
│ │ ├── publish.go
│ │ ├── recorder.go
│ │ ├── recorder_test.go
│ │ ├── shared.go
│ │ ├── shared_test.go
│ │ ├── tarball.go
│ │ └── tarball_test.go
│ └── resolve/
│ ├── doc.go
│ ├── resolve.go
│ ├── resolve_test.go
│ ├── selector.go
│ └── selector_test.go
└── test/
├── build-configs/
│ ├── .ko.yaml
│ ├── bar/
│ │ ├── cmd/
│ │ │ └── main.go
│ │ └── go.mod
│ ├── caps/
│ │ ├── cmd/
│ │ │ └── main.go
│ │ └── go.mod
│ ├── caps.ko.yaml
│ ├── foo/
│ │ ├── cmd/
│ │ │ └── main.go
│ │ └── go.mod
│ └── toolexec/
│ ├── cmd/
│ │ └── main.go
│ └── go.mod
├── kodata/
│ ├── a
│ ├── kenobi
│ └── subdir/
│ └── file.txt
├── main.go
└── test.yaml
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: "gomod"
directory: "/"
schedule:
interval: "daily"
- package-ecosystem: github-actions
directory: /
schedule:
interval: "daily"
================================================
FILE: .github/workflows/analyze.yaml
================================================
name: Analyze
on:
workflow_dispatch:
push:
branches: ['main']
pull_request:
branches: ['main']
permissions: {}
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
security-events: write
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
# We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head.
fetch-depth: 2
persist-credentials: false
- uses: github/codeql-action/init@df409f7d9260372bd5f19e5b04e83cb3c43714ae # v3.27.9
with:
languages: go
- uses: github/codeql-action/autobuild@df409f7d9260372bd5f19e5b04e83cb3c43714ae # v3.27.9
- uses: github/codeql-action/analyze@df409f7d9260372bd5f19e5b04e83cb3c43714ae # v3.27.9
================================================
FILE: .github/workflows/boilerplate.yaml
================================================
name: Boilerplate
on:
pull_request:
branches: ['main']
permissions: {}
jobs:
check:
name: Boilerplate Check
runs-on: ubuntu-latest
permissions:
contents: read
strategy:
fail-fast: false # Keep running if one leg fails.
matrix:
extension:
- go
- sh
# Map between extension and human-readable name.
include:
- extension: go
language: Go
- extension: sh
language: Bash
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- uses: chainguard-dev/actions/boilerplate@e82b4e5ae10182af72972addcb3fedf7454621c8 # main
with:
extension: ${{ matrix.extension }}
language: ${{ matrix.language }}
================================================
FILE: .github/workflows/build.yaml
================================================
name: Build
on:
pull_request:
branches:
- "main"
permissions: {}
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
with:
go-version: "1.24"
check-latest: true
- uses: golang/govulncheck-action@b625fbe08f3bccbe446d94fbf87fcc875a4f50ee # v1.0.4
with:
go-version-input: "1.25"
- run: |
go build ./...
go test -run=^$ ./...
================================================
FILE: .github/workflows/donotsubmit.yaml
================================================
name: Do Not Submit
on:
pull_request:
branches: ['main']
permissions: {}
jobs:
donotsubmit:
name: Do Not Submit
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- uses: chainguard-dev/actions/donotsubmit@84c993eaf02da1c325854fb272a4df9184bd80fc # main
================================================
FILE: .github/workflows/e2e.yaml
================================================
name: Basic e2e test
on:
pull_request:
branches:
- 'main'
permissions: {}
jobs:
e2e:
strategy:
fail-fast: false
matrix:
platform:
- ubuntu-latest
- windows-latest
name: e2e ${{ matrix.platform }}
runs-on: ${{ matrix.platform }}
permissions:
contents: read
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
with:
go-version-file: 'go.mod'
check-latest: true
- name: Build and run ko container
env:
KO_DOCKER_REPO: ko.local
shell: bash
run: |
set -o errexit
set -o nounset
set -o pipefail
set -x
# Check that building without push prints the tag (and sha)
KO_DOCKER_REPO="" go run ./ build --push=false ./test | grep ":latest@sha256:"
KO_DOCKER_REPO="" go run ./ build --push=false -t test ./test | grep ":test@sha256:"
KO_DOCKER_REPO="" go run ./ build --push=false -t test --tag-only ./test | grep ":test$"
# Check that using sbom-dir works.
KO_DOCKER_REPO="" go run ./ build -t test --push=false --sbom-dir ./sbom-data ./test
jq . ./sbom-data/test-linux-amd64.spdx.json
# Check that using sbom-dir works for multi-arch
KO_DOCKER_REPO="" go run ./ build --platform=linux/amd64,linux/arm64 -t test --push=false --sbom-dir ./sbom-data2 ./test
jq . ./sbom-data2/test-index.spdx.json
jq . ./sbom-data2/test-linux-amd64.spdx.json
jq . ./sbom-data2/test-linux-arm64.spdx.json
export PLATFORM=$(go env GOOS)/$(go env GOARCH)
if [[ "${{ matrix.platform }}" == "windows-latest" ]]; then
OSVERSION="10.0.20348"
PLATFORM=${PLATFORM}:${OSVERSION}
export KO_DEFAULTBASEIMAGE=mcr.microsoft.com/windows/nanoserver:ltsc2022
else
# Explicitly test multiple platform builds (a subset of what's in the base!)
export PLATFORM=${PLATFORM},linux/arm64
fi
echo platform is ${PLATFORM}
# Build and run the ko binary, which should be runnable.
docker run $(go run ./ build ./ --platform=${PLATFORM} --preserve-import-paths) version
# Build and run the test/ binary, which should log "Hello there" served from KO_DATA_PATH
testimg=$(go run ./ build ./test --platform=${PLATFORM} --preserve-import-paths)
docker run ${testimg} --wait=false 2>&1 | tee >(grep "Hello there") # Log all output too.
# Check that symlinks in kodata are chased.
# Skip this test on Windows.
if [[ "$RUNNER_OS" == "Linux" ]]; then
docker run ${testimg} --wait=false -f b
fi
# Check that using ldflags to set variables works.
cat > .ko.yaml << EOF
builds:
- id: test
main: ./test/
ldflags:
- "-X main.version=${{ github.sha }}"
EOF
docker run $(go run ./ build ./test/ --platform=${PLATFORM}) --wait=false 2>&1 | grep "${{ github.sha }}"
# TODO: check why it is failing when building for windows
if [[ "${{ matrix.platform }}" != "windows-latest" ]]; then
# Check that --debug adds dlv to the image, and that dlv is runnable.
docker run --entrypoint="dlv" $(go run ./ build ./test/ --platform=${PLATFORM} --debug) version | grep "Delve Debugger"
fi
================================================
FILE: .github/workflows/image.yaml
================================================
name: image
on:
push:
branches:
- 'main'
workflow_dispatch:
permissions: {}
jobs:
image:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
id-token: write
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
with:
go-version-file: 'go.mod'
check-latest: true
- uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0
# Build ko from HEAD, build and push an image tagged with the commit SHA,
# then keylessly sign it with cosign.
- name: Publish and sign image
env:
KO_DOCKER_REPO: ghcr.io/${{ github.repository }}
run: |
go build ./
echo "${{ github.token }}" | ./ko login ghcr.io --username "${{ github.actor }}" --password-stdin
img=$(./ko build --bare --platform=all -t latest -t ${{ github.sha }} ./)
echo "built ${img}"
cosign sign ${img} --yes \
-a sha=${{ github.sha }} \
-a run_id=${{ github.run_id }} \
-a run_attempt=${{ github.run_attempt }}
================================================
FILE: .github/workflows/kind-e2e.yaml
================================================
name: KinD e2e tests
on:
workflow_dispatch: # Allow manual runs.
pull_request:
branches:
- 'main'
permissions: {}
jobs:
e2e-tests:
name: e2e tests
runs-on: ubuntu-latest
env:
# https://github.com/google/go-containerregistry/pull/125 allows insecure registry for
# '*.local' hostnames. This works both for `ko` and our own tag-to-digest resolution logic,
# thus allowing us to test without bypassing tag-to-digest resolution.
REGISTRY_NAME: registry.local
REGISTRY_PORT: 5000
KO_DOCKER_REPO: registry.local:5000/ko
permissions:
contents: read
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
with:
go-version-file: 'go.mod'
check-latest: true
- name: Install ko
run: go install ./
- name: Setup Cluster
uses: chainguard-dev/actions/setup-kind@29fb6e979a0b3efc79748a17e8cec08d0594cbfd # main
with:
k8s-version: v1.28.x
registry-authority: ${{ env.REGISTRY_NAME }}:${{ env.REGISTRY_PORT }}
- name: Install Cosign
uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0
- name: Run Smoke Test
run: |
# Test with kind load
KO_DOCKER_REPO=kind.local ko apply --platform=all -f ./test
kubectl wait --timeout=10s --for=condition=Ready pod/kodata
kubectl delete pod kodata
# Test with registry
ko apply --platform=all -f ./test
kubectl wait --timeout=60s --for=condition=Ready pod/kodata
kubectl delete pod kodata
# Test ko run with kind load
# This tests that --labels are passed to kubectl, and -wait is passed to the test binary.
KO_DOCKER_REPO=kind.local ko run ./test -- --labels=foo=bar -- -wait=false
- name: Check SBOM
run: |
set -o pipefail
echo '::group:: SBOM'
cosign download sbom $(ko build ./test)
echo "${SBOM}"
echo '::endgroup::'
- name: Collect diagnostics and upload
if: ${{ failure() }}
uses: chainguard-dev/actions/kind-diag@29fb6e979a0b3efc79748a17e8cec08d0594cbfd # main
================================================
FILE: .github/workflows/modules-integration-test.yaml
================================================
name: Integration Test
on:
pull_request:
branches:
- 'main'
permissions: {}
jobs:
test:
name: Module Tests
runs-on: 'ubuntu-latest'
permissions:
contents: read
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
with:
go-version: '1.24'
check-latest: true
- env:
GOPATH: does not matter
run: ./integration_test.sh
================================================
FILE: .github/workflows/publish-site.yaml
================================================
name: publish
on:
workflow_dispatch:
push:
branches:
- 'main'
permissions: {}
jobs:
publish:
runs-on: ubuntu-latest
permissions:
contents: write
pages: write
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0
with:
python-version: 3.x
- run: pip install mkdocs-material mkdocs-redirects
- run: mkdocs gh-deploy --force
================================================
FILE: .github/workflows/registries.yaml
================================================
name: Push to registries
on:
push:
branches:
- 'main'
workflow_dispatch: # Allow manual runs.
permissions: {}
jobs:
quay:
name: Push to quay.io
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
with:
go-version-file: 'go.mod'
check-latest: true
- env:
QUAY_USERNAME: ko-testing+test
QUAY_PASSWORD: ${{ secrets.QUAY_PASSWORD }}
KO_DOCKER_REPO: quay.io/ko-testing/test
run: |
echo ${QUAY_PASSWORD} | go run ./ login --username=${QUAY_USERNAME} --password-stdin quay.io
go run ./ build --platform=all ./test/ --sbom=none --bare
dockerhub:
name: Push to dockerhub
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
with:
go-version-file: 'go.mod'
check-latest: true
- env:
DOCKERHUB_USERNAME: kotesting
DOCKERHUB_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }}
KO_DOCKER_REPO: kotesting/test
run: |
echo ${DOCKERHUB_PASSWORD} | go run ./ login --username=${DOCKERHUB_USERNAME} --password-stdin index.docker.io
go run ./ build --platform=all ./test/ --bare
ecr:
name: Push to ECR
runs-on: ubuntu-latest
env:
# This is an AWS account that Chainguard provides to enable
# go-containerregistry and ko to test ECR support.
AWS_ACCOUNT: 479305788615
AWS_REGION: us-west-2
REPOSITORY: ko-ecr-e2e-testing
permissions:
# This lets us clone the repo
contents: read
# This lets us mint identity tokens for federation with AWS.
id-token: write
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
with:
go-version-file: 'go.mod'
check-latest: true
- name: Install ko
run: go install .
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2
with:
role-to-assume: arn:aws:iam::${{ env.AWS_ACCOUNT }}:role/federated-ecr-readwrite
aws-region: ${{ env.AWS_REGION }}
- name: Test ko build
run: |
export KO_DOCKER_REPO=${{ env.AWS_ACCOUNT }}.dkr.ecr.${{ env.AWS_REGION }}.amazonaws.com/${{ env.REPOSITORY }}
ko build --bare ./test
================================================
FILE: .github/workflows/release.yml
================================================
name: goreleaser
on:
push:
tags:
- '*'
permissions: {}
jobs:
goreleaser:
outputs:
hashes: ${{ steps.hash.outputs.hashes }}
tag_name: ${{ steps.tag.outputs.tag_name }}
permissions:
packages: write
id-token: write
contents: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- run: git fetch --prune --unshallow
- uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
with:
go-version-file: 'go.mod'
check-latest: true
# This installs the current latest release. We have to manually bump this.
- uses: ko-build/setup-ko@3aebd0597dc1e9d1a26bcfdb7cbeb19c131d3037 # v0.7
with:
version: v0.18.0 # DO NOT REMOVE THIS OR IT WILL CREATE A CYCLE.
- uses: imjasonh/setup-crane@31b88efe9de28ae0ffa220711af4b60be9435f6e # v0.4
- uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0
- name: Set tag output
id: tag
run: echo "tag_name=${GITHUB_REF#refs/*/}" >> "$GITHUB_OUTPUT"
- uses: goreleaser/goreleaser-action@9ed2f89a662bf1735a48bc8557fd212fa902bebf # v6.1.0
id: run-goreleaser
with:
version: latest
args: release --clean
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: sign ko-image
run: |
digest=$(crane digest "${REGISTRY}":"${GIT_TAG}")
cosign sign --yes \
-a GIT_HASH="${GIT_HASH}" \
-a GIT_TAG="${GIT_TAG}" \
-a RUN_ID="${RUN_ID}" \
-a RUN_ATTEMPT="${RUN_ATTEMPT}" \
"${REGISTRY}@${digest}"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GIT_HASH: ${{ github.sha }}
GIT_TAG: ${{ steps.tag.outputs.tag_name }}
RUN_ATTEMPT: ${{ github.run_attempt }}
RUN_ID: ${{ github.run_id }}
REGISTRY: "ghcr.io/${{ github.repository }}"
- name: Generate subject
id: hash
env:
ARTIFACTS: "${{ steps.run-goreleaser.outputs.artifacts }}"
run: |
set -euo pipefail
checksum_file=$(echo "$ARTIFACTS" | jq -r '.[] | select (.type=="Checksum") | .path')
echo "hashes=$(cat $checksum_file | base64 -w0)" >> "$GITHUB_OUTPUT"
provenance:
needs:
- goreleaser
permissions:
actions: read # To read the workflow path.
id-token: write # To sign the provenance.
contents: write # To add assets to a release.
uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v2.0.0
with:
base64-subjects: "${{ needs.goreleaser.outputs.hashes }}"
upload-assets: true
upload-tag-name: "${{ needs.goreleaser.outputs.tag_name }}"
verification:
needs:
- goreleaser
- provenance
runs-on: ubuntu-latest
permissions: read-all
steps:
# Note: this will be replaced with the GHA in the future.
- name: Install the verifier
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -euo pipefail
gh -R slsa-framework/slsa-verifier release download v1.3.2 -p "slsa-verifier-linux-amd64"
chmod ug+x slsa-verifier-linux-amd64
# Note: see https://github.com/slsa-framework/slsa-verifier/blob/main/SHA256SUM.md
COMPUTED_HASH=$(sha256sum slsa-verifier-linux-amd64 | cut -d ' ' -f1)
EXPECTED_HASH="b1d6c9bbce6274e253f0be33158cacd7fb894c5ebd643f14a911bfe55574f4c0"
if [[ "$EXPECTED_HASH" != "$COMPUTED_HASH" ]];then
echo "error: expected $EXPECTED_HASH, computed $COMPUTED_HASH"
exit 1
fi
- name: Download assets
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PROVENANCE: "${{ needs.provenance.outputs.provenance-name }}"
run: |
set -euo pipefail
gh -R "$GITHUB_REPOSITORY" release download "$GITHUB_REF_NAME" -p "*.tar.gz"
gh -R "$GITHUB_REPOSITORY" release download "$GITHUB_REF_NAME" -p "$PROVENANCE"
- name: Verify assets
env:
CHECKSUMS: ${{ needs.goreleaser.outputs.hashes }}
PROVENANCE: "${{ needs.provenance.outputs.provenance-name }}"
run: |
set -euo pipefail
checksums=$(echo "$CHECKSUMS" | base64 -d)
while read -r line; do
fn=$(echo $line | cut -d ' ' -f2)
echo "Verifying $fn"
./slsa-verifier-linux-amd64 -artifact-path "$fn" \
-provenance "$PROVENANCE" \
-source "github.com/$GITHUB_REPOSITORY" \
-tag "$GITHUB_REF_NAME"
done <<<"$checksums"
================================================
FILE: .github/workflows/sbom.yaml
================================================
name: Validate SBOMs
on:
pull_request:
branches:
- 'main'
env:
SPDX_TOOLS_VERSION: 1.1.0
permissions: {}
jobs:
spdx:
name: Validate SPDX SBOM
runs-on: ubuntu-latest
permissions:
contents: read
env:
KO_DOCKER_REPO: localhost:1338
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
with:
go-version-file: 'go.mod'
check-latest: true
- uses: chainguard-dev/actions/setup-registry@main
- uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0
- name: Install SPDX Tools
run: |
wget https://github.com/spdx/tools-java/releases/download/v${SPDX_TOOLS_VERSION}/tools-java-${SPDX_TOOLS_VERSION}.zip
unzip tools-java-${SPDX_TOOLS_VERSION}.zip
- name: Generate and Validate
run: |
cosign download sbom $(go run ./ build) | tee spdx.json
java -jar ./tools-java-${SPDX_TOOLS_VERSION}-jar-with-dependencies.jar Verify spdx.json
- uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0
if: ${{ always() }}
with:
name: spdx.json
path: spdx.json
spdx-multi-arch:
name: Validate SPDX multi-arch SBOM
runs-on: ubuntu-latest
env:
KO_DOCKER_REPO: localhost:1338
permissions:
contents: read
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
with:
go-version-file: 'go.mod'
check-latest: true
- uses: chainguard-dev/actions/setup-registry@main
- uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0
- name: Install SPDX Tools
run: |
wget https://github.com/spdx/tools-java/releases/download/v${SPDX_TOOLS_VERSION}/tools-java-${SPDX_TOOLS_VERSION}.zip
unzip tools-java-${SPDX_TOOLS_VERSION}.zip
- name: Generate and Validate
run: |
img=$(go run ./ build --platform=linux/amd64,linux/arm64)
cosign download sbom $img | tee spdx-multi-arch.json
java -jar ./tools-java-${SPDX_TOOLS_VERSION}-jar-with-dependencies.jar Verify spdx-multi-arch.json
- uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0
if: ${{ always() }}
with:
name: spdx-multi-arch.json
path: spdx-multi-arch.json
================================================
FILE: .github/workflows/stale.yaml
================================================
name: 'Close stale'
on:
schedule:
- cron: '0 1 * * *'
permissions: {}
jobs:
stale:
runs-on: 'ubuntu-latest'
permissions:
issues: write
pull-requests: write
steps:
- uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9.0.0
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: |-
This issue is stale because it has been open for 90 days with no
activity. It will automatically close after 30 more days of
inactivity. Keep fresh with the 'lifecycle/frozen' label.
stale-issue-label: 'lifecycle/stale'
exempt-issue-labels: 'lifecycle/frozen'
stale-pr-message: |-
This Pull Request is stale because it has been open for 90 days with
no activity. It will automatically close after 30 more days of
inactivity. Keep fresh with the 'lifecycle/frozen' label.
stale-pr-label: 'lifecycle/stale'
exempt-pr-labels: 'lifecycle/frozen'
days-before-stale: 90
days-before-close: 30
================================================
FILE: .github/workflows/style.yaml
================================================
name: Code Style
on:
pull_request:
branches:
- 'main'
permissions: {}
jobs:
gofmt:
name: check gofmt
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
with:
go-version-file: 'go.mod'
check-latest: true
- uses: chainguard-dev/actions/gofmt@d886686603afb809f7ef9b734b333e20b7ce5cda
with:
args: -s
goimports:
name: check goimports
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
with:
go-version-file: 'go.mod'
check-latest: true
- uses: chainguard-dev/actions/goimports@d886686603afb809f7ef9b734b333e20b7ce5cda
lint:
name: Lint
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Check out code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- name: Set up Go
uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
with:
go-version-file: 'go.mod'
check-latest: true
- uses: chainguard-dev/actions/trailing-space@d886686603afb809f7ef9b734b333e20b7ce5cda
if: ${{ always() }}
- uses: chainguard-dev/actions/eof-newline@d886686603afb809f7ef9b734b333e20b7ce5cda
if: ${{ always() }}
- uses: reviewdog/action-misspell@18ffb61effb93b47e332f185216be7e49592e7e1 # v1.26.1
if: ${{ always() }}
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
fail_level: warning
locale: "US"
exclude: |
./.golangci.yaml
- uses: get-woke/woke-action-reviewdog@d71fd0115146a01c3181439ce714e21a69d75e31 # v0
if: ${{ always() }}
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
reporter: github-pr-check
level: error
fail-on-error: true
================================================
FILE: .github/workflows/test.yaml
================================================
name: Test
on:
push:
branches:
- 'main'
pull_request:
branches:
- 'main'
permissions: {}
jobs:
test:
name: Unit Tests
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
with:
go-version-file: 'go.mod'
check-latest: true
- run: go test -coverprofile=coverage.txt -covermode=atomic -race ./...
================================================
FILE: .github/workflows/verify.yaml
================================================
name: Verify
on:
pull_request:
branches:
- "main"
permissions: {}
jobs:
verify:
name: Verify Codegen
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
with:
go-version-file: "go.mod"
check-latest: true
- name: Verify
run: ./hack/presubmit.sh
golangci:
name: lint
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
with:
go-version-file: "go.mod"
check-latest: true
- name: golangci-lint
uses: golangci/golangci-lint-action@1e7e51e771db61008b38414a730f564565cf7c20 # v9.4.0
with:
version: v2.7.2
================================================
FILE: .gitignore
================================================
# Ignore GoLand (IntelliJ) files.
.idea/
ko
.DS_Store
/vendor/
================================================
FILE: .golangci.yaml
================================================
version: "2"
linters:
enable:
- asciicheck
- errorlint
- gosec
- importas
- misspell
- prealloc
- revive
- staticcheck
- tparallel
- unconvert
- unparam
- whitespace
disable:
- depguard
- errcheck
settings:
gosec:
excludes:
- G115
exclusions:
generated: lax
presets:
- comments
- common-false-positives
- legacy
- std-error-handling
rules:
- linters:
- gosec
path: test
paths:
- third_party$
- builtin$
- examples$
formatters:
enable:
- gofmt
- goimports
exclusions:
generated: lax
paths:
- third_party$
- builtin$
- examples$
================================================
FILE: .goreleaser.yml
================================================
version: 2
before:
hooks:
- go mod tidy
- /bin/bash -c 'if [ -n "$(git --no-pager diff --exit-code go.mod go.sum)" ]; then exit 1; fi'
builds:
- id: binary
main: ./main.go
env:
- CGO_ENABLED=0
flags:
- -trimpath
ldflags:
- "-s -w -X github.com/google/ko/pkg/commands.Version={{.Version}}"
goos:
- windows
- linux
- darwin
goarch:
- amd64
- arm64
- s390x
- 386
- mips64le
- ppc64le
- riscv64
kos:
- id: ko-image
build: binary
main: .
base_image: golang:latest
ldflags:
- "-s -w -X github.com/google/ko/pkg/commands.Version={{.Version}}"
platforms:
- all
tags:
- '{{ .Tag }}'
- '{{ .FullCommit }}'
- latest
sbom: spdx
bare: true
preserve_import_paths: false
base_import_paths: false
archives:
- id: with-version
name_template: >-
{{ .ProjectName }}_
{{- .Version }}_
{{- title .Os }}_
{{- if eq .Arch "amd64" }}x86_64
{{- else if eq .Arch "386" }}i386
{{- else }}{{ .Arch }}{{ end }}
- id: without-version
name_template: >-
{{ .ProjectName }}_
{{- title .Os }}_
{{- if eq .Arch "amd64" }}x86_64
{{- else if eq .Arch "386" }}i386
{{- else }}{{ .Arch }}{{ end }}
checksum:
name_template: 'checksums.txt'
snapshot:
version_template: "{{ .Tag }}-next"
changelog:
sort: asc
use: github
filters:
exclude:
- '^docs:'
- '^test:'
================================================
FILE: .ko.yaml
================================================
baseImageOverrides:
github.com/google/ko: golang:latest
builds:
- id: ko
ldflags:
- "{{ .Env.LDFLAGS }}"
================================================
FILE: .wokeignore
================================================
# Uses some Cobra methods
pkg/commands/*
================================================
FILE: CNAME
================================================
ko.build
================================================
FILE: CONTRIBUTING.md
================================================
# How to Contribute to ko
We'd love to accept your patches and contributions to this project. There are
just a few small guidelines you need to follow.
## Code reviews
All submissions, including submissions by project members, require review. We
use GitHub pull requests for this purpose. Consult
[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more
information on using pull requests.
## Testing
Ensure the following passes:
```
./hack/presubmit.sh
```
and commit any resultant changes to `go.mod` and `go.sum`. To update any docs
after client changes, run:
```
./hack/update-codegen.sh
```
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
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.
================================================
FILE: MAINTAINERS.md
================================================
# Maintainers
This page lists all active members of the maintainers for the `ko` project and any subprojects.
- Jon Johnson (@jonjohnsonjr)
- Matt Moore (@mattmoor)
- Jason Hall (@imjasonh)
New projects and new maintainers can be added or removed with the consensus approval of the current maintainers.
================================================
FILE: README.md
================================================
# `ko`: Easy Go Containers
[](https://github.com/ko-build/ko/actions?query=workflow%3ABuild)
[](https://godoc.org/github.com/google/ko)
[](https://goreportcard.com/report/ko-build/ko)
[](https://slsa.dev/images/gh-badge-level3.svg)
<img src="./docs/images/demo.png" width="100%">
---
> 🎉 Google has applied for `ko` to join the Cloud Native Computing Foundation as a Sandbox project! Learn more [here](https://opensource.googleblog.com/2022/10/ko-applies-to-become-a-cncf-sandbox-project.html)!
`ko` is a simple, fast container image builder for Go applications.
It's ideal for use cases where your image contains a single Go application
without any/many dependencies on the OS base image (e.g., no cgo, no OS package
dependencies).
`ko` builds images by effectively executing `go build` on your local machine,
and as such doesn't require `docker` to be installed. This can make it a good
fit for lightweight CI/CD use cases.
`ko` makes [multi-platform builds](https://ko.build/features/multi-platform/) easy, produces [SBOMs](https://ko.build/features/sboms/) by default, and includes support for simple YAML templating which makes it a powerful tool for [Kubernetes applications](https://ko.build/features/k8s/).
# [Install `ko`](https://ko.build/install/) and [get started](https://ko.build/get-started/)!
### Acknowledgements
This work is based heavily on experience from having built the [Docker](https://github.com/bazelbuild/rules_docker) and [Kubernetes](https://github.com/bazelbuild/rules_k8s) support for [Bazel](https://bazel.build).
That work was presented [here](https://www.youtube.com/watch?v=RS1aiQqgUTA).
### Discuss
Questions? Comments? Ideas?
Come discuss `ko` with us in the `#ko-build` channel on the [Kubernetes Slack](https://slack.k8s.io)!
See you there!
### Community Meetings
You can find all the necessary details about the community meetings in this [page](https://ko.build/community).
================================================
FILE: ROADMAP.md
================================================
# `ko` Project Roadmap
_Last updated October 2022_
- Foster a community of contributors and users
- give talks, do outreach, expand the pool of contributors
- identify projects that could benefit from using `ko`, and help onboard them
- publish case studies from successful migrations
- Integrate [sigstore](https://sigstore.dev) for built artifacts
- attach signed SBOMs
- attach signed provenance attestations
- support the OCI referrers API and [fallback tag scheme](https://github.com/opencontainers/distribution-spec/blob/main/spec.md#referrers-tag-schema)
- integrate with CI workload identity (e.g., GitHub OIDC) to keylessly sign artifacts
- Faster builds
- identify unnecessary work and avoid it when possible
- Ecosystem integrations
- support Terraform provider, and potentially Pulumi and CDK, others
- provide working examples of these integrations
================================================
FILE: cmd/help/main.go
================================================
// Copyright 2021 ko Build Authors All Rights Reserved.
//
// 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.
package main
import (
"fmt"
"os"
"github.com/google/ko/pkg/commands"
"github.com/spf13/cobra"
"github.com/spf13/cobra/doc"
)
var dir string
var root = &cobra.Command{
Use: "gendoc",
Short: "Generate ko's help docs",
Args: cobra.NoArgs,
RunE: func(*cobra.Command, []string) error {
return doc.GenMarkdownTree(commands.Root, dir)
},
}
func init() {
root.Flags().StringVarP(&dir, "dir", "d", ".", "Path to directory in which to generate docs")
}
func main() {
if err := root.Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}
================================================
FILE: code-of-conduct.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level of
experience, education, socio-economic status, nationality, personal appearance,
race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
- Using welcoming and inclusive language
- Being respectful of differing viewpoints and experiences
- Gracefully accepting constructive criticism
- Focusing on what is best for the community
- Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
- The use of sexualized language or imagery and unwelcome sexual attention or
advances
- Trolling, insulting/derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or electronic
address, without explicit permission
- Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, or to ban temporarily or permanently any
contributor for other behaviors that they deem inappropriate, threatening,
offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
<!-- TODO: Need a real CoC contact list. -->
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team. All complaints will be reviewed and
investigated and will result in a response that is deemed necessary and
appropriate to the circumstances. The project team is obligated to maintain
confidentiality with regard to the reporter of an incident. Further details of
specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 1.4, available at
https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
================================================
FILE: docs/CNAME
================================================
ko.build
================================================
FILE: docs/README.md
================================================
# Docs for https://ko.build
## Development
Update `.md` files to update content.
Update `mkdocs.yml` to update sidebar headers and ordering.
To run locally:
- [install `mkdocs` and `mkdocs-material`](https://squidfunk.github.io/mkdocs-material/getting-started/) and run `mkdocs serve`, or
- `docker run --rm -it -p 8000:8000 -v ${PWD}:/docs squidfunk/mkdocs-material`
- on an M1 Mac, use `ghcr.io/afritzler/mkdocs-material` instead.
This will start a local server on localhost:8000 that autoupdates as you make changes.
## Deployment
When PRs are merged, the site will be rebuilt and published automatically.
### Credits
The site is powered by [mkdocs-material](https://squidfunk.github.io/mkdocs-material). The code and theme are released under the MIT license.
Content is licensed [CC-BY](https://creativecommons.org/licenses/by/4.0/).
================================================
FILE: docs/advanced/faq.md
================================================
# Frequently Asked Questions
## How can I set `ldflags`?
[Using -ldflags](https://blog.cloudflare.com/setting-go-variables-at-compile-time/) is a common way to embed version info in go binaries (In fact, we do this for `ko`!).
Unfortunately, because `ko` wraps `go build`, it's not possible to use this flag directly; however, you can use the `GOFLAGS` environment variable instead:
```sh
GOFLAGS="-ldflags=-X=main.version=1.2.3" ko build .
```
Currently, there is a limitation that does not allow to set multiple arguments in `ldflags` using `GOFLAGS`.
Using `-ldflags` multiple times also does not work.
In this use case, it works best to use the [`builds` section](./../configuration.md) in the `.ko.yaml` file.
## Why are my images all created in 1970?
In order to support [reproducible builds](https://reproducible-builds.org), `ko` doesn't embed timestamps in the images it produces by default.
However, `ko` does respect the [`SOURCE_DATE_EPOCH`](https://reproducible-builds.org/docs/source-date-epoch/) environment variable, which will set the container image's timestamp accordingly.
Similarly, the `KO_DATA_DATE_EPOCH` environment variable can be used to set the _modtime_ timestamp of the files in `KO_DATA_PATH`.
For example, you can set the container image's timestamp to the current timestamp by executing:
```sh
export SOURCE_DATE_EPOCH=$(date +%s)
```
or set the timestamp of the files in `KO_DATA_PATH` to the latest git commit's timestamp with:
```sh
export KO_DATA_DATE_EPOCH=$(git log -1 --format='%ct')
```
## Can I build Windows containers?
Yes, but support for Windows containers is new, experimental, and tenuous. Be prepared to file bugs. 🐛
The default base image does not provide a Windows image.
You can try out building a Windows container image by [setting the base image](./../configuration.md) to a Windows base image and building with `--platform=windows/amd64` or `--platform=all`:
For example, to build a Windows container image, update your `.ko.yaml` to set the base image:
```plaintext
defaultBaseImage: mcr.microsoft.com/windows/nanoserver:ltsc2022
```
And build for `windows/amd64`.
```sh
ko build ./ --platform=windows/amd64
```
### Known issues 🐛
- Symlinks in `kodata` are ignored when building Windows images; only regular files and directories will be included in the Windows image.
## Does `ko` support autocompletion?
Yes! `ko completion` generates a Bash/Zsh/Fish/PowerShell completion script.
You can get how to load it from help document.
```sh
ko completion [bash|zsh|fish|powershell] --help
```
Or, you can source it directly:
```bash
source <(ko completion)
```
## Does `ko` work with [Kustomize](https://kustomize.io/)?
Yes! `ko resolve -f -` will read and process input from stdin, so you can have `ko` easily process the output of the `kustomize` command.
```sh
kustomize build config | ko resolve -f -
```
## Does `ko` integrate with other build and development tools?
Oh, you betcha. Here's a partial list:
- `ko` support in [Skaffold](https://skaffold.dev/docs/pipeline-stages/builders/ko/)
- `ko` support for [goreleaser](https://goreleaser.com/customization/ko/)
- `ko` task in the [Tekton catalog](https://github.com/tektoncd/catalog/tree/main/task/ko/)
- `ko` support in [Carvel's `kbld`](https://carvel.dev/kbld/docs/latest/config/#ko)
- `ko` extension for [Tilt](https://github.com/tilt-dev/tilt-extensions/tree/master/ko)
## Does `ko` work with [OpenShift Internal Registry](https://access.redhat.com/documentation/en-us/openshift_container_platform/4.11/html/registry/registry-overview#registry-integrated-openshift-registry_registry-overview)?
Yes! Follow these steps:
1. [Connect to your OpenShift installation](https://docs.openshift.com/container-platform/latest/cli_reference/openshift_cli/getting-started-cli.html#cli-logging-in_cli-developer-commands)
1. [Expose the OpenShift Internal Registry](https://docs.openshift.com/container-platform/latest/registry/securing-exposing-registry.html) so you can push to it:
1. Export your token to `$HOME/.docker/config.json`:
```sh
oc registry login --to=$HOME/.docker/config.json
```
1. Create a namespace where you will push your images, i.e: `ko-images`
1. Execute this command to set `KO_DOCKER_REPO` to publish images to the internal registry.
```sh
export KO_DOCKER_REPO=$(oc registry info --public)/ko-images
```
================================================
FILE: docs/advanced/go-packages.md
================================================
# Go Packages
`ko`'s functionality can be consumed as a library in a Go application.
To build an image, use [`pkg/build`](https://pkg.go.dev/github.com/google/ko/pkg/build), and publish it with [`pkg/publish`](https://pkg.go.dev/github.com/google/ko/pkg/publish).
This is a minimal example of using the packages together, to implement the core subset of `ko`'s functionality:
```go
package main
import (
"context"
"fmt"
"log"
"github.com/google/go-containerregistry/pkg/authn"
"github.com/google/go-containerregistry/pkg/name"
"github.com/google/go-containerregistry/pkg/v1/remote"
"github.com/google/ko/pkg/build"
"github.com/google/ko/pkg/publish"
)
const (
baseImage = "cgr.dev/chainguard/static:latest"
targetRepo = "example.registry/my-repo"
importpath = "github.com/my-org/miniko"
commitSHA = "deadbeef"
)
func main() {
ctx := context.Background()
b, err := build.NewGo(ctx, ".",
build.WithPlatforms("linux/amd64"), // only build for these platforms.
build.WithBaseImages(func(ctx context.Context, _ string) (name.Reference, build.Result, error) {
ref := name.MustParseReference(baseImage)
base, err := remote.Index(ref, remote.WithContext(ctx))
return ref, base, err
}))
if err != nil {
log.Fatalf("NewGo: %v", err)
}
r, err := b.Build(ctx, importpath)
if err != nil {
log.Fatalf("Build: %v", err)
}
p, err := publish.NewDefault(targetRepo, // publish to example.registry/my-repo
publish.WithTags([]string{commitSHA}), // tag with :deadbeef
publish.WithAuthFromKeychain(authn.DefaultKeychain)) // use credentials from ~/.docker/config.json
if err != nil {
log.Fatalf("NewDefault: %v", err)
}
ref, err := p.Publish(ctx, r, importpath)
if err != nil {
log.Fatalf("Publish: %v", err)
}
fmt.Println(ref.String())
}
```
================================================
FILE: docs/advanced/lambda.md
================================================
# AWS Lambda
`ko` can build images that can be deployed as AWS Lambda functions, using [Lambda's container support](https://docs.aws.amazon.com/lambda/latest/dg/images-create.html).
For best results, use the [Go runtime interface client](https://docs.aws.amazon.com/lambda/latest/dg/go-image.html#go-image-clients) provided by the [`lambda` package](https://pkg.go.dev/github.com/aws/aws-lambda-go/lambda).
For example:
```go
package main
import (
"context"
"fmt"
"github.com/aws/aws-lambda-go/lambda"
)
type Event struct {
Name string `json:"name"`
// TODO: add other request fields here.
}
func main() {
lambda.Start(func(ctx context.Context, event Event) (string, error) {
return fmt.Sprintf("Hello %s!", event.Name), nil
})
}
```
See AWS's [documentation](https://docs.aws.amazon.com/lambda/latest/dg/golang-handler.html) for more information on writing Lambda functions in Go.
To deploy to Lambda, you must push to AWS Elastic Container Registry (ECR):
```sh
KO_DOCKER_REPO=[account-id].dkr.ecr.[region].amazonaws.com/my-repo
image=$(ko build ./cmd/app)
```
Then, create a Lambda function using the image in ECR:
```sh
aws lambda create-function \
--function-name hello-world \
--package-type Image \
--code ImageUri=${image} \
--role arn:aws:iam::[account-id]:role/lambda-ex
```
See AWS's [documentation](https://docs.aws.amazon.com/lambda/latest/dg/go-image.html) for more information on deploying Lambda functions using Go container images, including how to configure push access to ECR, and how to configure the IAM role for the function.
The base image that `ko` uses by default supports both x86 and Graviton2 architectures.
You can also use the [`ko` Terraform provider](./terraform.md) to build and deploy Lambda functions as part of your IaC workflow, using the [`aws_lambda_function` resource](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function.html). See the [provider example](https://github.com/ko-build/terraform-provider-ko/tree/main/provider-examples/lambda) to get started.
================================================
FILE: docs/advanced/limitations.md
================================================
# Limitations
`ko` works best when your application has no dependencies on the underlying image.
This means `ko` is ideal when you don't require [cgo](https://pkg.go.dev/cmd/cgo), and builds are executed with `CGO_ENABLED=0` by default.
To install other OS packages, make those available in your [configured base image](../../configuration).
`ko` only supports Go applications.
For a similar tool targeting Java applications, try [Jib](https://github.com/GoogleContainerTools/jib).
For other languages, try [apko](https://github.com/chainguard-dev/apko) and [melange](https://github.com/chainguard-dev/melange).
================================================
FILE: docs/advanced/linux-capabilities.md
================================================
# Linux Capabilities
In Linux, capabilities are a way to selectively grant privileges to a running process.
Docker provides `--cap-add` and `--cap-drop`
[run options](https://docs.docker.com/engine/containers/run/#runtime-privilege-and-linux-capabilities)
to tweak container capabilities, e.g:
```
docker run --cap-add bpf hello-world
```
If container runs as a non-root user,
capabilities are narrowed by intersecting with *file* capabilities of the
application binary. When building images with a Dockerfile, one
typically uses `setcap` tool to modify file capabilities, e.g:
`setcap FILE bpf=ep`.
To set file capabilities with `ko`, specify `linux_capabilities`
in builds configuration section in your `.ko.yaml`. Use `setcap` syntax:
```yaml
builds:
- id: caps
linux_capabilities: bpf=ep
```
## Alternative spelling
```yaml
builds:
- id: caps
linux_capabilities:
- cap1
- cap2
- cap3
```
A list of capability names is equivalent to `cap1,cap2,cap3=p`.
## Improving UX in capability-reliant apps
A capability can be *permitted* (`=p`), or both *permitted* and *effective* (`=ep`).
Effective capabilities are used for permission checks.
A program can promote permitted capability to effective when needed.
```yaml
builds:
- id: caps
linux_capabilities: bpf,perfmon,net_admin=ep
```
Initially, `=ep` might look like a good idea.
There's no need to explicitly promote *permitted* capabilities.
Application takes advantage of *effective* capabilities right away.
There is a catch though.
```
$ docker run --cap-add bpf ko.local/caps.test-4b8f7bca75c467b3d2803e1c087a3287
exec /ko-app/caps.test: operation not permitted
```
When run options request fewer capabilities than specified in file capabilities,
container fails to start. It is hard to tell what went wrong since
`operation not permitted` is a generic error. (Docker is unlikely to improve diagnostics
for this failure case since the check is implemented in Linux kernel.)
We suggest to use `=p` instead. This option puts application in charge of verifying and
promoting permitted capabilities to effective. It can produce much better diagnostics:
```
$ docker run --cap-add bpf ko.local/caps.test-4b8f7bca75c467b3d2803e1c087a3287
current capabilities: cap_bpf=p
activating capabilities: cap_net_admin,cap_perfmon,cap_bpf=ep: operation not permitted
```
[Sample code](https://go.dev/play/p/uPMzyotkNHg).
================================================
FILE: docs/advanced/migrating-from-dockerfile.md
================================================
# Migrating from Dockerfile
If your `Dockerfile` looks like either of the examples in the [official tutorial for writing a Dockerfile to containerize a Go application](https://docs.docker.com/language/golang/build-images/), you can easily migrate to use `ko` instead.
Let's review the best practice multi-stage Dockerfile in that tutorial first:
```Dockerfile
## Build
FROM golang:1.16-buster AS build
WORKDIR /app
COPY go.mod ./
COPY go.sum ./
RUN go mod download
COPY *.go ./
RUN go build -o /docker-gs-ping
## Deploy
FROM gcr.io/distroless/base-debian10
WORKDIR /
COPY --from=build /docker-gs-ping /docker-gs-ping
EXPOSE 8080
USER nonroot:nonroot
ENTRYPOINT ["/docker-gs-ping"]
```
This `Dockerfile`:
1. pulls the `golang:1.16` image
1. `COPY`s your local source into the container environment (`COPY`ing `go.mod` and `go.sum` first and running `go mod download`, to cache dependencies in the container environment)
1. `RUN`s `go build` on your source, inside the container, to produce an executable
1. `COPY`s the executable built in the previous step into a new image, on top of a minimal [distroless](https://github.com/GoogleContainerTools/distroless) base image.
The result is a Go application built on a minimal base image, with an optimally cached build sequence.
After running `docker build` on this `Dockerfile`, don't forget to push that image to the registry so you can deploy it.
---
## Migrating to `ko`
If your Go source is laid out as described in the tutorial, and you've [installed](../../install) and [set up your environment](../../get-started), you can simply run `ko build ./` to build and push the container image to your registry.
You're done. You can delete your `Dockerfile` and uninstall `docker`.
`ko` takes advantage of your local [Go build cache](../../features/build-cache) without needing to be told to, and it sets the `ENTRYPOINT` and uses a nonroot distroless base image by default.
To build a multi-arch image, simply add `--platform=all`.
Compare this to the [equivalent Docker instructions](https://docs.docker.com/desktop/multi-arch/).
================================================
FILE: docs/advanced/root-ca-certificates.md
================================================
# Root CA Certificates
To install a [root certificate](https://en.wikipedia.org/wiki/Root_certificate) into your container built using `ko`, you can use one of the following methods.
## incert
[`incert`](https://github.com/chainguard-dev/incert) allows you to append CA certificates to an image and push the modified image to a specified registry.
`incert` can be run after `ko build` to build your Go application container image with custom root CA certificates.
### Example
1. Build and push your Go application container image using `ko build`
```sh
KO_DOCKER_REPO=mycompany/myimage:latest ko build .
```
2. Append the built image with your custom CA certificate(s) using `incert`
```sh
incert -image-url=mycompany/myimage:latest -ca-certs-file=/path/to/cacerts.pem -dest-image-url=myregistry/myimage:latest
```
## Custom Base Image
New root certificates can be [installed into a custom image](https://stackoverflow.com/questions/42292444/how-do-i-add-a-ca-root-certificate-inside-a-docker-image) using standard OS packages. Then, this custom image can be used [to override the base image for `ko`](https://ko.build/configuration/#overriding-base-images). Once the Go application container image is built using `ko` with the custom base image, the root certificates installed on the base image will be trusted by the Go application.
### Example
1. Make a custom container image with your new root certificates
```dockerfile
# Dockerfile
FROM alpine
RUN apk update
RUN apk add ca-certificates
ADD new-root-ca.crt /usr/local/share/ca-certificates/new-root-ca.crt
RUN chmod 644 /usr/local/share/ca-certificates/new-root-ca.crt
RUN update-ca-certificates
```
2. Build and push the custom container image to a container registry
```sh
docker build . -t docker.io/ko-build/image-with-new-root-certs
docker push docker.io/ko-build/image-with-new-root-certs
```
3. Configure `ko` to [override the default base image](https://ko.build/configuration/#overriding-base-images) with the custom image
```yaml
# .ko.yaml
defaultBaseImage: docker.io/ko-build/image-with-new-root-certs
```
**OR**
```sh
export KO_DEFAULTBASEIMAGE=docker.io/ko-build/image-with-new-root-certs
```
4. Build the Go app container image with `ko`
```sh
ko build .
```
## Static Assets
Alternatively, root certificates can be installed into the Go application container image using a combination of [`ko` static assets](https://ko.build/features/static-assets/) and [overriding the default system location for SSL certificates](https://pkg.go.dev/crypto/x509#SystemCertPool).
Using `ko`'s support for static assets, root certificates can be stored in the `<importpath>/kodata` directory (either checked into the repository, or injected dynamically by a CI pipeline). After running `ko build`, the certificate files are then bundled into the built image at the path `$KO_DATA_PATH`.
To enable the Go application to trust the bundled certificate(s), the container runtime or orchestrator (Docker, Kubernetes, etc) must set the environment variable `SSL_CERT_DIR` to the same value as `KO_DATA_PATH`. Go [uses `SSL_CERT_DIR` to determine the directory to check for SSL certificate files](https://go.dev/src/crypto/x509/root_unix.go). Once this variable is set, the Go application will trust the bundled root certificates in `$KO_DATA_PATH`.
### Example
1. Copy the root certificate(s) to the `<importpath>/kodata/` directory
```sh
# $(pwd) assumed to be at <importpath> for this example
mkdir -p kodata
cp $CERT_FILE_DIR/*.crt kodata/
```
2. Build the Go application container image
```sh
KO_DOCKER_REPO=docker.io/ko-build/static-assets-certs ko build .
```
3. Run the Go application container image with `SSL_CERT_DIR` equal to `/var/run/ko` (the default value for `$KO_DATA_PATH`)
```sh
docker run -e SSL_CERT_DIR=/var/run/ko docker.io/ko-build/static-assets-certs
```
A functional client-server example for this can be seen [here](https://github.com/kosamson/ko-private-ca-test).
================================================
FILE: docs/advanced/terraform.md
================================================
# Terraform Provider
In addition to the CLI, `ko`'s functionality is also available as a Terraform provider.
This allows `ko` to be integrated with your Infrastructure-as-Code (IaC) workflows, and makes building your code a seamless part of your deployment process.
Using the Terraform provider is as simple as adding a `ko_build` resource to your Terraform configuration:
```hcl
// Require the `ko-build/ko` provider.
terraform {
required_providers {
ko = { source = "ko-build/ko" }
}
}
// Configure the provider to push to your repo.
provider "ko" {
repo = "example.registry/my-repo" // equivalent to KO_DOCKER_REPO
}
// Build your code.
resource "ko_build" "app" {
importpath = "github.com/example/repo/cmd/app"
}
// TODO: use the `ko_build.app` resource elsewhere in your Terraform configuration.
// Report the build image's digest.
output "image" {
value = ko_build.app.image_ref
}
```
See the [`ko-build/ko` provider on the Terraform Registry](https://registry.terraform.io/providers/ko-build/ko/latest) for more information, and the [GitHub repo](https://github.com/ko-build/terraform-provider-ko) for more examples.
================================================
FILE: docs/community.md
================================================
# Community
## Meetings
We have a bi-weekly community meeting on [Wednesdays at 1:00 PM US Eastern time, 10:00 AM US Western time](https://dateful.com/eventlink/2763257725). The main goal of these meetings is that we want to hear from you! We want to know what you're using `ko` for, what you'd like to see in `ko`, how we can make `ko` better for you. With any remaining time we can go through open issues and PRs.
We have a [meeting agenda](https://ko.build/agenda) you can use to propose topics for discussion/ideas. You can also just show up and we'll figure out what to talk about.
## Slack
Come discuss `ko` with us in the `#ko-build` channel on the [Kubernetes Slack](https://ko.build/slack)!
See you there!
================================================
FILE: docs/configuration.md
================================================
# Configuration
## Basic Configuration
Aside from certain environment variables (see [below](#environment-variables-advanced)) like `KO_DOCKER_REPO`, you can
configure `ko`'s behavior using a `.ko.yaml` file. The location of this file can be overridden with `KO_CONFIG_PATH`.
### Overriding Base Images
By default, `ko` bases images on `cgr.dev/chainguard/static`. This is a
small image that provides the bare necessities to run your Go binary.
You can override this base image in two ways:
1. To override the base image for all images `ko` builds, add this line to your
`.ko.yaml` file:
```yaml
defaultBaseImage: registry.example.com/base/image
```
You can also use the `KO_DEFAULTBASEIMAGE` environment variable to set the default base image, which overrides the YAML configuration:
```shell
KO_DEFAULTBASEIMAGE=registry.example.com/base/image ko build .
```
2. To override the base image for certain importpaths:
```yaml
baseImageOverrides:
github.com/my-user/my-repo/cmd/app: registry.example.com/base/for/app
github.com/my-user/my-repo/cmd/foo: registry.example.com/base/for/foo
```
### Overriding Go build settings
By default, `ko` builds the binary with no additional build flags other than
`-trimpath`. You can replace the default build
arguments by providing build flags and ldflags using a
[GoReleaser](https://github.com/goreleaser/goreleaser) influenced `builds`
configuration section in your `.ko.yaml`.
```yaml
builds:
- id: foo
dir: . # default is .
main: ./foobar/foo
env:
- GOPRIVATE=git.internal.example.com,source.developers.google.com
flags:
- -tags
- netgo
ldflags:
- -s -w
- -extldflags "-static"
- -X main.version={{.Env.VERSION}}
- id: bar
dir: ./bar
main: . # default is .
env:
- GOCACHE=/workspace/.gocache
ldflags:
- -s
- -w
```
If your repository contains multiple modules (multiple `go.mod` files in
different directories), use the `dir` field to specify the directory where
`ko` should run `go build`.
`ko` picks the entry from `builds` based on the import path you request. The
import path is matched against the result of joining `dir` and `main`.
The paths specified in `dir` and `main` are relative to the working directory
of the `ko` process.
The `ldflags` default value is `[]`.
### Templating support
The `ko` builds supports templating of `flags` and `ldflags`, similar to the
[GoReleaser `builds` section](https://goreleaser.com/customization/build/).
The table below lists the supported template parameters.
| Template param | Description |
|-----------------------|----------------------------------------------------------|
| `Env` | Map of environment variables used for the build |
| `GoEnv` | Map of `go env` environment variables used for the build |
| `Date` | The UTC build date in RFC 3339 format |
| `Timestamp` | The UTC build date as Unix epoc seconds |
| `Git.Branch` | The current git branch |
| `Git.Tag` | The current git tag |
| `Git.ShortCommit` | The git commit short hash |
| `Git.FullCommit` | The git commit full hash |
| `Git.CommitDate` | The UTC commit date in RFC 3339 format |
| `Git.CommitTimestamp` | The UTC commit date in Unix format |
| `Git.IsDirty` | Whether or not current git state is dirty |
| `Git.IsClean` | Whether or not current git state is clean. |
| `Git.TreeState` | Either `clean` or `dirty` |
### Setting default platforms
By default, `ko` builds images based on the platform it runs on. If your target platform differs from your build platform you can specify the build platform:
**As a parameter**
See [Multi-Platform Images](./features/multi-platform.md).
**In .ko.yaml**
Add this to your `.ko.yaml` file:
```yaml
defaultPlatforms:
- linux/arm64
- linux/amd64
```
You can also use the `KO_DEFAULTPLATFORMS` environment variable to set the default platforms, which overrides the YAML configuration:
```shell
KO_DEFAULTPLATFORMS=linux/arm64,linux/amd64
```
### Setting build environment variables
By default, `ko` builds use the ambient environment from the system (i.e. `os.Environ()`).
These values can be overridden for your build.
```yaml
defaultEnv:
- FOO=foo
builds:
- id: foo
dir: .
main: ./foobar/foo
env:
- FOO=bar
- id: bar # Will use defaultEnv.
dir: ./bar
main: .
```
For a given build, the environment variables are merged in the following order:
- System `os.Environ` (lowest precedence)
- Build variables: `build.env` if specified, otherwise `defaultEnv` (highest precedence)
### Setting build flags and ldflags
You can specify both `flags` and `ldflags` globally as well as per-build.
```yaml
defaultFlags:
- -v
defaultLdflags:
- -s
builds:
- id: foo
dir: .
main: ./foobar/foo
flags:
- -trimpath
ldflags:
- -w
- id: bar # Will use defaultFlags and defaultLdflags.
dir: ./bar
main: .
```
The values for a `build` will be used if specified, otherwise their respective defaults will be used.
Both default and per-build values may use [template parameters](#templating-support).
### Environment Variables (advanced)
For ease of use, backward compatibility and advanced use cases, `ko` supports the following environment variables to
influence the build process.
| Variable | Default Value | Description |
|------------------|--------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `KO_DOCKER_REPO` | (not set) | Container repository where to push images built with `ko` (required) |
| `KO_GO_PATH` | `go` | `go` binary to use for builds, relative or absolute path, otherwise looked up via $PATH (optional) |
| `KO_CONFIG_PATH` | `./.ko.yaml` | Path to `ko` configuration file (optional) |
| `KOCACHE` | (not set) | This tells `ko` to store a local mapping between the `go build` inputs to the image layer that they produce, so `go build` can be skipped entirely if the layer is already present in the image registry (optional). |
## Naming Images
`ko` provides a few different strategies for naming the image it pushes, to
workaround certain registry limitations and user preferences:
Given `KO_DOCKER_REPO=registry.example.com/repo`, by default,
`ko build ./cmd/app` will produce an image named like
`registry.example.com/repo/app-<md5>`, which includes the MD5 hash of the full
import path, to avoid collisions.
- `--preserve-import-paths` (`-P`) will include the entire importpath:
`registry.example.com/repo/github.com/my-user/my-repo/cmd/app`
- `--base-import-paths` (`-B`) will omit the MD5 portion:
`registry.example.com/repo/app`
- `--bare` will only include the `KO_DOCKER_REPO`: `registry.example.com/repo`
## Local Publishing Options
`ko` is normally used to publish images to container image registries,
identified by `KO_DOCKER_REPO`.
`ko` can also load images to a local Docker daemon, if available, by setting
`KO_DOCKER_REPO=ko.local`, or by passing the `--local` (`-L`) flag.
Local images can be used as a base image for other `ko` images:
```yaml
defaultBaseImage: ko.local/example/base/image
```
`ko` can also load images into a local [KinD](https://kind.sigs.k8s.io)
cluster, if available, by setting `KO_DOCKER_REPO=kind.local`. By default this
loads into the default KinD cluster name (`kind`). To load into another KinD
cluster, set `KIND_CLUSTER_NAME=my-other-cluster`.
================================================
FILE: docs/custom/main.html
================================================
{% extends "base.html" %}
{% block site_meta %}
{{ super() }}
{% if page and page.meta and page.meta.ko_meta %}
<meta charset=utf-8>
<meta name=go-import content="ko.build git https://github.com/ko-build/ko">
<meta name=go-source content="ko.build git https://github.com/ko-build/ko https://github.com/ko-build/ko/tree/main{/dir} https://github.com/ko-build/ko/blob/main{/dir}/{file}#L{line}">
{% endif %}
{% endblock %}
================================================
FILE: docs/custom/partials/copyright.html
================================================
<small>The Linux Foundation® (TLF) has registered trademarks and uses trademarks. For a list of TLF trademarks, see <a href="https://www.linuxfoundation.org/legal/trademark-usage" window="_blank">Trademark Usage</a></small>
================================================
FILE: docs/deployment.md
================================================
# Deployment
_See [Kubernetes Integration](../features/k8s) for information about deploying to Kubernetes._
Because the output of `ko build` is an image reference, you can easily pass it to other tools that expect to take an image reference.
### [`docker run`](https://docs.docker.com/engine/reference/run/)
To run the container locally:
```plaintext
docker run -p 8080:8080 $(ko build ./cmd/app)
```
---
### [Google Cloud Run](https://cloud.google.com/run)
```plaintext
gcloud run deploy --image=$(ko build ./cmd/app)
```
> 💡 **Note:** The image must be pushed to [Google Container Registry](https://cloud.google.com/container-registry) or [Artifact Registry](https://cloud.google.com/artifact-registry).
---
### [fly.io](https://fly.io)
```plaintext
flyctl launch --image=$(ko build ./cmd/app)
```
> 💡 **Note:** The image must be pushed to Fly.io's container registry at `registry.fly.io`, or if not, the image must be publicly available. When pushing to `registry.fly.io`, you must first log in with [`flyctl auth docker`](https://fly.io/docs/flyctl/auth-docker/).
---
### [AWS Lambda](https://aws.amazon.com/lambda/)
```plaintext
aws lambda update-function-code \
--function-name=my-function-name \
--image-uri=$(ko build ./cmd/app)
```
> 💡 **Note:** The image must be pushed to [ECR](https://aws.amazon.com/ecr/), based on the AWS provided base image, and use the [`aws-lambda-go`](https://github.com/aws/aws-lambda-go) framework.
See [official docs](https://docs.aws.amazon.com/lambda/latest/dg/go-image.html) for more information.
---
### [Azure Container Apps](https://azure.microsoft.com/services/container-apps/)
```plaintext
az containerapp update \
--name my-container-app
--resource-group my-resource-group
--image $(ko build ./cmd/app)
```
> 💡 **Note:** The image must be pushed to [ACR](https://azure.microsoft.com/services/container-registry/) or other registry service.
See [official docs](https://docs.microsoft.com/azure/container-apps/) for more information.
================================================
FILE: docs/features/build-cache.md
================================================
# Build Cache
Because `ko` just runs `go build` in your normal development environment, it automatically reuses your [`go build` cache](https://pkg.go.dev/cmd/go#hdr-Build_and_test_caching) from previous builds, making iterative development faster.
`ko` also avoids pushing blobs to the remote image registry if they're already present, making pushes faster.
You can make `ko` even faster by setting the `KOCACHE` environment variable.
This tells `ko` to store a local mapping between the `go build` inputs to the image layer that they produce, so `go build` can be skipped entirely if the layer is already present in the image registry.
================================================
FILE: docs/features/debugging.md
================================================
# Debugging
Sometimes it's challenging to track down the cause of unexpected behavior in an app. Because `ko` makes it simple to make tweaks to your app and immediately rebuild your image, it's possible to iteratively explore various aspects of your app, such as by adding log lines that print variable values.
But to help you solve the problem _as fast as possible_, `ko` supports debugging your Go app with [delve](https://github.com/go-delve/delve).
To use this feature, just add the `--debug` flag to your `ko build` command. This adjusts how the image is built:
- It installs `delve` in the image (in addition to your own app).
- It sets the image's `ENTRYPOINT` to a `delve exec ...` command that runs the Go app in debug-mode, listening on port `40000` for a debugger client.
- It ensures your compiled Go app includes debug symbols needed to enable debugging.
**Note:** This feature is geared toward development workflows. It **should not** be used in production.
### How it works
Build the image using the debug feature.
```plaintext
ko build . --debug
```
Run the container, ensuring that the debug port (`40000`) is exposed to allow clients to connect to it.
```plaintext
docker run -p 40000:40000 <img>
```
This sets up your app to be waiting to run the command you've specified. All that's needed now is to connect your debugger client to the running container!
================================================
FILE: docs/features/k8s.md
================================================
# Kubernetes Integration
You _could_ stop at just building and pushing images.
But, because building images is so _easy_ with `ko`, and because building with
`ko` only requires a string importpath to identify the image, we can integrate
this with YAML generation to make Kubernetes use cases much simpler.
## YAML Changes
Traditionally, you might have a Kubernetes deployment, defined in a YAML file,
that runs an image:
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: registry.example.com/my-app:v1.2.3
```
...which you apply to your cluster with `kubectl apply`:
```plaintext
kubectl apply -f deployment.yaml
```
With `ko`, you can instead reference your Go binary by its importpath, prefixed
with `ko://`:
```yaml
...
spec:
containers:
- name: my-app
image: ko://github.com/my-user/my-repo/cmd/app
```
## `ko resolve`
With this small change, running `ko resolve -f deployment.yaml` will instruct
`ko` to:
1. scan the YAML file(s) for values with the `ko://` prefix,
2. for each unique `ko://`-prefixed string, execute `ko build <importpath>` to
build and push an image,
3. replace `ko://`-prefixed string(s) in the input YAML with the fully-specified
image reference of the built image(s), as above.
4. Print the resulting resolved YAML to stdout.
The result can be redirected to a file, to distribute to others:
```plaintext
ko resolve -f config/ > release.yaml
```
Taken together, `ko resolve` aims to make packaging, pushing, and referencing
container images an invisible implementation detail of your Kubernetes
deployment, and let you focus on writing code in Go.
## `ko apply`
To apply the resulting resolved YAML config, you can redirect the output of
`ko resolve` to `kubectl apply`:
```plaintext
ko resolve -f config/ | kubectl apply -f -
```
Since this is a relatively common use case, the same functionality is available
using `ko apply`:
```plaintext
ko apply -f config/
```
Also, any flags passed after `--` are passed to `kubectl apply` directly, for example to specify context and kubeconfig:
```
ko apply -f config -- --context=foo --kubeconfig=cfg.yaml
```
**NB:** This requires that `kubectl` is available.
## `ko delete`
To teardown resources applied using `ko apply`, you can run `ko delete`:
```plaintext
ko delete -f config/
```
This is purely a convenient alias for `kubectl delete`, and doesn't perform any
builds, or delete any previously built images.
================================================
FILE: docs/features/multi-platform.md
================================================
# Multi-Platform Images
Because Go supports cross-compilation to other CPU architectures and operating systems, `ko` excels at producing multi-platform images.
To build and push an image for all platforms supported by the configured base image, simply add `--platform=all`.
This will instruct `ko` to look up all the supported platforms in the base image, execute `GOOS=<os> GOARCH=<arch> GOARM=<variant> go build` for each platform, and produce a manifest list containing an image for each platform.
You can also select specific platforms, for example, `--platform=linux/amd64,linux/arm64`.
`ko` also has experimental support for building for Windows images.
See [FAQ](../../advanced/faq#can-i-build-windows-containers).
================================================
FILE: docs/features/sboms.md
================================================
# SBOMs
A [Software Bill of Materials (SBOM)](https://en.wikipedia.org/wiki/Software_bill_of_materials) is a list of software components that a software artifact depends on.
Having a list of dependencies can be helpful in determining whether any vulnerable components were used to build the software artifact.
**From v0.9+, `ko` generates and uploads an SBOM for every image it produces by default.**
ko will generate an SBOM in the [SPDX](https://spdx.dev/) format by default. To disable SBOM generation, pass `--sbom=none`.
These SBOMs can be downloaded using the [`cosign download sbom`](https://github.com/sigstore/cosign/blob/main/doc/cosign_download_sbom.md) command.
================================================
FILE: docs/features/static-assets.md
================================================
# Static Assets
`ko` can also bundle static assets into the images it produces.
By convention, any contents of a directory named `<importpath>/kodata/` will be
bundled into the image, and the path where it's available in the image will be
identified by the environment variable `KO_DATA_PATH`.
As an example, you can bundle and serve static contents in your image:
```
cmd/
app/
main.go
kodata/
favicon.ico
index.html
```
Then, in your `main.go`:
```go
func main() {
http.Handle("/", http.FileServer(http.Dir(os.Getenv("KO_DATA_PATH"))))
log.Fatal(http.ListenAndServe(":8080", nil))
}
```
You can simulate `ko`'s behavior outside of the container image by setting the
`KO_DATA_PATH` environment variable yourself with `KO_DATA_PATH=cmd/app/kodata/ go run ./cmd/app`.
> 💡 **Tip:** Symlinks in `kodata` are followed and included as well. For example,
you can include Git commit information in your image with `ln -s -r .git/HEAD ./cmd/app/kodata/`
Also note that `http.FileServer` will not serve the `Last-Modified` header
(or validate `If-Modified-Since` request headers) because `ko` does not embed
timestamps by default.
This can be supported by manually setting the `KO_DATA_DATE_EPOCH` environment
variable during build ([See FAQ](../../advanced/faq#why-are-my-images-all-created-in-1970)).
================================================
FILE: docs/get-started.md
================================================
# Get Started
## Setup
First, [install `ko`](../install).
### Authenticate
`ko` depends on the authentication configured in your Docker config (typically `~/.docker/config.json`).
✨ **If you can push an image with `docker push`, you are already authenticated for `ko`!** ✨
Since `ko` doesn't require `docker`, `ko login` also provides a surface for logging in to a container image registry with a username and password, similar to [`docker login`](https://docs.docker.com/engine/reference/commandline/login/).
Additionally, even if auth is not configured in the Docker config, `ko` includes built-in support for authenticating to the following container registries using credentials configured in the environment:
- Google Container Registry and Artifact Registry, using [Application Default Credentials](https://cloud.google.com/docs/authentication/production) or auth configured in `gcloud`.
- Amazon Elastic Container Registry, using [AWS credentials](https://github.com/awslabs/amazon-ecr-credential-helper/#aws-credentials)
- Azure Container Registry, using [environment variables](https://github.com/chrismellard/docker-credential-acr-env/)
- GitHub Container Registry, using the `GITHUB_TOKEN` environment variable
### Choose Destination
`ko` depends on an environment variable, `KO_DOCKER_REPO`, to identify where it should push images that it builds. Typically this will be a remote registry, e.g.:
- `KO_DOCKER_REPO=gcr.io/my-project`, or
- `KO_DOCKER_REPO=ghcr.io/my-org/my-repo`, or
- `KO_DOCKER_REPO=my-dockerhub-user`
## Build an Image
`ko build ./cmd/app` builds and pushes a container image, and prints the resulting image digest to stdout.
In this example, `./cmd/app` must be a `package main` that defines `func main()`.
```plaintext
$ ko build ./cmd/app
...
registry.example.com/my-project/app-099ba5bcefdead87f92606265fb99ac0@sha256:6e398316742b7aa4a93161dce4a23bc5c545700b862b43347b941000b112ec3e
```
> 💡 **Note**: Prior to v0.10, the command was called `ko publish` -- this is equivalent to `ko build`, and both commands will work and do the same thing.
The executable binary that was built from `./cmd/app` is available in the image at `/ko-app/app` -- the binary name matches the base import path name -- and that binary is the image's entrypoint.
================================================
FILE: docs/index.md
================================================
---
ko_meta: true
---
# Introduction
`ko` makes building Go container images easy, fast, and secure by default.

`ko` is a simple, fast container image builder for Go applications.
It's ideal for use cases where your image contains a single Go application without many dependencies on the OS base image (e.g., no cgo, no OS package dependencies).
`ko` builds images by executing `go build` on your local machine, and as such doesn't require `docker` to be installed.
This can make it a good fit for lightweight CI/CD use cases.
`ko` makes [multi-platform builds](https://ko.build/features/multi-platform/) easy, produces [SBOMs](https://ko.build/features/sboms/) by default, and includes support for simple YAML templating which makes it a powerful tool for [Kubernetes applications](https://ko.build/features/k8s/).
---
> 🏃 [Install `ko`](./install) and [get started](./get-started)!
---
`ko` is used and loved by these open source projects:
- [Knative](https://knative.dev)
- [Tekton](https://tekton.dev)
- [Karpenter](https://karpenter.sh)
- [Kyverno](https://kyverno.io)
- [Sigstore](https://sigstore.dev)
- [Shipwright](https://shipwright.io)
- [Capsule](https://capsule.clastix.io/)
- [CloudScript](https://cloudscript.com.br/)
- [Kamaji](https://kamaji.clastix.io/)
[_Add your project here!_](https://github.com/ko-build/ko/edit/main/docs/index.md)
---
`ko` is a Cloud Native Computing Foundation Sandbox project.
<a href="https://cncf.io">
<img width=300 src="./images/cncf-light.svg#only-light" alt="CNCF logo" />
<img width=300 src="./images/cncf-dark.svg#only-dark" alt="CNCF logo" />
</a>
================================================
FILE: docs/install.md
================================================
# Installation
### Install from [GitHub Releases](https://github.com/ko-build/ko/releases)
```
$ VERSION=TODO # choose the latest version (without v prefix)
$ OS=Linux # or Darwin
$ ARCH=x86_64 # or arm64, i386, s390x
```
We generate [SLSA3 provenance](https://slsa.dev) using the OpenSSF's [slsa-framework/slsa-github-generator](https://github.com/slsa-framework/slsa-github-generator). To verify our release, install the verification tool from [slsa-framework/slsa-verifier#installation](https://github.com/slsa-framework/slsa-verifier#installation) and verify as follows:
```shell
$ curl -sSfL "https://github.com/ko-build/ko/releases/download/v${VERSION}/ko_${VERSION}_${OS}_${ARCH}.tar.gz" > ko.tar.gz
$ curl -sSfL https://github.com/ko-build/ko/releases/download/v${VERSION}/multiple.intoto.jsonl > multiple.intoto.jsonl
$ slsa-verifier verify-artifact --provenance-path multiple.intoto.jsonl --source-uri github.com/ko-build/ko --source-tag "v${VERSION}" ko.tar.gz
Verified signature against tlog entry index 24413745 at URL: https://rekor.sigstore.dev/api/v1/log/entries/24296fb24b8ad77ab97a5263b5fa8f35789618348a39358b1f9470b0c31045effbbe5e23e77a5836
Verified build using builder "https://github.com/slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@refs/tags/v1.7.0" at commit 200db7243f02b5c0303e21d8ab8e3b4ad3a229d0
Verifying artifact /Users/batuhanapaydin/workspace/ko/ko.tar.gz: PASSED
PASSED: Verified SLSA provenance
```
```shell
$ tar xzf ko.tar.gz ko
$ chmod +x ./ko
```
### Install using [Homebrew](https://brew.sh)
```plaintext
brew install ko
```
### Install using [MacPorts](https://www.macports.org)
```plaintext
sudo port install ko
```
More info [here](https://ports.macports.org/port/ko/)
### Install on Windows using [Scoop](https://scoop.sh)
```plaintext
scoop install ko
```
### Install on [Alpine Linux](https://www.alpinelinux.org)
Installation on Alpine requires using the [`testing` repository](https://wiki.alpinelinux.org/wiki/Enable_Community_Repository#Using_testing_repositories)
```
echo https://dl-cdn.alpinelinux.org/alpine/edge/testing/ >> /etc/apk/repositories
apk update
apk add ko
```
### Build and Install from source
With Go 1.16+, build and install the latest released version:
```plaintext
go install github.com/google/ko@latest
```
### Setup on GitHub Actions
You can use the [setup-ko](https://github.com/ko-build/setup-ko) action to install ko and setup auth to [GitHub Container Registry](https://github.com/features/packages) in a GitHub Action workflow:
```plaintext
steps:
- uses: ko-build/setup-ko@v0.6
```
================================================
FILE: docs/reference/ko.md
================================================
## ko
Rapidly iterate with Go, Containers, and Kubernetes.
```
ko [flags]
```
### Options
```
-h, --help help for ko
-v, --verbose Enable debug logs
```
### SEE ALSO
* [ko apply](ko_apply.md) - Apply the input files with image references resolved to built/pushed image digests.
* [ko build](ko_build.md) - Build and publish container images from the given importpaths.
* [ko create](ko_create.md) - Create the input files with image references resolved to built/pushed image digests.
* [ko delete](ko_delete.md) - See "kubectl help delete" for detailed usage.
* [ko login](ko_login.md) - Log in to a registry
* [ko resolve](ko_resolve.md) - Print the input files with image references resolved to built/pushed image digests.
* [ko run](ko_run.md) - A variant of `kubectl run` that containerizes IMPORTPATH first.
* [ko version](ko_version.md) - Print ko version.
================================================
FILE: docs/reference/ko_apply.md
================================================
## ko apply
Apply the input files with image references resolved to built/pushed image digests.
### Synopsis
This sub-command finds import path references within the provided files, builds them into Go binaries, containerizes them, publishes them, and then feeds the resulting yaml into "kubectl apply".
```
ko apply -f FILENAME [flags]
```
### Examples
```
# Build and publish import path references to a Docker
# Registry as:
# ${KO_DOCKER_REPO}/<package name>-<hash of import path>
# Then, feed the resulting yaml into "kubectl apply".
# When KO_DOCKER_REPO is ko.local, it is the same as if
# --local was passed.
ko apply -f config/
# Build and publish import path references to a Docker
# Registry preserving import path names as:
# ${KO_DOCKER_REPO}/<import path>
# Then, feed the resulting yaml into "kubectl apply".
ko apply --preserve-import-paths -f config/
# Build and publish import path references to a Docker
# daemon as:
# ko.local/<import path>
# Then, feed the resulting yaml into "kubectl apply".
ko apply --local -f config/
# Apply from stdin:
cat config.yaml | ko apply -f -
# Any flags passed after '--' are passed to 'kubectl apply' directly:
ko apply -f config -- --namespace=foo --kubeconfig=cfg.yaml
```
### Options
```
--bare Whether to just use KO_DOCKER_REPO without additional context (may not work properly with --tags).
-B, --base-import-paths Whether to use the base path without MD5 hash after KO_DOCKER_REPO (may not work properly with --tags).
--debug Include Delve debugger into image and wrap around ko-app. This debugger will listen to port 40000.
--disable-optimizations Disable optimizations when building Go code. Useful when you want to interactively debug the created container.
-f, --filename strings Filename, directory, or URL to files to use to create the resource
-h, --help help for apply
--image-annotation strings Which annotations (key=value[,key=value]) to add to the OCI manifest.
--image-label strings Which labels (key=value[,key=value]) to add to the image.
--image-refs string Path to file where a list of the published image references will be written.
--image-user string The default user the image should be run as.
--insecure-registry Whether to skip TLS verification on the registry
-j, --jobs int The maximum number of concurrent builds (default GOMAXPROCS)
-L, --local Load into images to local docker daemon.
--oci-layout-path string Path to save the OCI image layout of the built images
--platform strings Which platform to use when pulling a multi-platform base. Format: all | <os>[/<arch>[/<variant>]][,platform]*
-P, --preserve-import-paths Whether to preserve the full import path after KO_DOCKER_REPO.
--push Push images to KO_DOCKER_REPO (default true)
-R, --recursive Process the directory used in -f, --filename recursively. Useful when you want to manage related manifests organized within the same directory.
--sbom string The SBOM media type to use (none will disable SBOM synthesis and upload). (default "spdx")
--sbom-dir string Path to file where the SBOM will be written.
-l, --selector string Selector (label query) to filter on, supports '=', '==', and '!='.(e.g. -l key1=value1,key2=value2)
--tag-only Include tags but not digests in resolved image references. Useful when digests are not preserved when images are repopulated.
-t, --tags strings Which tags to use for the produced image instead of the default 'latest' tag (may not work properly with --base-import-paths or --bare). (default [latest])
--tarball string File to save images tarballs
```
### Options inherited from parent commands
```
-v, --verbose Enable debug logs
```
### SEE ALSO
* [ko](ko.md) - Rapidly iterate with Go, Containers, and Kubernetes.
================================================
FILE: docs/reference/ko_build.md
================================================
## ko build
Build and publish container images from the given importpaths.
### Synopsis
This sub-command builds the provided import paths into Go binaries, containerizes them, and publishes them.
```
ko build IMPORTPATH... [flags]
```
### Examples
```
# Build and publish import path references to a Docker Registry as:
# ${KO_DOCKER_REPO}/<package name>-<hash of import path>
# When KO_DOCKER_REPO is ko.local, it is the same as if --local and
# --preserve-import-paths were passed.
# If the import path is not provided, the current working directory is the
# default.
ko build github.com/foo/bar/cmd/baz github.com/foo/bar/cmd/blah
# Build and publish a relative import path as:
# ${KO_DOCKER_REPO}/<package name>-<hash of import path>
# When KO_DOCKER_REPO is ko.local, it is the same as if --local and
# --preserve-import-paths were passed.
ko build ./cmd/blah
# Build and publish a relative import path as:
# ${KO_DOCKER_REPO}/<import path>
# When KO_DOCKER_REPO is ko.local, it is the same as if --local was passed.
ko build --preserve-import-paths ./cmd/blah
# Build and publish import path references to a Docker daemon as:
# ko.local/<import path>
# This always preserves import paths.
ko build --local github.com/foo/bar/cmd/baz github.com/foo/bar/cmd/blah
```
### Options
```
--bare Whether to just use KO_DOCKER_REPO without additional context (may not work properly with --tags).
-B, --base-import-paths Whether to use the base path without MD5 hash after KO_DOCKER_REPO (may not work properly with --tags).
--debug Include Delve debugger into image and wrap around ko-app. This debugger will listen to port 40000.
--disable-optimizations Disable optimizations when building Go code. Useful when you want to interactively debug the created container.
-h, --help help for build
--image-annotation strings Which annotations (key=value[,key=value]) to add to the OCI manifest.
--image-label strings Which labels (key=value[,key=value]) to add to the image.
--image-refs string Path to file where a list of the published image references will be written.
--image-user string The default user the image should be run as.
--insecure-registry Whether to skip TLS verification on the registry
-j, --jobs int The maximum number of concurrent builds (default GOMAXPROCS)
-L, --local Load into images to local docker daemon.
--oci-layout-path string Path to save the OCI image layout of the built images
--platform strings Which platform to use when pulling a multi-platform base. Format: all | <os>[/<arch>[/<variant>]][,platform]*
-P, --preserve-import-paths Whether to preserve the full import path after KO_DOCKER_REPO.
--push Push images to KO_DOCKER_REPO (default true)
--sbom string The SBOM media type to use (none will disable SBOM synthesis and upload). (default "spdx")
--sbom-dir string Path to file where the SBOM will be written.
--tag-only Include tags but not digests in resolved image references. Useful when digests are not preserved when images are repopulated.
-t, --tags strings Which tags to use for the produced image instead of the default 'latest' tag (may not work properly with --base-import-paths or --bare). (default [latest])
--tarball string File to save images tarballs
```
### Options inherited from parent commands
```
-v, --verbose Enable debug logs
```
### SEE ALSO
* [ko](ko.md) - Rapidly iterate with Go, Containers, and Kubernetes.
================================================
FILE: docs/reference/ko_create.md
================================================
## ko create
Create the input files with image references resolved to built/pushed image digests.
### Synopsis
This sub-command finds import path references within the provided files, builds them into Go binaries, containerizes them, publishes them, and then feeds the resulting yaml into "kubectl create".
```
ko create -f FILENAME [flags]
```
### Examples
```
# Build and publish import path references to a Docker
# Registry as:
# ${KO_DOCKER_REPO}/<package name>-<hash of import path>
# Then, feed the resulting yaml into "kubectl create".
# When KO_DOCKER_REPO is ko.local, it is the same as if
# --local was passed.
ko create -f config/
# Build and publish import path references to a Docker
# Registry preserving import path names as:
# ${KO_DOCKER_REPO}/<import path>
# Then, feed the resulting yaml into "kubectl create".
ko create --preserve-import-paths -f config/
# Build and publish import path references to a Docker
# daemon as:
# ko.local/<import path>
# Then, feed the resulting yaml into "kubectl create".
ko create --local -f config/
# Create from stdin:
cat config.yaml | ko create -f -
# Any flags passed after '--' are passed to 'kubectl apply' directly:
ko apply -f config -- --namespace=foo --kubeconfig=cfg.yaml
```
### Options
```
--bare Whether to just use KO_DOCKER_REPO without additional context (may not work properly with --tags).
-B, --base-import-paths Whether to use the base path without MD5 hash after KO_DOCKER_REPO (may not work properly with --tags).
--debug Include Delve debugger into image and wrap around ko-app. This debugger will listen to port 40000.
--disable-optimizations Disable optimizations when building Go code. Useful when you want to interactively debug the created container.
-f, --filename strings Filename, directory, or URL to files to use to create the resource
-h, --help help for create
--image-annotation strings Which annotations (key=value[,key=value]) to add to the OCI manifest.
--image-label strings Which labels (key=value[,key=value]) to add to the image.
--image-refs string Path to file where a list of the published image references will be written.
--image-user string The default user the image should be run as.
--insecure-registry Whether to skip TLS verification on the registry
-j, --jobs int The maximum number of concurrent builds (default GOMAXPROCS)
-L, --local Load into images to local docker daemon.
--oci-layout-path string Path to save the OCI image layout of the built images
--platform strings Which platform to use when pulling a multi-platform base. Format: all | <os>[/<arch>[/<variant>]][,platform]*
-P, --preserve-import-paths Whether to preserve the full import path after KO_DOCKER_REPO.
--push Push images to KO_DOCKER_REPO (default true)
-R, --recursive Process the directory used in -f, --filename recursively. Useful when you want to manage related manifests organized within the same directory.
--sbom string The SBOM media type to use (none will disable SBOM synthesis and upload). (default "spdx")
--sbom-dir string Path to file where the SBOM will be written.
-l, --selector string Selector (label query) to filter on, supports '=', '==', and '!='.(e.g. -l key1=value1,key2=value2)
--tag-only Include tags but not digests in resolved image references. Useful when digests are not preserved when images are repopulated.
-t, --tags strings Which tags to use for the produced image instead of the default 'latest' tag (may not work properly with --base-import-paths or --bare). (default [latest])
--tarball string File to save images tarballs
```
### Options inherited from parent commands
```
-v, --verbose Enable debug logs
```
### SEE ALSO
* [ko](ko.md) - Rapidly iterate with Go, Containers, and Kubernetes.
================================================
FILE: docs/reference/ko_delete.md
================================================
## ko delete
See "kubectl help delete" for detailed usage.
```
ko delete [flags]
```
### Options
```
-h, --help help for delete
```
### Options inherited from parent commands
```
-v, --verbose Enable debug logs
```
### SEE ALSO
* [ko](ko.md) - Rapidly iterate with Go, Containers, and Kubernetes.
================================================
FILE: docs/reference/ko_login.md
================================================
## ko login
Log in to a registry
```
ko login [OPTIONS] [SERVER] [flags]
```
### Examples
```
# Log in to reg.example.com
ko login reg.example.com -u AzureDiamond -p hunter2
```
### Options
```
-h, --help help for login
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
```
### Options inherited from parent commands
```
-v, --verbose Enable debug logs
```
### SEE ALSO
* [ko](ko.md) - Rapidly iterate with Go, Containers, and Kubernetes.
================================================
FILE: docs/reference/ko_resolve.md
================================================
## ko resolve
Print the input files with image references resolved to built/pushed image digests.
### Synopsis
This sub-command finds import path references within the provided files, builds them into Go binaries, containerizes them, publishes them, and prints the resulting yaml.
```
ko resolve -f FILENAME [flags]
```
### Examples
```
# Build and publish import path references to a Docker
# Registry as:
# ${KO_DOCKER_REPO}/<package name>-<hash of import path>
# When KO_DOCKER_REPO is ko.local, it is the same as if
# --local and --preserve-import-paths were passed.
ko resolve -f config/
# Build and publish import path references to a Docker
# Registry preserving import path names as:
# ${KO_DOCKER_REPO}/<import path>
# When KO_DOCKER_REPO is ko.local, it is the same as if
# --local was passed.
ko resolve --preserve-import-paths -f config/
# Build and publish import path references to a Docker
# daemon as:
# ko.local/<import path>
# This always preserves import paths.
ko resolve --local -f config/
```
### Options
```
--bare Whether to just use KO_DOCKER_REPO without additional context (may not work properly with --tags).
-B, --base-import-paths Whether to use the base path without MD5 hash after KO_DOCKER_REPO (may not work properly with --tags).
--debug Include Delve debugger into image and wrap around ko-app. This debugger will listen to port 40000.
--disable-optimizations Disable optimizations when building Go code. Useful when you want to interactively debug the created container.
-f, --filename strings Filename, directory, or URL to files to use to create the resource
-h, --help help for resolve
--image-annotation strings Which annotations (key=value[,key=value]) to add to the OCI manifest.
--image-label strings Which labels (key=value[,key=value]) to add to the image.
--image-refs string Path to file where a list of the published image references will be written.
--image-user string The default user the image should be run as.
--insecure-registry Whether to skip TLS verification on the registry
-j, --jobs int The maximum number of concurrent builds (default GOMAXPROCS)
-L, --local Load into images to local docker daemon.
--oci-layout-path string Path to save the OCI image layout of the built images
--platform strings Which platform to use when pulling a multi-platform base. Format: all | <os>[/<arch>[/<variant>]][,platform]*
-P, --preserve-import-paths Whether to preserve the full import path after KO_DOCKER_REPO.
--push Push images to KO_DOCKER_REPO (default true)
-R, --recursive Process the directory used in -f, --filename recursively. Useful when you want to manage related manifests organized within the same directory.
--sbom string The SBOM media type to use (none will disable SBOM synthesis and upload). (default "spdx")
--sbom-dir string Path to file where the SBOM will be written.
-l, --selector string Selector (label query) to filter on, supports '=', '==', and '!='.(e.g. -l key1=value1,key2=value2)
--tag-only Include tags but not digests in resolved image references. Useful when digests are not preserved when images are repopulated.
-t, --tags strings Which tags to use for the produced image instead of the default 'latest' tag (may not work properly with --base-import-paths or --bare). (default [latest])
--tarball string File to save images tarballs
```
### Options inherited from parent commands
```
-v, --verbose Enable debug logs
```
### SEE ALSO
* [ko](ko.md) - Rapidly iterate with Go, Containers, and Kubernetes.
================================================
FILE: docs/reference/ko_run.md
================================================
## ko run
A variant of `kubectl run` that containerizes IMPORTPATH first.
### Synopsis
This sub-command combines "ko build" and "kubectl run" to support containerizing and running Go binaries on Kubernetes in a single command.
```
ko run IMPORTPATH [flags]
```
### Examples
```
# Publish the image and run it on Kubernetes as:
# ${KO_DOCKER_REPO}/<package name>-<hash of import path>
# When KO_DOCKER_REPO is ko.local, it is the same as if
# --local and --preserve-import-paths were passed.
ko run github.com/foo/bar/cmd/baz
# This supports relative import paths as well.
ko run ./cmd/baz
# You can also supply args and flags to the command.
ko run ./cmd/baz -- -v arg1 arg2 --yes
```
### Options
```
--bare Whether to just use KO_DOCKER_REPO without additional context (may not work properly with --tags).
-B, --base-import-paths Whether to use the base path without MD5 hash after KO_DOCKER_REPO (may not work properly with --tags).
--debug Include Delve debugger into image and wrap around ko-app. This debugger will listen to port 40000.
--disable-optimizations Disable optimizations when building Go code. Useful when you want to interactively debug the created container.
-h, --help help for run
--image-annotation strings Which annotations (key=value[,key=value]) to add to the OCI manifest.
--image-label strings Which labels (key=value[,key=value]) to add to the image.
--image-refs string Path to file where a list of the published image references will be written.
--image-user string The default user the image should be run as.
--insecure-registry Whether to skip TLS verification on the registry
-j, --jobs int The maximum number of concurrent builds (default GOMAXPROCS)
-L, --local Load into images to local docker daemon.
--oci-layout-path string Path to save the OCI image layout of the built images
--platform strings Which platform to use when pulling a multi-platform base. Format: all | <os>[/<arch>[/<variant>]][,platform]*
-P, --preserve-import-paths Whether to preserve the full import path after KO_DOCKER_REPO.
--push Push images to KO_DOCKER_REPO (default true)
--sbom string The SBOM media type to use (none will disable SBOM synthesis and upload). (default "spdx")
--sbom-dir string Path to file where the SBOM will be written.
--tag-only Include tags but not digests in resolved image references. Useful when digests are not preserved when images are repopulated.
-t, --tags strings Which tags to use for the produced image instead of the default 'latest' tag (may not work properly with --base-import-paths or --bare). (default [latest])
--tarball string File to save images tarballs
```
### Options inherited from parent commands
```
-v, --verbose Enable debug logs
```
### SEE ALSO
* [ko](ko.md) - Rapidly iterate with Go, Containers, and Kubernetes.
================================================
FILE: docs/reference/ko_version.md
================================================
## ko version
Print ko version.
```
ko version [flags]
```
### Options
```
-h, --help help for version
```
### Options inherited from parent commands
```
-v, --verbose Enable debug logs
```
### SEE ALSO
* [ko](ko.md) - Rapidly iterate with Go, Containers, and Kubernetes.
================================================
FILE: go.mod
================================================
module github.com/google/ko
go 1.25.7
require (
github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.12.0
github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589
github.com/dprotaso/go-yit v0.0.0-20260209000607-dfb86291624d
github.com/go-training/helloworld v0.0.0-20200225145412-ba5f4379d78b
github.com/go-viper/mapstructure/v2 v2.5.0
github.com/google/go-cmp v0.7.0
github.com/google/go-containerregistry v0.21.3
github.com/moby/moby/api v1.54.0
github.com/moby/moby/client v0.3.0
github.com/opencontainers/image-spec v1.1.1
github.com/sigstore/cosign/v3 v3.0.5
github.com/spf13/cobra v1.10.2
github.com/spf13/viper v1.21.0
github.com/stretchr/testify v1.11.1
go.uber.org/automaxprocs v1.6.0
go.yaml.in/yaml/v4 v4.0.0-rc.4
golang.org/x/sync v0.20.0
golang.org/x/tools v0.43.0
k8s.io/apimachinery v0.35.3
sigs.k8s.io/kind v0.31.0
)
require (
al.essio.dev/pkg/shellescape v1.6.0 // indirect
cloud.google.com/go/compute/metadata v0.9.0 // indirect
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect
github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect
github.com/Azure/go-autorest v14.2.0+incompatible // indirect
github.com/Azure/go-autorest/autorest v0.11.30 // indirect
github.com/Azure/go-autorest/autorest/adal v0.9.24 // indirect
github.com/Azure/go-autorest/autorest/azure/auth v0.5.13 // indirect
github.com/Azure/go-autorest/autorest/azure/cli v0.4.7 // indirect
github.com/Azure/go-autorest/autorest/date v0.3.1 // indirect
github.com/Azure/go-autorest/logger v0.2.2 // indirect
github.com/Azure/go-autorest/tracing v0.6.1 // indirect
github.com/BurntSushi/toml v1.6.0 // indirect
github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
github.com/aws/aws-sdk-go-v2 v1.41.3 // indirect
github.com/aws/aws-sdk-go-v2/config v1.32.11 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.19.11 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.19 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.19 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.19 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.5 // indirect
github.com/aws/aws-sdk-go-v2/service/ecr v1.56.0 // indirect
github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.38.11 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.6 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.19 // indirect
github.com/aws/aws-sdk-go-v2/service/signin v1.0.7 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.30.12 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.16 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.41.8 // indirect
github.com/aws/smithy-go v1.24.2 // indirect
github.com/blang/semver v3.5.1+incompatible // indirect
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/containerd/errdefs v1.0.0 // indirect
github.com/containerd/errdefs/pkg v0.3.0 // indirect
github.com/containerd/stargz-snapshotter/estargz v0.18.2 // indirect
github.com/coreos/go-oidc/v3 v3.17.0 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect
github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/digitorus/pkcs7 v0.0.0-20250730155240-ffadbf3f398c // indirect
github.com/digitorus/timestamp v0.0.0-20250524132541-c45532741eea // indirect
github.com/dimchansky/utfbom v1.1.1 // indirect
github.com/distribution/reference v0.6.0 // indirect
github.com/docker/cli v29.3.0+incompatible // indirect
github.com/docker/distribution v2.8.3+incompatible // indirect
github.com/docker/docker-credential-helpers v0.9.5 // indirect
github.com/docker/go-connections v0.6.0 // indirect
github.com/docker/go-units v0.5.0 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/evanphx/json-patch/v5 v5.9.11 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fsnotify/fsnotify v1.9.0 // indirect
github.com/go-jose/go-jose/v4 v4.1.3 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/analysis v0.24.3 // indirect
github.com/go-openapi/errors v0.22.7 // indirect
github.com/go-openapi/jsonpointer v0.22.5 // indirect
github.com/go-openapi/jsonreference v0.21.5 // indirect
github.com/go-openapi/loads v0.23.3 // indirect
github.com/go-openapi/runtime v0.29.3 // indirect
github.com/go-openapi/spec v0.22.4 // indirect
github.com/go-openapi/strfmt v0.26.0 // indirect
github.com/go-openapi/swag v0.25.5 // indirect
github.com/go-openapi/swag/cmdutils v0.25.5 // indirect
github.com/go-openapi/swag/conv v0.25.5 // indirect
github.com/go-openapi/swag/fileutils v0.25.5 // indirect
github.com/go-openapi/swag/jsonname v0.25.5 // indirect
github.com/go-openapi/swag/jsonutils v0.25.5 // indirect
github.com/go-openapi/swag/loading v0.25.5 // indirect
github.com/go-openapi/swag/mangling v0.25.5 // indirect
github.com/go-openapi/swag/netutils v0.25.5 // indirect
github.com/go-openapi/swag/stringutils v0.25.5 // indirect
github.com/go-openapi/swag/typeutils v0.25.5 // indirect
github.com/go-openapi/swag/yamlutils v0.25.5 // indirect
github.com/go-openapi/validate v0.25.2 // indirect
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
github.com/google/certificate-transparency-go v1.3.3 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
github.com/hashicorp/go-retryablehttp v0.7.8 // indirect
github.com/in-toto/attestation v1.1.2 // indirect
github.com/in-toto/in-toto-golang v0.10.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/jedisct1/go-minisign v0.0.0-20241212093149-d2f9f49435c7 // indirect
github.com/klauspost/compress v1.18.4 // indirect
github.com/letsencrypt/boulder v0.20251208.0 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/moby/docker-image-spec v1.3.1 // indirect
github.com/moby/term v0.5.2 // indirect
github.com/oklog/ulid/v2 v2.1.1 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/pelletier/go-toml v1.9.5 // indirect
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/sagikazarmark/locafero v0.12.0 // indirect
github.com/sassoftware/relic v7.2.1+incompatible // indirect
github.com/secure-systems-lab/go-securesystemslib v0.10.0 // indirect
github.com/shibumi/go-pathspec v1.3.0 // indirect
github.com/sigstore/protobuf-specs v0.5.0 // indirect
github.com/sigstore/rekor v1.5.1 // indirect
github.com/sigstore/rekor-tiles/v2 v2.2.1 // indirect
github.com/sigstore/sigstore v1.10.4 // indirect
github.com/sigstore/sigstore-go v1.1.4 // indirect
github.com/sigstore/timestamp-authority/v2 v2.0.5 // indirect
github.com/sirupsen/logrus v1.9.4 // indirect
github.com/spf13/afero v1.15.0 // indirect
github.com/spf13/cast v1.10.0 // indirect
github.com/spf13/pflag v1.0.10 // indirect
github.com/subosito/gotenv v1.6.0 // indirect
github.com/theupdateframework/go-tuf v0.7.0 // indirect
github.com/theupdateframework/go-tuf/v2 v2.4.1 // indirect
github.com/transparency-dev/formats v0.1.0 // indirect
github.com/transparency-dev/merkle v0.0.2 // indirect
github.com/vbatts/tar-split v0.12.2 // indirect
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.64.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 // indirect
go.opentelemetry.io/otel v1.42.0 // indirect
go.opentelemetry.io/otel/metric v1.42.0 // indirect
go.opentelemetry.io/otel/trace v1.42.0 // indirect
go.yaml.in/yaml/v2 v2.4.4 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
golang.org/x/crypto v0.49.0 // indirect
golang.org/x/mod v0.34.0 // indirect
golang.org/x/net v0.52.0 // indirect
golang.org/x/oauth2 v0.36.0 // indirect
golang.org/x/sys v0.42.0 // indirect
golang.org/x/term v0.41.0 // indirect
golang.org/x/text v0.35.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20260311181403-84a4fc48630c // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c // indirect
google.golang.org/grpc v1.79.3 // indirect
google.golang.org/protobuf v1.36.11 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/klog/v2 v2.140.0 // indirect
k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 // indirect
sigs.k8s.io/yaml v1.6.0 // indirect
)
================================================
FILE: go.sum
================================================
al.essio.dev/pkg/shellescape v1.6.0 h1:NxFcEqzFSEVCGN2yq7Huv/9hyCEGVa/TncnOOBBeXHA=
al.essio.dev/pkg/shellescape v1.6.0/go.mod h1:6sIqp7X2P6mThCQ7twERpZTuigpr6KbZWtls1U8I890=
cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE=
cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU=
cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM=
cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M=
cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc=
cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c=
cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs=
cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10=
cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc=
cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU=
cloud.google.com/go/kms v1.25.0 h1:gVqvGGUmz0nYCmtoxWmdc1wli2L1apgP8U4fghPGSbQ=
cloud.google.com/go/kms v1.25.0/go.mod h1:XIdHkzfj0bUO3E+LvwPg+oc7s58/Ns8Nd8Sdtljihbk=
cloud.google.com/go/longrunning v0.8.0 h1:LiKK77J3bx5gDLi4SMViHixjD2ohlkwBi+mKA7EhfW8=
cloud.google.com/go/longrunning v0.8.0/go.mod h1:UmErU2Onzi+fKDg2gR7dusz11Pe26aknR4kHmJJqIfk=
filippo.io/edwards25519 v1.1.1 h1:YpjwWWlNmGIDyXOn8zLzqiD+9TyIlPhGFG96P39uBpw=
filippo.io/edwards25519 v1.1.1/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/AdamKorcz/go-fuzz-headers-1 v0.0.0-20230919221257-8b5d3ce2d11d h1:zjqpY4C7H15HjRPEenkS4SAn3Jy2eRRjkjZbGR30TOg=
github.com/AdamKorcz/go-fuzz-headers-1 v0.0.0-20230919221257-8b5d3ce2d11d/go.mod h1:XNqJ7hv2kY++g8XEHREpi+JqZo3+0l+CH2egBVN4yqM=
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU=
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0 h1:fou+2+WFTib47nS+nz/ozhEBnvU96bKHy6LjRsY4E28=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0/go.mod h1:t76Ruy8AHvUAC8GfMWJMa0ElSbuIcO03NLpynfbgsPA=
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1 h1:Hk5QBxZQC1jb2Fwj6mpzme37xbCDdNTxU7O9eb5+LB4=
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1/go.mod h1:IYus9qsFobWIc2YVwe/WPjcnyCkPKtnHAqUYeebc8z0=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 h1:9iefClla7iYpfYWdzPCRDozdmndjTm8DXdpCzPajMgA=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2/go.mod h1:XtLgD3ZD34DAaVIIAyG3objl5DynM3CQ/vMcbBNJZGI=
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.4.0 h1:E4MgwLBGeVB5f2MdcIVD3ELVAWpr+WD6MUe1i+tM/PA=
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.4.0/go.mod h1:Y2b/1clN4zsAoUd/pgNAQHjLDnTis/6ROkUfyob6psM=
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.2.0 h1:nCYfgcSyHZXJI8J0IWE5MsCGlb2xp9fJiXyxWgmOFg4=
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.2.0/go.mod h1:ucUjca2JtSZboY8IoUqyQyuuXvwbMBVwFOm0vdQPNhA=
github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg=
github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs=
github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
github.com/Azure/go-autorest/autorest v0.11.28/go.mod h1:MrkzG3Y3AH668QyF9KRk5neJnGgmhQ6krbhR8Q5eMvA=
github.com/Azure/go-autorest/autorest v0.11.30 h1:iaZ1RGz/ALZtN5eq4Nr1SOFSlf2E4pDI3Tcsl+dZPVE=
github.com/Azure/go-autorest/autorest v0.11.30/go.mod h1:t1kpPIOpIVX7annvothKvb0stsrXa37i7b+xpmBW8Fs=
github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ=
github.com/Azure/go-autorest/autorest/adal v0.9.22/go.mod h1:XuAbAEUv2Tta//+voMI038TrJBqjKam0me7qR+L8Cmk=
github.com/Azure/go-autorest/autorest/adal v0.9.24 h1:BHZfgGsGwdkHDyZdtQRQk1WeUdW0m2WPAwuHZwUi5i4=
github.com/Azure/go-autorest/autorest/adal v0.9.24/go.mod h1:7T1+g0PYFmACYW5LlG2fcoPiPlFHjClyRGL7dRlP5c8=
github.com/Azure/go-autorest/autorest/azure/auth v0.5.13 h1:Ov8avRZi2vmrE2JcXw+tu5K/yB41r7xK9GZDiBF7NdM=
github.com/Azure/go-autorest/autorest/azure/auth v0.5.13/go.mod h1:5BAVfWLWXihP47vYrPuBKKf4cS0bXI+KM9Qx6ETDJYo=
github.com/Azure/go-autorest/autorest/azure/cli v0.4.6/go.mod h1:piCfgPho7BiIDdEQ1+g4VmKyD5y+p/XtSNqE6Hc4QD0=
github.com/Azure/go-autorest/autorest/azure/cli v0.4.7 h1:Q9R3utmFg9K1B4OYtAZ7ZUUvIUdzQt7G2MN5Hi/d670=
github.com/Azure/go-autorest/autorest/azure/cli v0.4.7/go.mod h1:bVrAueELJ0CKLBpUHDIvD516TwmHmzqwCpvONWRsw3s=
github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=
github.com/Azure/go-autorest/autorest/date v0.3.1 h1:o9Z8Jyt+VJJTCZ/UORishuHOusBwolhjokt9s5k8I4w=
github.com/Azure/go-autorest/autorest/date v0.3.1/go.mod h1:Dz/RDmXlfiFFS/eW+b/xMUSFs1tboPVy6UjgADToWDM=
github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw=
github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU=
github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
github.com/Azure/go-autorest/logger v0.2.2 h1:hYqBsEBywrrOSW24kkOCXRcKfKhK76OzLTfF+MYDE2o=
github.com/Azure/go-autorest/logger v0.2.2/go.mod h1:I5fg9K52o+iuydlWfa9T5K6WFos9XYr9dYTFzpqgibw=
github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
github.com/Azure/go-autorest/tracing v0.6.1 h1:YUMSrC/CeD1ZnnXcNYU4a/fzsO35u2Fsful9L/2nyR0=
github.com/Azure/go-autorest/tracing v0.6.1/go.mod h1:/3EgjbsjraOqiicERAeu3m7/z0x1TzjQGAwDrJrXGkc=
github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 h1:XRzhVemXdgvJqCH0sFfrBUTnUJSBrBf7++ypk+twtRs=
github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk=
github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk=
github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
github.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0=
github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
github.com/aws/aws-sdk-go v1.55.8 h1:JRmEUbU52aJQZ2AjX4q4Wu7t4uZjOu71uyNmaWlUkJQ=
github.com/aws/aws-sdk-go v1.55.8/go.mod h1:ZkViS9AqA6otK+JBBNH2++sx1sgxrPKcSzPPvQkUtXk=
github.com/aws/aws-sdk-go-v2 v1.41.3 h1:4kQ/fa22KjDt13QCy1+bYADvdgcxpfH18f0zP542kZA=
github.com/aws/aws-sdk-go-v2 v1.41.3/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o=
github.com/aws/aws-sdk-go-v2/config v1.32.11 h1:ftxI5sgz8jZkckuUHXfC/wMUc8u3fG1vQS0plr2F2Zs=
github.com/aws/aws-sdk-go-v2/config v1.32.11/go.mod h1:twF11+6ps9aNRKEDimksp923o44w/Thk9+8YIlzWMmo=
github.com/aws/aws-sdk-go-v2/credentials v1.19.11 h1:NdV8cwCcAXrCWyxArt58BrvZJ9pZ9Fhf9w6Uh5W3Uyc=
github.com/aws/aws-sdk-go-v2/credentials v1.19.11/go.mod h1:30yY2zqkMPdrvxBqzI9xQCM+WrlrZKSOpSJEsylVU+8=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.19 h1:INUvJxmhdEbVulJYHI061k4TVuS3jzzthNvjqvVvTKM=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.19/go.mod h1:FpZN2QISLdEBWkayloda+sZjVJL+e9Gl0k1SyTgcswU=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.19 h1:/sECfyq2JTifMI2JPyZ4bdRN77zJmr6SrS1eL3augIA=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.19/go.mod h1:dMf8A5oAqr9/oxOfLkC/c2LU/uMcALP0Rgn2BD5LWn0=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.19 h1:AWeJMk33GTBf6J20XJe6qZoRSJo0WfUhsMdUKhoODXE=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.19/go.mod h1:+GWrYoaAsV7/4pNHpwh1kiNLXkKaSoppxQq9lbH8Ejw=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.5 h1:clHU5fm//kWS1C2HgtgWxfQbFbx4b6rx+5jzhgX9HrI=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.5/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY=
github.com/aws/aws-sdk-go-v2/service/ecr v1.56.0 h1:XxNya31nOtsClGghvQ2VkhIB2S/rggb64x5vkHl4xZQ=
github.com/aws/aws-sdk-go-v2/service/ecr v1.56.0/go.mod h1:T+Tz2Xp1gnvtlgvP7OyRHlr84KtI3fZW5Ax/e+s9b64=
github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.38.11 h1:2T9NCuNzzBh6RUrwYZBFl1D9lLJ2r2CCbg7w383DjQE=
github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.38.11/go.mod h1:FkD34cqOmnqfAEiNHeqOT50SoXqHEgdDsa8BrMw9t+w=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.6 h1:XAq62tBTJP/85lFD5oqOOe7YYgWxY9LvWq8plyDvDVg=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.6/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.19 h1:X1Tow7suZk9UCJHE1Iw9GMZJJl0dAnKXXP1NaSDHwmw=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.19/go.mod h1:/rARO8psX+4sfjUQXp5LLifjUt8DuATZ31WptNJTyQA=
github.com/aws/aws-sdk-go-v2/service/kms v1.49.5 h1:DKibav4XF66XSeaXcrn9GlWGHos6D/vJ4r7jsK7z5CE=
github.com/aws/aws-sdk-go-v2/service/kms v1.49.5/go.mod h1:1SdcmEGUEQE1mrU2sIgeHtcMSxHuybhPvuEPANzIDfI=
github.com/aws/aws-sdk-go-v2/service/signin v1.0.7 h1:Y2cAXlClHsXkkOvWZFXATr34b0hxxloeQu/pAZz2row=
github.com/aws/aws-sdk-go-v2/service/signin v1.0.7/go.mod h1:idzZ7gmDeqeNrSPkdbtMp9qWMgcBwykA7P7Rzh5DXVU=
github.com/aws/aws-sdk-go-v2/service/sso v1.30.12 h1:iSsvB9EtQ09YrsmIc44Heqlx5ByGErqhPK1ZQLppias=
github.com/aws/aws-sdk-go-v2/service/sso v1.30.12/go.mod h1:fEWYKTRGoZNl8tZ77i61/ccwOMJdGxwOhWCkp6TXAr0=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.16 h1:EnUdUqRP1CNzt2DkV67tJx6XDN4xlfBFm+bzeNOQVb0=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.16/go.mod h1:Jic/xv0Rq/pFNCh3WwpH4BEqdbSAl+IyHro8LbibHD8=
github.com/aws/aws-sdk-go-v2/service/sts v1.41.8 h1:XQTQTF75vnug2TXS8m7CVJfC2nniYPZnO1D4Np761Oo=
github.com/aws/aws-sdk-go-v2/service/sts v1.41.8/go.mod h1:Xgx+PR1NUOjNmQY+tRMnouRp83JRM8pRMw/vCaVhPkI=
github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng=
github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc=
github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.12.0 h1:JFWXO6QPihCknDdnL6VaQE57km4ZKheHIGd9YiOGcTo=
github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.12.0/go.mod h1:046/oLyFlYdAghYQE2yHXi/E//VM5Cf3/dFmA+3CZ0c=
github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM=
github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589 h1:krfRl01rzPzxSxyLyrChD+U+MzsBXbm0OwYYB67uF+4=
github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589/go.mod h1:OuDyvmLnMCwa2ep4Jkm6nyA0ocJuZlGyk2gGseVzERM=
github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE=
github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4=
github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI=
github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M=
github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE=
github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk=
github.com/containerd/stargz-snapshotter/estargz v0.18.2 h1:yXkZFYIzz3eoLwlTUZKz2iQ4MrckBxJjkmD16ynUTrw=
github.com/containerd/stargz-snapshotter/estargz v0.18.2/go.mod h1:XyVU5tcJ3PRpkA9XS2T5us6Eg35yM0214Y+wvrZTBrY=
github.com/coreos/go-oidc/v3 v3.17.0 h1:hWBGaQfbi0iVviX4ibC7bk8OKT5qNr4klBaCHVNvehc=
github.com/coreos/go-oidc/v3 v3.17.0/go.mod h1:wqPbKFrVnE90vty060SB40FCJ8fTHTxSwyXJqZH+sI8=
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo=
github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s=
github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE=
github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467 h1:uX1JmpONuD549D73r6cgnxyUu18Zb7yHAy5AYU0Pm4Q=
github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw=
github.com/danieljoos/wincred v1.2.3 h1:v7dZC2x32Ut3nEfRH+vhoZGvN72+dQ/snVXo/vMFLdQ=
github.com/danieljoos/wincred v1.2.3/go.mod h1:6qqX0WNrS4RzPZ1tnroDzq9kY3fu1KwE7MRLQK4X0bs=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/digitorus/pkcs7 v0.0.0-20230713084857-e76b763bdc49/go.mod h1:SKVExuS+vpu2l9IoOc0RwqE7NYnb0JlcFHFnEJkVDzc=
github.com/digitorus/pkcs7 v0.0.0-20250730155240-ffadbf3f398c h1:g349iS+CtAvba7i0Ee9EP1TlTZ9w+UncBY6HSmsFZa0=
github.com/digitorus/pkcs7 v0.0.0-20250730155240-ffadbf3f398c/go.mod h1:mCGGmWkOQvEuLdIRfPIpXViBfpWto4AhwtJlAvo62SQ=
github.com/digitorus/timestamp v0.0.0-20250524132541-c45532741eea h1:ALRwvjsSP53QmnN3Bcj0NpR8SsFLnskny/EIMebAk1c=
github.com/digitorus/timestamp v0.0.0-20250524132541-c45532741eea/go.mod h1:GvWntX9qiTlOud0WkQ6ewFm0LPy5JUR1Xo0Ngbd1w6Y=
github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U=
github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE=
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
github.com/docker/cli v29.3.0+incompatible h1:z3iWveU7h19Pqx7alZES8j+IeFQZ1lhTwb2F+V9SVvk=
github.com/docker/cli v29.3.0+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk=
github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
github.com/docker/docker-credential-helpers v0.9.5 h1:EFNN8DHvaiK8zVqFA2DT6BjXE0GzfLOZ38ggPTKePkY=
github.com/docker/docker-credential-helpers v0.9.5/go.mod h1:v1S+hepowrQXITkEfw6o4+BMbGot02wiKpzWhGUZK6c=
github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94=
github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vmaMAntpSFH5BFKE=
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/dprotaso/go-yit v0.0.0-20260209000607-dfb86291624d h1:/USl0X37Afc2SyjRG4/eNrbm4CZRfZLdzwTy9YXxowA=
github.com/dprotaso/go-yit v0.0.0-20260209000607-dfb86291624d/go.mod h1:k03zg0AFMepR2TrssNeMUISoI0QcX2N58Sl0qPU6MZs=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU=
github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM=
github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
github.com/go-chi/chi v4.1.2+incompatible h1:fGFk2Gmi/YKXk0OmGfBh0WgmN3XB8lVnEyNz34tQRec=
github.com/go-chi/chi/v5 v5.2.5 h1:Eg4myHZBjyvJmAFjFvWgrqDTXFyOzjj7YIm3L3mu6Ug=
github.com/go-chi/chi/v5 v5.2.5/go.mod h1:X7Gx4mteadT3eDOMTsXzmI4/rwUpOwBHLpAfupzFJP0=
github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs=
github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-openapi/analysis v0.24.3 h1:a1hrvMr8X0Xt69KP5uVTu5jH62DscmDifrLzNglAayk=
github.com/go-openapi/analysis v0.24.3/go.mod h1:Nc+dWJ/FxZbhSow5Yh3ozg5CLJioB+XXT6MdLvJUsUw=
github.com/go-openapi/errors v0.22.7 h1:JLFBGC0Apwdzw3484MmBqspjPbwa2SHvpDm0u5aGhUA=
github.com/go-openapi/errors v0.22.7/go.mod h1://QW6SD9OsWtH6gHllUCddOXDL0tk0ZGNYHwsw4sW3w=
github.com/go-openapi/jsonpointer v0.22.5 h1:8on/0Yp4uTb9f4XvTrM2+1CPrV05QPZXu+rvu2o9jcA=
github.com/go-openapi/jsonpointer v0.22.5/go.mod h1:gyUR3sCvGSWchA2sUBJGluYMbe1zazrYWIkWPjjMUY0=
github.com/go-openapi/jsonreference v0.21.5 h1:6uCGVXU/aNF13AQNggxfysJ+5ZcU4nEAe+pJyVWRdiE=
github.com/go-openapi/jsonreference v0.21.5/go.mod h1:u25Bw85sX4E2jzFodh1FOKMTZLcfifd1Q+iKKOUxExw=
github.com/go-openapi/loads v0.23.3 h1:g5Xap1JfwKkUnZdn+S0L3SzBDpcTIYzZ5Qaag0YDkKQ=
github.com/go-openapi/loads v0.23.3/go.mod h1:NOH07zLajXo8y55hom0omlHWDVVvCwBM/S+csCK8LqA=
github.com/go-openapi/runtime v0.29.3 h1:h5twGaEqxtQg40ePiYm9vFFH1q06Czd7Ot6ufdK0w/Y=
github.com/go-openapi/runtime v0.29.3/go.mod h1:8A1W0/L5eyNJvKciqZtvIVQvYO66NlB7INMSZ9bw/oI=
github.com/go-openapi/spec v0.22.4 h1:4pxGjipMKu0FzFiu/DPwN3CTBRlVM2yLf/YTWorYfDQ=
github.com/go-openapi/spec v0.22.4/go.mod h1:WQ6Ai0VPWMZgMT4XySjlRIE6GP1bGQOtEThn3gcWLtQ=
github.com/go-openapi/strfmt v0.26.0 h1:SDdQLyOEqu8W96rO1FRG1fuCtVyzmukky0zcD6gMGLU=
github.com/go-openapi/strfmt v0.26.0/go.mod h1:Zslk5VZPOISLwmWTMBIS7oiVFem1o1EI6zULY8Uer7Y=
github.com/go-openapi/swag v0.25.5 h1:pNkwbUEeGwMtcgxDr+2GBPAk4kT+kJ+AaB+TMKAg+TU=
github.com/go-openapi/swag v0.25.5/go.mod h1:B3RT6l8q7X803JRxa2e59tHOiZlX1t8viplOcs9CwTA=
github.com/go-openapi/swag/cmdutils v0.25.5 h1:yh5hHrpgsw4NwM9KAEtaDTXILYzdXh/I8Whhx9hKj7c=
github.com/go-openapi/swag/cmdutils v0.25.5/go.mod h1:pdae/AFo6WxLl5L0rq87eRzVPm/XRHM3MoYgRMvG4A0=
github.com/go-openapi/swag/conv v0.25.5 h1:wAXBYEXJjoKwE5+vc9YHhpQOFj2JYBMF2DUi+tGu97g=
github.com/go-openapi/swag/conv v0.25.5/go.mod h1:CuJ1eWvh1c4ORKx7unQnFGyvBbNlRKbnRyAvDvzWA4k=
github.com/go-openapi/swag/fileutils v0.25.5 h1:B6JTdOcs2c0dBIs9HnkyTW+5gC+8NIhVBUwERkFhMWk=
github.com/go-openapi/swag/fileutils v0.25.5/go.mod h1:V3cT9UdMQIaH4WiTrUc9EPtVA4txS0TOmRURmhGF4kc=
github.com/go-openapi/swag/jsonname v0.25.5 h1:8p150i44rv/Drip4vWI3kGi9+4W9TdI3US3uUYSFhSo=
github.com/go-openapi/swag/jsonname v0.25.5/go.mod h1:jNqqikyiAK56uS7n8sLkdaNY/uq6+D2m2LANat09pKU=
github.com/go-openapi/swag/jsonutils v0.25.5 h1:XUZF8awQr75MXeC+/iaw5usY/iM7nXPDwdG3Jbl9vYo=
github.com/go-openapi/swag/jsonutils v0.25.5/go.mod h1:48FXUaz8YsDAA9s5AnaUvAmry1UcLcNVWUjY42XkrN4=
github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.5 h1:SX6sE4FrGb4sEnnxbFL/25yZBb5Hcg1inLeErd86Y1U=
github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.5/go.mod h1:/2KvOTrKWjVA5Xli3DZWdMCZDzz3uV/T7bXwrKWPquo=
github.com/go-openapi/swag/loading v0.25.5 h1:odQ/umlIZ1ZVRteI6ckSrvP6e2w9UTF5qgNdemJHjuU=
github.com/go-openapi/swag/loading v0.25.5/go.mod h1:I8A8RaaQ4DApxhPSWLNYWh9NvmX2YKMoB9nwvv6oW6g=
github.com/go-openapi/swag/mangling v0.25.5 h1:hyrnvbQRS7vKePQPHHDso+k6CGn5ZBs5232UqWZmJZw=
github.com/go-openapi/swag/mangling v0.25.5/go.mod h1:6hadXM/o312N/h98RwByLg088U61TPGiltQn71Iw0NY=
github.com/go-openapi/swag/netutils v0.25.5 h1:LZq2Xc2QI8+7838elRAaPCeqJnHODfSyOa7ZGfxDKlU=
github.com/go-openapi/swag/netutils v0.25.5/go.mod h1:lHbtmj4m57APG/8H7ZcMMSWzNqIQcu0RFiXrPUara14=
github.com/go-openapi/swag/stringutils v0.25.5 h1:NVkoDOA8YBgtAR/zvCx5rhJKtZF3IzXcDdwOsYzrB6M=
github.com/go-openapi/swag/stringutils v0.25.5/go.mod h1:PKK8EZdu4QJq8iezt17HM8RXnLAzY7gW0O1KKarrZII=
github.com/go-openapi/swag/typeutils v0.25.5 h1:EFJ+PCga2HfHGdo8s8VJXEVbeXRCYwzzr9u4rJk7L7E=
github.com/go-openapi/swag/typeutils v0.25.5/go.mod h1:itmFmScAYE1bSD8C4rS0W+0InZUBrB2xSPbWt6DLGuc=
github.com/go-openapi/swag/yamlutils v0.25.5 h1:kASCIS+oIeoc55j28T4o8KwlV2S4ZLPT6G0iq2SSbVQ=
github.com/go-openapi/swag/yamlutils v0.25.5/go.mod h1:Gek1/SjjfbYvM+Iq4QGwa/2lEXde9n2j4a3wI3pNuOQ=
github.com/go-openapi/testify/enable/yaml/v2 v2.4.1 h1:NZOrZmIb6PTv5LTFxr5/mKV/FjbUzGE7E6gLz7vFoOQ=
github.com/go-openapi/testify/enable/yaml/v2 v2.4.1/go.mod h1:r7dwsujEHawapMsxA69i+XMGZrQ5tRauhLAjV/sxg3Q=
github.com/go-openapi/testify/v2 v2.4.1 h1:zB34HDKj4tHwyUQHrUkpV0Q0iXQ6dUCOQtIqn8hE6Iw=
github.com/go-openapi/testify/v2 v2.4.1/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54=
github.com/go-openapi/validate v0.25.2 h1:12NsfLAwGegqbGWr2CnvT65X/Q2USJipmJ9b7xDJZz0=
github.com/go-openapi/validate v0.25.2/go.mod h1:Pgl1LpPPGFnZ+ys4/hTlDiRYQdI1ocKypgE+8Q8BLfY=
github.com/go-rod/rod v0.116.2 h1:A5t2Ky2A+5eD/ZJQr1EfsQSe5rms5Xof/qj296e+ZqA=
github.com/go-rod/rod v0.116.2/go.mod h1:H+CMO9SCNc2TJ2WfrG+pKhITz57uGNYU43qYHh438Mg=
github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=
github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
github.com/go-training/helloworld v0.0.0-20200225145412-ba5f4379d78b h1:0pOrjn0UzTcHdhDVdxrH8LwM7QLnAp8qiUtwXM04JEE=
github.com/go-training/helloworld v0.0.0-20200225145412-ba5f4379d78b/go.mod h1:hGGmX3bRUkYkc9aKA6mkUxi6d+f1GmZF1je0FlVTgwU=
github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro=
github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=
github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo=
github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/google/certificate-transparency-go v1.3.3 h1:hq/rSxztSkXN2tx/3jQqF6Xc0O565UQPdHrOWvZwybo=
github.com/google/certificate-transparency-go v1.3.3/go.mod h1:iR17ZgSaXRzSa5qvjFl8TnVD5h8ky2JMVio+dzoKMgA=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/go-containerregistry v0.21.3 h1:Xr+yt3VvwOOn/5nJzd7UoOhwPGiPkYW0zWDLLUXqAi4=
github.com/google/go-containerregistry v0.21.3/go.mod h1:D5ZrJF1e6dMzvInpBPuMCX0FxURz7GLq2rV3Us9aPkc=
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0=
github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
github.com/google/trillian v1.7.2 h1:EPBxc4YWY4Ak8tcuhyFleY+zYlbCDCa4Sn24e1Ka8Js=
github.com/google/trillian v1.7.2/go.mod h1:mfQJW4qRH6/ilABtPYNBerVJAJ/upxHLX81zxNQw05s=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/enterprise-certificate-proxy v0.3.12 h1:Fg+zsqzYEs1ZnvmcztTYxhgCBsx3eEhEwQ1W/lHq/sQ=
github.com/googleapis/enterprise-certificate-proxy v0.3.12/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg=
github.com/googleapis/gax-go/v2 v2.17.0 h1:RksgfBpxqff0EZkDWYuz9q/uWsTVz+kf43LsZ1J6SMc=
github.com/googleapis/gax-go/v2 v2.17.0/go.mod h1:mzaqghpQp4JDh3HvADwrat+6M3MOIDp5YKHhb9PAgDY=
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI=
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c=
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k=
github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
github.com/hashicorp/go-retryablehttp v0.7.8 h1:ylXZWnqa7Lhqpk0L1P1LzDtGcCR0rPVUrx/c8Unxc48=
github.com/hashicorp/go-retryablehttp v0.7.8/go.mod h1:rjiScheydd+CxvumBsIrFKlx3iS0jrZ7LvzFGFmuKbw=
github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=
github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
github.com/hashicorp/go-secure-stdlib/parseutil v0.2.0 h1:U+kC2dOhMFQctRfhK0gRctKAPTloZdMU5ZJxaesJ/VM=
github.com/hashicorp/go-secure-stdlib/parseutil v0.2.0/go.mod h1:Ll013mhdmsVDuoIXVfBtvgGJsXDYkTw1kooNcoCXuE0=
github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9CdjCtrXrXGuOpxEA7Ts=
github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4=
github.com/hashicorp/go-sockaddr v1.0.7 h1:G+pTkSO01HpR5qCxg7lxfsFEZaG+C0VssTy/9dbT+Fw=
github.com/hashicorp/go-sockaddr v1.0.7/go.mod h1:FZQbEYa1pxkQ7WLpyXJ6cbjpT8q0YgQaK/JakXqGyWw=
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/hashicorp/hcl v1.0.1-vault-7 h1:ag5OxFVy3QYTFTJODRzTKVZ6xvdfLLCA1cy/Y6xGI0I=
github.com/hashicorp/hcl v1.0.1-vault-7/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM=
github.com/hashicorp/vault/api v1.22.0 h1:+HYFquE35/B74fHoIeXlZIP2YADVboaPjaSicHEZiH0=
github.com/hashicorp/vault/api v1.22.0/go.mod h1:IUZA2cDvr4Ok3+NtK2Oq/r+lJeXkeCrHRmqdyWfpmGM=
github.com/howeyc/gopass v0.0.0-20210920133722-c8aef6fb66ef h1:A9HsByNhogrvm9cWb28sjiS3i7tcKCkflWFEkHfuAgM=
github.com/howeyc/gopass v0.0.0-20210920133722-c8aef6fb66ef/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs=
github.com/in-toto/attestation v1.1.2 h1:MBFn6lsMq6dptQZJBhalXTcWMb/aJy3V+GX3VYj/V1E=
github.com/in-toto/attestation v1.1.2/go.mod h1:gYFddHMZj3DiQ0b62ltNi1Vj5rC879bTmBbrv9CRHpM=
github.com/in-toto/in-toto-golang v0.10.0 h1:+s2eZQSK3WmWfYV85qXVSBfqgawi/5L02MaqA4o/tpM=
github.com/in-toto/in-toto-golang v0.10.0/go.mod h1:wjT4RiyFlLWCmLUJjwB8oZcjaq7HA390aMJcD3xXgmg=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo=
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
github.com/jackc/pgx/v5 v5.8.0 h1:TYPDoleBBme0xGSAX3/+NujXXtpZn9HBONkQC7IEZSo=
github.com/jackc/pgx/v5 v5.8.0/go.mod h1:QVeDInX2m9VyzvNeiCJVjCkNFqzsNb43204HshNSZKw=
github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo=
github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
github.com/jedisct1/go-minisign v0.0.0-20241212093149-d2f9f49435c7 h1:FWpSWRD8FbVkKQu8M1DM9jF5oXFLyE+XpisIYfdzbic=
github.com/jedisct1/go-minisign v0.0.0-20241212093149-d2f9f49435c7/go.mod h1:BMxO138bOokdgt4UaxZiEfypcSHX0t6SIFimVP1oRfk=
github.com/jellydator/ttlcache/v3 v3.4.0 h1:YS4P125qQS0tNhtL6aeYkheEaB/m8HCqdMMP4mnWdTY=
github.com/jellydator/ttlcache/v3 v3.4.0/go.mod h1:Hw9EgjymziQD3yGsQdf1FqFdpp7YjFMd4Srg5EJlgD4=
github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24 h1:liMMTbpW34dhU4az1GN0pTPADwNmvoRSeoZ6PItiqnY=
github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/klauspost/compress v1.18.4 h1:RPhnKRAQ4Fh8zU2FY/6ZFDwTVTxgJ/EMydqSTzE9a2c=
github.com/klauspost/compress v1.18.4/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/letsencrypt/boulder v0.20251208.0 h1:rG1V+1Oiy8H7i6kSf85RwXeZZ8q2Vj65dbsSk88J7wI=
github.com/letsencrypt/boulder v0.20251208.0/go.mod h1:Wi99CY9yzFg4yaHamFCBIScvY8KOcBUe1rlPjUZNTJM=
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE=
github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=
github.com/moby/moby/api v1.54.0 h1:7kbUgyiKcoBhm0UrWbdrMs7RX8dnwzURKVbZGy2GnL0=
github.com/moby/moby/api v1.54.0/go.mod h1:8mb+ReTlisw4pS6BRzCMts5M49W5M7bKt1cJy/YbAqc=
github.com/moby/moby/client v0.3.0 h1:UUGL5okry+Aomj3WhGt9Aigl3ZOxZGqR7XPo+RLPlKs=
github.com/moby/moby/client v0.3.0/go.mod h1:HJgFbJRvogDQjbM8fqc1MCEm4mIAGMLjXbgwoZp6jCQ=
github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ=
github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc=
github.com/natefinch/atomic v1.0.1 h1:ZPYKxkqQOx3KZ+RsbnP/YsgvxWQPGxjC0oBt2AhwV0A=
github.com/natefinch/atomic v1.0.1/go.mod h1:N/D/ELrljoqDyT3rZrsUmtsuzvHkeB/wWjHV22AZRbM=
github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY=
github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc=
github.com/oklog/ulid/v2 v2.1.1 h1:suPZ4ARWLOJLegGFiZZ1dFAkqzhMjL3J1TzI+5wHz8s=
github.com/oklog/ulid/v2 v2.1.1/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ=
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
github.com/onsi/gomega v1.39.1 h1:1IJLAad4zjPn2PsnhH70V4DKRFlrCzGBNrNaru+Vf28=
github.com/onsi/gomega v1.39.1/go.mod h1:hL6yVALoTOxeWudERyfppUcZXjMwIMLnuSfruD2lcfg=
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040=
github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M=
github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o=
github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk=
github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
github.com/sagikazarmark/locafero v0.12.0 h1:/NQhBAkUb4+fH1jivKHWusDYFjMOOKU88eegjfxfHb4=
github.com/sagikazarmark/locafero v0.12.0/go.mod h1:sZh36u/YSZ918v0Io+U9ogLYQJ9tLLBmM4eneO6WwsI=
github.com/sassoftware/relic v7.2.1+incompatible h1:Pwyh1F3I0r4clFJXkSI8bOyJINGqpgjJU3DYAZeI05A=
github.com/sassoftware/relic v7.2.1+incompatible/go.mod h1:CWfAxv73/iLZ17rbyhIEq3K9hs5w6FpNMdUT//qR+zk=
github.com/sassoftware/relic/v7 v7.6.2 h1:rS44Lbv9G9eXsukknS4mSjIAuuX+lMq/FnStgmZlUv4=
github.com/sassoftware/relic/v7 v7.6.2/go.mod h1:kjmP0IBVkJZ6gXeAu35/KCEfca//+PKM6vTAsyDPY+k=
github.com/secure-systems-lab/go-securesystemslib v0.10.0 h1:l+H5ErcW0PAehBNrBxoGv1jjNpGYdZ9RcheFkB2WI14=
github.com/secure-systems-lab/go-securesystemslib v0.10.0/go.mod h1:MRKONWmRoFzPNQ9USRF9i1mc7MvAVvF1LlW8X5VWDvk=
github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw=
github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
github.com/shibumi/go-pathspec v1.3.0 h1:QUyMZhFo0Md5B8zV8x2tesohbb5kfbpTi9rBnKh5dkI=
github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE=
github.com/sigstore/cosign/v3 v3.0.5 h1:c1zPqjU+H4wmirgysC+AkWMg7a7fykyOYF/m+F1150I=
github.com/sigstore/cosign/v3 v3.0.5/go.mod h1:ble1vMvJagCFyTIDkibCq6MIHiWDw00JNYl0f9rB4T4=
github.com/sigstore/protobuf-specs v0.5.0 h1:F8YTI65xOHw70NrvPwJ5PhAzsvTnuJMGLkA4FIkofAY=
github.com/sigstore/protobuf-specs v0.5.0/go.mod h1:+gXR+38nIa2oEupqDdzg4qSBT0Os+sP7oYv6alWewWc=
github.com/sigstore/rekor v1.5.1 h1:Ca1egHRWRuDvXV4tZu9aXEXc3Gej9FG+HKeapV9OAMQ=
github.com/sigstore/rekor v1.5.1/go.mod h1:gTLDuZuo3SyQCuZvKqwRPA79Qo/2rw39/WtLP/rZjUQ=
github.com/sigstore/rekor-tiles/v2 v2.2.1 h1:UmV1CBQ3SjxxPGpFmwDoOhoIwiKpM2Qm1pU5tPGmvNk=
github.com/sigstore/rekor-tiles/v2 v2.2.1/go.mod h1:z8n6l6oidpaLjjE6rJERuQqY9X38ulnHZCXyL+DEL7U=
github.com/sigstore/sigstore v1.10.4 h1:ytOmxMgLdcUed3w1SbbZOgcxqwMG61lh1TmZLN+WeZE=
github.com/sigstore/sigstore v1.10.4/go.mod h1:tDiyrdOref3q6qJxm2G+JHghqfmvifB7hw+EReAfnbI=
github.com/sigstore/sigstore-go v1.1.4 h1:wTTsgCHOfqiEzVyBYA6mDczGtBkN7cM8mPpjJj5QvMg=
github.com/sigstore/sigstore-go v1.1.4/go.mod h1:2U/mQOT9cjjxrtIUeKDVhL+sHBKsnWddn8URlswdBsg=
github.com/sigstore/sigstore/pkg/signature/kms/aws v1.10.4 h1:VZ+L6SKVWbLPHznIF0tBuO7qKMFdJiJMVwFKu9DlY5o=
github.com/sigstore/sigstore/pkg/signature/kms/aws v1.10.4/go.mod h1:Rstj47WpJym25il8j4jTL0BfikzP/9AhVD+DsBcYzZc=
github.com/sigstore/sigstore/pkg/signature/kms/azure v1.10.4 h1:G7yOv8bxk3zIEEZyVCixPxtePIAm+t3ZWSaKRPzVw+o=
github.com/sigstore/sigstore/pkg/signature/kms/azure v1.10.4/go.mod h1:hxJelB/bRItMYOzi6qD9xEKjse2QZcikh4TbysfdDHc=
github.com/sigstore/sigstore/pkg/signature/kms/gcp v1.10.4 h1:Qxt6dE4IwhJ6gIXmg2q4S/SeqEDSZ29nmfsv7Zb6LL4=
github.com/sigstore/sigstore/pkg/signature/kms/gcp v1.10.4/go.mod h1:hJVeNOwarqfyALjOwsf0OR8YA/A96NABucEaQumPr30=
github.com/sigstore/sigstore/pkg/signature/kms/hashivault v1.10.4 h1:KVavYMPfSf5NryOl6VrZ9nRG3fXOOJOPp7Czk/YCPkM=
github.com/sigstore/sigstore/pkg/signature/kms/hashivault v1.10.4/go.mod h1:J7CA1AaBkyK8dYq6EdQANhj+8oEcsA7PrIp088qgPiY=
github.com/sigstore/timestamp-authority/v2 v2.0.5 h1:WT17MU4bNRvjRLlTvTO5gmrSIWJVbzwrNXgwsjB+53U=
github.com/sigstore/timestamp-authority/v2 v2.0.5/go.mod h1:oV+Yy0GsfgNAeDZcv/WJjQE42wFtMTtuD85bPLAQk5M=
github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w=
github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g=
github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I=
github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg=
github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY=
github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo=
github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU=
github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4=
github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU=
github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
github.com/theupdateframework/go-tuf v0.7.0 h1:CqbQFrWo1ae3/I0UCblSbczevCCbS31Qvs5LdxRWqRI=
github.com/theupdateframework/go-tuf v0.7.0/go.mod h1:uEB7WSY+7ZIugK6R1hiBMBjQftaFzn7ZCDJcp1tCUug=
github.com/theupdateframework/go-tuf/v2 v2.4.1 h1:K6ewW064rKZCPkRo1W/CTbTtm/+IB4+coG1iNURAGCw=
github.com/theupdateframework/go-tuf/v2 v2.4.1/go.mod h1:Nex2enPVYDFCklrnbTzl3OVwD7fgIAj0J5++z/rvCj8=
github.com/tink-crypto/tink-go-awskms/v2 v2.1.0 h1:N9UxlsOzu5mttdjhxkDLbzwtEecuXmlxZVo/ds7JKJI=
github.com/tink-crypto/tink-go-awskms/v2 v2.1.0/go.mod h1:PxSp9GlOkKL9rlybW804uspnHuO9nbD98V/fDX4uSis=
github.com/tink-crypto/tink-go-gcpkms/v2 v2.2.0 h1:3B9i6XBXNTRspfkTC0asN5W0K6GhOSgcujNiECNRNb0=
github.com/tink-crypto/tink-go-gcpkms/v2 v2.2.0/go.mod h1:jY5YN2BqD/KSCHM9SqZPIpJNG/u3zwfLXHgws4x2IRw=
github.com/tink-crypto/tink-go-hcvault/v2 v2.4.0 h1:j+S+WKBQ5ya26A5EM/uXoVe+a2IaPQN8KgBJZ22cJ+4=
github.com/tink-crypto/tink-go-hcvault/v2 v2.4.0/go.mod h1:OCKJIujnTzDq7f+73NhVs99oA2c1TR6nsOpuasYM6Yo=
github.com/tink-crypto/tink-go/v2 v2.6.0 h1:+KHNBHhWH33Vn+igZWcsgdEPUxKwBMEe0QC60t388v4=
github.com/tink-crypto/tink-go/v2 v2.6.0/go.mod h1:2WbBA6pfNsAfBwDCggboaHeB2X29wkU8XHtGwh2YIk8=
github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 h1:e/5i7d4oYZ+C1wj2THlRK+oAhjeS/TRQwMfkIuet3w0=
github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399/go.mod h1:LdwHTNJT99C5fTAzDz0ud328OgXz+gierycbcIx2fRs=
github.com/transparency-dev/formats v0.1.0 h1:oL0zUFuYUjg8AbtjPMnIRDmjbaHo5jCjEWU5yaNuz0g=
github.com/transparency-dev/formats v0.1.0/go.mod h1:d2FibUOHfCMdCe/+/rbKt1IPLBbPTDfwj46kt541/mU=
github.com/transparency-dev/merkle v0.0.2 h1:Q9nBoQcZcgPamMkGn7ghV8XiTZ/kRxn1yCG81+twTK4=
github.com/transparency-dev/merkle v0.0.2/go.mod h1:pqSy+OXefQ1EDUVmAJ8MUhHB9TXGuzVAT58PqBoHz1A=
github.com/vbatts/tar-split v0.12.2 h1:w/Y6tjxpeiFMR47yzZPlPj/FcPLpXbTUi/9H7d3CPa4=
github.com/vbatts/tar-split v0.12.2/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA=
github.com/ysmood/fetchup v0.2.3 h1:ulX+SonA0Vma5zUFXtv52Kzip/xe7aj4vqT5AJwQ+ZQ=
github.com/ysmood/fetchup v0.2.3/go.mod h1:xhibcRKziSvol0H1/pj33dnKrYyI2ebIvz5cOOkYGns=
github.com/ysmood/goob v0.4.0 h1:HsxXhyLBeGzWXnqVKtmT9qM7EuVs/XOgkX7T6r1o1AQ=
github.com/ysmood/goob v0.4.0/go.mod h1:u6yx7ZhS4Exf2MwciFr6nIM8knHQIE22lFpWHnfql18=
github.com/ysmood/got v0.40.0 h1:ZQk1B55zIvS7zflRrkGfPDrPG3d7+JOza1ZkNxcc74Q=
github.com/ysmood/got v0.40.0/go.mod h1:W7DdpuX6skL3NszLmAsC5hT7JAhuLZhByVzHTq874Qg=
github.com/ysmood/gson v0.7.3 h1:QFkWbTH8MxyUTKPkVWAENJhxqdBa4lYTQWqZCiLG6kE=
github.com/ysmood/gson v0.7.3/go.mod h1:3Kzs5zDl21g5F/BlLTNcuAGAYLKt2lV5G8D1zF3RNmg=
github.com/ysmood/leakless v0.9.0 h1:qxCG5VirSBvmi3uynXFkcnLMzkphdh3xx5FtrORwDCU=
github.com/ysmood/leakless v0.9.0/go.mod h1:R8iAXPRaG97QJwqxs74RdwzcRHT1SWCGTNqY8q0JvMQ=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/zalando/go-keyring v0.2.3 h1:v9CUu9phlABObO4LPWycf+zwMG7nlbb3t/B5wa97yms=
github.com/zalando/go-keyring v0.2.3/go.mod h1:HL4k+OXQfJUWaMnqyuSOc0drfGPX2b51Du6K+MRgZMk=
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.64.0 h1:RN3ifU8y4prNWeEnQp2kRRHz8UwonAEYZl8tUzHEXAk=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.64.0/go.mod h1:habDz3tEWiFANTo6oUE99EmaFUrCNYAAg3wiVmusm70=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 h1:OyrsyzuttWTSur2qN/Lm0m2a8yqyIjUVBZcxFPuXq2o=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0/go.mod h1:C2NGBr+kAB4bk3xtMXfZ94gqFDtg/GkI7e9zqGh5Beg=
go.opentelemetry.io/otel v1.42.0 h1:lSQGzTgVR3+sgJDAU/7/ZMjN9Z+vUip7leaqBKy4sho=
go.opentelemetry.io/otel v1.42.0/go.mod h1:lJNsdRMxCUIWuMlVJWzecSMuNjE7dOYyWlqOXWkdqCc=
go.opentelemetry.io/otel/metric v1.42.0 h1:2jXG+3oZLNXEPfNmnpxKDeZsFI5o4J+nz6xUlaFdF/4=
go.opentelemetry.io/otel/metric v1.42.0/go.mod h1:RlUN/7vTU7Ao/diDkEpQpnz3/92J9ko05BIwxYa2SSI=
go.opentelemetry.io/otel/sdk v1.42.0 h1:LyC8+jqk6UJwdrI/8VydAq/hvkFKNHZVIWuslJXYsDo=
go.opentelemetry.io/otel/sdk v1.42.0/go.mod h1:rGHCAxd9DAph0joO4W6OPwxjNTYWghRWmkHuGbayMts=
go.opentelemetry.io/otel/sdk/metric v1.42.0 h1:D/1QR46Clz6ajyZ3G8SgNlTJKBdGp84q9RKCAZ3YGuA=
go.opentelemetry.io/otel/sdk/metric v1.42.0/go.mod h1:Ua6AAlDKdZ7tdvaQKfSmnFTdHx37+J4ba8MwVCYM5hc=
go.opentelemetry.io/otel/trace v1.42.0 h1:OUCgIPt+mzOnaUTpOQcBiM/PLQ/Op7oq6g4LenLmOYY=
go.opentelemetry.io/otel/trace v1.42.0/go.mod h1:f3K9S+IFqnumBkKhRJMeaZeNk9epyhnCmQh/EysQCdc=
go.step.sm/crypto v0.76.2 h1:JJ/yMcs/rmcCAwlo+afrHjq74XBFRTJw5B2y4Q4Z4c4=
go.step.sm/crypto v0.76.2/go.mod h1:m6KlB/HzIuGFep0UWI5e0SYi38UxpoKeCg6qUaHV6/Q=
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc=
go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ=
go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ=
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
go.yaml.in/yaml/v4 v4.0.0-rc.4 h1:UP4+v6fFrBIb1l934bDl//mmnoIZEDK0idg1+AIvX5U=
go.yaml.in/yaml/v4 v4.0.0-rc.4/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4=
golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.34.0 h1:xIHgNUUnW6sYkcM5Jleh05DvLOtwc6RitGHbDk4akRI=
golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0=
golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw=
golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs=
golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo=
golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
golang.org/x/term v0.41.0 h1:QCgPso/Q3RTJx2Th4bDLqML4W6iJiaXFq2/ftQF13YU=
golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8=
golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA=
golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=
golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s=
golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
google.golang.org/api v0.269.0 h1:qDrTOxKUQ/P0MveH6a7vZ+DNHxJQjtGm/uvdbdGXCQg=
google.golang.org/api v0.269.0/go.mod h1:N8Wpcu23Tlccl0zSHEkcAZQKDLdquxK+l9r2LkwAauE=
google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 h1:VQZ/yAbAtjkHgH80teYd2em3xtIkkHd7ZhqfH2N9CsM=
google.golang.org/genproto v0.0.0-20260128011058-8636f8732409/go.mod h1:rxKD3IEILWEu3P44seeNOAwZN4SaoKaQ/2eTg4mM6EM=
google.golang.org/genproto/googleapis/api v0.0.0-20260311181403-84a4fc48630c h1:OyQPd6I3pN/9gDxz6L13kYGJgqkpdrAohJRBeXyxlgI=
google.golang.org/genproto/googleapis/api v0.0.0-20260311181403-84a4fc48630c/go.mod h1:X2gu9Qwng7Nn009s/r3RUxqkzQNqOrAy79bluY7ojIg=
google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c h1:xgCzyF2LFIO/0X2UAoVRiXKU5Xg6VjToG4i2/ecSswk=
google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE=
google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ=
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q=
gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA=
k8s.io/apimachinery v0.35.3 h1:MeaUwQCV3tjKP4bcwWGgZ/cp/vpsRnQzqO6J6tJyoF8=
k8s.io/apimachinery v0.35.3/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns=
k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc=
k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0=
k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 h1:AZYQSJemyQB5eRxqcPky+/7EdBj0xi3g0ZcxxJ7vbWU=
k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk=
pgregory.net/rapid v1.2.0 h1:keKAYRcjm+e1F0oAuU5F5+YPAWcyxNNRK2wud503Gnk=
pgregory.net/rapid v1.2.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04=
sigs.k8s.io/kind v0.31.0 h1:UcT4nzm+YM7YEbqiAKECk+b6dsvc/HRZZu9U0FolL1g=
sigs.k8s.io/kind v0.31.0/go.mod h1:FSqriGaoTPruiXWfRnUXNykF8r2t+fHtK0P0m1AbGF8=
sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs=
sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4=
software.sslmate.com/src/go-pkcs12 v0.4.0 h1:H2g08FrTvSFKUj+D309j1DPfk5APnIdAQAB8aEykJ5k=
software.sslmate.com/src/go-pkcs12 v0.4.0/go.mod h1:Qiz0EyvDRJjjxGyUQa2cCNZn/wMyzrRJ/qcDXOQazLI=
================================================
FILE: hack/boilerplate/boilerplate.go.txt
================================================
// Copyright 2023 ko Build Authors All Rights Reserved.
//
// 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.
================================================
FILE: hack/boilerplate/boilerplate.sh.txt
================================================
#!/usr/bin/env bash
# Copyright 2023 ko Build Authors All Rights Reserved.
#
# 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.
================================================
FILE: hack/presubmit.sh
================================================
#!/usr/bin/env bash
# Copyright 2021 ko Build Authors All Rights Reserved.
#
# 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.
set -o errexit
set -o nounset
set -o pipefail
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
pushd "${PROJECT_ROOT}"
trap popd EXIT
# Verify that all source files are correctly formatted.
find . -name "*.go" -exec gofmt -d -e -l {} +
# Verify that generated Markdown docs are up-to-date.
tmpdir=$(mktemp -d)
go run cmd/help/main.go --dir "$tmpdir"
diff -Naur -I '###### Auto generated' "$tmpdir" docs/reference/
================================================
FILE: hack/tools.go
================================================
// Copyright 2021 ko Build Authors All Rights Reserved.
//
// 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.
//go:build tools
// +build tools
package hack
import (
_ "github.com/go-training/helloworld"
)
================================================
FILE: hack/update-codegen.sh
================================================
#!/usr/bin/env bash
# Copyright 2021 ko Build Authors All Rights Reserved.
#
# 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.
set -o errexit
set -o nounset
set -o pipefail
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
pushd ${PROJECT_ROOT}
trap popd EXIT
go mod tidy
go run $PROJECT_ROOT/cmd/help/main.go --dir=$PROJECT_ROOT/docs/reference/
================================================
FILE: hack/update-deps.sh
================================================
#!/usr/bin/env bash
# Copyright 2018 ko Build Authors All Rights Reserved.
#
# 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.
set -o errexit
set -o nounset
set -o pipefail
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
pushd ${PROJECT_ROOT}
trap popd EXIT
go mod tidy
================================================
FILE: integration_test.sh
================================================
#!/bin/bash
set -o errexit
set -o nounset
set -o pipefail
ROOT_DIR=$(dirname "$0")
pushd "$ROOT_DIR"
ROOT_DIR="$(pwd)"
echo "Moving GOPATH into /tmp/ to test modules behavior."
export GOPATH="${GOPATH:-$(go env GOPATH)}"
export ORIGINAL_GOPATH="$GOPATH"
GOPATH="$(mktemp -d)"
export GOPATH
export CGO_ENABLED=0
GOARCH="${GOARCH:-$(go env GOARCH)}"
pushd "$GOPATH" || exit 1
echo "Copying ko to temp gopath."
mkdir -p "$GOPATH/src/github.com/google/ko"
cp -r "$ROOT_DIR/"* "$GOPATH/src/github.com/google/ko/"
pushd "$GOPATH/src/github.com/google/ko" || exit 1
echo "Building ko"
RESULT="$(go build .)"
echo "Beginning scenarios."
FILTER="[^ ]local[^ ]*"
echo "1. Test should create an image that outputs 'Hello World'."
RESULT="$(./ko build --local --platform="linux/$GOARCH" "$GOPATH/src/github.com/google/ko/test" | grep "$FILTER" | xargs -I% docker run %)"
if [[ "$RESULT" != *"Hello there"* ]]; then
echo "Test FAILED. Saw $RESULT" && exit 1
else
echo "Test PASSED"
fi
echo "2. Test knative 'KO_FLAGS' variable is ignored."
# https://github.com/ko-build/ko/issues/1317
RESULT="$(KO_FLAGS="--platform=badvalue" ./ko build --local --platform="linux/$GOARCH" "$GOPATH/src/github.com/google/ko/test" | grep "$FILTER" | xargs -I% docker run %)"
if [[ "$RESULT" != *"Hello there"* ]]; then
echo "Test FAILED. Saw $RESULT" && exit 1
else
echo "Test PASSED"
fi
echo "3. Linux capabilities."
pushd test/build-configs || exit 1
# run as non-root user with net_bind_service cap granted
docker_run_opts="--user 1 --cap-add=net_bind_service"
RESULT="$(../../ko build --local --platform="linux/$GOARCH" ./caps/cmd | grep "$FILTER" | xargs -I% docker run $docker_run_opts %)"
if [[ "$RESULT" != "No capabilities" ]]; then
echo "Test FAILED. Saw '$RESULT' but expected 'No capabilities'. Docker 'cap-add' must have no effect unless matching capabilities are granted to the file." && exit 1
fi
# build with a different config requesting net_bind_service file capability
RESULT_WITH_FILE_CAPS="$(KO_CONFIG_PATH=caps.ko.yaml ../../ko build --local --platform="linux/$GOARCH" ./caps/cmd | grep "$FILTER" | xargs -I% docker run $docker_run_opts %)"
if [[ "$RESULT_WITH_FILE_CAPS" != "Has capabilities"* ]]; then
echo "Test FAILED. Saw '$RESULT_WITH_FILE_CAPS' but expected 'Has capabilities'. Docker 'cap-add' must work when matching capabilities are granted to the file." && exit 1
else
echo "Test PASSED"
fi
popd || exit 1
popd || exit 1
popd || exit 1
export GOPATH="$ORIGINAL_GOPATH"
================================================
FILE: internal/sbom/sbom.go
================================================
// Copyright 2022 ko Build Authors All Rights Reserved.
//
// 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.
package sbom
import (
"bufio"
"bytes"
"fmt"
"runtime/debug"
"strings"
"unicode"
)
func modulePackageName(mod *debug.Module) string {
return fmt.Sprintf("SPDXRef-Package-%s-%s",
strings.ReplaceAll(mod.Path, "/", "."),
mod.Version)
}
func goRef(mod *debug.Module) string {
path := mod.Path
// Try to lowercase the first 2 path elements to comply with spec
// https://github.com/package-url/purl-spec/blob/master/PURL-TYPES.rst#golang
p := strings.Split(path, "/")
if len(p) > 2 {
path = strings.Join(
append(
[]string{strings.ToLower(p[0]), strings.ToLower(p[1])},
p[2:]...,
), "/",
)
}
return fmt.Sprintf("pkg:golang/%s@%s?type=module", path, mod.Version)
}
// massageGoVersionM massages the ou
gitextract_aa0jajfb/
├── .github/
│ ├── dependabot.yml
│ └── workflows/
│ ├── analyze.yaml
│ ├── boilerplate.yaml
│ ├── build.yaml
│ ├── donotsubmit.yaml
│ ├── e2e.yaml
│ ├── image.yaml
│ ├── kind-e2e.yaml
│ ├── modules-integration-test.yaml
│ ├── publish-site.yaml
│ ├── registries.yaml
│ ├── release.yml
│ ├── sbom.yaml
│ ├── stale.yaml
│ ├── style.yaml
│ ├── test.yaml
│ └── verify.yaml
├── .gitignore
├── .golangci.yaml
├── .goreleaser.yml
├── .ko.yaml
├── .wokeignore
├── CNAME
├── CONTRIBUTING.md
├── LICENSE
├── MAINTAINERS.md
├── README.md
├── ROADMAP.md
├── cmd/
│ └── help/
│ └── main.go
├── code-of-conduct.md
├── docs/
│ ├── CNAME
│ ├── README.md
│ ├── advanced/
│ │ ├── faq.md
│ │ ├── go-packages.md
│ │ ├── lambda.md
│ │ ├── limitations.md
│ │ ├── linux-capabilities.md
│ │ ├── migrating-from-dockerfile.md
│ │ ├── root-ca-certificates.md
│ │ └── terraform.md
│ ├── community.md
│ ├── configuration.md
│ ├── custom/
│ │ ├── main.html
│ │ └── partials/
│ │ └── copyright.html
│ ├── deployment.md
│ ├── features/
│ │ ├── build-cache.md
│ │ ├── debugging.md
│ │ ├── k8s.md
│ │ ├── multi-platform.md
│ │ ├── sboms.md
│ │ └── static-assets.md
│ ├── get-started.md
│ ├── index.md
│ ├── install.md
│ └── reference/
│ ├── ko.md
│ ├── ko_apply.md
│ ├── ko_build.md
│ ├── ko_create.md
│ ├── ko_delete.md
│ ├── ko_login.md
│ ├── ko_resolve.md
│ ├── ko_run.md
│ └── ko_version.md
├── go.mod
├── go.sum
├── hack/
│ ├── boilerplate/
│ │ ├── boilerplate.go.txt
│ │ └── boilerplate.sh.txt
│ ├── presubmit.sh
│ ├── tools.go
│ ├── update-codegen.sh
│ └── update-deps.sh
├── integration_test.sh
├── internal/
│ └── sbom/
│ ├── sbom.go
│ └── spdx.go
├── main.go
├── mkdocs.yml
├── pkg/
│ ├── build/
│ │ ├── build.go
│ │ ├── cache.go
│ │ ├── config.go
│ │ ├── doc.go
│ │ ├── future.go
│ │ ├── future_test.go
│ │ ├── gobuild.go
│ │ ├── gobuild_test.go
│ │ ├── gobuilds.go
│ │ ├── gobuilds_test.go
│ │ ├── layer.go
│ │ ├── limit.go
│ │ ├── limit_test.go
│ │ ├── options.go
│ │ ├── recorder.go
│ │ ├── recorder_test.go
│ │ ├── shared.go
│ │ ├── shared_test.go
│ │ ├── strict.go
│ │ └── strict_test.go
│ ├── caps/
│ │ ├── caps.go
│ │ ├── caps_dd_test.go
│ │ ├── caps_test.go
│ │ ├── gen.sh
│ │ └── new_file_caps_test.go
│ ├── commands/
│ │ ├── apply.go
│ │ ├── build.go
│ │ ├── cache.go
│ │ ├── commands.go
│ │ ├── config.go
│ │ ├── config_test.go
│ │ ├── create.go
│ │ ├── delete.go
│ │ ├── options/
│ │ │ ├── build.go
│ │ │ ├── build_test.go
│ │ │ ├── filestuff.go
│ │ │ ├── namer_test.go
│ │ │ ├── publish.go
│ │ │ ├── selector.go
│ │ │ ├── testdata/
│ │ │ │ ├── bad-config/
│ │ │ │ │ └── .ko.yaml/
│ │ │ │ │ └── .gitignore
│ │ │ │ ├── config/
│ │ │ │ │ ├── .ko.yaml
│ │ │ │ │ └── my-ko.yaml
│ │ │ │ ├── multiple-platforms/
│ │ │ │ │ └── .ko.yaml
│ │ │ │ └── paths/
│ │ │ │ ├── .ko.yaml
│ │ │ │ └── app/
│ │ │ │ ├── cmd/
│ │ │ │ │ └── foo/
│ │ │ │ │ └── main.go
│ │ │ │ └── go.mod
│ │ │ └── validate.go
│ │ ├── publisher.go
│ │ ├── publisher_test.go
│ │ ├── resolve.go
│ │ ├── resolver.go
│ │ ├── resolver_test.go
│ │ ├── root.go
│ │ ├── run.go
│ │ └── version.go
│ ├── doc.go
│ ├── internal/
│ │ ├── git/
│ │ │ ├── clone.go
│ │ │ ├── errors.go
│ │ │ ├── git.go
│ │ │ ├── info.go
│ │ │ └── info_test.go
│ │ ├── gittesting/
│ │ │ ├── git.go
│ │ │ └── git_test.go
│ │ └── testing/
│ │ ├── daemon.go
│ │ ├── doc.go
│ │ ├── fixed.go
│ │ └── fixed_test.go
│ ├── publish/
│ │ ├── daemon.go
│ │ ├── daemon_test.go
│ │ ├── default.go
│ │ ├── default_test.go
│ │ ├── doc.go
│ │ ├── future.go
│ │ ├── future_test.go
│ │ ├── kind/
│ │ │ ├── doc.go
│ │ │ ├── write.go
│ │ │ └── write_test.go
│ │ ├── kind.go
│ │ ├── layout.go
│ │ ├── layout_test.go
│ │ ├── multi.go
│ │ ├── multi_test.go
│ │ ├── options.go
│ │ ├── publish.go
│ │ ├── recorder.go
│ │ ├── recorder_test.go
│ │ ├── shared.go
│ │ ├── shared_test.go
│ │ ├── tarball.go
│ │ └── tarball_test.go
│ └── resolve/
│ ├── doc.go
│ ├── resolve.go
│ ├── resolve_test.go
│ ├── selector.go
│ └── selector_test.go
└── test/
├── build-configs/
│ ├── .ko.yaml
│ ├── bar/
│ │ ├── cmd/
│ │ │ └── main.go
│ │ └── go.mod
│ ├── caps/
│ │ ├── cmd/
│ │ │ └── main.go
│ │ └── go.mod
│ ├── caps.ko.yaml
│ ├── foo/
│ │ ├── cmd/
│ │ │ └── main.go
│ │ └── go.mod
│ └── toolexec/
│ ├── cmd/
│ │ └── main.go
│ └── go.mod
├── kodata/
│ ├── a
│ ├── kenobi
│ └── subdir/
│ └── file.txt
├── main.go
└── test.yaml
SYMBOL INDEX (537 symbols across 90 files)
FILE: cmd/help/main.go
function init (line 36) | func init() {
function main (line 40) | func main() {
FILE: internal/sbom/sbom.go
function modulePackageName (line 26) | func modulePackageName(mod *debug.Module) string {
function goRef (line 32) | func goRef(mod *debug.Module) string {
function massageGoVersionM (line 53) | func massageGoVersionM(b []byte) ([]byte, error) {
FILE: internal/sbom/spdx.go
type qualifier (line 36) | type qualifier struct
function ociRef (line 43) | func ociRef(path string, imgDigest v1.Hash, qual ...qualifier) string {
function h1ToSHA256 (line 56) | func h1ToSHA256(s string) string {
constant dateFormat (line 67) | dateFormat = "2006-01-02T15:04:05Z"
function GenerateImageSPDX (line 69) | func GenerateImageSPDX(koVersion string, mod []byte, img oci.SignedImage...
function extractDate (line 202) | func extractDate(sii oci.SignedImageIndex) (*time.Time, error) {
function GenerateIndexSPDX (line 229) | func GenerateIndexSPDX(koVersion string, sii oci.SignedImageIndex) ([]by...
function ociPackageName (line 359) | func ociPackageName(d v1.Hash) string {
function starterDocument (line 363) | func starterDocument(koVersion string, date time.Time, d v1.Hash) (Docum...
function addBaseImage (line 379) | func addBaseImage(doc *Document, annotations map[string]string, h v1.Has...
constant NOASSERTION (line 462) | NOASSERTION = "NOASSERTION"
constant Version (line 463) | Version = "SPDX-2.3"
type Document (line 466) | type Document struct
type CreationInfo (line 480) | type CreationInfo struct
type Package (line 486) | type Package struct
type PackageVerificationCode (line 506) | type PackageVerificationCode struct
type File (line 511) | type File struct
type Checksum (line 523) | type Checksum struct
type ExternalRef (line 528) | type ExternalRef struct
type Relationship (line 534) | type Relationship struct
type ExternalDocumentRef (line 540) | type ExternalDocumentRef struct
FILE: main.go
function main (line 26) | func main() {
FILE: pkg/build/build.go
type Interface (line 26) | type Interface interface
type Result (line 48) | type Result interface
FILE: pkg/build/cache.go
type diffIDToDescriptor (line 34) | type diffIDToDescriptor
type buildIDToDiffID (line 35) | type buildIDToDiffID
type layerCache (line 37) | type layerCache struct
method get (line 45) | func (c *layerCache) get(ctx context.Context, file string, miss layerF...
method getMeta (line 72) | func (c *layerCache) getMeta(ctx context.Context, file string) (*v1.Ha...
method put (line 109) | func (c *layerCache) put(ctx context.Context, file string, layer v1.La...
method readDiffToDesc (line 164) | func (c *layerCache) readDiffToDesc(file string) (diffIDToDescriptor, ...
method readBuildToDiff (line 183) | func (c *layerCache) readBuildToDiff(file string) (buildIDToDiffID, er...
type layerFactory (line 43) | type layerFactory
function getBuildID (line 202) | func getBuildID(ctx context.Context, file string) (string, error) {
FILE: pkg/build/config.go
type StringArray (line 24) | type StringArray
method UnmarshalYAML (line 27) | func (a *StringArray) UnmarshalYAML(unmarshal func(any) error) error {
type FlagArray (line 42) | type FlagArray
method UnmarshalYAML (line 45) | func (a *FlagArray) UnmarshalYAML(unmarshal func(any) error) error {
type Config (line 64) | type Config struct
FILE: pkg/build/future.go
function newFuture (line 21) | func newFuture(work func() (Result, error)) *future {
type result (line 40) | type result struct
type future (line 45) | type future struct
method Get (line 53) | func (f *future) Get() (Result, error) {
FILE: pkg/build/future_test.go
function makeImage (line 23) | func makeImage() (Result, error) {
function digest (line 27) | func digest(t *testing.T, img Result) string {
function TestSameFutureSameImage (line 35) | func TestSameFutureSameImage(t *testing.T) {
function TestDiffFutureDiffImage (line 55) | func TestDiffFutureDiffImage(t *testing.T) {
FILE: pkg/build/gobuild.go
constant defaultAppFilename (line 59) | defaultAppFilename = "ko-app"
constant defaultGoBin (line 61) | defaultGoBin = "go"
constant goBinPathEnv (line 62) | goBinPathEnv = "KO_GO_PATH"
type GetBase (line 66) | type GetBase
type buildContext (line 69) | type buildContext struct
type builder (line 79) | type builder
type sbomber (line 81) | type sbomber
type platformMatcher (line 83) | type platformMatcher struct
method matches (line 1469) | func (pm *platformMatcher) matches(base *v1.Platform) bool {
type gobuild (line 88) | type gobuild struct
method qualifyLocalImport (line 203) | func (g *gobuild) qualifyLocalImport(importpath string) (string, error) {
method QualifyImport (line 223) | func (g *gobuild) QualifyImport(importpath string) (string, error) {
method IsSupportedReference (line 241) | func (g *gobuild) IsSupportedReference(s string) error {
method kodataPath (line 669) | func (g *gobuild) kodataPath(ref reference) (string, error) {
method tarKoData (line 791) | func (g *gobuild) tarKoData(ref reference, platform *v1.Platform) (*by...
method configForImportPath (line 936) | func (g *gobuild) configForImportPath(ip string) Config {
method useDebugging (line 963) | func (g gobuild) useDebugging(platform v1.Platform) bool {
method buildOne (line 967) | func (g *gobuild) buildOne(ctx context.Context, refStr string, base v1...
method Build (line 1273) | func (g *gobuild) Build(ctx context.Context, s string) (Result, error) {
method buildAll (line 1321) | func (g *gobuild) buildAll(ctx context.Context, ref string, baseRef na...
type Option (line 114) | type Option
type gobuildOpener (line 116) | type gobuildOpener struct
method Open (line 139) | func (gbo *gobuildOpener) Open() (Interface, error) {
function NewGo (line 187) | func NewGo(ctx context.Context, dir string, options ...Option) (Interfac...
function getGoarm (line 263) | func getGoarm(platform v1.Platform) (string, error) {
function getGoBinary (line 283) | func getGoBinary() string {
function doesPlatformSupportDebugging (line 290) | func doesPlatformSupportDebugging(platform v1.Platform) bool {
function getDelve (line 300) | func getDelve(ctx context.Context, platform v1.Platform) (string, error) {
function build (line 363) | func build(ctx context.Context, buildCtx buildContext) (string, error) {
function goenv (line 425) | func goenv(ctx context.Context) (map[string]string, error) {
function goversionm (line 461) | func goversionm(ctx context.Context, file string, appPath string, appFil...
function spdx (line 492) | func spdx(version string) sbomber {
function writeSBOM (line 530) | func writeSBOM(sbom []byte, appFileName, dir, ext string) error {
function buildEnv (line 546) | func buildEnv(platform v1.Platform, osEnv, buildEnv []string) ([]string,...
function appFilename (line 575) | func appFilename(importpath string) string {
constant userOwnerAndGroupSID (line 591) | userOwnerAndGroupSID = "AQAAgBQAAAAkAAAAAAAAAAAAAAABAgAAAAAABSAAAAAhAgAA...
function tarBinary (line 593) | func tarBinary(name, binary string, platform *v1.Platform, opts *layerOp...
constant kodataRoot (line 688) | kodataRoot = "/var/run/ko"
function writeDirToTar (line 691) | func writeDirToTar(tw *tar.Writer, name string, modTime time.Time) error {
function writeFileToTar (line 704) | func writeFileToTar(tw *tar.Writer, name, evalPath string, size int64, m...
function walkRecursive (line 740) | func walkRecursive(tw *tar.Writer, root, chroot string, creationTime v1....
function createTemplateData (line 832) | func createTemplateData(ctx context.Context, buildCtx buildContext) (map...
function applyTemplating (line 878) | func applyTemplating(list []string, data map[string]any) ([]string, erro...
function createBuildArgs (line 897) | func createBuildArgs(ctx context.Context, buildCtx buildContext) ([]stri...
type layerOptions (line 1235) | type layerOptions struct
function buildLayer (line 1239) | func buildLayer(appPath, file string, platform *v1.Platform, layerMediaT...
function updatePath (line 1253) | func updatePath(cf *v1.ConfigFile, appPath string) {
function parseSpec (line 1451) | func parseSpec(spec []string) (*platformMatcher, error) {
FILE: pkg/build/gobuild_test.go
function repoRootDir (line 46) | func repoRootDir() (string, error) {
function TestGoBuildQualifyImport (line 56) | func TestGoBuildQualifyImport(t *testing.T) {
function TestGoBuildIsSupportedRef (line 142) | func TestGoBuildIsSupportedRef(t *testing.T) {
function TestGoBuildIsSupportedRefWithModules (line 177) | func TestGoBuildIsSupportedRefWithModules(t *testing.T) {
function TestBuildEnv (line 218) | func TestBuildEnv(t *testing.T) {
function TestGoEnv (line 303) | func TestGoEnv(t *testing.T) {
function TestCreateTemplateData (line 312) | func TestCreateTemplateData(t *testing.T) {
function TestBuildConfig (line 427) | func TestBuildConfig(t *testing.T) {
function nilGetBase (line 557) | func nilGetBase(context.Context, string) (name.Reference, Result, error) {
constant wantSBOM (line 561) | wantSBOM = "This is our fake SBOM"
function fauxSBOM (line 564) | func fauxSBOM(context.Context, string, string, string, oci.SignedEntity,...
function writeTempFile (line 569) | func writeTempFile(_ context.Context, buildCtx buildContext) (string, er...
function TestGoBuildNoKoData (line 586) | func TestGoBuildNoKoData(t *testing.T) {
function validateImage (line 681) | func validateImage(t *testing.T, img oci.SignedImage, baseLayers int64, ...
function TestGoBuild (line 915) | func TestGoBuild(t *testing.T) {
function TestGoBuild_Defaults (line 1026) | func TestGoBuild_Defaults(t *testing.T) {
function TestGoBuild_ConfigOverrideDefaults (line 1071) | func TestGoBuild_ConfigOverrideDefaults(t *testing.T) {
function TestGoBuildWithKOCACHE (line 1120) | func TestGoBuildWithKOCACHE(t *testing.T) {
function TestGoBuildWithoutSBOM (line 1159) | func TestGoBuildWithoutSBOM(t *testing.T) {
function TestGoBuildIndex (line 1197) | func TestGoBuildIndex(t *testing.T) {
function TestNestedIndex (line 1269) | func TestNestedIndex(t *testing.T) {
function TestGoarm (line 1303) | func TestGoarm(t *testing.T) {
function TestMatchesPlatformSpec (line 1370) | func TestMatchesPlatformSpec(t *testing.T) {
function TestGoBuildConsistentMediaTypes (line 1506) | func TestGoBuildConsistentMediaTypes(t *testing.T) {
function TestDebugger (line 1580) | func TestDebugger(t *testing.T) {
FILE: pkg/build/gobuilds.go
type gobuilds (line 26) | type gobuilds struct
method QualifyImport (line 72) | func (g *gobuilds) QualifyImport(importpath string) (string, error) {
method IsSupportedReference (line 85) | func (g *gobuilds) IsSupportedReference(importpath string) error {
method Build (line 90) | func (g *gobuilds) Build(ctx context.Context, importpath string) (Resu...
method builder (line 96) | func (g *gobuilds) builder(importpath string) builderWithConfig {
type builderWithConfig (line 38) | type builderWithConfig struct
function NewGobuilds (line 44) | func NewGobuilds(ctx context.Context, workingDirectory string, buildConf...
function relativePath (line 138) | func relativePath(baseDir string, importpath string) (string, error) {
FILE: pkg/build/gobuilds_test.go
function Test_gobuilds (line 25) | func Test_gobuilds(t *testing.T) {
function Test_relativePath (line 132) | func Test_relativePath(t *testing.T) {
FILE: pkg/build/layer.go
type lazyLayer (line 25) | type lazyLayer struct
method Digest (line 36) | func (l *lazyLayer) Digest() (v1.Hash, error) {
method DiffID (line 40) | func (l *lazyLayer) DiffID() (v1.Hash, error) {
method Size (line 44) | func (l *lazyLayer) Size() (int64, error) {
method MediaType (line 48) | func (l *lazyLayer) MediaType() (types.MediaType, error) {
method Compressed (line 53) | func (l *lazyLayer) Compressed() (io.ReadCloser, error) {
method Uncompressed (line 62) | func (l *lazyLayer) Uncompressed() (io.ReadCloser, error) {
method compute (line 70) | func (l *lazyLayer) compute() (v1.Layer, error) {
FILE: pkg/build/limit.go
type Limiter (line 24) | type Limiter struct
method QualifyImport (line 33) | func (l *Limiter) QualifyImport(ip string) (string, error) {
method IsSupportedReference (line 38) | func (l *Limiter) IsSupportedReference(ip string) error {
method Build (line 43) | func (l *Limiter) Build(ctx context.Context, ip string) (Result, error) {
function NewLimiter (line 55) | func NewLimiter(b Interface, n int) *Limiter {
FILE: pkg/build/limit_test.go
type sleeper (line 25) | type sleeper struct
method QualifyImport (line 30) | func (*sleeper) QualifyImport(ip string) (string, error) {
method IsSupportedReference (line 35) | func (*sleeper) IsSupportedReference(_ string) error {
method Build (line 40) | func (*sleeper) Build(_ context.Context, _ string) (Result, error) {
function TestLimiter (line 45) | func TestLimiter(t *testing.T) {
FILE: pkg/build/options.go
function WithBaseImages (line 25) | func WithBaseImages(gb GetBase) Option {
function WithCreationTime (line 34) | func WithCreationTime(t v1.Time) Option {
function WithKoDataCreationTime (line 43) | func WithKoDataCreationTime(t v1.Time) Option {
function WithDisabledOptimizations (line 52) | func WithDisabledOptimizations() Option {
function WithDisabledSBOM (line 60) | func WithDisabledSBOM() Option {
function WithTrimpath (line 69) | func WithTrimpath(v bool) Option {
function WithConfig (line 81) | func WithConfig(buildConfigs map[string]Config) Option {
function WithDefaultEnv (line 90) | func WithDefaultEnv(env []string) Option {
function WithDefaultFlags (line 98) | func WithDefaultFlags(flags []string) Option {
function WithDefaultLdflags (line 106) | func WithDefaultLdflags(ldflags []string) Option {
function WithPlatforms (line 123) | func WithPlatforms(platforms ...string) Option {
function WithLabel (line 135) | func WithLabel(k, v string) Option {
function WithAnnotation (line 146) | func WithAnnotation(k, v string) Option {
function WithUser (line 157) | func WithUser(user string) Option {
function withBuilder (line 166) | func withBuilder(b builder) Option {
function WithSPDX (line 175) | func WithSPDX(version string) Option {
function withSBOMber (line 184) | func withSBOMber(sbom sbomber) Option {
function WithJobs (line 192) | func WithJobs(jobs int) Option {
function WithSBOMDir (line 200) | func WithSBOMDir(dir string) Option {
function WithDebugger (line 207) | func WithDebugger() Option {
FILE: pkg/build/recorder.go
type Recorder (line 23) | type Recorder struct
method QualifyImport (line 33) | func (r *Recorder) QualifyImport(ip string) (string, error) {
method IsSupportedReference (line 38) | func (r *Recorder) IsSupportedReference(ip string) error {
method Build (line 43) | func (r *Recorder) Build(ctx context.Context, ip string) (Result, erro...
FILE: pkg/build/recorder_test.go
type fake (line 24) | type fake struct
method QualifyImport (line 32) | func (r *fake) QualifyImport(ip string) (string, error) { return ip, n...
method IsSupportedReference (line 35) | func (r *fake) IsSupportedReference(ip string) error { return r.isr(ip) }
method Build (line 38) | func (r *fake) Build(_ context.Context, ip string) (Result, error) { r...
function TestISRPassThrough (line 40) | func TestISRPassThrough(t *testing.T) {
function TestBuildRecording (line 74) | func TestBuildRecording(t *testing.T) {
FILE: pkg/build/shared.go
type Caching (line 25) | type Caching struct
method Build (line 45) | func (c *Caching) Build(ctx context.Context, ip string) (Result, error) {
method QualifyImport (line 68) | func (c *Caching) QualifyImport(ip string) (string, error) {
method IsSupportedReference (line 73) | func (c *Caching) IsSupportedReference(ip string) error {
method Invalidate (line 78) | func (c *Caching) Invalidate(ip string) {
function NewCaching (line 37) | func NewCaching(inner Interface) (*Caching, error) {
FILE: pkg/build/shared_test.go
type slowbuild (line 25) | type slowbuild struct
method QualifyImport (line 32) | func (sb *slowbuild) QualifyImport(ip string) (string, error) { return...
method IsSupportedReference (line 34) | func (sb *slowbuild) IsSupportedReference(string) error { return nil }
method Build (line 36) | func (sb *slowbuild) Build(context.Context, string) (Result, error) {
function TestCaching (line 41) | func TestCaching(t *testing.T) {
FILE: pkg/build/strict.go
constant StrictScheme (line 21) | StrictScheme = "ko://"
type reference (line 23) | type reference struct
method IsStrict (line 35) | func (r reference) IsStrict() bool {
method Path (line 39) | func (r reference) Path() string {
method String (line 43) | func (r reference) String() string {
function newRef (line 28) | func newRef(s string) reference {
FILE: pkg/build/strict_test.go
function TestStrictReference (line 19) | func TestStrictReference(t *testing.T) {
FILE: pkg/caps/caps.go
type Mask (line 28) | type Mask
function Parse (line 36) | func Parse(s string) (Mask, error) {
function allKnownCaps (line 51) | func allKnownCaps() Mask {
type Flags (line 105) | type Flags
constant FlagEffective (line 110) | FlagEffective Flags = 1
function XattrBytes (line 116) | func XattrBytes(permitted, inheritable Mask, flags Flags) ([]byte, error) {
type FileCaps (line 143) | type FileCaps struct
method ToXattrBytes (line 211) | func (fc *FileCaps) ToXattrBytes() ([]byte, error) {
function NewFileCaps (line 151) | func NewFileCaps(terms ...string) (*FileCaps, error) {
FILE: pkg/caps/caps_test.go
function TestParse (line 23) | func TestParse(t *testing.T) {
type ddTest (line 55) | type ddTest struct
function TestDd (line 61) | func TestDd(t *testing.T) {
FILE: pkg/caps/new_file_caps_test.go
function TestNewFileCaps (line 23) | func TestNewFileCaps(t *testing.T) {
FILE: pkg/commands/apply.go
function addApply (line 29) | func addApply(topLevel *cobra.Command) {
FILE: pkg/commands/build.go
function addBuild (line 25) | func addBuild(topLevel *cobra.Command) {
FILE: pkg/commands/cache.go
type imageCache (line 38) | type imageCache struct
method get (line 69) | func (i *imageCache) get(ctx context.Context, ref name.Reference, miss...
method newLazyIndex (line 220) | func (i *imageCache) newLazyIndex(ref name.Reference, idx v1.ImageInde...
method newLazyImage (line 240) | func (i *imageCache) newLazyImage(ref name.Reference, img v1.Image, mi...
function newCache (line 50) | func newCache(puller *remote.Puller) (*imageCache, error) {
type lazyIndex (line 272) | type lazyIndex struct
method MediaType (line 281) | func (i *lazyIndex) MediaType() (types.MediaType, error) {
method Digest (line 285) | func (i *lazyIndex) Digest() (v1.Hash, error) {
method Size (line 289) | func (i *lazyIndex) Size() (int64, error) {
method IndexManifest (line 293) | func (i *lazyIndex) IndexManifest() (*v1.IndexManifest, error) {
method RawManifest (line 297) | func (i *lazyIndex) RawManifest() ([]byte, error) {
method Image (line 301) | func (i *lazyIndex) Image(h v1.Hash) (v1.Image, error) {
method ImageIndex (line 315) | func (i *lazyIndex) ImageIndex(h v1.Hash) (v1.ImageIndex, error) {
type lazyImage (line 329) | type lazyImage struct
method Layers (line 342) | func (i *lazyImage) Layers() ([]v1.Layer, error) {
method MediaType (line 366) | func (i *lazyImage) MediaType() (types.MediaType, error) {
method Digest (line 370) | func (i *lazyImage) Digest() (v1.Hash, error) {
method Size (line 374) | func (i *lazyImage) Size() (int64, error) {
method ConfigName (line 378) | func (i *lazyImage) ConfigName() (v1.Hash, error) {
method ConfigFile (line 382) | func (i *lazyImage) ConfigFile() (*v1.ConfigFile, error) {
method RawConfigFile (line 386) | func (i *lazyImage) RawConfigFile() ([]byte, error) {
method Manifest (line 390) | func (i *lazyImage) Manifest() (*v1.Manifest, error) {
method RawManifest (line 394) | func (i *lazyImage) RawManifest() ([]byte, error) {
method LayerByDigest (line 398) | func (i *lazyImage) LayerByDigest(h v1.Hash) (v1.Layer, error) {
method LayerByDiffID (line 422) | func (i *lazyImage) LayerByDiffID(h v1.Hash) (v1.Layer, error) {
type lazyLayer (line 431) | type lazyLayer struct
method Digest (line 440) | func (l *lazyLayer) Digest() (v1.Hash, error) {
method DiffID (line 444) | func (l *lazyLayer) DiffID() (v1.Hash, error) {
method Size (line 448) | func (l *lazyLayer) Size() (int64, error) {
method MediaType (line 452) | func (l *lazyLayer) MediaType() (types.MediaType, error) {
method Compressed (line 456) | func (l *lazyLayer) Compressed() (io.ReadCloser, error) {
method Uncompressed (line 470) | func (l *lazyLayer) Uncompressed() (io.ReadCloser, error) {
FILE: pkg/commands/commands.go
function AddKubeCommands (line 27) | func AddKubeCommands(topLevel *cobra.Command) {
function isKubectlAvailable (line 38) | func isKubectlAvailable() bool {
FILE: pkg/commands/config.go
function getBaseImage (line 55) | func getBaseImage(bo *options.BuildOptions) build.GetBase {
function getTimeFromEnv (line 147) | func getTimeFromEnv(env string) (*v1.Time, error) {
function getCreationTime (line 160) | func getCreationTime() (*v1.Time, error) {
function getKoDataCreationTime (line 164) | func getKoDataCreationTime() (*v1.Time, error) {
type baseFactory (line 168) | type baseFactory
FILE: pkg/commands/config_test.go
function TestOverrideDefaultBaseImageUsingBuildOption (line 27) | func TestOverrideDefaultBaseImageUsingBuildOption(t *testing.T) {
FILE: pkg/commands/create.go
function addCreate (line 29) | func addCreate(topLevel *cobra.Command) {
FILE: pkg/commands/delete.go
type runCmd (line 26) | type runCmd
function passthru (line 30) | func passthru(command string) runCmd {
function addDelete (line 55) | func addDelete(topLevel *cobra.Command) {
FILE: pkg/commands/options/build.go
constant configDefaultBaseImage (line 34) | configDefaultBaseImage = "cgr.dev/chainguard/static:latest"
type BuildOptions (line 38) | type BuildOptions struct
method LoadConfig (line 110) | func (bo *BuildOptions) LoadConfig() error {
function AddBuildOptions (line 87) | func AddBuildOptions(cmd *cobra.Command, bo *BuildOptions) {
function yamlUnmarshallerHookFunc (line 208) | func yamlUnmarshallerHookFunc(_ reflect.Type, to reflect.Type, data any)...
function createBuildConfigMap (line 235) | func createBuildConfigMap(workingDirectory string, configs []build.Confi...
FILE: pkg/commands/options/build_test.go
function TestDefaultBaseImage (line 28) | func TestDefaultBaseImage(t *testing.T) {
function TestDefaultPlatformsAll (line 43) | func TestDefaultPlatformsAll(t *testing.T) {
function TestDefaultEnv (line 71) | func TestDefaultEnv(t *testing.T) {
function TestDefaultFlags (line 80) | func TestDefaultFlags(t *testing.T) {
function TestDefaultLdFlags (line 89) | func TestDefaultLdFlags(t *testing.T) {
function TestBuildConfigWithWorkingDirectoryAndDirAndMain (line 98) | func TestBuildConfigWithWorkingDirectoryAndDirAndMain(t *testing.T) {
function TestCreateBuildConfigs (line 116) | func TestCreateBuildConfigs(t *testing.T) {
function TestAddBuildOptionsSetsDefaultsForNonFlagOptions (line 151) | func TestAddBuildOptionsSetsDefaultsForNonFlagOptions(t *testing.T) {
function TestOverrideConfigPath (line 160) | func TestOverrideConfigPath(t *testing.T) {
FILE: pkg/commands/options/filestuff.go
type FilenameOptions (line 26) | type FilenameOptions struct
function AddFileArg (line 31) | func AddFileArg(cmd *cobra.Command, fo *FilenameOptions) {
function EnumerateFiles (line 40) | func EnumerateFiles(fo *FilenameOptions) chan string {
FILE: pkg/commands/options/namer_test.go
function TestMakeNamer (line 24) | func TestMakeNamer(t *testing.T) {
function foreachTestCaseMakeNamer (line 37) | func foreachTestCaseMakeNamer(fn func(tc testMakeNamerCase)) {
function testMakeNamerCases (line 43) | func testMakeNamerCases() []testMakeNamerCase {
type testMakeNamerCase (line 68) | type testMakeNamerCase struct
FILE: pkg/commands/options/publish.go
type PublishOptions (line 29) | type PublishOptions struct
function AddPublishArg (line 75) | func AddPublishArg(cmd *cobra.Command, po *PublishOptions) {
function packageWithMD5 (line 109) | func packageWithMD5(base, importpath string) string {
function preserveImportPath (line 115) | func preserveImportPath(base, importpath string) string {
function baseImportPaths (line 119) | func baseImportPaths(base, importpath string) string {
function bareDockerRepo (line 123) | func bareDockerRepo(base, _ string) string {
function MakeNamer (line 127) | func MakeNamer(po *PublishOptions) publish.Namer {
FILE: pkg/commands/options/selector.go
type SelectorOptions (line 22) | type SelectorOptions struct
function AddSelectorArg (line 26) | func AddSelectorArg(cmd *cobra.Command, so *SelectorOptions) {
FILE: pkg/commands/options/testdata/paths/app/cmd/foo/main.go
function main (line 19) | func main() {
FILE: pkg/commands/options/validate.go
constant bareBaseFlagsWarning (line 24) | bareBaseFlagsWarning = `WARNING!
constant localFlagsWarning (line 34) | localFlagsWarning = `WARNING!
function Validate (line 44) | func Validate(po *PublishOptions, bo *BuildOptions) error {
FILE: pkg/commands/publisher.go
function PublishImages (line 27) | func PublishImages(ctx context.Context, importpaths []string, pub publis...
function publishImages (line 31) | func publishImages(ctx context.Context, importpaths []string, pub publis...
FILE: pkg/commands/publisher_test.go
function TestPublishImages (line 29) | func TestPublishImages(t *testing.T) {
function sampleAppRelDir (line 98) | func sampleAppRelDir() (string, error) {
FILE: pkg/commands/resolve.go
function addResolve (line 26) | func addResolve(topLevel *cobra.Command) {
FILE: pkg/commands/resolver.go
function ua (line 40) | func ua() string {
function gobuildOptions (line 47) | func gobuildOptions(bo *options.BuildOptions) ([]build.Option, error) {
function NewBuilder (line 146) | func NewBuilder(ctx context.Context, bo *options.BuildOptions) (build.In...
function makeBuilder (line 150) | func makeBuilder(ctx context.Context, bo *options.BuildOptions) (*build....
function NewPublisher (line 180) | func NewPublisher(po *options.PublishOptions) (publish.Interface, error) {
function makePublisher (line 184) | func makePublisher(po *options.PublishOptions) (publish.Interface, error) {
type nopPublisher (line 289) | type nopPublisher struct
method Publish (line 296) | func (n nopPublisher) Publish(_ context.Context, br build.Result, s st...
method Close (line 315) | func (n nopPublisher) Close() error { return nil }
type resolvedFuture (line 318) | type resolvedFuture
function ResolveFilesToWriter (line 320) | func ResolveFilesToWriter(
function resolveFile (line 415) | func resolveFile(
function unique (line 487) | func unique(ss []string) []string {
FILE: pkg/commands/resolver_test.go
type erroringClient (line 67) | type erroringClient struct
method Ping (line 74) | func (m *erroringClient) Ping(context.Context, client.PingOptions) (cl...
method ImageLoad (line 77) | func (m *erroringClient) ImageLoad(context.Context, io.Reader, ...clie...
method ImageTag (line 80) | func (m *erroringClient) ImageTag(context.Context, client.ImageTagOpti...
method ImageInspect (line 84) | func (m *erroringClient) ImageInspect(_ context.Context, _ string, _ ....
function TestResolveMultiDocumentYAMLs (line 88) | func TestResolveMultiDocumentYAMLs(t *testing.T) {
function TestResolveMultiDocumentYAMLsWithSelector (line 142) | func TestResolveMultiDocumentYAMLsWithSelector(t *testing.T) {
function TestNewBuilder (line 172) | func TestNewBuilder(t *testing.T) {
function TestNewPublisherCanPublish (line 243) | func TestNewPublisherCanPublish(t *testing.T) {
function registryServerWithImage (line 329) | func registryServerWithImage(namespace string) (*httptest.Server, error) {
function mustRepository (line 342) | func mustRepository(s string) name.Repository {
function mustDigest (line 350) | func mustDigest(img v1.Image) v1.Hash {
function mustRandom (line 358) | func mustRandom() v1.Image {
function yamlToTmpFile (line 366) | func yamlToTmpFile(t *testing.T, yaml []byte) string {
FILE: pkg/commands/root.go
function New (line 28) | func New() *cobra.Command {
FILE: pkg/commands/run.go
function addRun (line 31) | func addRun(topLevel *cobra.Command) {
function unparsedDashes (line 153) | func unparsedDashes() int {
FILE: pkg/commands/version.go
function addVersion (line 28) | func addVersion(topLevel *cobra.Command) {
function version (line 43) | func version() string {
FILE: pkg/internal/git/clone.go
function Clone (line 46) | func Clone(ctx context.Context, dir string, repoURL string) error {
FILE: pkg/internal/git/errors.go
type ErrDirty (line 58) | type ErrDirty struct
method Error (line 62) | func (e ErrDirty) Error() string {
FILE: pkg/internal/git/git.go
type runConfig (line 47) | type runConfig struct
function run (line 54) | func run(ctx context.Context, cfg runConfig) (string, error) {
function clean (line 80) | func clean(output string, err error) (string, error) {
function cleanAllLines (line 89) | func cleanAllLines(output string, err error) ([]string, error) {
FILE: pkg/internal/git/info.go
type Info (line 50) | type Info struct
method TemplateValue (line 60) | func (i Info) TemplateValue() map[string]any {
function GetInfo (line 80) | func GetInfo(ctx context.Context, dir string) (Info, error) {
function isRepo (line 132) | func isRepo(ctx context.Context, dir string) bool {
function checkDirty (line 141) | func checkDirty(ctx context.Context, dir string) error {
function getBranch (line 152) | func getBranch(ctx context.Context, dir string) (string, error) {
function getCommitDate (line 159) | func getCommitDate(ctx context.Context, dir string) (time.Time, error) {
function getShortCommit (line 178) | func getShortCommit(ctx context.Context, dir string) (string, error) {
function getFullCommit (line 185) | func getFullCommit(ctx context.Context, dir string) (string, error) {
function getTag (line 192) | func getTag(ctx context.Context, dir string, excluding []string) (string...
function gitDescribe (line 203) | func gitDescribe(ctx context.Context, dir, ref string, excluding []strin...
function filterOut (line 219) | func filterOut(tags []string, exclude []string) string {
FILE: pkg/internal/git/info_test.go
constant fakeGitURL (line 50) | fakeGitURL = "git@github.com:foo/bar.git"
function TestNotAGitFolder (line 52) | func TestNotAGitFolder(t *testing.T) {
function TestSingleCommit (line 61) | func TestSingleCommit(t *testing.T) {
function TestBranch (line 82) | func TestBranch(t *testing.T) {
function TestNewRepository (line 104) | func TestNewRepository(t *testing.T) {
function TestNoTags (line 115) | func TestNoTags(t *testing.T) {
function TestDirty (line 135) | func TestDirty(t *testing.T) {
function TestValidState (line 161) | func TestValidState(t *testing.T) {
function TestGitNotInPath (line 176) | func TestGitNotInPath(t *testing.T) {
function requireEmpty (line 185) | func requireEmpty(t *testing.T, tpl map[string]any) {
FILE: pkg/internal/gittesting/git.go
function GitInit (line 49) | func GitInit(t *testing.T, dir string) {
function GitRemoteAdd (line 60) | func GitRemoteAdd(t *testing.T, dir, url string) {
function GitCommit (line 68) | func GitCommit(t *testing.T, dir, msg string) {
function GitTag (line 76) | func GitTag(t *testing.T, dir, tag string) {
function GitAdd (line 84) | func GitAdd(t *testing.T, dir string) {
function fakeGit (line 91) | func fakeGit(dir string, args ...string) (string, error) {
function GitCheckoutBranch (line 104) | func GitCheckoutBranch(t *testing.T, dir, name string) {
function gitRun (line 111) | func gitRun(dir string, args ...string) (string, error) {
FILE: pkg/internal/gittesting/git_test.go
function TestGit (line 41) | func TestGit(t *testing.T) {
FILE: pkg/internal/testing/daemon.go
type MockDaemon (line 26) | type MockDaemon struct
method Ping (line 34) | func (m *MockDaemon) Ping(context.Context, client.PingOptions) (client...
method ImageLoad (line 37) | func (m *MockDaemon) ImageLoad(context.Context, io.Reader, ...client.I...
method ImageTag (line 41) | func (m *MockDaemon) ImageTag(_ context.Context, opt client.ImageTagOp...
method ImageInspect (line 49) | func (m *MockDaemon) ImageInspect(context.Context, string, ...client.I...
FILE: pkg/internal/testing/fixed.go
type fixedBuild (line 29) | type fixedBuild struct
method QualifyImport (line 40) | func (f *fixedBuild) QualifyImport(ip string) (string, error) {
method IsSupportedReference (line 45) | func (f *fixedBuild) IsSupportedReference(s string) error {
method Build (line 54) | func (f *fixedBuild) Build(_ context.Context, s string) (build.Result,...
function NewFixedBuild (line 35) | func NewFixedBuild(entries map[string]build.Result) build.Interface {
type fixedPublish (line 62) | type fixedPublish struct
method Publish (line 74) | func (f *fixedPublish) Publish(_ context.Context, _ build.Result, s st...
method Close (line 87) | func (f *fixedPublish) Close() error {
function NewFixedPublish (line 69) | func NewFixedPublish(base name.Repository, entries map[string]v1.Hash) p...
function ComputeDigest (line 91) | func ComputeDigest(base name.Repository, ref string, h v1.Hash) string {
FILE: pkg/internal/testing/fixed_test.go
function TestFixedPublish (line 27) | func TestFixedPublish(t *testing.T) {
function TestFixedBuild (line 64) | func TestFixedBuild(t *testing.T) {
FILE: pkg/publish/daemon.go
constant LocalDomain (line 32) | LocalDomain = "ko.local"
type demon (line 37) | type demon struct
method getOpts (line 82) | func (d *demon) getOpts(ctx context.Context) []daemon.Option {
method Publish (line 90) | func (d *demon) Publish(ctx context.Context, br build.Result, s string...
method Close (line 168) | func (d *demon) Close() error {
type DaemonOption (line 45) | type DaemonOption
function WithLocalDomain (line 48) | func WithLocalDomain(domain string) DaemonOption {
function WithDockerClient (line 58) | func WithDockerClient(client daemon.Client) DaemonOption {
function NewDaemon (line 68) | func NewDaemon(namer Namer, tags []string, opts ...DaemonOption) (Interf...
FILE: pkg/publish/daemon_test.go
function TestDaemon (line 28) | func TestDaemon(t *testing.T) {
function TestDaemonTags (line 48) | func TestDaemonTags(t *testing.T) {
function TestDaemonDomain (line 81) | func TestDaemonDomain(t *testing.T) {
FILE: pkg/publish/default.go
type defalt (line 41) | type defalt struct
method pushResult (line 149) | func (d *defalt) pushResult(ctx context.Context, tag name.Tag, br buil...
method Publish (line 226) | func (d *defalt) Publish(ctx context.Context, br build.Result, s strin...
method Close (line 283) | func (d *defalt) Close() error {
type Option (line 54) | type Option
type defaultOpener (line 56) | type defaultOpener struct
method Open (line 84) | func (do *defaultOpener) Open() (Interface, error) {
type Namer (line 71) | type Namer
function identity (line 78) | func identity(base, in string) string { return path.Join(base, in) }
constant latestTag (line 82) | latestTag = "latest"
function NewDefault (line 124) | func NewDefault(base string, options ...Option) (Interface, error) {
FILE: pkg/publish/default_test.go
function TestDefault (line 45) | func TestDefault(t *testing.T) {
function md5Hash (line 88) | func md5Hash(base, s string) string {
function TestDefaultWithCustomNamer (line 95) | func TestDefaultWithCustomNamer(t *testing.T) {
function TestDefaultWithTags (line 128) | func TestDefaultWithTags(t *testing.T) {
function TestDefaultWithReleaseTag (line 176) | func TestDefaultWithReleaseTag(t *testing.T) {
FILE: pkg/publish/future.go
function newFuture (line 23) | func newFuture(work func() (name.Reference, error)) *future {
type result (line 42) | type result struct
type future (line 47) | type future struct
method Get (line 55) | func (f *future) Get() (name.Reference, error) {
FILE: pkg/publish/future_test.go
function makeRef (line 25) | func makeRef() (name.Reference, error) {
function TestSameFutureSameReference (line 37) | func TestSameFutureSameReference(t *testing.T) {
function TestDiffFutureDiffReference (line 57) | func TestDiffFutureDiffReference(t *testing.T) {
FILE: pkg/publish/kind.go
constant KindDomain (line 32) | KindDomain = "kind.local"
type kindPublisher (line 35) | type kindPublisher struct
method Publish (line 51) | func (t *kindPublisher) Publish(ctx context.Context, br build.Result, ...
method Close (line 128) | func (t *kindPublisher) Close() error {
function NewKindPublisher (line 42) | func NewKindPublisher(base string, namer Namer, tags []string) Interface {
FILE: pkg/publish/kind/write.go
constant clusterNameEnvKey (line 35) | clusterNameEnvKey = "KIND_CLUSTER_NAME"
type provider (line 38) | type provider interface
function Tag (line 48) | func Tag(ctx context.Context, src, dest name.Tag) error {
function Write (line 62) | func Write(ctx context.Context, tag name.Tag, img v1.Image) error {
function onEachNode (line 88) | func onEachNode(f func(nodes.Node) error) error {
function getNodes (line 104) | func getNodes() ([]nodes.Node, error) {
FILE: pkg/publish/kind/write_test.go
function TestWrite (line 31) | func TestWrite(t *testing.T) {
function TestTag (line 66) | func TestTag(t *testing.T) {
function TestFailWithNoNodes (line 101) | func TestFailWithNoNodes(t *testing.T) {
function TestFailCommands (line 130) | func TestFailCommands(t *testing.T) {
type fakeProvider (line 164) | type fakeProvider struct
method ListInternalNodes (line 168) | func (f *fakeProvider) ListInternalNodes(string) ([]nodes.Node, error) {
type fakeNode (line 172) | type fakeNode struct
method CommandContext (line 177) | func (f *fakeNode) CommandContext(_ context.Context, cmd string, args ...
method String (line 186) | func (f *fakeNode) String() string {
method Command (line 191) | func (f *fakeNode) Command(string, ...string) exec.Cmd { return nil }
method Role (line 192) | func (f *fakeNode) Role() (string, error) { return "", nil }
method IP (line 193) | func (f *fakeNode) IP() (string, string, error) { return "", ""...
method SerialLogs (line 194) | func (f *fakeNode) SerialLogs(io.Writer) error { return nil }
type fakeCmd (line 196) | type fakeCmd struct
method Run (line 202) | func (f *fakeCmd) Run() error {
method SetStdin (line 210) | func (f *fakeCmd) SetStdin(stdin io.Reader) exec.Cmd {
method SetEnv (line 216) | func (f *fakeCmd) SetEnv(...string) exec.Cmd { return f }
method SetStdout (line 217) | func (f *fakeCmd) SetStdout(io.Writer) exec.Cmd { return f }
method SetStderr (line 218) | func (f *fakeCmd) SetStderr(io.Writer) exec.Cmd { return f }
FILE: pkg/publish/layout.go
type LayoutPublisher (line 30) | type LayoutPublisher struct
method writeResult (line 39) | func (l *LayoutPublisher) writeResult(br build.Result) (layout.Path, e...
method Publish (line 78) | func (l *LayoutPublisher) Publish(_ context.Context, br build.Result, ...
method Close (line 99) | func (l *LayoutPublisher) Close() error {
function NewLayout (line 35) | func NewLayout(p string) Interface {
FILE: pkg/publish/layout_test.go
function TestLayout (line 26) | func TestLayout(t *testing.T) {
FILE: pkg/publish/multi.go
function MultiPublisher (line 30) | func MultiPublisher(publishers ...Interface) Interface {
type multiPublisher (line 34) | type multiPublisher struct
method Publish (line 39) | func (p *multiPublisher) Publish(ctx context.Context, br build.Result,...
method Close (line 53) | func (p *multiPublisher) Close() (err error) {
FILE: pkg/publish/multi_test.go
function TestMulti (line 27) | func TestMulti(t *testing.T) {
function TestMulti_Zero (line 63) | func TestMulti_Zero(t *testing.T) {
FILE: pkg/publish/options.go
type staticKeychain (line 24) | type staticKeychain struct
method Resolve (line 28) | func (s staticKeychain) Resolve(authn.Resource) (authn.Authenticator, ...
function WithTransport (line 34) | func WithTransport(t http.RoundTripper) Option {
function WithUserAgent (line 43) | func WithUserAgent(ua string) Option {
function WithAuth (line 52) | func WithAuth(a authn.Authenticator) Option {
function WithAuthFromKeychain (line 61) | func WithAuthFromKeychain(keys authn.Keychain) Option {
function WithNamer (line 70) | func WithNamer(n Namer) Option {
function WithTags (line 78) | func WithTags(tags []string) Option {
function WithTagOnly (line 86) | func WithTagOnly(tagOnly bool) Option {
function Insecure (line 93) | func Insecure(b bool) Option {
function WithJobs (line 112) | func WithJobs(jobs int) Option {
FILE: pkg/publish/publish.go
type Interface (line 25) | type Interface interface
FILE: pkg/publish/recorder.go
type recorder (line 32) | type recorder struct
method Publish (line 51) | func (r *recorder) Publish(ctx context.Context, br build.Result, ref s...
method Close (line 90) | func (r *recorder) Close() error {
function NewRecorder (line 43) | func NewRecorder(inner Interface, name string) (Interface, error) {
FILE: pkg/publish/recorder_test.go
type cbPublish (line 30) | type cbPublish struct
method Publish (line 36) | func (sp *cbPublish) Publish(ctx context.Context, br build.Result, ref...
method Close (line 40) | func (sp *cbPublish) Close() error {
function TestRecorder (line 44) | func TestRecorder(t *testing.T) {
FILE: pkg/publish/shared.go
type caching (line 27) | type caching struct
method Publish (line 54) | func (c *caching) Publish(ctx context.Context, br build.Result, ref st...
method Close (line 79) | func (c *caching) Close() error {
type entry (line 36) | type entry struct
function NewCaching (line 46) | func NewCaching(inner Interface) (Interface, error) {
FILE: pkg/publish/shared_test.go
type slowpublish (line 27) | type slowpublish struct
method Publish (line 34) | func (sp *slowpublish) Publish(context.Context, build.Result, string) ...
method Close (line 39) | func (sp *slowpublish) Close() error {
function TestCaching (line 43) | func TestCaching(t *testing.T) {
FILE: pkg/publish/tarball.go
type tar (line 29) | type tar struct
method Publish (line 49) | func (t *tar) Publish(_ context.Context, br build.Result, s string) (n...
method Close (line 95) | func (t *tar) Close() error {
function NewTarball (line 38) | func NewTarball(file, base string, namer Namer, tags []string) Interface {
FILE: pkg/publish/tarball_test.go
function TestTarball (line 29) | func TestTarball(t *testing.T) {
FILE: pkg/resolve/resolve.go
function ImageReferences (line 34) | func ImageReferences(ctx context.Context, docs []*yaml.Node, builder bui...
function refsFromDoc (line 89) | func refsFromDoc(doc *yaml.Node) yit.Iterator {
FILE: pkg/resolve/resolve_test.go
function TestYAMLArrays (line 54) | func TestYAMLArrays(t *testing.T) {
function TestYAMLMaps (line 121) | func TestYAMLMaps(t *testing.T) {
type object (line 189) | type object struct
function TestYAMLObject (line 196) | func TestYAMLObject(t *testing.T) {
function TestStrict (line 253) | func TestStrict(t *testing.T) {
function TestIsSupportedReferenceError (line 275) | func TestIsSupportedReferenceError(t *testing.T) {
function mustRandom (line 295) | func mustRandom() build.Result {
function mustRepository (line 303) | func mustRepository(s string) name.Repository {
function mustDigest (line 311) | func mustDigest(img build.Result) v1.Hash {
FILE: pkg/resolve/selector.go
function MatchesSelector (line 31) | func MatchesSelector(doc *yaml.Node, selector labels.Selector) (bool, er...
function docKind (line 52) | func docKind(doc *yaml.Node) (string, error) {
function objMatchesSelector (line 82) | func objMatchesSelector(doc *yaml.Node, selector labels.Selector) bool {
function listMatchesSelector (line 110) | func listMatchesSelector(doc *yaml.Node, selector labels.Selector) (bool...
type labelsNode (line 145) | type labelsNode struct
method Get (line 151) | func (n labelsNode) Get(label string) (value string) {
method Has (line 160) | func (n labelsNode) Has(label string) bool {
method Lookup (line 169) | func (n labelsNode) Lookup(label string) (value string, exists bool) {
FILE: pkg/resolve/selector_test.go
constant webPod (line 35) | webPod = `apiVersion: v1
constant dbPod (line 43) | dbPod = `apiVersion: v1
constant podNoLabel (line 51) | podNoLabel = `apiVersion: v1
constant podList (line 56) | podList = `apiVersion: v1
constant webPodList (line 75) | webPodList = `apiVersion: v1
constant dbPodList (line 88) | dbPodList = `apiVersion: v1
constant podListNoLabel (line 101) | podListNoLabel = `apiVersion: v1
function TestMatchesSelector (line 118) | func TestMatchesSelector(t *testing.T) {
function TestSelectorFailure (line 225) | func TestSelectorFailure(t *testing.T) {
function selector (line 264) | func selector(s string) labels.Selector {
function normalizeYAML (line 272) | func normalizeYAML(t *testing.T, yuml string) string {
function yamlToStr (line 277) | func yamlToStr(t *testing.T, node *yaml.Node) string {
function strToYAML (line 286) | func strToYAML(t *testing.T, yuml string) *yaml.Node {
function TestLabelsNode (line 297) | func TestLabelsNode(t *testing.T) {
FILE: test/build-configs/bar/cmd/main.go
function main (line 19) | func main() {
FILE: test/build-configs/caps/cmd/main.go
function permittedCaps (line 25) | func permittedCaps() (uint64, error) {
function main (line 39) | func main() {
FILE: test/build-configs/foo/cmd/main.go
function main (line 19) | func main() {
FILE: test/build-configs/toolexec/cmd/main.go
function main (line 19) | func main() {
FILE: test/main.go
function main (line 40) | func main() {
Condensed preview — 186 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (662K chars).
[
{
"path": ".github/dependabot.yml",
"chars": 201,
"preview": "version: 2\nupdates:\n - package-ecosystem: \"gomod\"\n directory: \"/\"\n schedule:\n interval: \"daily\"\n - package-"
},
{
"path": ".github/workflows/analyze.yaml",
"chars": 840,
"preview": "name: Analyze\n\non:\n workflow_dispatch:\n push:\n branches: ['main']\n pull_request:\n branches: ['main']\n\npermissio"
},
{
"path": ".github/workflows/boilerplate.yaml",
"chars": 834,
"preview": "name: Boilerplate\n\non:\n pull_request:\n branches: ['main']\n\npermissions: {}\n\njobs:\n check:\n name: Boilerplate Che"
},
{
"path": ".github/workflows/build.yaml",
"chars": 597,
"preview": "name: Build\n\non:\n pull_request:\n branches:\n - \"main\"\n\npermissions: {}\n\njobs:\n build:\n name: Build\n runs-"
},
{
"path": ".github/workflows/donotsubmit.yaml",
"chars": 427,
"preview": "name: Do Not Submit\n\non:\n pull_request:\n branches: ['main']\n\npermissions: {}\n\njobs:\n donotsubmit:\n name: Do Not "
},
{
"path": ".github/workflows/e2e.yaml",
"chars": 3529,
"preview": "name: Basic e2e test\n\non:\n pull_request:\n branches:\n - 'main'\n\npermissions: {}\n\njobs:\n e2e:\n strategy:\n "
},
{
"path": ".github/workflows/image.yaml",
"chars": 1286,
"preview": "name: image\n\non:\n push:\n branches:\n - 'main'\n workflow_dispatch:\n\npermissions: {}\n\njobs:\n image:\n runs-on:"
},
{
"path": ".github/workflows/kind-e2e.yaml",
"chars": 2306,
"preview": "name: KinD e2e tests\n\non:\n workflow_dispatch: # Allow manual runs.\n pull_request:\n branches:\n - 'main'\n\npermi"
},
{
"path": ".github/workflows/modules-integration-test.yaml",
"chars": 577,
"preview": "name: Integration Test\n\non:\n pull_request:\n branches:\n - 'main'\n\npermissions: {}\n\njobs:\n test:\n name: Modul"
},
{
"path": ".github/workflows/publish-site.yaml",
"chars": 515,
"preview": "name: publish\non:\n workflow_dispatch:\n push:\n branches:\n - 'main'\n\npermissions: {}\n\njobs:\n publish:\n runs-"
},
{
"path": ".github/workflows/registries.yaml",
"chars": 2891,
"preview": "name: Push to registries\n\non:\n push:\n branches:\n - 'main'\n\n workflow_dispatch: # Allow manual runs.\n\npermissi"
},
{
"path": ".github/workflows/release.yml",
"chars": 4877,
"preview": "name: goreleaser\n\non:\n push:\n tags:\n - '*'\n\npermissions: {}\n\njobs:\n goreleaser:\n outputs:\n hashes: ${{"
},
{
"path": ".github/workflows/sbom.yaml",
"chars": 2714,
"preview": "name: Validate SBOMs\n\non:\n pull_request:\n branches:\n - 'main'\n\nenv:\n SPDX_TOOLS_VERSION: 1.1.0\n\npermissions: {"
},
{
"path": ".github/workflows/stale.yaml",
"chars": 1071,
"preview": "name: 'Close stale'\n\non:\n schedule:\n - cron: '0 1 * * *'\n\npermissions: {}\n\njobs:\n stale:\n runs-on: 'ubuntu-latest'"
},
{
"path": ".github/workflows/style.yaml",
"chars": 2364,
"preview": "name: Code Style\n\non:\n pull_request:\n branches:\n - 'main'\n\npermissions: {}\n\njobs:\n gofmt:\n name: check gofm"
},
{
"path": ".github/workflows/test.yaml",
"chars": 602,
"preview": "name: Test\n\non:\n push:\n branches:\n - 'main'\n pull_request:\n branches:\n - 'main'\n\npermissions: {}\n\njobs"
},
{
"path": ".github/workflows/verify.yaml",
"chars": 1110,
"preview": "name: Verify\n\non:\n pull_request:\n branches:\n - \"main\"\n\npermissions: {}\n\njobs:\n verify:\n name: Verify Codege"
},
{
"path": ".gitignore",
"chars": 66,
"preview": "# Ignore GoLand (IntelliJ) files.\n.idea/\n\nko\n\n.DS_Store\n\n/vendor/\n"
},
{
"path": ".golangci.yaml",
"chars": 729,
"preview": "version: \"2\"\nlinters:\n enable:\n - asciicheck\n - errorlint\n - gosec\n - importas\n - misspell\n - preallo"
},
{
"path": ".goreleaser.yml",
"chars": 1516,
"preview": "version: 2\n\nbefore:\n hooks:\n - go mod tidy\n - /bin/bash -c 'if [ -n \"$(git --no-pager diff --exit-code go.mod go."
},
{
"path": ".ko.yaml",
"chars": 120,
"preview": "baseImageOverrides:\n github.com/google/ko: golang:latest\n\nbuilds:\n - id: ko\n ldflags:\n - \"{{ .Env.LDFLAGS }}\"\n"
},
{
"path": ".wokeignore",
"chars": 41,
"preview": "# Uses some Cobra methods\npkg/commands/*\n"
},
{
"path": "CNAME",
"chars": 8,
"preview": "ko.build"
},
{
"path": "CONTRIBUTING.md",
"chars": 623,
"preview": "# How to Contribute to ko\n\nWe'd love to accept your patches and contributions to this project. There are\njust a few smal"
},
{
"path": "LICENSE",
"chars": 11357,
"preview": "\n Apache License\n Version 2.0, January 2004\n "
},
{
"path": "MAINTAINERS.md",
"chars": 306,
"preview": "# Maintainers\n\nThis page lists all active members of the maintainers for the `ko` project and any subprojects.\n\n- Jon Jo"
},
{
"path": "README.md",
"chars": 2192,
"preview": "# `ko`: Easy Go Containers\n\n[](h"
},
{
"path": "ROADMAP.md",
"chars": 887,
"preview": "# `ko` Project Roadmap\n\n_Last updated October 2022_\n\n- Foster a community of contributors and users\n - give talks, do o"
},
{
"path": "cmd/help/main.go",
"chars": 1169,
"preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "code-of-conduct.md",
"chars": 3250,
"preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
},
{
"path": "docs/CNAME",
"chars": 9,
"preview": "ko.build\n"
},
{
"path": "docs/README.md",
"chars": 852,
"preview": "# Docs for https://ko.build\n\n## Development\n\nUpdate `.md` files to update content.\n\nUpdate `mkdocs.yml` to update sideba"
},
{
"path": "docs/advanced/faq.md",
"chars": 4373,
"preview": "# Frequently Asked Questions\n\n## How can I set `ldflags`?\n\n[Using -ldflags](https://blog.cloudflare.com/setting-go-varia"
},
{
"path": "docs/advanced/go-packages.md",
"chars": 1817,
"preview": "# Go Packages\n\n`ko`'s functionality can be consumed as a library in a Go application.\n\nTo build an image, use [`pkg/buil"
},
{
"path": "docs/advanced/lambda.md",
"chars": 2069,
"preview": "# AWS Lambda\n\n`ko` can build images that can be deployed as AWS Lambda functions, using [Lambda's container support](htt"
},
{
"path": "docs/advanced/limitations.md",
"chars": 617,
"preview": "# Limitations\n\n`ko` works best when your application has no dependencies on the underlying image.\n\nThis means `ko` is id"
},
{
"path": "docs/advanced/linux-capabilities.md",
"chars": 2392,
"preview": "# Linux Capabilities\n\nIn Linux, capabilities are a way to selectively grant privileges to a running process.\n\nDocker pro"
},
{
"path": "docs/advanced/migrating-from-dockerfile.md",
"chars": 2101,
"preview": "# Migrating from Dockerfile\n\nIf your `Dockerfile` looks like either of the examples in the [official tutorial for writin"
},
{
"path": "docs/advanced/root-ca-certificates.md",
"chars": 3970,
"preview": "# Root CA Certificates\n\nTo install a [root certificate](https://en.wikipedia.org/wiki/Root_certificate) into your contai"
},
{
"path": "docs/advanced/terraform.md",
"chars": 1147,
"preview": "# Terraform Provider\n\nIn addition to the CLI, `ko`'s functionality is also available as a Terraform provider.\n\nThis allo"
},
{
"path": "docs/community.md",
"chars": 720,
"preview": "# Community\n\n## Meetings\n\nWe have a bi-weekly community meeting on [Wednesdays at 1:00 PM US Eastern time, 10:00 AM US W"
},
{
"path": "docs/configuration.md",
"chars": 8765,
"preview": "# Configuration\n\n## Basic Configuration\n\nAside from certain environment variables (see [below](#environment-variables-ad"
},
{
"path": "docs/custom/main.html",
"chars": 447,
"preview": "{% extends \"base.html\" %}\n\n{% block site_meta %}\n {{ super() }}\n {% if page and page.meta and page.meta.ko_meta %}"
},
{
"path": "docs/custom/partials/copyright.html",
"chars": 224,
"preview": "<small>The Linux Foundation® (TLF) has registered trademarks and uses trademarks. For a list of TLF trademarks, see <a h"
},
{
"path": "docs/deployment.md",
"chars": 2012,
"preview": "# Deployment\n\n_See [Kubernetes Integration](../features/k8s) for information about deploying to Kubernetes._\n\nBecause th"
},
{
"path": "docs/features/build-cache.md",
"chars": 642,
"preview": "# Build Cache\n\nBecause `ko` just runs `go build` in your normal development environment, it automatically reuses your [`"
},
{
"path": "docs/features/debugging.md",
"chars": 1386,
"preview": "# Debugging\n\nSometimes it's challenging to track down the cause of unexpected behavior in an app. Because `ko` makes it "
},
{
"path": "docs/features/k8s.md",
"chars": 2648,
"preview": "# Kubernetes Integration\n\nYou _could_ stop at just building and pushing images.\n\nBut, because building images is so _eas"
},
{
"path": "docs/features/multi-platform.md",
"chars": 727,
"preview": "# Multi-Platform Images\n\nBecause Go supports cross-compilation to other CPU architectures and operating systems, `ko` ex"
},
{
"path": "docs/features/sboms.md",
"chars": 679,
"preview": "# SBOMs\n\nA [Software Bill of Materials (SBOM)](https://en.wikipedia.org/wiki/Software_bill_of_materials) is a list of so"
},
{
"path": "docs/features/static-assets.md",
"chars": 1335,
"preview": "# Static Assets\n\n`ko` can also bundle static assets into the images it produces.\n\nBy convention, any contents of a direc"
},
{
"path": "docs/get-started.md",
"chars": 2290,
"preview": "# Get Started\n\n## Setup\n\nFirst, [install `ko`](../install).\n\n### Authenticate\n\n`ko` depends on the authentication config"
},
{
"path": "docs/index.md",
"chars": 1663,
"preview": "---\nko_meta: true\n---\n\n# Introduction\n\n`ko` makes building Go container images easy, fast, and secure by default.\n\n\n\n```\n$ VERSION=TODO # choose"
},
{
"path": "docs/reference/ko.md",
"chars": 889,
"preview": "## ko\n\nRapidly iterate with Go, Containers, and Kubernetes.\n\n```\nko [flags]\n```\n\n### Options\n\n```\n -h, --help help"
},
{
"path": "docs/reference/ko_apply.md",
"chars": 4186,
"preview": "## ko apply\n\nApply the input files with image references resolved to built/pushed image digests.\n\n### Synopsis\n\nThis sub"
},
{
"path": "docs/reference/ko_build.md",
"chars": 3810,
"preview": "## ko build\n\nBuild and publish container images from the given importpaths.\n\n### Synopsis\n\nThis sub-command builds the p"
},
{
"path": "docs/reference/ko_create.md",
"chars": 4199,
"preview": "## ko create\n\nCreate the input files with image references resolved to built/pushed image digests.\n\n### Synopsis\n\nThis s"
},
{
"path": "docs/reference/ko_delete.md",
"chars": 315,
"preview": "## ko delete\n\nSee \"kubectl help delete\" for detailed usage.\n\n```\nko delete [flags]\n```\n\n### Options\n\n```\n -h, --help "
},
{
"path": "docs/reference/ko_login.md",
"chars": 549,
"preview": "## ko login\n\nLog in to a registry\n\n```\nko login [OPTIONS] [SERVER] [flags]\n```\n\n### Examples\n\n```\n # Log in to reg.exam"
},
{
"path": "docs/reference/ko_resolve.md",
"chars": 3963,
"preview": "## ko resolve\n\nPrint the input files with image references resolved to built/pushed image digests.\n\n### Synopsis\n\nThis s"
},
{
"path": "docs/reference/ko_run.md",
"chars": 3193,
"preview": "## ko run\n\nA variant of `kubectl run` that containerizes IMPORTPATH first.\n\n### Synopsis\n\nThis sub-command combines \"ko "
},
{
"path": "docs/reference/ko_version.md",
"chars": 290,
"preview": "## ko version\n\nPrint ko version.\n\n```\nko version [flags]\n```\n\n### Options\n\n```\n -h, --help help for version\n```\n\n### "
},
{
"path": "go.mod",
"chars": 9074,
"preview": "module github.com/google/ko\n\ngo 1.25.7\n\nrequire (\n\tgithub.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.12.0\n\tgi"
},
{
"path": "go.sum",
"chars": 57037,
"preview": "al.essio.dev/pkg/shellescape v1.6.0 h1:NxFcEqzFSEVCGN2yq7Huv/9hyCEGVa/TncnOOBBeXHA=\nal.essio.dev/pkg/shellescape v1.6.0/"
},
{
"path": "hack/boilerplate/boilerplate.go.txt",
"chars": 613,
"preview": "// Copyright 2023 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "hack/boilerplate/boilerplate.sh.txt",
"chars": 622,
"preview": "#!/usr/bin/env bash\n\n# Copyright 2023 ko Build Authors All Rights Reserved.\n#\n# Licensed under the Apache License, Versi"
},
{
"path": "hack/presubmit.sh",
"chars": 1056,
"preview": "#!/usr/bin/env bash\n\n# Copyright 2021 ko Build Authors All Rights Reserved.\n#\n# Licensed under the Apache License, Versi"
},
{
"path": "hack/tools.go",
"chars": 712,
"preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "hack/update-codegen.sh",
"chars": 860,
"preview": "#!/usr/bin/env bash\n\n# Copyright 2021 ko Build Authors All Rights Reserved.\n#\n# Licensed under the Apache License, Versi"
},
{
"path": "hack/update-deps.sh",
"chars": 785,
"preview": "#!/usr/bin/env bash\n\n# Copyright 2018 ko Build Authors All Rights Reserved.\n#\n# Licensed under the Apache License, Versi"
},
{
"path": "integration_test.sh",
"chars": 2504,
"preview": "#!/bin/bash\nset -o errexit\nset -o nounset\nset -o pipefail\n\nROOT_DIR=$(dirname \"$0\")\n\npushd \"$ROOT_DIR\"\n\nROOT_DIR=\"$(pwd)"
},
{
"path": "internal/sbom/sbom.go",
"chars": 2387,
"preview": "// Copyright 2022 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "internal/sbom/spdx.go",
"chars": 15619,
"preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "main.go",
"chars": 943,
"preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "mkdocs.yml",
"chars": 2788,
"preview": "site_name: 'ko: Easy Go Containers'\nsite_url: https://ko.build\nrepo_url: https://github.com/ko-build/ko\nedit_uri: edit/m"
},
{
"path": "pkg/build/build.go",
"chars": 2120,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/build/cache.go",
"chars": 5234,
"preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/build/config.go",
"chars": 3503,
"preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/build/doc.go",
"chars": 726,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/build/future.go",
"chars": 1866,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/build/future_test.go",
"chars": 1620,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/build/gobuild.go",
"chars": 45295,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/build/gobuild_test.go",
"chars": 43894,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/build/gobuilds.go",
"chars": 5446,
"preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/build/gobuilds_test.go",
"chars": 5611,
"preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/build/layer.go",
"chars": 1860,
"preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/build/limit.go",
"chars": 1705,
"preview": "// Copyright 2019 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/build/limit_test.go",
"chars": 1553,
"preview": "// Copyright 2019 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/build/options.go",
"chars": 5745,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/build/recorder.go",
"chars": 1424,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/build/recorder_test.go",
"chars": 2678,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/build/shared.go",
"chars": 2278,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/build/shared_test.go",
"chars": 2402,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/build/strict.go",
"chars": 1218,
"preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/build/strict_test.go",
"chars": 1428,
"preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/caps/caps.go",
"chars": 5765,
"preview": "// Copyright 2024 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/caps/caps_dd_test.go",
"chars": 5380,
"preview": "// Generated file, do not edit.\n\n// Copyright 2024 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache"
},
{
"path": "pkg/caps/caps_test.go",
"chars": 2358,
"preview": "// Copyright 2024 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/caps/gen.sh",
"chars": 2518,
"preview": "#!/usr/bin/env bash\n\n# Copyright 2024 ko Build Authors All Rights Reserved.\n#\n# Licensed under the Apache License, Versi"
},
{
"path": "pkg/caps/new_file_caps_test.go",
"chars": 2349,
"preview": "// Copyright 2024 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/commands/apply.go",
"chars": 4713,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/commands/build.go",
"chars": 3184,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/commands/cache.go",
"chars": 10176,
"preview": "// Copyright 2023 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/commands/commands.go",
"chars": 1243,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/commands/config.go",
"chars": 5032,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/commands/config_test.go",
"chars": 1713,
"preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/commands/create.go",
"chars": 4739,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/commands/delete.go",
"chars": 2026,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/commands/options/build.go",
"chars": 10445,
"preview": "// Copyright 2019 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/commands/options/build_test.go",
"chars": 5671,
"preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/commands/options/filestuff.go",
"chars": 2700,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/commands/options/namer_test.go",
"chars": 2124,
"preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/commands/options/publish.go",
"chars": 5095,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/commands/options/selector.go",
"chars": 1026,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/commands/options/testdata/bad-config/.ko.yaml/.gitignore",
"chars": 69,
"preview": ".# We just want to have a practically empty directory.\n*\n!.gitignore\n"
},
{
"path": "pkg/commands/options/testdata/config/.ko.yaml",
"chars": 127,
"preview": "defaultBaseImage: alpine\ndefaultPlatforms: all\ndefaultEnv: FOO=bar\ndefaultFlags:\n - -tags\n - netgo\ndefaultLdflags:\n -"
},
{
"path": "pkg/commands/options/testdata/config/my-ko.yaml",
"chars": 22,
"preview": "defaultBaseImage: wow\n"
},
{
"path": "pkg/commands/options/testdata/multiple-platforms/.ko.yaml",
"chars": 71,
"preview": "defaultBaseImage: alpine\ndefaultPlatforms:\n- linux/arm64\n- linux/amd64\n"
},
{
"path": "pkg/commands/options/testdata/paths/.ko.yaml",
"chars": 112,
"preview": "builds:\n- id: app-with-main-package-in-different-directory-to-go-mod-and-ko-yaml\n dir: ./app\n main: ./cmd/foo\n"
},
{
"path": "pkg/commands/options/testdata/paths/app/cmd/foo/main.go",
"chars": 682,
"preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/commands/options/testdata/paths/app/go.mod",
"chars": 36,
"preview": "module example.com/testapp\n\ngo 1.15\n"
},
{
"path": "pkg/commands/options/validate.go",
"chars": 1856,
"preview": "// Copyright 2022 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/commands/publisher.go",
"chars": 1788,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/commands/publisher_test.go",
"chars": 3129,
"preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/commands/resolve.go",
"chars": 2812,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/commands/resolver.go",
"chars": 14152,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/commands/resolver_test.go",
"chars": 11068,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/commands/root.go",
"chars": 1890,
"preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/commands/run.go",
"chars": 4760,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/commands/version.go",
"chars": 1282,
"preview": "// Copyright 2019 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/doc.go",
"chars": 685,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/internal/git/clone.go",
"chars": 2228,
"preview": "// Copyright 2024 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/internal/git/errors.go",
"chars": 2647,
"preview": "// Copyright 2024 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/internal/git/git.go",
"chars": 3205,
"preview": "// Copyright 2024 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/internal/git/info.go",
"chars": 6296,
"preview": "// Copyright 2024 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/internal/git/info_test.go",
"chars": 6657,
"preview": "// Copyright 2024 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/internal/gittesting/git.go",
"chars": 3892,
"preview": "// Copyright 2024 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/internal/gittesting/git_test.go",
"chars": 1997,
"preview": "// Copyright 2024 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/internal/testing/daemon.go",
"chars": 1577,
"preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/internal/testing/doc.go",
"chars": 699,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/internal/testing/fixed.go",
"chars": 2819,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/internal/testing/fixed_test.go",
"chars": 2649,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/publish/daemon.go",
"chars": 4323,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/publish/daemon_test.go",
"chars": 3340,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/publish/default.go",
"chars": 7674,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/publish/default_test.go",
"chars": 8112,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/publish/doc.go",
"chars": 782,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/publish/future.go",
"chars": 1944,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/publish/future_test.go",
"chars": 1712,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/publish/kind/doc.go",
"chars": 698,
"preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/publish/kind/write.go",
"chars": 3379,
"preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/publish/kind/write_test.go",
"chars": 5423,
"preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/publish/kind.go",
"chars": 3227,
"preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/publish/layout.go",
"chars": 2552,
"preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/publish/layout_test.go",
"chars": 1276,
"preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/publish/multi.go",
"chars": 1711,
"preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/publish/multi_test.go",
"chars": 1876,
"preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/publish/options.go",
"chars": 2921,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/publish/publish.go",
"chars": 1193,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/publish/recorder.go",
"chars": 2683,
"preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/publish/recorder_test.go",
"chars": 2952,
"preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/publish/shared.go",
"chars": 2220,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/publish/shared_test.go",
"chars": 2436,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/publish/tarball.go",
"chars": 2876,
"preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/publish/tarball_test.go",
"chars": 1889,
"preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/resolve/doc.go",
"chars": 700,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/resolve/resolve.go",
"chars": 2511,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/resolve/resolve_test.go",
"chars": 9518,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/resolve/selector.go",
"chars": 3986,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "pkg/resolve/selector_test.go",
"chars": 8518,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "test/build-configs/.ko.yaml",
"chars": 877,
"preview": "# Copyright 2021 ko Build Authors All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\""
},
{
"path": "test/build-configs/bar/cmd/main.go",
"chars": 678,
"preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "test/build-configs/bar/go.mod",
"chars": 646,
"preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "test/build-configs/caps/cmd/main.go",
"chars": 1298,
"preview": "// Copyright 2024 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "test/build-configs/caps/go.mod",
"chars": 647,
"preview": "// Copyright 2024 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "test/build-configs/caps.ko.yaml",
"chars": 707,
"preview": "# Copyright 2024 ko Build Authors All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\""
},
{
"path": "test/build-configs/foo/cmd/main.go",
"chars": 678,
"preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "test/build-configs/foo/go.mod",
"chars": 646,
"preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "test/build-configs/toolexec/cmd/main.go",
"chars": 683,
"preview": "// Copyright 2022 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "test/build-configs/toolexec/go.mod",
"chars": 651,
"preview": "// Copyright 2022 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "test/kodata/a",
"chars": 6,
"preview": "hello\n"
},
{
"path": "test/kodata/kenobi",
"chars": 12,
"preview": "Hello there\n"
},
{
"path": "test/kodata/subdir/file.txt",
"chars": 20,
"preview": "subdir file content\n"
},
{
"path": "test/main.go",
"chars": 2233,
"preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
},
{
"path": "test/test.yaml",
"chars": 782,
"preview": "# Copyright 2018 ko Build Authors All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\""
}
]
About this extraction
This page contains the full source code of the ko-build/ko GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 186 files (594.7 KB), approximately 182.6k tokens, and a symbol index with 537 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.