diff --git a/cmd/flux/create_source_git.go b/cmd/flux/create_source_git.go index c5dbb996..dd435a52 100644 --- a/cmd/flux/create_source_git.go +++ b/cmd/flux/create_source_git.go @@ -95,10 +95,11 @@ var ( sourceGitUsername string sourceGitPassword string - sourceGitKeyAlgorithm flags.PublicKeyAlgorithm = "rsa" - sourceGitRSABits flags.RSAKeyBits = 2048 - sourceGitECDSACurve = flags.ECDSACurve{Curve: elliptic.P384()} - sourceGitSecretRef string + sourceGitKeyAlgorithm flags.PublicKeyAlgorithm = "rsa" + sourceGitRSABits flags.RSAKeyBits = 2048 + sourceGitECDSACurve = flags.ECDSACurve{Curve: elliptic.P384()} + sourceGitSecretRef string + sourceGitImplementation string ) func init() { @@ -112,6 +113,7 @@ func init() { createSourceGitCmd.Flags().Var(&sourceGitRSABits, "ssh-rsa-bits", sourceGitRSABits.Description()) createSourceGitCmd.Flags().Var(&sourceGitECDSACurve, "ssh-ecdsa-curve", sourceGitECDSACurve.Description()) createSourceGitCmd.Flags().StringVarP(&sourceGitSecretRef, "secret-ref", "", "", "the name of an existing secret containing SSH or basic credentials") + createSourceGitCmd.Flags().StringVar(&sourceGitImplementation, "git-implementation", "", "the git implementation to use, can be 'go-git' or 'libgit2'") createSourceCmd.AddCommand(createSourceGitCmd) } @@ -142,6 +144,10 @@ func createSourceGitCmdRun(cmd *cobra.Command, args []string) error { return err } + if !utils.ContainsItemString([]string{sourcev1.GoGitImplementation, sourcev1.LibGit2Implementation, ""}, sourceGitImplementation) { + return fmt.Errorf("Invalid git implementation %q", sourceGitImplementation) + } + gitRepository := sourcev1.GitRepository{ ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -153,7 +159,8 @@ func createSourceGitCmdRun(cmd *cobra.Command, args []string) error { Interval: metav1.Duration{ Duration: interval, }, - Reference: &sourcev1.GitRepositoryRef{}, + Reference: &sourcev1.GitRepositoryRef{}, + GitImplementation: sourceGitImplementation, }, } diff --git a/docs/cmd/flux_create_source_git.md b/docs/cmd/flux_create_source_git.md index 0a1110fb..57532d16 100644 --- a/docs/cmd/flux_create_source_git.md +++ b/docs/cmd/flux_create_source_git.md @@ -56,6 +56,7 @@ flux create source git [name] [flags] ``` --branch string git branch (default "master") + --git-implementation string the git implementation to use, can be 'go-git' or 'libgit2' -h, --help help for git -p, --password string basic authentication password --secret-ref string the name of an existing secret containing SSH or basic credentials diff --git a/docs/guides/installation.md b/docs/guides/installation.md index d52b7a54..eea8cb71 100644 --- a/docs/guides/installation.md +++ b/docs/guides/installation.md @@ -217,7 +217,16 @@ flux bootstrap gitlab \ ### Generic Git Server -For other Git providers such as Bitbucket, Gogs, Gitea, etc you can manually setup the repository and the deploy key. +For other Git providers such as Bitbucket, Gogs, Gitea, Azure DevOps, etc you can manually setup the repository and the deploy key. + +#### Note about Azure DevOps + +Azure DevOps requires a non-default Git implementation (`libgit2`) to be enabled, so that the Git v2 protocol is supported. +Note that this implementation does not support shallow cloning, and it is therefore advised to only resort to this option if a +connection fails with the default configuration. + +Additionally, the current implementation of image automation does not support Azure DevOps as has no Git implementation with +this protocol. This limitation will likely change in the future. Create a Git repository and clone it locally: @@ -298,6 +307,18 @@ flux create source git flux-system \ --interval=1m ``` +If you are using Azure DevOps you need to specify a different git implementation than the default: + +```sh +flux create source git flux-system \ + --url= ssh:////my-repository \ + --ssh-key-algorithm=ecdsa \ + --ssh-ecdsa-curve=p521 \ + --branch=master \ + --interval=1m \ + --git-implementation=libgit2 +``` + You will be prompted to add a deploy key to your repository. If you don't specify the SSH algorithm, then `flux` will generate an RSA 2048 bits key. @@ -350,7 +371,7 @@ will perform a rolling update of all Flux components including itself. ## Bootstrap with Terraform -The bootstrap procedure can be implemented with Terraform using the Flux provider published on +The bootstrap procedure can be implemented with Terraform using the Flux provider published on [registry.terraform.io](https://registry.terraform.io/providers/fluxcd/flux). The provider consists of two data sources (`flux_install` and `flux_sync`) for generating the @@ -484,9 +505,9 @@ flux create helmrelease nginx \ --chart-version="5.x.x" ``` -## Upgrade +## Upgrade -Update Flux CLI to the latest release with `brew upgrade fluxcd/tap/flux` or by +Update Flux CLI to the latest release with `brew upgrade fluxcd/tap/flux` or by downloading the binary from [GitHub](https://github.com/fluxcd/flux2/releases). Verify that you are running the latest version with: diff --git a/go.sum b/go.sum index 2b4e79eb..1c76b552 100644 --- a/go.sum +++ b/go.sum @@ -139,13 +139,11 @@ github.com/fluxcd/kustomize-controller/api v0.4.0/go.mod h1:NB4aJ+hSWyg6Tx6p47ZW github.com/fluxcd/notification-controller/api v0.5.0 h1:xKKFnPVsYl2+GEjgKz5a5Mq6vmy+H2q9d2lJ2jmWJZs= github.com/fluxcd/notification-controller/api v0.5.0/go.mod h1:yLd+nrCJUThSkt4U+LLv8TRxqZdR11+gE1S2/bhgqmE= github.com/fluxcd/pkg/apis/meta v0.3.0/go.mod h1:wOzQQx8CdtUQCGaLzqGu4QgnNxYkI6/wvdvlovxWhF0= -github.com/fluxcd/pkg/apis/meta v0.4.0 h1:JChqB9GGgorW9HWKxirTVV0rzrcLyzBaVjinmqZ0iHA= github.com/fluxcd/pkg/apis/meta v0.4.0/go.mod h1:wOzQQx8CdtUQCGaLzqGu4QgnNxYkI6/wvdvlovxWhF0= github.com/fluxcd/pkg/apis/meta v0.5.0 h1:FaU++mQY0g4sVVl+hG+vk0CXBLbb4EVfRuzs3IjLXvo= github.com/fluxcd/pkg/apis/meta v0.5.0/go.mod h1:aEUuZIawboAAFLlYz/juVJ7KNmlWbBtJFYkOWWmGUR4= github.com/fluxcd/pkg/git v0.1.0 h1:WtQSoR1SlsI8IsiJGiFzbH9IyxFZPsTtxraAp68/H+U= github.com/fluxcd/pkg/git v0.1.0/go.mod h1:AO+smmdF7X+ciTypdoMOTbAHeiYCCSaa56OfW0Xo064= -github.com/fluxcd/pkg/runtime v0.3.1 h1:UI+FQd1OgipZ6N8YxXHtKYMAu1NRFWaR/Gp1M3T6RZA= github.com/fluxcd/pkg/runtime v0.3.1/go.mod h1:wg33L6k5FkGEYoZta7hbUlBIscM5VZd/PfCbaEi+wK4= github.com/fluxcd/pkg/runtime v0.4.0 h1:d/1okReK7ZyrQ2k/GKY1BEiMZNHu1rWKUxlHx2O45EY= github.com/fluxcd/pkg/runtime v0.4.0/go.mod h1:0Rbkgh3qj8Dl4uitccLc13hZyet1vvNJCAFAVUwNZDM= @@ -856,7 +854,6 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= k8s.io/api v0.17.0/go.mod h1:npsyOePkeP0CPwyGfXDHxvypiYMJxBWAMpQxCaJ4ZxI= k8s.io/api v0.18.6/go.mod h1:eeyxr+cwCjMdLAmr2W3RyDI0VvTawSg/3RFFBEnmZGI= -k8s.io/api v0.19.3 h1:GN6ntFnv44Vptj/b+OnMW7FmzkpDoIDLZRvKX3XH9aU= k8s.io/api v0.19.3/go.mod h1:VF+5FT1B74Pw3KxMdKyinLo+zynBaMBiAfGMuldcNDs= k8s.io/api v0.19.4 h1:I+1I4cgJYuCDgiLNjKx7SLmIbwgj9w7N7Zr5vSIdwpo= k8s.io/api v0.19.4/go.mod h1:SbtJ2aHCItirzdJ36YslycFNzWADYH3tgOhvBEFtZAk= @@ -865,7 +862,6 @@ k8s.io/apiextensions-apiserver v0.19.4 h1:D9ak9T012tb3vcGFWYmbQuj9SCC8YM4zhA4XZq k8s.io/apiextensions-apiserver v0.19.4/go.mod h1:B9rpH/nu4JBCtuUp3zTTk8DEjZUupZTBEec7/2zNRYw= k8s.io/apimachinery v0.17.0/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= k8s.io/apimachinery v0.18.6/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= -k8s.io/apimachinery v0.19.3 h1:bpIQXlKjB4cB/oNpnNnV+BybGPR7iP5oYpsOTEJ4hgc= k8s.io/apimachinery v0.19.3/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= k8s.io/apimachinery v0.19.4 h1:+ZoddM7nbzrDCp0T3SWnyxqf8cbWPT2fkZImoyvHUG0= k8s.io/apimachinery v0.19.4/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= @@ -873,7 +869,6 @@ k8s.io/apiserver v0.18.6/go.mod h1:Zt2XvTHuaZjBz6EFYzpp+X4hTmgWGy8AthNVnTdm3Wg= k8s.io/apiserver v0.19.4/go.mod h1:X8WRHCR1UGZDd7HpV0QDc1h/6VbbpAeAGyxSh8yzZXw= k8s.io/client-go v0.17.0/go.mod h1:TYgR6EUHs6k45hb6KWjVD6jFZvJV4gHDikv/It0xz+k= k8s.io/client-go v0.18.6/go.mod h1:/fwtGLjYMS1MaM5oi+eXhKwG+1UHidUEXRh6cNsdO0Q= -k8s.io/client-go v0.19.3 h1:ctqR1nQ52NUs6LpI0w+a5U+xjYwflFwA13OJKcicMxg= k8s.io/client-go v0.19.3/go.mod h1:+eEMktZM+MG0KO+PTkci8xnbCZHvj9TqR6Q1XDUIJOM= k8s.io/client-go v0.19.4 h1:85D3mDNoLF+xqpyE9Dh/OtrJDyJrSRKkHmDXIbEzer8= k8s.io/client-go v0.19.4/go.mod h1:ZrEy7+wj9PjH5VMBCuu/BDlvtUAku0oVFk4MmnW9mWA= @@ -907,7 +902,6 @@ mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZI rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= -sigs.k8s.io/controller-runtime v0.6.3 h1:SBbr+inLPEKhvlJtrvDcwIpm+uhDvp63Bl72xYJtoOE= sigs.k8s.io/controller-runtime v0.6.3/go.mod h1:WlZNXcM0++oyaQt4B7C2lEE5JYRs8vJUzRP4N4JpdAY= sigs.k8s.io/controller-runtime v0.6.4 h1:4013CKsBs5bEqo+LevzDett+LLxag/FjQWG94nVZ/9g= sigs.k8s.io/controller-runtime v0.6.4/go.mod h1:WlZNXcM0++oyaQt4B7C2lEE5JYRs8vJUzRP4N4JpdAY=