kubernetes-sigs / kustomize

Customization of kubernetes YAML configurations
Apache License 2.0
11.05k stars 2.25k forks source link

[Question] Kustomize URL formats #4454

Open thatsmydoing opened 2 years ago

thatsmydoing commented 2 years ago

kustomize's support for URL formats is not well-specified and provides shortcuts for sources like github that do not extend to other repositories and can be cause for confusion. For kustomization v1, I think it would be a good idea to formalize it since it will be a breaking change for other fields as well.

The problems with kustomize's url formats that I see are:

git url extraction

Typically, kustomize manifests live in subdirectories of a repository so a typical url looks like

https://github.com/kubernetes-sigs/kustomize/examples/helloWorld

where the repository to clone is https://github.com/kubernetes-sigs/kustomize and the subdirectory to build is examples/helloWorld. And kustomize just assumes that the repository is always 2 subdirectories deep. This leads to problems when this isn't the case and more special cases were added that say look one after the _git directory and look for the directory that ends in .git. So we support cloning the following repositories correctly:

but https://bitbucket.example.com/scm/project/repository will be treated as clone https://bitbucket.example.com/scm/project and build the subdirectory repository.

I think the better answer here is to just use // to delimit the repository url and the directory (this is already supported but is still subjected to the above). In that case, there is no need for special cases as we're not guessing anymore. So that https://bitbucket.example.com/scm/project/repository will mean just clone the repository repository and build the root. While https://bitbucket.example.com/scm/project//repository will mean clone the project repository and build repository

go-getter legacy and url magic

kustomize states that it supports "go-getter" format and previously actually did use go-getter (but not always for git cloning). For specifying a repository, all of the following are currently valid for HTTP clones

and the following are valid for SSH clones

and probably a lot more. The logic lives in https://github.com/kubernetes-sigs/kustomize/blob/master/api/internal/git/repospec.go which greatly needs an overhaul.

What's more, most of these only apply to github.com urls, so you can say github.com/kubernetes-sigs/kustomize/examples/helloWorld but bitbucket.com/kubernetes-sigs/kustomize/examples/helloWorld does not. There's also some weird logic with .git being appended to the repository but not if it's an AWS or Azure code host.

I think we should simply restrict the urls to one's accepted by git clone. Many of the above examples are not valid or wrong. Obviously gh: and git:: prefixes are not clonable.

remote resource overlap

kustomize currently tries to load a resource as a "file" first and then as a base. kustomize also supports loading remote file resources via HTTPS so this means it's possible a resource that has https:// can be interpreted as either a file or a base and you'd have to try both to know which is which. This does mean for bases that begin with https://, kustomize will try to load it as a file first, then fail, then clone the repository and succeed. This is fine for local files and bases but has some performance penalty for remote files and bases.

I'm not really sure what can be done here so long as the formats can overlap. We could say that all remote bases must have a //. So urls without // are treated as files but those with // are treated as bases. This might be acceptable since I don't believe it's common to have kustomization.yaml at the root of a repository and for those cases we can just say add // or //. to the end. This is a completely breaking change though and can't be eased into like the other suggestions.

k8s-ci-robot commented 2 years ago

@thatsmydoing: This issue is currently awaiting triage.

SIG CLI takes a lead on issue triage for this repo, but any Kubernetes member can accept issues by applying the triage/accepted label.

The triage/accepted label can be added by org members by writing /triage accepted in a comment.

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md). If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository.
thatsmydoing commented 2 years ago

In https://github.com/kubernetes-sigs/kustomize/pull/4453, it was suggested that remote git bases should just be prefixed with a git:: to disambiguate between remote file resources.

k8s-triage-robot commented 2 years ago

The Kubernetes project currently lacks enough contributors to adequately respond to all issues and PRs.

This bot triages issues and PRs according to the following rules:

You can:

Please send feedback to sig-contributor-experience at kubernetes/community.

/lifecycle stale

thatsmydoing commented 2 years ago

/remove-lifecycle stale

thatsmydoing commented 2 years ago

It seems tests have been added in https://github.com/kubernetes-sigs/kustomize/pull/4615

k8s-triage-robot commented 2 years ago

The Kubernetes project currently lacks enough active contributors to adequately respond to all issues and PRs.

This bot triages issues and PRs according to the following rules:

You can:

Please send feedback to sig-contributor-experience at kubernetes/community.

/lifecycle rotten

thatsmydoing commented 2 years ago

/remove-lifecycle rotten

k8s-triage-robot commented 2 years ago

The Kubernetes project currently lacks enough contributors to adequately respond to all issues and PRs.

This bot triages issues and PRs according to the following rules:

You can:

Please send feedback to sig-contributor-experience at kubernetes/community.

/lifecycle stale

thatsmydoing commented 2 years ago

/remove-lifecycle stale

k8s-triage-robot commented 1 year ago

The Kubernetes project currently lacks enough contributors to adequately respond to all issues and PRs.

This bot triages issues and PRs according to the following rules:

You can:

Please send feedback to sig-contributor-experience at kubernetes/community.

/lifecycle stale

thatsmydoing commented 1 year ago

/remove-lifecycle stale

thatsmydoing commented 1 year ago

It looks like gh: and git:: are now deprecated as of https://github.com/kubernetes-sigs/kustomize/pull/4954

k8s-triage-robot commented 4 months ago

This issue has not been updated in over 1 year, and should be re-triaged.

You can:

For more details on the triage process, see https://www.kubernetes.dev/docs/guide/issue-triage/

/remove-triage accepted

k8s-triage-robot commented 1 month ago

The Kubernetes project currently lacks enough contributors to adequately respond to all issues.

This bot triages un-triaged issues according to the following rules:

You can:

Please send feedback to sig-contributor-experience at kubernetes/community.

/lifecycle stale

k8s-triage-robot commented 1 week ago

The Kubernetes project currently lacks enough active contributors to adequately respond to all issues.

This bot triages un-triaged issues according to the following rules:

You can:

Please send feedback to sig-contributor-experience at kubernetes/community.

/lifecycle rotten