From b30d33c7375f0eff7eeb542795bfeefbeb15f120 Mon Sep 17 00:00:00 2001 From: Casey Lee Date: Sat, 2 Mar 2024 00:12:59 -0800 Subject: [PATCH] feat: add support for docker context, add homebrew tap, fix shell executor --- .github/workflows/checks.yml | 47 +++- .github/workflows/promote.yml | 4 +- .github/workflows/release.yml | 4 +- Makefile | 3 + codecatalyst-runner/.goreleaser.yaml | 44 +++- codecatalyst-runner/Makefile | 2 +- codecatalyst-runner/go.mod | 18 ++ codecatalyst-runner/go.sum | 181 +++++++++++++++ .../pkg/actions/action_plan.go | 15 +- .../pkg/actions/action_plan_test.go | 4 +- .../.codecatalyst/actions/action.yml | 4 +- .../.codecatalyst/workflows/cache-shell.yaml | 66 ++++++ .../.codecatalyst/workflows/custom.yaml | 14 +- .../.codecatalyst/workflows/sample.yaml | 22 +- .../.codecatalyst/workflows/shared.yaml | 16 +- .../exemplar-codecatalyst-action/.gitignore | 2 + .../exemplar-codecatalyst-action/lib/index.js | 8 +- .../exemplar-codecatalyst-action/lib/index.ts | 8 +- .../exemplar-codecatalyst-action/package.json | 2 +- .../exemplar-codecatalyst-action/pkg/index.js | 15 +- .../pkg/workflows/workflow_plans_provider.go | 2 +- .../pkg/workflows/workflow_runner_test.go | 38 +++- command-runner/Makefile | 6 +- command-runner/go.mod | 19 ++ command-runner/go.sum | 39 ++++ .../internal/containers/docker/docker_auth.go | 2 - .../containers/docker/docker_build.go | 2 - .../containers/docker/docker_connect.go | 113 ++++++++++ .../containers/docker/docker_logger.go | 2 - .../internal/containers/docker/docker_pull.go | 2 - .../containers/docker/docker_pull_test.go | 7 - .../internal/containers/docker/docker_run.go | 43 ---- .../containers/docker/docker_run_test.go | 3 - .../containers/docker/docker_service.go | 2 - .../containers/docker/docker_service_test.go | 17 +- .../pkg/runner/command_executor_test.go | 4 - .../pkg/runner/container_command_executor.go | 2 +- .../runner/container_command_executor_test.go | 2 +- command-runner/pkg/runner/runner.go | 4 + command-runner/pkg/runner/runner_test.go | 4 - .../pkg/runner/shell_command_executor.go | 209 +++++++++++++----- .../pkg/runner/shell_command_executor_test.go | 68 +++++- 42 files changed, 848 insertions(+), 221 deletions(-) create mode 100644 codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/.codecatalyst/workflows/cache-shell.yaml create mode 100644 codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/.gitignore create mode 100644 command-runner/internal/containers/docker/docker_connect.go diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 7d2bd66..deddadf 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -9,7 +9,7 @@ jobs: name: scan runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Secret Scanning @@ -26,10 +26,10 @@ jobs: name: lint runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: actions/setup-go@v4 + - uses: actions/setup-go@v5 with: go-version-file: go.work check-latest: true @@ -39,16 +39,16 @@ jobs: - name: Run golangci-lint run: make lint - test: - name: test + test-linux: + name: test-linux runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 2 - name: Set up QEMU uses: docker/setup-qemu-action@v3 - - uses: actions/setup-go@v4 + - uses: actions/setup-go@v5 with: go-version-file: go.work check-latest: true @@ -80,6 +80,33 @@ jobs: recreate: true path: code-coverage-results.md + test-macos: + name: test-macos + runs-on: macos-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 2 + - name: Install and start Colima + run: | + brew install docker + colima start + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - uses: actions/setup-go@v5 + with: + go-version-file: go.work + check-latest: true + cache-dependency-path: "**/go.sum" + + - name: Install dev dependencies + run: make dev-deps + + - name: Run tests + run: make test + snapshot-ccr-cli: name: snapshot-ccr-cli runs-on: ubuntu-latest @@ -87,13 +114,13 @@ jobs: contents: read id-token: write steps: - - uses: actions/checkout@v3 - - uses: actions/setup-go@v4 + - uses: actions/checkout@v4 + - uses: actions/setup-go@v5 with: go-version-file: go.work cache-dependency-path: "**/go.sum" check-latest: true - - uses: anchore/sbom-action/download-syft@v0.14.3 + - uses: anchore/sbom-action/download-syft@v0.15.8 - uses: sigstore/cosign-installer@v3 - name: GoReleaser uses: goreleaser/goreleaser-action@v5 diff --git a/.github/workflows/promote.yml b/.github/workflows/promote.yml index f9ff4c6..9e97f30 100644 --- a/.github/workflows/promote.yml +++ b/.github/workflows/promote.yml @@ -15,13 +15,13 @@ jobs: name: promote runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: ssh-key: ${{secrets.SSH_DEPLOY_KEY}} fetch-depth: 0 ref: main - uses: fregante/setup-git-user@v2 - - uses: actions/setup-go@v4 + - uses: actions/setup-go@v5 with: go-version-file: go.work check-latest: true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2b21066..77d0cfb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,10 +25,10 @@ jobs: contents: write id-token: write steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: actions/setup-go@v4 + - uses: actions/setup-go@v5 with: go-version-file: go.work check-latest: true diff --git a/Makefile b/Makefile index 8ef61be..fa88c56 100644 --- a/Makefile +++ b/Makefile @@ -56,3 +56,6 @@ attribution: upgrade: go work sync make attribution + +install: + @$(MAKE) -C codecatalyst-runner install diff --git a/codecatalyst-runner/.goreleaser.yaml b/codecatalyst-runner/.goreleaser.yaml index 790abe9..720c1d5 100644 --- a/codecatalyst-runner/.goreleaser.yaml +++ b/codecatalyst-runner/.goreleaser.yaml @@ -11,7 +11,7 @@ builds: - CGO_ENABLED=0 goos: - linux - - windows + # - windows - darwin archives: @@ -52,3 +52,45 @@ signs: cmd: cosign args: ["sign-blob", "--output-signature", "${artifact}.sig", "--output-certificate", "${artifact}.pem", "${artifact}"] artifacts: all +brews: + - name: codecatalyst-runner-cli + + # GitHub/GitLab repository to push the formula to + tap: + owner: aws + name: homebrew-tap + + url_template: "https://github.com/aws/codecatalyst-runner-cli/releases/download/{{ .Tag }}/{{ .ArtifactName }}" + + commit_author: + name: codecatalyst-runner-cli + email: codecatalyst-runner-cli@no-reply.github.com + + # The project name and current git tag are used in the format string. + commit_msg_template: "Brew formula update for {{ .ProjectName }} version {{ .Tag }}" + + # Folder inside the repository to put the formula. + # Default is the root folder. + folder: Formula + + homepage: "https://github.com/aws/codecatalyst-runner-cli" + + # Template of your app's description. + # Default is empty. + description: "CLI to run CodeCatalyst workflows locally 🧰" + + # SPDX identifier of your app's license. + # Default is empty. + license: "Apache-2" + + # Setting this will prevent goreleaser to actually try to commit the updated + # formula - instead, the formula file will be stored on the dist folder only, + # leaving the responsibility of publishing it to the user. + # If set to auto, the release will not be uploaded to the homebrew tap + # in case there is an indicator for prerelease in the tag e.g. v1.0.0-rc1 + # Default is false. + skip_upload: true + + # So you can `brew test` your formula. + # Default is empty. + test: system "#{bin}/ccr --version" diff --git a/codecatalyst-runner/Makefile b/codecatalyst-runner/Makefile index 8cf62af..3506a2e 100644 --- a/codecatalyst-runner/Makefile +++ b/codecatalyst-runner/Makefile @@ -21,7 +21,7 @@ lint: .PHONY: test test: - go test -json -v -coverprofile=coverage.txt --tags=$(TAGS) -test.timeout=10m ./... 2>&1 | gotestfmt + go test -json -v -coverprofile=coverage.txt --tags=$(TAGS) -test.timeout=30m ./... 2>&1 | gotestfmt .PHONY: test-short test-short: diff --git a/codecatalyst-runner/go.mod b/codecatalyst-runner/go.mod index 656c66f..f69c677 100644 --- a/codecatalyst-runner/go.mod +++ b/codecatalyst-runner/go.mod @@ -20,6 +20,7 @@ require ( require ( dario.cat/mergo v1.0.0 // indirect + github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/ProtonMail/go-crypto v1.0.0 // indirect github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect @@ -35,6 +36,8 @@ require ( github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 // indirect github.com/aws/smithy-go v1.19.0 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chzyer/readline v1.5.1 // indirect github.com/cloudflare/circl v1.3.7 // indirect github.com/containerd/containerd v1.7.13 // indirect @@ -43,12 +46,16 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/distribution/reference v0.5.0 // indirect github.com/docker/cli v25.0.2+incompatible // indirect + github.com/docker/distribution v2.8.2+incompatible // indirect github.com/docker/docker v25.0.2+incompatible // indirect github.com/docker/docker-credential-helpers v0.8.1 // indirect + github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c // indirect github.com/docker/go-connections v0.5.0 // indirect + github.com/docker/go-metrics v0.0.1 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fvbommel/sortorder v1.1.0 // indirect github.com/gdamore/encoding v1.0.0 // indirect github.com/gdamore/tcell/v2 v2.7.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect @@ -58,6 +65,8 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/gorilla/mux v1.8.1 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect @@ -66,16 +75,23 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/miekg/pkcs11 v1.1.1 // indirect github.com/moby/buildkit v0.12.5 // indirect github.com/moby/patternmatcher v0.6.0 // indirect github.com/moby/sys/sequential v0.5.0 // indirect github.com/moby/sys/user v0.1.0 // indirect + github.com/moby/term v0.0.0-20221205130635-1aeaba878587 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc6 // indirect github.com/opencontainers/selinux v1.11.0 // indirect github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/prometheus/client_golang v1.14.0 // indirect + github.com/prometheus/client_model v0.3.0 // indirect + github.com/prometheus/common v0.42.0 // indirect + github.com/prometheus/procfs v0.9.0 // indirect github.com/rivo/tview v0.0.0-20240204151237-861aa94d61c8 // indirect github.com/rivo/uniseg v0.4.7-0.20240127222946-601bbb3750c2 // indirect github.com/sergi/go-diff v1.3.1 // indirect @@ -83,6 +99,7 @@ require ( github.com/skeema/knownhosts v1.2.1 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/objx v0.5.1 // indirect + github.com/theupdateframework/notary v0.7.0 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/zclconf/go-cty v1.14.2 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 // indirect @@ -95,6 +112,7 @@ require ( golang.org/x/sys v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.17.0 // indirect + google.golang.org/protobuf v1.31.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/codecatalyst-runner/go.sum b/codecatalyst-runner/go.sum index 86deca3..1b77f5b 100644 --- a/codecatalyst-runner/go.sum +++ b/codecatalyst-runner/go.sum @@ -4,6 +4,8 @@ github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9 github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= @@ -11,6 +13,10 @@ github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7 github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/Shopify/logrus-bugsnag v0.0.0-20170309145241-6dbc35f2c30d h1:hi6J4K6DKrR4/ljxn6SF6nURyu785wKMuQcjt7H3VCQ= +github.com/Shopify/logrus-bugsnag v0.0.0-20170309145241-6dbc35f2c30d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= @@ -44,9 +50,25 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 h1:NzO4Vrau795RkUdSHKEwiR01FaGz github.com/aws/aws-sdk-go-v2/service/sts v1.26.7/go.mod h1:6h2YuIoxaMSCFf5fi1EgZAwdfkGMgDY+DVfa61uLe4U= github.com/aws/smithy-go v1.19.0 h1:KWFKQV80DpP3vJrrA9sVAHQ5gc2z8i4EzrLhLlWXcBM= github.com/aws/smithy-go v1.19.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/beorn7/perks v0.0.0-20150223135152-b965b613227f/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bitly/go-hostpool v0.1.0/go.mod h1:4gOCgp6+NZnVqlKyZ/iBZFTAJKembaVENUpMkpg42fw= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/bugsnag/bugsnag-go v1.0.5-0.20150529004307-13fd6b8acda0 h1:s7+5BfS4WFJoVF9pnB8kBk03S7pZXRdKamnV0FOl5Sc= +github.com/bugsnag/bugsnag-go v1.0.5-0.20150529004307-13fd6b8acda0/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= @@ -56,6 +78,8 @@ github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObk github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= +github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004 h1:lkAMpLVBDaj17e85keuznYcH5rqI438v41pKcBl4ZxQ= +github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004/go.mod h1:yMWuSON2oQp+43nFtAV/uvKQIFpSPerB57DCt9t8sSA= github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= @@ -65,29 +89,49 @@ github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= +github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.0.0-20191128021309-1d7a30a10f73/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/docker/cli v25.0.2+incompatible h1:6GEdvxwEA451/+Y3GtqIGn/MNjujQazUlxC6uGu8Tog= github.com/docker/cli v25.0.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= +github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v25.0.2+incompatible h1:/OaKeauroa10K4Nqavw4zlhcDq/WBcPMc5DbjOGgozY= github.com/docker/docker v25.0.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.8.1 h1:j/eKUktUltBtMzKqmfLB0PAgqYyMHOp5vfsD1807oKo= github.com/docker/docker-credential-helpers v0.8.1/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c/go.mod h1:CADgU4DSXK5QUlFslkQu2yW2TKzFZcXq/leZfM0UH5Q= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= +github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= 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/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4= +github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= +github.com/dvsekhvalnov/jose2go v0.0.0-20170216131308-f21a8cedbbae/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fvbommel/sortorder v1.1.0 h1:fUmoe+HLsBTctBDoaBwpQo5N+nrCp8g/BjKb/6ZQmYw= +github.com/fvbommel/sortorder v1.1.0/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.7.0 h1:I5LiGTQuwrysAt1KS9wg1yFfOI3arI3ucFrxtd/xqaA= @@ -102,29 +146,63 @@ github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMj github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4= github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= github.com/go-logr/logr v1.4.1/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-sql-driver/mysql v1.3.0 h1:pgwjLi/dvffoP9aabwkT3AKpXQM93QARkjFhDDqC1UE= +github.com/go-sql-driver/mysql v1.3.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/certificate-transparency-go v1.0.10-0.20180222191210-5ab67e519c93 h1:jc2UWq7CbdszqeH6qu1ougXMIUBfSy8Pbh/anURYbGI= +github.com/google/certificate-transparency-go v1.0.10-0.20180222191210-5ab67e519c93/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= +github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jinzhu/gorm v0.0.0-20170222002820-5409931a1bb8 h1:CZkYfurY6KGhVtlalI4QwQ6T0Cu6iuY3e0x5RLu96WE= +github.com/jinzhu/gorm v0.0.0-20170222002820-5409931a1bb8/go.mod h1:Vla75njaFJ8clLU1W44h34PjIkijhjHIYnZxMqCdxqo= +github.com/jinzhu/inflection v0.0.0-20170102125226-1c35d901db3d h1:jRQLvyVGL+iVtDElaEIDdKwpPqUIZJfzkNLV34htpEc= +github.com/jinzhu/inflection v0.0.0-20170102125226-1c35d901db3d/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= @@ -133,6 +211,9 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.17.5 h1:d4vBd+7CHydUqpFBgUEKkSdtSugf9YFmSkvUYPquI5E= github.com/klauspost/compress v1.17.5/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -140,8 +221,11 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lib/pq v0.0.0-20150723085316-0dad96c0b94f/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/magiconair/properties v1.5.3 h1:C8fxWnhYyME3n0klPOhVM7PtYUB3eV1W3DeFmN3j53Y= +github.com/magiconair/properties v1.5.3/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -152,6 +236,15 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.6.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= +github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/mitchellh/mapstructure v0.0.0-20150613213606-2caf8efc9366 h1:1ypTpKUfEOyX1YsJru6lLq7hrmK+QGECpJQ1PHUHuGo= +github.com/mitchellh/mapstructure v0.0.0-20150613213606-2caf8efc9366/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/moby/buildkit v0.12.5 h1:RNHH1l3HDhYyZafr5EgstEu8aGNCwyfvMtrQDtjH9T0= github.com/moby/buildkit v0.12.5/go.mod h1:YGwjA2loqyiYfZeEo8FtI7z4x5XponAaIWsWcSjWwso= github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= @@ -162,24 +255,62 @@ github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= github.com/moby/term v0.0.0-20221205130635-1aeaba878587 h1:HfkjXDfhgVaN5rmueG8cL8KKeFNecRCXFhaJ2qZ5SKA= github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.28.0 h1:i2rg/p9n/UqIDAMFUJ6qIUUMcsqOuUHgbpbu235Vr1c= github.com/onsi/gomega v1.28.0/go.mod h1:A1H2JE76sI14WIP57LMKj7FVfCHx3g3BcZVjJG8bjX8= +github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= 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.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.1.0-rc6 h1:XDqvyKsJEbRtATzkgItUqBA7QHk58yxX1Ov9HERHNqU= github.com/opencontainers/image-spec v1.1.0-rc6/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU= github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= +github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/owenrumney/go-sarif v1.1.1 h1:QNObu6YX1igyFKhdzd7vgzmw7XsWN3/6NMGuDzBgXmE= github.com/owenrumney/go-sarif v1.1.1/go.mod h1:dNDiPlF04ESR/6fHlPyq7gHKmrM0sHUvAGjsoh8ZH0U= github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 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 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.0-pre1.0.20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= +github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= +github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= +github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= +github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= github.com/rivo/tview v0.0.0-20240204151237-861aa94d61c8 h1:aW0ILZ0lkphO/2mUWocSfP1iebWtSFcxL8BiSNR+/8g= github.com/rivo/tview v0.0.0-20240204151237-861aa94d61c8/go.mod h1:sGSvhfWFNS7FpYxS8K+e22OTOI3UsB5rDs0nRtoZkpA= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -194,28 +325,45 @@ github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWR github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ= github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= +github.com/spf13/cast v0.0.0-20150508191742-4d07383ffe94 h1:JmfC365KywYwHB946TTiQWEb8kqPY+pybPLoGE9GgVk= +github.com/spf13/cast v0.0.0-20150508191742-4d07383ffe94/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= +github.com/spf13/cobra v0.0.1/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/jwalterweatherman v0.0.0-20141219030609-3d60171a6431 h1:XTHrT015sxHyJ5FnQ0AeemSspZWaDq7DoTRW0EVsDCE= +github.com/spf13/jwalterweatherman v0.0.0-20141219030609-3d60171a6431/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.0/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v0.0.0-20150530192845-be5ff3e4840c h1:2EejZtjFjKJGk71ANb+wtFK5EjUzUkEM3R0xnp559xg= +github.com/spf13/viper v0.0.0-20150530192845-be5ff3e4840c/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= 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/objx v0.5.1 h1:4VhoImhV/Bm0ToFkXFi8hXNXwpDRZ/ynw3amt82mzq0= github.com/stretchr/objx v0.5.1/go.mod h1:/iHQpkQwBD6DLUmQ4pE+s1TXdob1mORJ4/UFdrifcy0= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 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.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/theupdateframework/notary v0.7.0 h1:QyagRZ7wlSpjT5N2qQAh/pN+DVqgekv4DzbAiAiEL3c= +github.com/theupdateframework/notary v0.7.0/go.mod h1:c9DRxcmhHmVLDay4/2fUYdISnHqbFDGRSlXPO0AhYWw= github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= @@ -242,9 +390,13 @@ go.opentelemetry.io/otel/trace v1.22.0 h1:Hg6pPujv0XG9QaVbGOBVHunyuLcCC3jN7WEhPx go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= @@ -259,8 +411,11 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -273,6 +428,9 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -280,15 +438,21 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/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-20220310020820-b874c991c1a5/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-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -302,6 +466,7 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= 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.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= @@ -341,18 +506,34 @@ google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 h1: google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U= google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/grpc v1.0.5/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/cenkalti/backoff.v2 v2.2.1 h1:eJ9UAg01/HIHG987TwxvnzK2MgxXq97YY6rYDpY9aII= +gopkg.in/cenkalti/backoff.v2 v2.2.1/go.mod h1:S0QdOvT2AlerfSBkp0O+dk+bbIMaNbEmVk876gPCthU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/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/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/rethinkdb/rethinkdb-go.v6 v6.2.1 h1:d4KQkxAaAiRY2h5Zqis161Pv91A37uZyJOx73duwUwM= +gopkg.in/rethinkdb/rethinkdb-go.v6 v6.2.1/go.mod h1:WbjuEoo1oadwzQ4apSDU+JTvmllEHtsNHS6y7vFc7iw= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/codecatalyst-runner/pkg/actions/action_plan.go b/codecatalyst-runner/pkg/actions/action_plan.go index 35cc32a..5306c62 100644 --- a/codecatalyst-runner/pkg/actions/action_plan.go +++ b/codecatalyst-runner/pkg/actions/action_plan.go @@ -2,6 +2,7 @@ package actions import ( "fmt" + "os" "path/filepath" "strings" @@ -21,9 +22,17 @@ type NewActionPlanParams struct { DependsOn []string // dependencies } -const CodeCatalystImage = "docker://public.ecr.aws/c8t2t1h8/al2/curated:1.3-x86_64-ec2" const containerActionDir = "/codecatalyst/output/action" +const DefaultCodeCatalystImage = "docker://public.ecr.aws/c8t2t1h8/al2/curated:1.3-x86_64-ec2" + +func CodeCatalystImage() string { + if val, ok := os.LookupEnv("CATALYST_IMAGE"); ok { + return val + } + return DefaultCodeCatalystImage +} + // NewActionPlan creates a new Plan from the given params func NewActionPlan(params *NewActionPlanParams) (runner.Plan, error) { var id string @@ -144,9 +153,9 @@ func (ap *actionPlan) loadNodeAction(action *Action, steps []string, executionTy if executionType == runner.ExecutionTypeDocker || executionType == runner.ExecutionTypeFinch { switch action.Runs.Using { case UsingTypeNode12: - image = CodeCatalystImage + image = CodeCatalystImage() case UsingTypeNode16: - image = CodeCatalystImage + image = CodeCatalystImage() default: return fmt.Errorf("unsupported value for 'using': %s", action.Runs.Using) } diff --git a/codecatalyst-runner/pkg/actions/action_plan_test.go b/codecatalyst-runner/pkg/actions/action_plan_test.go index 62f89a0..28d3030 100644 --- a/codecatalyst-runner/pkg/actions/action_plan_test.go +++ b/codecatalyst-runner/pkg/actions/action_plan_test.go @@ -174,14 +174,14 @@ func TestNewActionPlan(t *testing.T) { }, ExpectedCommandGroups: []*runner.CommandGroup{ { - Image: CodeCatalystImage, + Image: CodeCatalystImage(), Entrypoint: runner.Command{"/bin/cat"}, Commands: []runner.Command{ {"node", "/codecatalyst/output/action/test/pre-command"}, }, }, { - Image: CodeCatalystImage, + Image: CodeCatalystImage(), Entrypoint: runner.Command{"/bin/cat"}, Commands: []runner.Command{ {"node", "/codecatalyst/output/action/test/main-command"}, diff --git a/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/.codecatalyst/actions/action.yml b/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/.codecatalyst/actions/action.yml index dfe9628..a5b3e2d 100644 --- a/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/.codecatalyst/actions/action.yml +++ b/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/.codecatalyst/actions/action.yml @@ -3,12 +3,12 @@ Name: 'hello-world-action' Version: '0.0.0' Description: 'This Action greets someone and outputs who was greeted' Configuration: - who-to-greet: + whoToGreet: Description: 'Who are we greeting here' Required: true DisplayName: 'Who to greet' Type: string - how-to-greet: + howToGreet: Description: 'How to greet the person' Required: false DisplayName: 'How to greet' diff --git a/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/.codecatalyst/workflows/cache-shell.yaml b/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/.codecatalyst/workflows/cache-shell.yaml new file mode 100644 index 0000000..b0a8327 --- /dev/null +++ b/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/.codecatalyst/workflows/cache-shell.yaml @@ -0,0 +1,66 @@ +Name: cache +SchemaVersion: "1.0" +Triggers: + - Type: PullRequest + Events: [ open, revision ] + Branches: + - feature-.* +Actions: + Setup: + Identifier: aws/build@v1 + Inputs: + Sources: + - WorkflowSource + Configuration: + Steps: + - Run: rm -rf .out/* || true + - Run: rm -rf .out2/* || true + Caching: + FileCaching: + cacheKey1: + Path: .out + cacheKey2: + Path: .out2/file.txt + RelativePathMiss: + Identifier: aws/build@v1 + Inputs: + Sources: + - WorkflowSource + DependsOn: + - Setup + Configuration: + Steps: + - Run: "! test -e .out/output.txt" + - Run: mkdir -p .out + - Run: echo "hello world" > .out/output.txt + - Run: "! test -e .out2/file.txt" + - Run: mkdir -p .out2 + - Run: echo "hello again" > .out2/file.txt + Caching: + FileCaching: + cacheKey1: + Path: .out + cacheKey2: + Path: .out2/file.txt + RelativePathHit: + Identifier: aws/build@v1 + Inputs: + Sources: + - WorkflowSource + DependsOn: + - RelativePathMiss + Configuration: + Steps: + - Run: ls -alFtR + - Run: test -e .out/output.txt + - Run: grep "hello world" .out/output.txt + - Run: rm -rf .out/output.txt + - Run: test -e .out2/file.txt + - Run: grep "hello again" .out2/file.txt + - Run: rm -rf .out2/file.txt + Caching: + FileCaching: + cacheKey1: + Path: .out + cacheKey2: + Path: .out2/file.txt diff --git a/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/.codecatalyst/workflows/custom.yaml b/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/.codecatalyst/workflows/custom.yaml index 7b4ca41..955acc2 100644 --- a/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/.codecatalyst/workflows/custom.yaml +++ b/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/.codecatalyst/workflows/custom.yaml @@ -11,14 +11,10 @@ Actions: Inputs: Sources: - WorkflowSource - Configuration: + Configuration: Steps: - Run: WhoToGreet=Alice - Run: HowToGreet=Hey - - Run: df - - Run: env | grep CATALYST - - Run: pwd - - Run: ls -alFt Outputs: Variables: - WhoToGreet @@ -32,8 +28,8 @@ Actions: - Name: Who Value: ${FirstAction.WhoToGreet} Configuration: - who-to-greet: ${Who} - how-to-greet: ${FirstAction.HowToGreet} + whoToGreet: ${Who} + howToGreet: ${FirstAction.HowToGreet} Outputs: Variables: - greeting @@ -42,6 +38,6 @@ Actions: Inputs: Sources: - WorkflowSource - Configuration: + Configuration: Steps: - - Run: echo ${Custom.greeting} | grep "Hey Alice" \ No newline at end of file + - Run: echo ${Custom.greeting} | grep "Hey Alice" diff --git a/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/.codecatalyst/workflows/sample.yaml b/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/.codecatalyst/workflows/sample.yaml index 0ad31d8..832df0f 100644 --- a/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/.codecatalyst/workflows/sample.yaml +++ b/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/.codecatalyst/workflows/sample.yaml @@ -31,10 +31,10 @@ Actions: - Run: echo ${Secrets.SAMPLE_SECRET} | grep mysecretvalue - Run: mkdir -p .out - Run: echo "hello world" > .out/output.txt - - Run: env|grep CATALYST_DEFAULT_DIR=/codecatalyst/output/src/git/v1/exemplar-codecatalyst-action + - Run: env|grep CATALYST_DEFAULT_DIR | grep git/v1/exemplar-codecatalyst-action - Run: env|grep CATALYST_ - - Run: env|grep CATALYST_SOURCE_DIR_WorkflowSource=/codecatalyst/output/src/git/v1/exemplar-codecatalyst-action - - Run: pwd|grep /codecatalyst/output/src/git/v1/exemplar-codecatalyst-action + - Run: env|grep CATALYST_SOURCE_DIR_WorkflowSource|grep git/v1/exemplar-codecatalyst-action + - Run: pwd|grep git/v1/exemplar-codecatalyst-action Group1: Actions: SubAction1: @@ -50,9 +50,9 @@ Actions: - Run: env | grep VAR3=foooo - Run: mkdir -p .out - Run: echo "hello again" > .out/output2.txt - - Run: env|grep CATALYST_DEFAULT_DIR=/codecatalyst/output/src/git/v1/exemplar-codecatalyst-action - - Run: env|grep CATALYST_SOURCE_DIR_WorkflowSource=/codecatalyst/output/src/git/v1/exemplar-codecatalyst-action - - Run: pwd|grep /codecatalyst/output/src/git/v1/exemplar-codecatalyst-action + - Run: env|grep CATALYST_DEFAULT_DIR | grep git/v1/exemplar-codecatalyst-action + - Run: env|grep CATALYST_SOURCE_DIR_WorkflowSource|grep git/v1/exemplar-codecatalyst-action + - Run: pwd|grep git/v1/exemplar-codecatalyst-action Outputs: Variables: - VAR3 @@ -69,9 +69,9 @@ Actions: - ARTIFACT1 Configuration: Steps: - - Run: env|grep CATALYST_DEFAULT_DIR=/codecatalyst/output/src/git/v1/exemplar-codecatalyst-action - - Run: env|grep CATALYST_SOURCE_DIR_WorkflowSource=/codecatalyst/output/src/git/v1/exemplar-codecatalyst-action - - Run: pwd|grep /codecatalyst/output/src/git/v1/exemplar-codecatalyst-action + - Run: env|grep CATALYST_DEFAULT_DIR | grep git/v1/exemplar-codecatalyst-action + - Run: env|grep CATALYST_SOURCE_DIR_WorkflowSource|grep git/v1/exemplar-codecatalyst-action + - Run: pwd|grep git/v1/exemplar-codecatalyst-action - Run: echo $CATALYST_SOURCE_DIR_ARTIFACT1 - Run: grep "hello world" $CATALYST_SOURCE_DIR_ARTIFACT1/.out/output.txt FinalAction: @@ -82,8 +82,8 @@ Actions: Configuration: Steps: - Run: echo ${Group1.SubAction1.VAR3} | grep foooo - - Run: env|grep CATALYST_DEFAULT_DIR=/codecatalyst/output/src/s3/01 - - Run: pwd|grep /codecatalyst/output/src/s3/01 + - Run: env|grep CATALYST_DEFAULT_DIR | grep s3/01 + - Run: pwd|grep s3/01 - Run: ls -alFt ${CATALYST_SOURCE_DIR_ARTIFACT2}/ - Run: echo ${CATALYST_SOURCE_DIR_ARTIFACT2} - Run: grep "hello again" $CATALYST_SOURCE_DIR_ARTIFACT2/.out/output2.txt diff --git a/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/.codecatalyst/workflows/shared.yaml b/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/.codecatalyst/workflows/shared.yaml index fb38ecb..70419a0 100644 --- a/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/.codecatalyst/workflows/shared.yaml +++ b/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/.codecatalyst/workflows/shared.yaml @@ -15,8 +15,8 @@ Actions: Sources: - WorkflowSource Configuration: - who-to-greet: 'TEST' - how-to-greet: 'TEST' + whoToGreet: 'TEST' + howToGreet: 'TEST' FirstAction: Identifier: aws/build@v1 Inputs: @@ -41,9 +41,9 @@ Actions: - Run: echo ${Secrets.SAMPLE_SECRET} | grep mysecretvalue - Run: mkdir -p .out - Run: echo "hello world" > .out/output.txt - - Run: env|grep CATALYST_DEFAULT_DIR=/codecatalyst/output/src/git/v1/exemplar-codecatalyst-action - - Run: env|grep CATALYST_SOURCE_DIR_WorkflowSource=/codecatalyst/output/src/git/v1/exemplar-codecatalyst-action - - Run: pwd|grep /codecatalyst/output/src/git/v1/exemplar-codecatalyst-action + - Run: env|grep CATALYST_DEFAULT_DIR | grep git/v1/exemplar-codecatalyst-action + - Run: env|grep CATALYST_SOURCE_DIR_WorkflowSource|grep git/v1/exemplar-codecatalyst-action + - Run: pwd|grep git/v1/exemplar-codecatalyst-action Group1: Actions: SubAction2: @@ -52,8 +52,8 @@ Actions: - FirstAction Configuration: Steps: - - Run: env|grep CATALYST_DEFAULT_DIR=/codecatalyst/output/src/git/v1/exemplar-codecatalyst-action - - Run: env|grep CATALYST_SOURCE_DIR_WorkflowSource=/codecatalyst/output/src/git/v1/exemplar-codecatalyst-action - - Run: pwd|grep /codecatalyst/output/src/git/v1/exemplar-codecatalyst-action + - Run: env|grep CATALYST_DEFAULT_DIR | grep git/v1/exemplar-codecatalyst-action + - Run: env|grep CATALYST_SOURCE_DIR_WorkflowSource|grep git/v1/exemplar-codecatalyst-action + - Run: pwd|grep git/v1/exemplar-codecatalyst-action - Run: grep "hello world" ./.out/output.txt diff --git a/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/.gitignore b/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/.gitignore new file mode 100644 index 0000000..d5f19d8 --- /dev/null +++ b/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/.gitignore @@ -0,0 +1,2 @@ +node_modules +package-lock.json diff --git a/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/lib/index.js b/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/lib/index.js index f81f622..c04ceab 100644 --- a/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/lib/index.js +++ b/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/lib/index.js @@ -33,10 +33,10 @@ const runSummaries = __importStar(require("@aws/codecatalyst-run-summaries")); const space = __importStar(require("@aws/codecatalyst-space")); try { // Get inputs from the action - const input_WhoToGreet = core.getInput('who-to-greet'); // Who are we greeting here - console.log(input_WhoToGreet); - const input_HowToGreet = core.getInput('how-to-greet'); // How to greet the person - console.log(input_HowToGreet); + const input_WhoToGreet = core.getInput('whoToGreet'); // Who are we greeting here + console.log(`WHO: ${input_WhoToGreet}`); + const input_HowToGreet = core.getInput('howToGreet'); // How to greet the person + console.log(`HOW: ${input_HowToGreet}`); // Interact with CodeCatalyst entities console.log(`Current CodeCatalyst space ${space.getSpace().name}`); console.log(`Current CodeCatalyst project ${project.getProject().name}`); diff --git a/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/lib/index.ts b/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/lib/index.ts index 7ede969..b82cd70 100644 --- a/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/lib/index.ts +++ b/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/lib/index.ts @@ -9,10 +9,10 @@ import * as space from '@aws/codecatalyst-space'; try { // Get inputs from the action - const input_WhoToGreet = core.getInput('who-to-greet'); // Who are we greeting here - console.log(input_WhoToGreet); - const input_HowToGreet = core.getInput('how-to-greet'); // How to greet the person - console.log(input_HowToGreet); + const input_WhoToGreet = core.getInput('whoToGreet'); // Who are we greeting here + console.log(`WHO: ${input_WhoToGreet}`); + const input_HowToGreet = core.getInput('howToGreet'); // How to greet the person + console.log(`HOW: ${input_HowToGreet}`); // Interact with CodeCatalyst entities console.log(`Current CodeCatalyst space ${space.getSpace().name}`); diff --git a/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/package.json b/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/package.json index 8a06637..b731c9e 100644 --- a/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/package.json +++ b/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/package.json @@ -5,7 +5,7 @@ "main": "lib/index.js", "scripts": { "build": "tsc", - "package": "tsc && jest && ncc build -o pkg", + "package": "tsc && ncc build -o pkg", "all": "npm run build && npm run package" }, "dependencies": { diff --git a/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/pkg/index.js b/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/pkg/index.js index 3a44de1..83a36f3 100644 --- a/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/pkg/index.js +++ b/codecatalyst-runner/pkg/workflows/testdata/exemplar-codecatalyst-action/pkg/index.js @@ -40,10 +40,10 @@ const runSummaries = __importStar(__nccwpck_require__(1617)); const space = __importStar(__nccwpck_require__(1006)); try { // Get inputs from the action - const input_WhoToGreet = core.getInput('who-to-greet'); // Who are we greeting here - console.log(input_WhoToGreet); - const input_HowToGreet = core.getInput('how-to-greet'); // How to greet the person - console.log(input_HowToGreet); + const input_WhoToGreet = core.getInput('whoToGreet'); // Who are we greeting here + console.log(`WHO: ${input_WhoToGreet}`); + const input_HowToGreet = core.getInput('howToGreet'); // How to greet the person + console.log(`HOW: ${input_HowToGreet}`); // Interact with CodeCatalyst entities console.log(`Current CodeCatalyst space ${space.getSpace().name}`); console.log(`Current CodeCatalyst project ${project.getProject().name}`); @@ -167,7 +167,7 @@ exports.getEnvironmentVariable = getEnvironmentVariable; /** * Sets the output value for the action output parameter. * -* @param varName The name of the environment variable. Must match the `^[A-Za-z0-9][A-Za-z0-9\-_]{1,30}[A-Za-z0-9]$` pattern. +* @param varName The name of the environment variable. The variable must match the ^[A-Za-z0-9@\-_]+$ pattern. * @param varValue The fully resolved value of the output variable. * * @return The result of running `echo ${varName}`. @@ -261,7 +261,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.isValidOutputVariableName = exports.writeContentToFileSync = exports.copyToFileSync = exports.unknownToBooleanOrFalse = exports.unknownToStringOrUndefined = exports.isString = exports.escape = exports.sanitizeCommand = exports.outputVariableNamePattern = void 0; const fs_1 = __importDefault(__nccwpck_require__(7147)); -exports.outputVariableNamePattern = new RegExp(/^[A-Za-z0-9][A-Za-z0-9\-_]{1,30}[A-Za-z0-9]$/); +exports.outputVariableNamePattern = new RegExp(/^[A-Za-z0-9@\-_]+$/); /** * Sanitizes (escapes) special characters in the command and its arguments. * @param cmd The command to be sanitized. @@ -350,6 +350,9 @@ exports.writeContentToFileSync = writeContentToFileSync; * @param varName The destination file. */ function isValidOutputVariableName(varName) { + if (!varName || varName.length < 1 || varName.length > 255) { + return false; + } return exports.outputVariableNamePattern.test(varName); } exports.isValidOutputVariableName = isValidOutputVariableName; diff --git a/codecatalyst-runner/pkg/workflows/workflow_plans_provider.go b/codecatalyst-runner/pkg/workflows/workflow_plans_provider.go index d23271e..8877ca1 100644 --- a/codecatalyst-runner/pkg/workflows/workflow_plans_provider.go +++ b/codecatalyst-runner/pkg/workflows/workflow_plans_provider.go @@ -129,7 +129,7 @@ func (wpp *workflowPlansProvider) planAction(ctx context.Context, actionName str var runs actions.Runs runs = actions.Runs{ Using: actions.UsingTypeDocker, - Image: actions.CodeCatalystImage, + Image: actions.CodeCatalystImage(), Entrypoint: "/bin/echo", } outputs := actions.Outputs{ diff --git a/codecatalyst-runner/pkg/workflows/workflow_runner_test.go b/codecatalyst-runner/pkg/workflows/workflow_runner_test.go index 6d53aeb..b218a99 100644 --- a/codecatalyst-runner/pkg/workflows/workflow_runner_test.go +++ b/codecatalyst-runner/pkg/workflows/workflow_runner_test.go @@ -13,6 +13,14 @@ import ( "github.com/stretchr/testify/assert" ) +func setupSuite(_ testing.TB) func(tb testing.TB) { + oldValue := os.Getenv("CATALYST_IMAGE") + os.Setenv("CATALYST_IMAGE", "docker://public.ecr.aws/docker/library/node:20-bookworm-slim") + return func(_ testing.TB) { + os.Setenv("CATALYST_IMAGE", oldValue) + } +} + func TestRun(t *testing.T) { ctx := context.Background() @@ -20,6 +28,9 @@ func TestRun(t *testing.T) { t.Skip("skipping test in short mode") } + teardownSuite := setupSuite(t) + defer teardownSuite(t) + type TestRunTargetParams struct { TestCase string WorkflowPath string @@ -45,6 +56,14 @@ func TestRun(t *testing.T) { "SAMPLE_SECRET": "mysecretvalue", }, }, + { + TestCase: "sample-shell", + WorkflowPath: "testdata/exemplar-codecatalyst-action/.codecatalyst/workflows/sample.yaml", + ExecutionType: runner.ExecutionTypeShell, + Secrets: map[string]string{ + "SAMPLE_SECRET": "mysecretvalue", + }, + }, { TestCase: "cache-finch", WorkflowPath: "testdata/exemplar-codecatalyst-action/.codecatalyst/workflows/cache.yaml", @@ -55,6 +74,11 @@ func TestRun(t *testing.T) { WorkflowPath: "testdata/exemplar-codecatalyst-action/.codecatalyst/workflows/cache.yaml", ExecutionType: runner.ExecutionTypeDocker, }, + { + TestCase: "cache-shell", + WorkflowPath: "testdata/exemplar-codecatalyst-action/.codecatalyst/workflows/cache-shell.yaml", + ExecutionType: runner.ExecutionTypeShell, + }, { TestCase: "custom-finch", WorkflowPath: "testdata/exemplar-codecatalyst-action/.codecatalyst/workflows/custom.yaml", @@ -65,6 +89,11 @@ func TestRun(t *testing.T) { WorkflowPath: "testdata/exemplar-codecatalyst-action/.codecatalyst/workflows/custom.yaml", ExecutionType: runner.ExecutionTypeDocker, }, + { + TestCase: "custom-shell", + WorkflowPath: "testdata/exemplar-codecatalyst-action/.codecatalyst/workflows/custom.yaml", + ExecutionType: runner.ExecutionTypeShell, + }, { TestCase: "shared-finch", WorkflowPath: "testdata/exemplar-codecatalyst-action/.codecatalyst/workflows/shared.yaml", @@ -81,8 +110,15 @@ func TestRun(t *testing.T) { "SAMPLE_SECRET": "mysecretvalue", }, }, + { + TestCase: "shared-shell", + WorkflowPath: "testdata/exemplar-codecatalyst-action/.codecatalyst/workflows/shared.yaml", + ExecutionType: runner.ExecutionTypeShell, + Secrets: map[string]string{ + "SAMPLE_SECRET": "mysecretvalue", + }, + }, } { - // zerolog.SetGlobalLevel(zerolog.DebugLevel) log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stdout}) log.Logger = log.Logger.With().Caller().Stack().Logger() ctx = log.Logger.WithContext(ctx) diff --git a/command-runner/Makefile b/command-runner/Makefile index 510685b..aef81ac 100644 --- a/command-runner/Makefile +++ b/command-runner/Makefile @@ -1,5 +1,3 @@ -TAGS ?= all - .PHONY: all all: deps format lint test @@ -18,11 +16,11 @@ lint: .PHONY: test test: - go test -json -v -coverprofile=coverage.txt --tags=$(TAGS) -test.timeout=10m ./... 2>&1 | gotestfmt + go test -json -v -coverprofile=coverage.txt -test.timeout=10m ./... 2>&1 | gotestfmt .PHONY: test-short test-short: - go test -json -v -coverprofile=coverage.txt --tags=$(TAGS) -short ./... 2>&1 | gotestfmt + go test -json -v -coverprofile=coverage.txt -short ./... 2>&1 | gotestfmt .PHONY: upgrade upgrade: diff --git a/command-runner/go.mod b/command-runner/go.mod index 0bd30dd..67d9929 100644 --- a/command-runner/go.mod +++ b/command-runner/go.mod @@ -24,22 +24,31 @@ require ( github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/ProtonMail/go-crypto v1.0.0 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cloudflare/circl v1.3.7 // indirect github.com/containerd/containerd v1.7.13 // indirect github.com/containerd/log v0.1.0 // indirect github.com/cyphar/filepath-securejoin v0.2.4 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/docker/distribution v2.8.2+incompatible // indirect github.com/docker/docker-credential-helpers v0.8.1 // indirect + github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c // indirect github.com/docker/go-connections v0.5.0 // indirect + github.com/docker/go-metrics v0.0.1 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fvbommel/sortorder v1.1.0 // indirect github.com/gdamore/encoding v1.0.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-logr/logr v1.4.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/gorilla/mux v1.8.1 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/klauspost/compress v1.17.5 // indirect @@ -47,6 +56,8 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/miekg/pkcs11 v1.1.1 // indirect github.com/moby/sys/sequential v0.5.0 // indirect github.com/moby/sys/user v0.1.0 // indirect github.com/moby/term v0.0.0-20221205130635-1aeaba878587 // indirect @@ -55,11 +66,18 @@ require ( github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/prometheus/client_golang v1.14.0 // indirect + github.com/prometheus/client_model v0.3.0 // indirect + github.com/prometheus/common v0.42.0 // indirect + github.com/prometheus/procfs v0.9.0 // indirect github.com/rivo/uniseg v0.4.7-0.20240127222946-601bbb3750c2 // indirect github.com/sergi/go-diff v1.3.1 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/skeema/knownhosts v1.2.1 // indirect + github.com/spf13/cobra v1.8.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/objx v0.5.1 // indirect + github.com/theupdateframework/notary v0.7.0 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 // indirect go.opentelemetry.io/otel v1.22.0 // indirect @@ -73,6 +91,7 @@ require ( golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.17.0 // indirect + google.golang.org/protobuf v1.31.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.4.0 // indirect diff --git a/command-runner/go.sum b/command-runner/go.sum index 0c2fb2a..dffee85 100644 --- a/command-runner/go.sum +++ b/command-runner/go.sum @@ -4,6 +4,7 @@ github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9 github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= @@ -11,13 +12,20 @@ github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7 github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/Shopify/logrus-bugsnag v0.0.0-20170309145241-6dbc35f2c30d h1:hi6J4K6DKrR4/ljxn6SF6nURyu785wKMuQcjt7H3VCQ= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/bugsnag/bugsnag-go v1.0.5-0.20150529004307-13fd6b8acda0 h1:s7+5BfS4WFJoVF9pnB8kBk03S7pZXRdKamnV0FOl5Sc= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o= github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004 h1:lkAMpLVBDaj17e85keuznYcH5rqI438v41pKcBl4ZxQ= github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= @@ -26,6 +34,7 @@ github.com/containerd/containerd v1.7.13/go.mod h1:zT3up6yTRfEUa6+GsITYIJNgSVL9N github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -35,20 +44,25 @@ github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/docker/cli v25.0.2+incompatible h1:6GEdvxwEA451/+Y3GtqIGn/MNjujQazUlxC6uGu8Tog= github.com/docker/cli v25.0.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/docker v25.0.2+incompatible h1:/OaKeauroa10K4Nqavw4zlhcDq/WBcPMc5DbjOGgozY= github.com/docker/docker v25.0.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.8.1 h1:j/eKUktUltBtMzKqmfLB0PAgqYyMHOp5vfsD1807oKo= github.com/docker/docker-credential-helpers v0.8.1/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= 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/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fvbommel/sortorder v1.1.0 h1:fUmoe+HLsBTctBDoaBwpQo5N+nrCp8g/BjKb/6ZQmYw= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.7.0 h1:I5LiGTQuwrysAt1KS9wg1yFfOI3arI3ucFrxtd/xqaA= @@ -68,6 +82,7 @@ github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= github.com/go-logr/logr v1.4.1/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-sql-driver/mysql v1.3.0 h1:pgwjLi/dvffoP9aabwkT3AKpXQM93QARkjFhDDqC1UE= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= @@ -75,13 +90,19 @@ github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/certificate-transparency-go v1.0.10-0.20180222191210-5ab67e519c93 h1:jc2UWq7CbdszqeH6qu1ougXMIUBfSy8Pbh/anURYbGI= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jinzhu/gorm v0.0.0-20170222002820-5409931a1bb8 h1:CZkYfurY6KGhVtlalI4QwQ6T0Cu6iuY3e0x5RLu96WE= +github.com/jinzhu/inflection v0.0.0-20170102125226-1c35d901db3d h1:jRQLvyVGL+iVtDElaEIDdKwpPqUIZJfzkNLV34htpEc= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= @@ -99,6 +120,7 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/magiconair/properties v1.5.3 h1:C8fxWnhYyME3n0klPOhVM7PtYUB3eV1W3DeFmN3j53Y= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= @@ -107,6 +129,9 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= +github.com/mitchellh/mapstructure v0.0.0-20150613213606-2caf8efc9366 h1:1ypTpKUfEOyX1YsJru6lLq7hrmK+QGECpJQ1PHUHuGo= github.com/moby/buildkit v0.12.5 h1:RNHH1l3HDhYyZafr5EgstEu8aGNCwyfvMtrQDtjH9T0= github.com/moby/buildkit v0.12.5/go.mod h1:YGwjA2loqyiYfZeEo8FtI7z4x5XponAaIWsWcSjWwso= github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= @@ -127,12 +152,17 @@ github.com/opencontainers/image-spec v1.1.0-rc6 h1:XDqvyKsJEbRtATzkgItUqBA7QHk58 github.com/opencontainers/image-spec v1.1.0-rc6/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU= github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= +github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= 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 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= +github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= +github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= github.com/rivo/tview v0.0.0-20240204151237-861aa94d61c8 h1:aW0ILZ0lkphO/2mUWocSfP1iebWtSFcxL8BiSNR+/8g= github.com/rivo/tview v0.0.0-20240204151237-861aa94d61c8/go.mod h1:sGSvhfWFNS7FpYxS8K+e22OTOI3UsB5rDs0nRtoZkpA= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -151,6 +181,11 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ= github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= +github.com/spf13/cast v0.0.0-20150508191742-4d07383ffe94 h1:JmfC365KywYwHB946TTiQWEb8kqPY+pybPLoGE9GgVk= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/jwalterweatherman v0.0.0-20141219030609-3d60171a6431 h1:XTHrT015sxHyJ5FnQ0AeemSspZWaDq7DoTRW0EVsDCE= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/viper v0.0.0-20150530192845-be5ff3e4840c h1:2EejZtjFjKJGk71ANb+wtFK5EjUzUkEM3R0xnp559xg= 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= @@ -164,6 +199,7 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/theupdateframework/notary v0.7.0 h1:QyagRZ7wlSpjT5N2qQAh/pN+DVqgekv4DzbAiAiEL3c= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -282,13 +318,16 @@ google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/cenkalti/backoff.v2 v2.2.1 h1:eJ9UAg01/HIHG987TwxvnzK2MgxXq97YY6rYDpY9aII= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/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/rethinkdb/rethinkdb-go.v6 v6.2.1 h1:d4KQkxAaAiRY2h5Zqis161Pv91A37uZyJOx73duwUwM= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 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= diff --git a/command-runner/internal/containers/docker/docker_auth.go b/command-runner/internal/containers/docker/docker_auth.go index 5dddb4f..2ad1786 100644 --- a/command-runner/internal/containers/docker/docker_auth.go +++ b/command-runner/internal/containers/docker/docker_auth.go @@ -1,5 +1,3 @@ -//go:build !(WITHOUT_DOCKER || !(linux || darwin || windows)) - package docker import ( diff --git a/command-runner/internal/containers/docker/docker_build.go b/command-runner/internal/containers/docker/docker_build.go index 9bd4538..c383be0 100644 --- a/command-runner/internal/containers/docker/docker_build.go +++ b/command-runner/internal/containers/docker/docker_build.go @@ -1,5 +1,3 @@ -//go:build !(WITHOUT_DOCKER || !(linux || darwin || windows)) - package docker import ( diff --git a/command-runner/internal/containers/docker/docker_connect.go b/command-runner/internal/containers/docker/docker_connect.go new file mode 100644 index 0000000..3c4391b --- /dev/null +++ b/command-runner/internal/containers/docker/docker_connect.go @@ -0,0 +1,113 @@ +package docker + +import ( + "context" + "fmt" + "os" + "strings" + + "github.com/aws/codecatalyst-runner-cli/command-runner/pkg/common" + "github.com/docker/cli/cli/command" + "github.com/docker/cli/cli/config" + "github.com/docker/cli/cli/connhelper" + "github.com/docker/cli/cli/context/docker" + "github.com/docker/cli/cli/context/store" + cliflags "github.com/docker/cli/cli/flags" + "github.com/docker/docker/client" + "github.com/rs/zerolog/log" +) + +// getDockerEndpointOpts results the endpoint for current docker context +func getDockerEndpointOpts(ctx context.Context) ([]client.Opt, error) { + opts := &cliflags.ClientOptions{} + storeConfig := command.DefaultContextStoreConfig() + contextStore := &command.ContextStoreWithDefault{ + Store: store.New(config.ContextStoreDir(), storeConfig), + Resolver: func() (*command.DefaultContext, error) { + return command.ResolveDefaultContext(opts, storeConfig) + }, + } + endpoint, err := resolveDockerEndpoint(ctx, contextStore, resolveContextName()) + if err != nil { + return nil, fmt.Errorf("unable to resolve docker endpoint: %w", err) + } + return endpoint.ClientOpts() +} + +// resolveDockerEndpoint from store +func resolveDockerEndpoint(ctx context.Context, s store.Reader, contextName string) (docker.Endpoint, error) { + if s == nil { + return docker.Endpoint{}, fmt.Errorf("no context store initialized") + } + log.Ctx(ctx).Debug().Msgf("Using docker context '%s'", contextName) + ctxMeta, err := s.GetMetadata(contextName) + if err != nil { + return docker.Endpoint{}, err + } + epMeta, err := docker.EndpointFromContext(ctxMeta) + if err != nil { + return docker.Endpoint{}, err + } + log.Ctx(ctx).Debug().Msgf("%sdocker context=%s host=%s", logPrefix, contextName, epMeta.Host) + return docker.WithTLSData(s, contextName, epMeta) +} + +// resolveContextName from environment variable or use current +func resolveContextName() string { + cfg := config.LoadDefaultConfigFile(os.Stderr) + if os.Getenv(client.EnvOverrideHost) != "" { + return command.DefaultContextName + } + if ctxName := os.Getenv(command.EnvOverrideContext); ctxName != "" { + return ctxName + } + if cfg != nil && cfg.CurrentContext != "" { + // We don't validate if this context exists: errors may occur when trying to use it. + return cfg.CurrentContext + } + return command.DefaultContextName +} + +// getDockerClient returns the Docker APIClient +func getDockerClient(ctx context.Context) (cli client.APIClient, err error) { + opts, err := getDockerEndpointOpts(ctx) + if err != nil { + return nil, err + } + dockerHost := os.Getenv("DOCKER_HOST") + + if strings.HasPrefix(dockerHost, "ssh://") { + var helper *connhelper.ConnectionHelper + + helper, err = connhelper.GetConnectionHelper(dockerHost) + if err != nil { + return nil, err + } + cli, err = client.NewClientWithOpts( + client.WithHost(helper.Host), + client.WithDialContext(helper.Dialer), + ) + } else { + cli, err = client.NewClientWithOpts(opts...) + } + if err != nil { + return nil, fmt.Errorf("failed to connect to docker daemon: %w", err) + } + cli.NegotiateAPIVersion(ctx) + + return cli, nil +} + +func (cr *dockerContainer) connect() common.Executor { + return func(ctx context.Context) error { + if cr.cli != nil { + return nil + } + cli, err := getDockerClient(ctx) + if err != nil { + return err + } + cr.cli = cli + return nil + } +} diff --git a/command-runner/internal/containers/docker/docker_logger.go b/command-runner/internal/containers/docker/docker_logger.go index d2fe57d..f643f4f 100644 --- a/command-runner/internal/containers/docker/docker_logger.go +++ b/command-runner/internal/containers/docker/docker_logger.go @@ -1,5 +1,3 @@ -//go:build !(WITHOUT_DOCKER || !(linux || darwin || windows)) - package docker import ( diff --git a/command-runner/internal/containers/docker/docker_pull.go b/command-runner/internal/containers/docker/docker_pull.go index 65e10b1..d189419 100644 --- a/command-runner/internal/containers/docker/docker_pull.go +++ b/command-runner/internal/containers/docker/docker_pull.go @@ -1,5 +1,3 @@ -//go:build !(WITHOUT_DOCKER || !(linux || darwin || windows)) - package docker import ( diff --git a/command-runner/internal/containers/docker/docker_pull_test.go b/command-runner/internal/containers/docker/docker_pull_test.go index ad77432..be9f2e7 100644 --- a/command-runner/internal/containers/docker/docker_pull_test.go +++ b/command-runner/internal/containers/docker/docker_pull_test.go @@ -1,14 +1,9 @@ -//go:build all || docker -// +build all docker - package docker import ( "context" "testing" - "github.com/docker/cli/cli/config" - "github.com/rs/zerolog" "github.com/rs/zerolog/log" assert "github.com/stretchr/testify/assert" @@ -41,8 +36,6 @@ func TestCleanImage(t *testing.T) { func TestGetImagePullOptions(t *testing.T) { ctx := context.Background() - config.SetDir("/non-existent/docker") - options, err := getImagePullOptions(ctx, newDockerPullExecutorInput{ Image: "", Username: "username", diff --git a/command-runner/internal/containers/docker/docker_run.go b/command-runner/internal/containers/docker/docker_run.go index 2337c96..dce9699 100644 --- a/command-runner/internal/containers/docker/docker_run.go +++ b/command-runner/internal/containers/docker/docker_run.go @@ -1,5 +1,3 @@ -//go:build !(WITHOUT_DOCKER || !(linux || darwin || windows)) - package docker import ( @@ -21,7 +19,6 @@ import ( "github.com/rs/zerolog/log" - "github.com/docker/cli/cli/connhelper" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/mount" @@ -111,46 +108,6 @@ type dockerContainer struct { GID int } -// getDockerClient returns the Docker APIClient -func getDockerClient(ctx context.Context) (cli client.APIClient, err error) { - dockerHost := os.Getenv("DOCKER_HOST") - - if strings.HasPrefix(dockerHost, "ssh://") { - var helper *connhelper.ConnectionHelper - - helper, err = connhelper.GetConnectionHelper(dockerHost) - if err != nil { - return nil, err - } - cli, err = client.NewClientWithOpts( - client.WithHost(helper.Host), - client.WithDialContext(helper.Dialer), - ) - } else { - cli, err = client.NewClientWithOpts(client.FromEnv) - } - if err != nil { - return nil, fmt.Errorf("failed to connect to docker daemon: %w", err) - } - cli.NegotiateAPIVersion(ctx) - - return cli, nil -} - -func (cr *dockerContainer) connect() common.Executor { - return func(ctx context.Context) error { - if cr.cli != nil { - return nil - } - cli, err := getDockerClient(ctx) - if err != nil { - return err - } - cr.cli = cli - return nil - } -} - func (cr *dockerContainer) Close() common.Executor { return func(ctx context.Context) error { if cr.cli != nil { diff --git a/command-runner/internal/containers/docker/docker_run_test.go b/command-runner/internal/containers/docker/docker_run_test.go index 5e08052..ccebe81 100644 --- a/command-runner/internal/containers/docker/docker_run_test.go +++ b/command-runner/internal/containers/docker/docker_run_test.go @@ -1,6 +1,3 @@ -//go:build all || docker -// +build all docker - package docker import ( diff --git a/command-runner/internal/containers/docker/docker_service.go b/command-runner/internal/containers/docker/docker_service.go index daf3f80..1e7fedd 100644 --- a/command-runner/internal/containers/docker/docker_service.go +++ b/command-runner/internal/containers/docker/docker_service.go @@ -1,5 +1,3 @@ -//go:build !(WITHOUT_DOCKER || !(linux || darwin || windows)) - package docker import ( diff --git a/command-runner/internal/containers/docker/docker_service_test.go b/command-runner/internal/containers/docker/docker_service_test.go index 1769678..6959e13 100644 --- a/command-runner/internal/containers/docker/docker_service_test.go +++ b/command-runner/internal/containers/docker/docker_service_test.go @@ -1,6 +1,3 @@ -//go:build all || docker -// +build all docker - package docker import ( @@ -9,7 +6,6 @@ import ( "testing" "github.com/docker/docker/api/types" - "github.com/docker/docker/client" "github.com/rs/zerolog" "github.com/rs/zerolog/log" "github.com/stretchr/testify/assert" @@ -27,6 +23,8 @@ func TestImageExistsLocally(t *testing.T) { // to help make this test reliable and not flaky, we need to have // an image that will exist, and onew that won't exist + ctx = log.Logger.WithContext(ctx) + dcsp := &ServiceProvider{} dcs := dcsp.NewContainerService() @@ -41,13 +39,12 @@ func TestImageExistsLocally(t *testing.T) { assert.Equal(t, false, invalidImagePlatform) // pull an image - cli, err := client.NewClientWithOpts(client.FromEnv) + cli, err := getDockerClient(ctx) assert.Nil(t, err) - cli.NegotiateAPIVersion(context.Background()) // Chose alpine latest because it's so small // maybe we should build an image instead so that tests aren't reliable on dockerhub - readerDefault, err := cli.ImagePull(ctx, "node:16-buster-slim", types.ImagePullOptions{ + readerDefault, err := cli.ImagePull(ctx, "alpine:3", types.ImagePullOptions{ Platform: "linux/amd64", }) assert.Nil(t, err) @@ -55,12 +52,12 @@ func TestImageExistsLocally(t *testing.T) { _, err = io.ReadAll(readerDefault) assert.Nil(t, err) - imageDefaultArchExists, err := dcs.ImageExistsLocally(ctx, "node:16-buster-slim", "linux/amd64") + imageDefaultArchExists, err := dcs.ImageExistsLocally(ctx, "alpine:3", "linux/amd64") assert.Nil(t, err) assert.Equal(t, true, imageDefaultArchExists) // Validate if another architecture platform can be pulled - readerArm64, err := cli.ImagePull(ctx, "node:16-buster-slim", types.ImagePullOptions{ + readerArm64, err := cli.ImagePull(ctx, "alpine:3", types.ImagePullOptions{ Platform: "linux/arm64", }) assert.Nil(t, err) @@ -68,7 +65,7 @@ func TestImageExistsLocally(t *testing.T) { _, err = io.ReadAll(readerArm64) assert.Nil(t, err) - imageArm64Exists, err := dcs.ImageExistsLocally(ctx, "node:16-buster-slim", "linux/arm64") + imageArm64Exists, err := dcs.ImageExistsLocally(ctx, "alpine:3", "linux/arm64") assert.Nil(t, err) assert.Equal(t, true, imageArm64Exists) } diff --git a/command-runner/pkg/runner/command_executor_test.go b/command-runner/pkg/runner/command_executor_test.go index 2bc0c60..043bf6d 100644 --- a/command-runner/pkg/runner/command_executor_test.go +++ b/command-runner/pkg/runner/command_executor_test.go @@ -1,6 +1,3 @@ -//go:build all || docker -// +build all docker - package runner import ( @@ -37,7 +34,6 @@ func TestExecutor(t *testing.T) { ExpectedType: &containerCommandExecutor{}, }, } { - // setup the code under test ctx := context.Background() executor, err := newCommandExecutor(ctx, "testID", tt.ExecutionType, &tt.CommandGroup, &EnvironmentConfiguration{ diff --git a/command-runner/pkg/runner/container_command_executor.go b/command-runner/pkg/runner/container_command_executor.go index 981a29e..5a9185c 100644 --- a/command-runner/pkg/runner/container_command_executor.go +++ b/command-runner/pkg/runner/container_command_executor.go @@ -243,7 +243,7 @@ env -0 | while IFS='=' read -r -d '' n v; do printf "::set-output name=%s::%s\n func setupCopyAndCloseExecutors(actionContainer types.Container, workingDir string, filemaps []*FileMap) ([]common.Executor, []common.Executor, error) { copyExecutors := []common.Executor{} closeExecutors := []common.Executor{ - actionContainer.Exec([]string{"/bin/sh", "/tmp/mce/tmp/envout.sh"}, nil, "", "/"), + actionContainer.Exec([]string{"/bin/bash", "/tmp/mce/tmp/envout.sh"}, nil, "", "/"), } for _, filemap := range filemaps { switch filemap.Type { diff --git a/command-runner/pkg/runner/container_command_executor_test.go b/command-runner/pkg/runner/container_command_executor_test.go index b054e66..96f7a16 100644 --- a/command-runner/pkg/runner/container_command_executor_test.go +++ b/command-runner/pkg/runner/container_command_executor_test.go @@ -178,7 +178,7 @@ func TestExecutorContainer(t *testing.T) { }) mockContainer := &cmock.MockContainer{} mockContainer.On("Pull", true).Return(nil) - mockContainer.On("Exec", []string{"/bin/sh", "/tmp/mce/tmp/envout.sh"}, emptyMap, "", "/").Return(nil) + mockContainer.On("Exec", []string{"/bin/bash", "/tmp/mce/tmp/envout.sh"}, emptyMap, "", "/").Return(nil) mockContainer.On("Remove").Return(nil) mockContainer.On("Create", emptyList, emptyList).Return(nil) mockContainer.On("Start", false).Return(nil) diff --git a/command-runner/pkg/runner/runner.go b/command-runner/pkg/runner/runner.go index cc7ea38..8d4945a 100644 --- a/command-runner/pkg/runner/runner.go +++ b/command-runner/pkg/runner/runner.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "math" + "os" "strings" "github.com/aws/codecatalyst-runner-cli/command-runner/internal/containers" @@ -120,6 +121,9 @@ const ( // DefaultExecutionType determines the appropriate default func DefaultExecutionType() ExecutionType { + if _, ok := os.LookupEnv("__MDE_ENVIRONMENT_ID"); ok { + return ExecutionTypeShell + } defaultSP := containers.DefaultServiceProvider(context.Background()) switch defaultSP { case containers.Finch: diff --git a/command-runner/pkg/runner/runner_test.go b/command-runner/pkg/runner/runner_test.go index 0ba5bf7..292092c 100644 --- a/command-runner/pkg/runner/runner_test.go +++ b/command-runner/pkg/runner/runner_test.go @@ -1,6 +1,3 @@ -//go:build all || docker -// +build all docker - package runner import ( @@ -52,7 +49,6 @@ func TestRunAll(t *testing.T) { }, }, } { - // setup the code under test ctx := context.Background() diff --git a/command-runner/pkg/runner/shell_command_executor.go b/command-runner/pkg/runner/shell_command_executor.go index 46b6493..0947768 100644 --- a/command-runner/pkg/runner/shell_command_executor.go +++ b/command-runner/pkg/runner/shell_command_executor.go @@ -8,7 +8,9 @@ import ( "os" "os/exec" "path/filepath" + "regexp" "strings" + "time" "github.com/aws/codecatalyst-runner-cli/command-runner/internal/fs" "github.com/aws/codecatalyst-runner-cli/command-runner/pkg/common" @@ -20,11 +22,13 @@ import ( ) type shellCommandExecutor struct { - Env []string - Stdout io.Writer - Stderr io.Writer - WorkingDir string - CleanupDir string + Stdout io.Writer + Stderr io.Writer + Env []string + WorkingDir string + CloseExecutors []common.Executor + ctx context.Context + mceDir string } type newShellCommandExecutorParams struct { @@ -32,41 +36,24 @@ type newShellCommandExecutorParams struct { } func newShellCommandExecutor(ctx context.Context, params *newShellCommandExecutorParams) (commandExecutor, error) { - execWorkingDir := params.WorkingDir - var cleanupDir string - for _, filemap := range params.FileMaps { - // only handle filemap for working directory in first pass - if resolvePath(filemap.SourcePath, params.WorkingDir) == resolvePath(".", params.WorkingDir) { - if filemap.Type == FileMapTypeCopyIn || filemap.Type == FileMapTypeCopyInWithGitignore { - // create temporary directory for the working directory - var err error - execWorkingDir, err = createCleanWorkdir(ctx, execWorkingDir) - if err != nil { - return nil, err - } - cleanupDir = filepath.Dir(execWorkingDir) - } - } + mceDir, err := os.MkdirTemp(fs.TmpDir(), "mce") + if err != nil { + return nil, err } + closeExecutors := []common.Executor{} for _, filemap := range params.FileMaps { switch filemap.Type { case FileMapTypeCopyOut: - if err := copyDir( - ctx, - resolvePath(filemap.SourcePath, params.WorkingDir), - resolvePath(filemap.TargetPath, execWorkingDir), - false, - ); err != nil { - return nil, err - } + closeExecutors = append(closeExecutors, copyOut(ctx, mceDir, params.WorkingDir, filemap)) case FileMapTypeBind: - if resolvePath(filemap.SourcePath, params.WorkingDir) != resolvePath(".", params.WorkingDir) { - return nil, fmt.Errorf("unable to use bind mounts with shell executor for non-working directory '%s'", filemap.SourcePath) + // treat bind mount as symlink + if err := symlink(mceDir, params.WorkingDir, filemap); err != nil { + return nil, err } case FileMapTypeCopyIn: if err := copyDir( ctx, - resolvePath(filemap.TargetPath, execWorkingDir), + resolvePath(filemap.TargetPath, mceDir), resolvePath(filemap.SourcePath, params.WorkingDir), false, ); err != nil { @@ -75,7 +62,7 @@ func newShellCommandExecutor(ctx context.Context, params *newShellCommandExecuto case FileMapTypeCopyInWithGitignore: if err := copyDir( ctx, - resolvePath(filemap.TargetPath, execWorkingDir), + resolvePath(filemap.TargetPath, mceDir), resolvePath(filemap.SourcePath, params.WorkingDir), true, ); err != nil { @@ -86,44 +73,82 @@ func newShellCommandExecutor(ctx context.Context, params *newShellCommandExecuto } } + closeExecutors = append(closeExecutors, setOutputs(mceDir, params.Stdout)) + closeExecutors = append(closeExecutors, func(ctx context.Context) error { + log.Debug().Msgf("close() is removing %s", mceDir) + return os.RemoveAll(mceDir) + }) + env := make([]string, 0) + var defaultDir string if params.Env != nil { for k, v := range params.Env { - env = append(env, fmt.Sprintf("%s=%s", k, v)) + if strings.HasPrefix(k, "CATALYST_SOURCE_DIR_") { + v = resolvePath(v, mceDir) + if k == "CATALYST_SOURCE_DIR_WorkflowSource" || defaultDir == "" { + defaultDir = v + } + } + env = append(env, fmt.Sprintf("%s=%s", k, interpolate(v, params.Env))) } } + if defaultDir == "" { + defaultDir = params.WorkingDir + } env = append(env, fmt.Sprintf("PATH=%s", os.Getenv("PATH"))) - env = append(env, fmt.Sprintf("CATALYST_DEFAULT_DIR=%s", execWorkingDir)) + env = append(env, fmt.Sprintf("CATALYST_DEFAULT_DIR=%s", defaultDir)) + + if err := os.WriteFile(filepath.Join(mceDir, "env.sh"), []byte(""), 00666); err != nil /* #nosec G306 */ { + return nil, err + } + + if err := os.WriteFile(filepath.Join(mceDir, "dir.txt"), []byte(defaultDir), 00644); err != nil /* #nosec G306 */ { + return nil, err + } return &shellCommandExecutor{ - Env: env, - Stdout: params.Stdout, - Stderr: params.Stderr, - WorkingDir: execWorkingDir, - CleanupDir: cleanupDir, + Stdout: params.Stdout, + Stderr: params.Stderr, + WorkingDir: defaultDir, + Env: env, + CloseExecutors: closeExecutors, + mceDir: mceDir, + ctx: ctx, }, nil } -func (sce *shellCommandExecutor) Close(_ bool) error { - if sce.CleanupDir != "" { - log.Debug().Msgf("close() is removing %s", sce.CleanupDir) - return os.RemoveAll(sce.CleanupDir) +func (sce *shellCommandExecutor) Close(isError bool) error { + var err error + if !isError { + err = common.NewPipelineExecutor(sce.CloseExecutors...).TraceRegion("close-executors")(sce.ctx) } - return nil + return err } func (sce *shellCommandExecutor) ExecuteCommand(ctx context.Context, command Command) error { - shell := []string{"/bin/bash", "-c"} + script := fmt.Sprintf(` + MCE_DIR=%s + cd $(cat ${MCE_DIR}/dir.txt) + set -a + . ${MCE_DIR}/env.sh + %s + CODEBUILD_LAST_EXIT=$? + export -p > ${MCE_DIR}/env.sh + pwd > ${MCE_DIR}/dir.txt + exit $CODEBUILD_LAST_EXIT`, sce.mceDir, strings.Join(command, " ")) + scriptName := fmt.Sprintf("script-%d.sh", time.Now().UnixNano()) + scriptPath := filepath.Join(sce.mceDir, scriptName) + if err := os.WriteFile(scriptPath, []byte(script), 00755); err != nil /* #nosec G306 */ { + return err + } - args := shell - args = append(args, strings.Join(command, " ")) - cmd := exec.CommandContext(ctx, shell[0]) //#nosec G204 - cmd.Path = shell[0] - cmd.Args = args + cmd := exec.CommandContext(ctx, "/bin/sh", scriptPath) //#nosec G204 cmd.Stdin = nil cmd.Dir = sce.WorkingDir cmd.Env = sce.Env + log.Debug().Msgf("ExecuteCommand: path=%s args=%s dir=%s env=%#v script=%s", cmd.Path, cmd.Args, cmd.Dir, cmd.Env, script) + stdout, err := cmd.StdoutPipe() if err != nil { return err @@ -158,15 +183,6 @@ func streamPipe(dst io.Writer, src io.ReadCloser) { _, _ = io.Copy(dst, reader) } -func createCleanWorkdir(ctx context.Context, workdir string) (string, error) { - tmpdir, err := os.MkdirTemp(fs.TmpDir(), "executor-shell") - if err != nil { - return "", err - } - log.Ctx(ctx).Debug().Msgf("Created clean working directory %s", tmpdir) - return filepath.Join(tmpdir, filepath.Base(workdir)), nil -} - func copyDir(ctx context.Context, destdir string, sourcedir string, useGitIgnore bool) error { if sourcedir == destdir { return fmt.Errorf("unable to copyDir when sourcedir==destdir") @@ -197,3 +213,78 @@ func copyDir(ctx context.Context, destdir string, sourcedir string, useGitIgnore } return filepath.Walk(sourcedir, fc.CollectFiles(ctx, []string{})) } + +func setOutputs(mceDir string, stdout io.Writer) common.Executor { + return func(context.Context) error { + f, err := os.Open(filepath.Join(mceDir, "env.sh")) + if err != nil { + return nil + } + defer f.Close() + scanner := bufio.NewScanner(f) + pattern := regexp.MustCompile(`^export (.+)="(.+)"$`) + for scanner.Scan() { + line := scanner.Text() + kv := pattern.FindStringSubmatch(line) + if len(kv) == 3 { + fmt.Fprintf(stdout, "::set-output name=%s::%s\n", kv[1], kv[2]) + } + } + return scanner.Err() + } +} + +func copyOut(ctx context.Context, mceDir string, workingDir string, filemap *FileMap) common.Executor { + sourcePath := resolvePath(filemap.SourcePath, mceDir) + targetPath := resolvePath(filemap.TargetPath, workingDir) + return func(context.Context) error { + sources, err := filepath.Glob(sourcePath) + if err != nil { + return err + } + log.Debug().Msgf("clearing cache %s", targetPath) + if err := os.RemoveAll(targetPath); err != nil { + return err + } + log.Debug().Msgf("copying %v (%s) to %s", sources, sourcePath, targetPath) + for _, source := range sources { + if err := copyDir( + ctx, + targetPath, + source, + false, + ); err != nil { + return err + } + } + return nil + } +} + +func symlink(mceDir string, workingDir string, filemap *FileMap) error { + if resolvePath(filemap.SourcePath, workingDir) != resolvePath(".", workingDir) { + sourcePath := resolvePath(filemap.SourcePath, workingDir) + targetPath := resolvePath(filemap.TargetPath, mceDir) + log.Debug().Msgf("symlink mount %s to %s", sourcePath, targetPath) + if err := os.MkdirAll(filepath.Dir(targetPath), 0755); err != nil { + return err + } + return os.Symlink(sourcePath, targetPath) + } + return nil +} + +func interpolate(s string, vars map[string]string) string { + r := regexp.MustCompile(`\${?([a-zA-Z0-9_\-.]+)}?`) + symbols := regexp.MustCompile(`[${}]`) + repl := func(match string) string { + key := symbols.ReplaceAllString(match, "") + if val, ok := vars[key]; ok { + return val + } + return match + } + rtn := r.ReplaceAllStringFunc(s, repl) + log.Debug().Msgf("interpolate %s -> %s", s, rtn) + return rtn +} diff --git a/command-runner/pkg/runner/shell_command_executor_test.go b/command-runner/pkg/runner/shell_command_executor_test.go index c5c5f15..c843272 100644 --- a/command-runner/pkg/runner/shell_command_executor_test.go +++ b/command-runner/pkg/runner/shell_command_executor_test.go @@ -33,8 +33,8 @@ func TestExecutorShell(t *testing.T) { }, Commands: []CommandTest{ { - Command: "echo -n $FOO", - ExpectedOutput: "BAR", + Command: "echo $FOO", + ExpectedOutput: "BAR\n", }, { Command: "ls", @@ -58,17 +58,18 @@ func TestExecutorShell(t *testing.T) { }, }, Env: map[string]string{ - "FOO": "BAR", + "CATALYST_SOURCE_DIR_WorkflowSource": ".", + "FOO": "BAR", }, }, Commands: []CommandTest{ { - Command: "echo -n $FOO", - ExpectedOutput: "BAR", + Command: "echo $FOO", + ExpectedOutput: "BAR\n", }, { - Command: "ls", - ExpectedOutput: "main.py\n", + Command: "ls | grep -c main.py", + ExpectedOutput: "1\n", }, { Command: "pwd | grep -v -c testdata/workingdir/basic", @@ -123,3 +124,56 @@ func TestExecutorShell(t *testing.T) { }) } } + +func TestInterpolate(t *testing.T) { + type TestParams struct { + TestCase string + Input string + ExpectedOutput string + } + + vars := map[string]string{ + "foo": "bar", + "with-hyphen": "Alice", + } + + for _, tt := range []*TestParams{ + { + TestCase: "No variables", + Input: "hello", + ExpectedOutput: "hello", + }, + { + TestCase: "Simple", + Input: "${foo}", + ExpectedOutput: "bar", + }, + { + TestCase: "Simple no curly", + Input: "$foo", + ExpectedOutput: "bar", + }, + { + TestCase: "Missing", + Input: "${baz}", + ExpectedOutput: "${baz}", + }, + { + TestCase: "Embedded", + Input: "PRE${foo}POST", + ExpectedOutput: "PREbarPOST", + }, + { + TestCase: "Hypen", + Input: "Hello ${with-hyphen}!", + ExpectedOutput: "Hello Alice!", + }, + } { + t.Run(tt.TestCase, func(t *testing.T) { + assert := assert.New(t) + + output := interpolate(tt.Input, vars) + assert.Equal(tt.ExpectedOutput, output) + }) + } +}