GithubHelp home page GithubHelp logo

doodlescheduling / flux-build Goto Github PK

View Code? Open in Web Editor NEW
23.0 2.0 3.0 610 KB

Build and test kustomize overlays with flux2 HelmRelease support

License: Apache License 2.0

Dockerfile 0.03% Makefile 0.46% Go 99.04% Ruby 0.47%
flux github-action gitops helm kubernetes kustomize validation ci-pipeline

flux-build's Introduction

Build and test kustomize overlays with flux support

release release report Coverage Status license

Test kustomize overlays with suppport for templating flux2 HelmReleases. Errors must be acknowledged as early as possible in a delivery pipeline. Errors emerging from HelmReleases often only occur once a HelmRelease is already applied to the cluster. This app can be used locally and in a ci pipeline to validate kustomize overlays early.

It builds a kustomization overlay similar how the behaviour of the kustomize-controller is. The built manifests are dumped to stdout (or to the configured output). While this is great the big feature is that it also includes all manifests templated from each HelmRelease discovered within the kustomize build.

Like for a flux2 kustomization it automatically creates the kustomize.yaml if none exists.

  • Recursively kustomizes a folder
  • Templates all HelmReleases found
  • Supports all HelmRelease features including in-line values, ConfigMaps, Secrets and postRender patches
  • Made to work without accessing any kubernetes clusters

The built manifests can be used for further tests like kubeconform tests, kyverno checks and other tooling or just to inspect locally how manifests will look like after installing the HelmRelease.

flux-build basically behaves like kustomize build but supports HelmRelease templating in addition.

Usage

flux-build path/to/kustomize

Which will dump all manifests to stdout. It is also possible to chain multiple paths, this is useful in cases one HelmRelease should be templated but the values and or the source are in a different directory/kustomize overlay.

flux-build --workers=50 path/to/overlay /path/to/helmreposiories /path/to/configmapvalues

The rendering also works if a single path to a helmrelease is given:

flux-build helmrelease.yaml /path/to/helmreposiories

Installation

Brew

brew tap doodlescheduling/flux-build
brew install flux-build

Docker

docker pull ghcr.io/doodlescheduling/flux-build:v0

Arguments

Flag Env Default Description
`` PATHS `` REQUIRED: One or more paths comma separated to kustomize
--workers WORKERS Number of CPU cores Workers used to template the HelmReleases. Greatly improves speed if there are many HelmReleases
--fail-fast FAIL_FAST false Exit early if an error occured
--allow-failure ALLOW_FAILURE false Do not exit > 0 if an error occured
--cache-dir CACHE_DIR `` Cache directory (for repositorieries, charts)
--api-versions API_VERSIONS `` Kubernetes api versions used for Capabilities.APIVersions (See helm help)
--kube-version KUBE_VERSION 1.27.0 Kubernetes version (Some helm charts validate manifests against a specific kubernetes version)
--output OUTPUT /dev/stdout Path to output file
--include-helm-hooks INCLUDE_HELM_HOOKS false Include helm hooks in the output

Github Action

This app works also great on CI, in fact this was the original reason why it was created.

Example usage

name: flux-build
on:
- pull_request

jobs:
  build:
    strategy:
      matrix:
        cluster: [staging, production]

    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0
    - uses: docker://ghcr.io/doodlescheduling/flux-build:v0
      env:
        PATHS: ./${{ matrix.cluster }}
        OUTPUT: /dev/null

Advanced example

While a simple gitops pipeline just verifies if kustomizations can be built and HelmReleases installed a more advanced pipeline includes follow-up validations like kyverno tests, kubeval validations or kubeaudit tests.

name: flux-build
on:
- pull_request

jobs:
  build:
    strategy:
      matrix:
        cluster: [staging, production]

    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0
    - uses: docker://ghcr.io/doodlescheduling/flux-build:v0
      env:
        PATHS: ./${{ matrix.cluster }}
        WORKERS: "50"
        OUTPUT: ./build.yaml
    - name: Setup kubeconform
      shell: bash
      run: |
        curl -L -v --fail https://github.com/yannh/kubeconform/releases/download/v0.6.1/kubeconform-linux-amd64.tar.gz -o kubeconform.tgz
        tar xvzf kubeconform.tgz
        sudo mv kubeconform /usr/bin/
    - name: Setup openapi2jsonschema
      shell: bash
      run: |
        curl -L -v --fail https://raw.githubusercontent.com/yannh/kubeconform/v0.6.2/scripts/openapi2jsonschema.py -o openapi2jsonschema.py
        sudo mv openapi2jsonschema.py /usr/bin/openapi2jsonschema
        sudo chmod +x /usr/bin/openapi2jsonschema
    - name: Setup yq
      uses: chrisdickinson/setup-yq@3d931309f27270ebbafd53f2daee773a82ea1822 #v1.0.1
      with:
        yq-version: v4.24.5
    - name: Convert CRD to json schemas
      shell: bash
      run: |
        echo "openapi2jsonschema ./build.yaml"
        mkdir "schemas"
        cat $m | yq -e 'select(.kind == "CustomResourceDefinition")' > schemas/crds.yaml
        pip install pyyaml
        openapi2jsonschema schemas/*.yaml
    - name: Run conform
      shell: bash
      env: 
        KUBERNETES_VERSION: "${{ inputs.kubernetes-version }}"
      run: |
        echo "kubeconform $m"
        cat ./build.yaml | kubeconform -kubernetes-version $KUBERNETES_VERSION -schema-location default -schema-location "schemas/{{ .ResourceKind }}_{{ .ResourceAPIVersion }}.json" --skip CustomResourceDefinition,APIService --strict --summary
    - name: Setup kyverno
      shell: bash
      run: |
        curl -LO --fail https://github.com/kyverno/kyverno/releases/download/v1.7.2/kyverno-cli_v1.7.2_linux_x86_64.tar.gz
        tar -xvf kyverno-cli_v1.7.2_linux_x86_64.tar.gz
        sudo cp kyverno /usr/local/bin/
    - name: Test kyverno policies
      shell: bash
      run: |
        kyverno apply kyverno-policies -r ./build.yaml

Dealing with secrets

Secrets are usually in an encrypted form and only available as v1.Secret on the cluster directly if following best GitOps practices. This means flux-build has not directly access to these secrets but some resources might still have a dependecy to them.

It depends whether the secrets value is actually a hard dependency or a soft one. Example for hard dependencies are if the secret is used in HelmRepository as repository credentials. If flux-build is used on a ci build, a way to achieve this is to store the plain v1.Secret as a ci secret and inject it into the folder which gets built by flux-build. Locally one might first need to pull the decrypted secret from the cluster.

For soft dependencies meaning the actual secrets value is only required at runtime on the cluster but flux-build can use any value. To achieve this a good practice is to add a dummy secret which is available to flux-build but not synced to the cluster (Either by placing the dummies in a folder which is not targeted by a flux kustomization or by annotating the dummy secrets with kustomize.toolkit.fluxcd.io/reconcile: disabled). Examples for this case are usually if a HelmRelease refers to v1.Secrets as values.

License notice

Many internal packages have been cloned from source-controller and helm-controller to achive the same functionilty for this action as at controller runtime.

Please see upstream license.

flux-build's People

Contributors

dud225 avatar goreleaserbot avatar littlefox94 avatar raffis avatar renovate[bot] avatar yoadey avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

flux-build's Issues

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

Open

These updates have all been created already. Click a checkbox below to force a retry/rebase of any.

Detected dependencies

dockerfile
Dockerfile
github-actions
.github/workflows/main.yaml
  • actions/checkout v4@0ad4b8fadaa221de15dcec353f45205ec38ea70b
  • actions/setup-go v5.0.1@cdcb36043654635271a94b9a6d1392de5bb323a7
  • shogo82148/actions-goveralls v1.9.0@785c9d68212c91196d3994652647f8721918ba11
.github/workflows/pr-build.yaml
  • actions/checkout v4@0ad4b8fadaa221de15dcec353f45205ec38ea70b
  • actions/setup-go v5.0.1@cdcb36043654635271a94b9a6d1392de5bb323a7
  • chrisdickinson/setup-yq v1.0.1@3d931309f27270ebbafd53f2daee773a82ea1822
  • shogo82148/actions-goveralls v1.9.0@785c9d68212c91196d3994652647f8721918ba11
.github/workflows/pr-label.yaml
  • pascalgn/size-label-action bbbaa0d5ccce8e2e76254560df5c64b82dac2e12
.github/workflows/publish-release.yaml
  • Actions-R-Us/actions-tagger v2.0.3@330ddfac760021349fef7ff62b372f2f691c20fb
.github/workflows/rebase.yaml
  • actions/checkout v4@0ad4b8fadaa221de15dcec353f45205ec38ea70b
  • cirrus-actions/rebase 1.8@b87d48154a87a85666003575337e27b8cd65f691
.github/workflows/release.yaml
  • actions/checkout v4@0ad4b8fadaa221de15dcec353f45205ec38ea70b
  • actions/setup-go v5.0.1@cdcb36043654635271a94b9a6d1392de5bb323a7
  • docker/login-action v3.2.0@0d4c9c5ea7693da7b068278f7b52bda2a190a446
  • sigstore/cosign-installer v3.5.0@59acb6260d9c0ba8f4a2f9d9b48431a222b68e20
  • anchore/sbom-action v0.16.0@e8d2a6937ecead383dfe75190d104edd1f9c5751
  • goreleaser/goreleaser-action v5.1.0@5742e2a039330cbb23ebf35f046f814d4c6ff811
.github/workflows/scan.yaml
  • actions/checkout v4@0ad4b8fadaa221de15dcec353f45205ec38ea70b
  • fossa-contrib/fossa-action v3.0.0@cdc5065bcdee31a32e47d4585df72d66e8e941c2
  • actions/checkout v4@0ad4b8fadaa221de15dcec353f45205ec38ea70b
  • github/codeql-action codeql-bundle-20221020@f0a12816612c7306b485a22cb164feb43c6df818
  • github/codeql-action codeql-bundle-20221020@f0a12816612c7306b485a22cb164feb43c6df818
  • github/codeql-action codeql-bundle-20221020@f0a12816612c7306b485a22cb164feb43c6df818
gomod
go.mod
  • go 1.22.0
  • github.com/Masterminds/semver/v3 v3.2.1
  • github.com/cyphar/filepath-securejoin v0.2.5
  • github.com/docker/cli v26.1.4+incompatible
  • github.com/drone/envsubst v1.0.3
  • github.com/fluxcd/helm-controller/api v0.37.4
  • github.com/fluxcd/pkg/apis/kustomize v1.5.0
  • github.com/fluxcd/pkg/oci v0.38.0
  • github.com/fluxcd/pkg/runtime v0.47.1
  • github.com/fluxcd/pkg/version v0.4.0
  • github.com/fluxcd/source-controller/api v1.3.0
  • github.com/go-logr/logr v1.4.2
  • github.com/go-logr/zapr v1.3.0
  • github.com/google/go-containerregistry v0.19.2
  • github.com/onsi/gomega v1.33.1
  • github.com/opencontainers/go-digest v1.0.0
  • github.com/otiai10/copy v1.14.0
  • github.com/sethvargo/go-envconfig v1.0.3
  • github.com/sigstore/cosign v1.13.6
  • github.com/sigstore/sigstore v1.8.6
  • github.com/spf13/pflag v1.0.5
  • go.uber.org/zap v1.27.0
  • golang.org/x/sync v0.7.0
  • helm.sh/helm/v3 v3.15.2
  • k8s.io/api v0.30.2
  • k8s.io/apiextensions-apiserver v0.30.2
  • k8s.io/apimachinery v0.30.2
  • k8s.io/helm v2.17.0+incompatible
  • sigs.k8s.io/kustomize/api v0.17.2
  • sigs.k8s.io/kustomize/kyaml v0.17.1
  • sigs.k8s.io/yaml v1.4.0
  • sigs.k8s.io/kustomize/api v0.17.2
  • sigs.k8s.io/kustomize/kyaml v0.17.1
helm-requirements
internal/helm/testdata/charts/helmchartwithdeps-v1/requirements.yaml
helm-values
internal/helm/testdata/charts/helmchart-v1/values.yaml
internal/helm/testdata/charts/helmchartwithdeps-v1/values.yaml
helmv3
internal/helm/testdata/charts/helmchartwithdeps/Chart.yaml
  • grafana >=5.7.0
homebrew
Formula/flux-build.rb
  • DoodleScheduling/flux-build v2.3.0

  • Check this box to trigger a request for Renovate to run again on this repository

Helm post-rendering breaks resources outside release namespace

Hi,

when building a HelmRelease from a helm chart that has resources outside the release namespace, the post-rendering will forcefully move those resources to the release namespace.

In our case we have two Roles with the same name, one in the release namespace and another one in kube-public. Due to both being in the same namespace now, there is an ID conflict - but even without that ID conflict, the deployment does not look the same as Flux applies this HelmRelease.

I'm not sure why this post-rendering was added, but at the very least, it should only apply to resources without an explicitly configured namespace? Should this done to the manifests rendered by Helm at all?

Otherwise a really useful piece of software, gonna help us a lot - found it via your comment on fluxcd/flux2 issue 2808 (not a link on purpose, to not link this on that issue), many thanks for that :)

Add diff like support

Hello,

Thanks for your tool, it's great !

Do you think you could add a "diff" command doing a diff between current installation in cluster and provided HelmRelease ?

Usecase: Print diff in CI before applying upgrade so we can easily track changes

Thanks

panic: concurrent map read and map write

Hi,

in some cases, flux-build panics with a fatal error: concurrent map read and map write, see the output below.

flux-build was invoked with flux-build ./clusters/kubermatic-seed/dev-0401/apps common > $someOutputFile in this case, the kustomization at common only including some HelmRepository manifests, which are referenced by HelmReleases in the other kustomization.

Retrying works most of the time and I do not yet have minimal example, if the stack trace isn't helping, I'll gladly try to find one.

Log including stack traces
2023-07-13T12:28:24.798Z	INFO	action/action.go:89	build kustomize path	{"path": "./clusters/kubermatic-seed/dev-0401/apps"}
2023-07-13T12:28:24.798Z	INFO	action/action.go:89	build kustomize path	{"path": "common"}
fatal error: concurrent map read and map write

goroutine 30 [running]:
sigs.k8s.io/kustomize/kyaml/openapi.isNamespaceScopedFromSchema(...)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/openapi/openapi.go:381
sigs.k8s.io/kustomize/kyaml/openapi.IsNamespaceScoped({{0xc001d2bf80, 0x18}, {0xc0031c48f0, 0xe}})
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/openapi/openapi.go:376 +0xa5
sigs.k8s.io/kustomize/kyaml/openapi.IsCertainlyClusterScoped(...)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/openapi/openapi.go:390
sigs.k8s.io/kustomize/kyaml/resid.NewGvk({0xc00317b290?, 0x2196ac3?}, {0xc00317b2a6?, 0xc000eca200?}, {0xc0031c48f0?, 0x14?})
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/resid/gvk.go:27 +0x131
sigs.k8s.io/kustomize/kyaml/resid.GvkFromNode(0x0?)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/resid/gvk.go:33 +0xd3
sigs.k8s.io/kustomize/api/resource.(*Resource).GetGvk(...)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/resource/resource.go:57
sigs.k8s.io/kustomize/api/resource.(*Resource).CurId(0xc0031de320)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/resource/resource.go:442 +0x65
sigs.k8s.io/kustomize/api/resmap.(*resWrangler).Append(0xc002ca0678, 0xc0031de320)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/resmap/reswrangler.go:77 +0x45
sigs.k8s.io/kustomize/api/resmap.(*resWrangler).appendAll(...)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/resmap/reswrangler.go:468
sigs.k8s.io/kustomize/api/resmap.(*resWrangler).AppendAll(0xc0031c4be0?, {0x2535710?, 0xc002ca0a50?})
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/resmap/reswrangler.go:462 +0xaa
sigs.k8s.io/kustomize/api/internal/accumulator.(*ResAccumulator).AppendAll(...)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/internal/accumulator/resaccumulator.go:45
sigs.k8s.io/kustomize/api/internal/accumulator.(*ResAccumulator).MergeAccumulator(0xc002bf4c40, 0xc002bf4d40)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/internal/accumulator/resaccumulator.go:95 +0x53
sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).accumulateDirectory(0xc0002dacd0, 0xc002bf4c40, {0x251b308?, 0xc0002dad70}, 0x0)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/internal/target/kusttarget.go:515 +0x67c
sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).accumulateResources(0xc0002dacd0, 0x7eff0ef455b8?, {0xc002cb3e00?, 0x2, 0xc002c656e0?})
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/internal/target/kusttarget.go:429 +0x2a5
sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).accumulateTarget(0xc0002dacd0, 0x0?)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/internal/target/kusttarget.go:188 +0x3d
sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).AccumulateTarget(0xc002c9fe10?)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/internal/target/kusttarget.go:181 +0x105
sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).accumulateDirectory(0xc00060c050, 0xc000392200, {0x251b308?, 0xc0002dac80}, 0x0)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/internal/target/kusttarget.go:509 +0x64f
sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).accumulateResources(0xc00060c050, 0x7eff0ef45f18?, {0xc0000b3560?, 0x9, 0xc000710d20?})
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/internal/target/kusttarget.go:429 +0x2a5
sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).accumulateTarget(0xc00060c050, 0x14fb27d?)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/internal/target/kusttarget.go:188 +0x3d
sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).AccumulateTarget(0x0?)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/internal/target/kusttarget.go:181 +0x105
sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).makeCustomizedResMap(0xc00060c050)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/internal/target/kusttarget.go:127 +0x5f
sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).MakeCustomizedResMap(...)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/internal/target/kusttarget.go:118
sigs.k8s.io/kustomize/api/krusty.(*Kustomizer).Run(0xc000ecbd18, {0x2525b80, 0x36bdf40}, {0x7fffecdc88ba, 0x28})
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/krusty/kustomizer.go:88 +0x317
github.com/doodlescheduling/flux-build/internal/build.(*Kustomize).buildKustomization(0x0?, {0x7fffecdc88ba, 0x28})
	/go/src/github.com/DoodleScheduling/flux-build/internal/build/kustomize.go:99 +0x5db
github.com/doodlescheduling/flux-build/internal/build.(*Kustomize).Build(0x4b506566696e6b77?, {0x201?, 0x7add000000000000?})
	/go/src/github.com/DoodleScheduling/flux-build/internal/build/kustomize.go:35 +0x25
github.com/doodlescheduling/flux-build/internal/action.(*Action).Run.func3({0x2519bd8?, 0xc000844550?})
	/go/src/github.com/DoodleScheduling/flux-build/internal/action/action.go:96 +0x9f
github.com/doodlescheduling/flux-build/internal/worker.(*pool).runTask.func1()
	/go/src/github.com/DoodleScheduling/flux-build/internal/worker/pool.go:134 +0x6b
created by github.com/doodlescheduling/flux-build/internal/worker.(*pool).runTask
	/go/src/github.com/DoodleScheduling/flux-build/internal/worker/pool.go:132 +0x8a

goroutine 1 [semacquire]:
sync.runtime_Semacquire(0xc000063b00?)
	/usr/local/go/src/runtime/sema.go:62 +0x27
sync.(*WaitGroup).Wait(0xc000063980?)
	/usr/local/go/src/sync/waitgroup.go:116 +0x4b
github.com/doodlescheduling/flux-build/internal/worker.(*pool).Wait(0xc000846d20)
	/go/src/github.com/DoodleScheduling/flux-build/internal/worker/pool.go:142 +0x2f
github.com/doodlescheduling/flux-build/internal/action.(*Action).exit(0xc000927280, {0xc001c40d88?, 0x1, 0x21c1a4a?})
	/go/src/github.com/DoodleScheduling/flux-build/internal/action/action.go:167 +0x62
github.com/doodlescheduling/flux-build/internal/action.(*Action).Run(0xc000927280, {0x2519c10?, 0xc00005c108?})
	/go/src/github.com/DoodleScheduling/flux-build/internal/action/action.go:130 +0x56b
main.main()
	/go/src/github.com/DoodleScheduling/flux-build/main.go:105 +0x799

goroutine 11 [chan receive]:
github.com/golang/glog.(*loggingT).flushDaemon(0xc0000a03c0?)
	/go/pkg/mod/github.com/golang/[email protected]/glog.go:882 +0x6a
created by github.com/golang/glog.init.0
	/go/pkg/mod/github.com/golang/[email protected]/glog.go:410 +0x1bf

goroutine 58 [select]:
github.com/doodlescheduling/flux-build/internal/action.(*Action).Run.func2({0x2519bd8, 0xc000844500})
	/go/src/github.com/DoodleScheduling/flux-build/internal/action/action.go:69 +0xdf
github.com/doodlescheduling/flux-build/internal/worker.(*pool).runTask.func1()
	/go/src/github.com/DoodleScheduling/flux-build/internal/worker/pool.go:134 +0x6b
created by github.com/doodlescheduling/flux-build/internal/worker.(*pool).runTask
	/go/src/github.com/DoodleScheduling/flux-build/internal/worker/pool.go:132 +0x8a

goroutine 22 [select]:
github.com/doodlescheduling/flux-build/internal/worker.(*pool).start.func1()
	/go/src/github.com/DoodleScheduling/flux-build/internal/worker/pool.go:79 +0xa8
created by github.com/doodlescheduling/flux-build/internal/worker.(*pool).start
	/go/src/github.com/DoodleScheduling/flux-build/internal/worker/pool.go:77 +0x5a

goroutine 23 [select]:
github.com/doodlescheduling/flux-build/internal/worker.(*pool).start.func2()
	/go/src/github.com/DoodleScheduling/flux-build/internal/worker/pool.go:110 +0xd2
created by github.com/doodlescheduling/flux-build/internal/worker.(*pool).start
	/go/src/github.com/DoodleScheduling/flux-build/internal/worker/pool.go:106 +0xaf

goroutine 57 [select]:
github.com/doodlescheduling/flux-build/internal/action.(*Action).Run.func4({0x2519bd8, 0xc0008445f0})
	/go/src/github.com/DoodleScheduling/flux-build/internal/action/action.go:111 +0xb5
github.com/doodlescheduling/flux-build/internal/worker.(*pool).runTask.func1()
	/go/src/github.com/DoodleScheduling/flux-build/internal/worker/pool.go:134 +0x6b
created by github.com/doodlescheduling/flux-build/internal/worker.(*pool).runTask
	/go/src/github.com/DoodleScheduling/flux-build/internal/worker/pool.go:132 +0x8a

goroutine 25 [select]:
github.com/doodlescheduling/flux-build/internal/worker.(*pool).start.func2()
	/go/src/github.com/DoodleScheduling/flux-build/internal/worker/pool.go:110 +0xd2
created by github.com/doodlescheduling/flux-build/internal/worker.(*pool).start
	/go/src/github.com/DoodleScheduling/flux-build/internal/worker/pool.go:106 +0xaf

goroutine 26 [select]:
github.com/doodlescheduling/flux-build/internal/worker.(*pool).start.func1()
	/go/src/github.com/DoodleScheduling/flux-build/internal/worker/pool.go:79 +0xa8
created by github.com/doodlescheduling/flux-build/internal/worker.(*pool).start
	/go/src/github.com/DoodleScheduling/flux-build/internal/worker/pool.go:77 +0x5a

goroutine 27 [select]:
github.com/doodlescheduling/flux-build/internal/worker.(*pool).start.func2()
	/go/src/github.com/DoodleScheduling/flux-build/internal/worker/pool.go:110 +0xd2
created by github.com/doodlescheduling/flux-build/internal/worker.(*pool).start
	/go/src/github.com/DoodleScheduling/flux-build/internal/worker/pool.go:106 +0xaf

goroutine 28 [select]:
github.com/doodlescheduling/flux-build/internal/worker.(*pool).start.func1()
	/go/src/github.com/DoodleScheduling/flux-build/internal/worker/pool.go:79 +0xa8
created by github.com/doodlescheduling/flux-build/internal/worker.(*pool).start
	/go/src/github.com/DoodleScheduling/flux-build/internal/worker/pool.go:77 +0x5a

goroutine 29 [select]:
github.com/doodlescheduling/flux-build/internal/worker.(*pool).start.func2()
	/go/src/github.com/DoodleScheduling/flux-build/internal/worker/pool.go:110 +0xd2
created by github.com/doodlescheduling/flux-build/internal/worker.(*pool).start
	/go/src/github.com/DoodleScheduling/flux-build/internal/worker/pool.go:106 +0xaf

goroutine 31 [runnable]:
compress/flate.(*huffmanDecoder).init(0xc00087b450, {0xc001b9e8e8, 0x17, 0x1f?})
	/usr/local/go/src/compress/flate/inflate.go:116 +0x50f
compress/flate.(*decompressor).readHuffman(0xc00087ac00)
	/usr/local/go/src/compress/flate/inflate.go:459 +0x42f
compress/flate.(*decompressor).nextBlock(0xc00087ac00)
	/usr/local/go/src/compress/flate/inflate.go:322 +0x10e
compress/flate.(*decompressor).Read(0xc00087ac00, {0xc00117f000, 0x200, 0xc000a181d8?})
	/usr/local/go/src/compress/flate/inflate.go:347 +0x7e
compress/gzip.(*Reader).Read(0xc002b0f080, {0xc00117f000, 0x200, 0x200})
	/usr/local/go/src/compress/gzip/gunzip.go:252 +0xbb
bytes.(*Buffer).ReadFrom(0xc000a0d9b0, {0x24f68c0, 0xc002b0f080})
	/usr/local/go/src/bytes/buffer.go:202 +0x98
io.copyBuffer({0x24f6820, 0xc000a0d9b0}, {0x24f68c0, 0xc002b0f080}, {0x0, 0x0, 0x0})
	/usr/local/go/src/io/io.go:413 +0x14b
io.Copy(...)
	/usr/local/go/src/io/io.go:386
sigs.k8s.io/kustomize/kyaml/openapi/kustomizationapi.bindataRead({0x353f120, 0x1e0, 0x1e0}, {0x21d7da2, 0x1d})
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/openapi/kustomizationapi/swagger.go:28 +0x176
sigs.k8s.io/kustomize/kyaml/openapi/kustomizationapi.kustomizationapiSwaggerJsonBytes(...)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/openapi/kustomizationapi/swagger.go:86
sigs.k8s.io/kustomize/kyaml/openapi/kustomizationapi.kustomizationapiSwaggerJson()
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/openapi/kustomizationapi/swagger.go:93 +0x4c
sigs.k8s.io/kustomize/kyaml/openapi/kustomizationapi.Asset({0x21d7da2, 0x1d})
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/openapi/kustomizationapi/swagger.go:109 +0x76
sigs.k8s.io/kustomize/kyaml/openapi/kustomizationapi.MustAsset({0x21d7da2, 0x1d})
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/openapi/kustomizationapi/swagger.go:121 +0x27
sigs.k8s.io/kustomize/kyaml/openapi.initSchema()
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/openapi/openapi.go:620 +0xa6
sigs.k8s.io/kustomize/kyaml/openapi.isNamespaceScopedFromSchema(...)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/openapi/openapi.go:380
sigs.k8s.io/kustomize/kyaml/openapi.IsNamespaceScoped({{0xc0007f6960, 0x20}, {0xc0006e0270, 0xe}})
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/openapi/openapi.go:376 +0x88
sigs.k8s.io/kustomize/kyaml/openapi.IsCertainlyClusterScoped(...)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/openapi/openapi.go:390
sigs.k8s.io/kustomize/kyaml/resid.NewGvk({0xc0002cc960?, 0x2196ac3?}, {0xc0002cc979?, 0xc0006e02c0?}, {0xc0006e0270?, 0x0?})
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/resid/gvk.go:27 +0x131
sigs.k8s.io/kustomize/kyaml/resid.GvkFromNode(0x40dc8a?)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/resid/gvk.go:33 +0xd3
sigs.k8s.io/kustomize/api/resource.(*Resource).GetGvk(...)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/resource/resource.go:57
sigs.k8s.io/kustomize/api/resource.(*Resource).CurId(0xc000175b30)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/resource/resource.go:442 +0x65
sigs.k8s.io/kustomize/api/resmap.(*resWrangler).Append(0xc0008518d8, 0xc000175b30)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/resmap/reswrangler.go:77 +0x45
sigs.k8s.io/kustomize/api/resmap.newResMapFromResourceSlice({0xc000873fc0, 0x1, 0xc000624af8?})
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/resmap/factory.go:130 +0x8c
sigs.k8s.io/kustomize/api/resmap.(*Factory).NewResMapFromBytes(0xc0001758b0?, {0xc000015800?, 0x18?, 0x2155160?})
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/resmap/factory.go:73 +0x45
sigs.k8s.io/kustomize/api/resmap.(*Factory).FromFile(0xc00014b530?, {0x251b308?, 0xc0001758b0?}, {0xc0007ad248, 0x18})
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/resmap/factory.go:60 +0x5a
sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).accumulateFile(0xc000175900, 0xc000406cc0, {0xc0007ad248, 0x18})
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/internal/target/kusttarget.go:525 +0x66
sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).accumulateResources(0xc000175900, 0x7eff0ef455b8?, {0xc000847800?, 0x5, 0xc000537bc0?})
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/internal/target/kusttarget.go:408 +0x9e
sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).accumulateTarget(0xc000175900, 0x0?)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/internal/target/kusttarget.go:188 +0x3d
sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).AccumulateTarget(0xc0006e01f0?)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/internal/target/kusttarget.go:181 +0x105
sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).accumulateDirectory(0xc000175810, 0xc000406b40, {0x251b308?, 0xc0001758b0}, 0x0)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/internal/target/kusttarget.go:509 +0x64f
sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).accumulateResources(0xc000175810, 0x7eff0ef455b8?, {0xc0005a84c0?, 0x1, 0xc000537680?})
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/internal/target/kusttarget.go:429 +0x2a5
sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).accumulateTarget(0xc000175810, 0x14fb27d?)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/internal/target/kusttarget.go:188 +0x3d
sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).AccumulateTarget(0x0?)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/internal/target/kusttarget.go:181 +0x105
sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).makeCustomizedResMap(0xc000175810)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/internal/target/kusttarget.go:127 +0x5f
sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).MakeCustomizedResMap(...)
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/internal/target/kusttarget.go:118
sigs.k8s.io/kustomize/api/krusty.(*Kustomizer).Run(0xc000a19d18, {0x2525b80, 0x36bdf40}, {0x7fffecdc88e3, 0x6})
	/go/pkg/mod/sigs.k8s.io/kustomize/[email protected]/krusty/kustomizer.go:88 +0x317
github.com/doodlescheduling/flux-build/internal/build.(*Kustomize).buildKustomization(0x0?, {0x7fffecdc88e3, 0x6})
	/go/src/github.com/DoodleScheduling/flux-build/internal/build/kustomize.go:99 +0x5db
github.com/doodlescheduling/flux-build/internal/build.(*Kustomize).Build(0x2014b5067?, {0x0?, 0x189a940e42a00?})
	/go/src/github.com/DoodleScheduling/flux-build/internal/build/kustomize.go:35 +0x25
github.com/doodlescheduling/flux-build/internal/action.(*Action).Run.func3({0x2519bd8?, 0xc000844550?})
	/go/src/github.com/DoodleScheduling/flux-build/internal/action/action.go:96 +0x9f
github.com/doodlescheduling/flux-build/internal/worker.(*pool).runTask.func1()
	/go/src/github.com/DoodleScheduling/flux-build/internal/worker/pool.go:134 +0x6b
created by github.com/doodlescheduling/flux-build/internal/worker.(*pool).runTask
	/go/src/github.com/DoodleScheduling/flux-build/internal/worker/pool.go:132 +0x8a

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.