refactor: Make CLI argument names consistent (#2084)

* fix: Wrong argument naming

* fix: tarPath as well

* Test

* fix: Fix tests

* np: Format markdown

* fix: Review changes
This commit is contained in:
Gabriel Nützi 2022-08-22 15:10:11 +02:00 committed by GitHub
parent 348018d0e9
commit 90e426ba3f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 744 additions and 488 deletions

5
.prettierrc Normal file
View File

@ -0,0 +1,5 @@
printWidth: 80
tabWidth: 2
semi: false
singleQuote: false
overrides: [{ files: "*.md", options: { proseWrap: always } }]

View File

@ -6,9 +6,14 @@ To get started developing, see our [DEVELOPMENT.md](./DEVELOPMENT.md).
In this file you'll find info on: In this file you'll find info on:
- [The CLA](#contributor-license-agreement) - [Contributing to Kaniko](#contributing-to-kaniko)
- [The code review process](#code-reviews) - [Contributor License Agreement](#contributor-license-agreement)
- [Standards](#standards) around [commit messages](#commit-messages) and [code](#coding-standards) - [Code reviews](#code-reviews)
- [Standards](#standards)
- [Commit Messages](#commit-messages)
- [Coding standards](#coding-standards)
- [Finding something to work on](#finding-something-to-work-on)
[code](#coding-standards)
- [Finding something to work on](#finding-something-to-work-on) - [Finding something to work on](#finding-something-to-work-on)
## Contributor License Agreement ## Contributor License Agreement
@ -36,12 +41,13 @@ This section describes the standards we will try to maintain in this repo.
### Commit Messages ### Commit Messages
All commit messages should follow [these best practices](https://chris.beams.io/posts/git-commit/), All commit messages should follow
specifically: [these best practices](https://chris.beams.io/posts/git-commit/), specifically:
- Start with a subject line - Start with a subject line
- Contain a body that explains _why_ you're making the change you're making - Contain a body that explains _why_ you're making the change you're making
- Reference an issue number if one exists, closing it if applicable (with text such as - Reference an issue number if one exists, closing it if applicable (with text
such as
["Fixes #245" or "Closes #111"](https://help.github.com/articles/closing-issues-using-keywords/)) ["Fixes #245" or "Closes #111"](https://help.github.com/articles/closing-issues-using-keywords/))
Aim for [2 paragraphs in the body](https://www.youtube.com/watch?v=PJjmw9TRB7s). Aim for [2 paragraphs in the body](https://www.youtube.com/watch?v=PJjmw9TRB7s).
@ -61,10 +67,11 @@ The code in this repo should follow best practices, specifically:
## Finding something to work on ## Finding something to work on
Thanks so much for considering contributing to our project!! We hope very much you can find something Thanks so much for considering contributing to our project!! We hope very much
interesting to work on: you can find something interesting to work on:
- To find issues that we particularly would like contributors to tackle, look for - To find issues that we particularly would like contributors to tackle, look
for
[issues with the "help wanted" label](https://github.com/GoogleContainerTools/kaniko/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22). [issues with the "help wanted" label](https://github.com/GoogleContainerTools/kaniko/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22).
- Issues that are good for new folks will additionally be marked with - Issues that are good for new folks will additionally be marked with
["good first issue"](https://github.com/GoogleContainerTools/kaniko/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22). ["good first issue"](https://github.com/GoogleContainerTools/kaniko/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22).

View File

@ -186,7 +186,7 @@ steps:
args: args:
- --build-arg=NUM=${_COUNT} - --build-arg=NUM=${_COUNT}
- --no-push - --no-push
- --snapshotMode=redo - --snapshot-mode=redo
env: env:
- 'BENCHMARK_FILE=gs://$PROJECT_ID/gcb/benchmark_file' - 'BENCHMARK_FILE=gs://$PROJECT_ID/gcb/benchmark_file'
``` ```

1060
README.md

File diff suppressed because it is too large Load Diff

View File

@ -62,12 +62,31 @@ func init() {
RootCmd.PersistentFlags().MarkDeprecated("whitelist-var-run", "Please use ignore-var-run instead.") RootCmd.PersistentFlags().MarkDeprecated("whitelist-var-run", "Please use ignore-var-run instead.")
} }
func valdiateFlags() {
checkNoDeprecatedFlags()
// Allow setting --registry-mirror using an environment variable.
if val, ok := os.LookupEnv("KANIKO_REGISTRY_MIRROR"); ok {
opts.RegistryMirrors.Set(val)
}
// Default the custom platform flag to our current platform, and validate it.
if opts.CustomPlatform == "" {
opts.CustomPlatform = platforms.Format(platforms.Normalize(platforms.DefaultSpec()))
}
if _, err := v1.ParsePlatform(opts.CustomPlatform); err != nil {
logrus.Fatalf("Invalid platform %q: %v", opts.CustomPlatform, err)
}
}
// RootCmd is the kaniko command that is run // RootCmd is the kaniko command that is run
var RootCmd = &cobra.Command{ var RootCmd = &cobra.Command{
Use: "executor", Use: "executor",
PersistentPreRunE: func(cmd *cobra.Command, args []string) error { PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
if cmd.Use == "executor" { if cmd.Use == "executor" {
valdiateFlags()
// Command line flag takes precedence over the KANIKO_DIR environment variable. // Command line flag takes precedence over the KANIKO_DIR environment variable.
dir := config.KanikoDir dir := config.KanikoDir
if opts.KanikoDir != constants.DefaultKanikoPath { if opts.KanikoDir != constants.DefaultKanikoPath {
@ -85,7 +104,7 @@ var RootCmd = &cobra.Command{
} }
if !opts.NoPush && len(opts.Destinations) == 0 { if !opts.NoPush && len(opts.Destinations) == 0 {
return errors.New("You must provide --destination, or use --no-push") return errors.New("you must provide --destination, or use --no-push")
} }
if err := cacheFlagsValid(); err != nil { if err := cacheFlagsValid(); err != nil {
return errors.Wrap(err, "cache flags invalid") return errors.Wrap(err, "cache flags invalid")
@ -97,10 +116,10 @@ var RootCmd = &cobra.Command{
return errors.Wrap(err, "error resolving dockerfile path") return errors.Wrap(err, "error resolving dockerfile path")
} }
if len(opts.Destinations) == 0 && opts.ImageNameDigestFile != "" { if len(opts.Destinations) == 0 && opts.ImageNameDigestFile != "" {
return errors.New("You must provide --destination if setting ImageNameDigestFile") return errors.New("you must provide --destination if setting ImageNameDigestFile")
} }
if len(opts.Destinations) == 0 && opts.ImageNameTagDigestFile != "" { if len(opts.Destinations) == 0 && opts.ImageNameTagDigestFile != "" {
return errors.New("You must provide --destination if setting ImageNameTagDigestFile") return errors.New("you must provide --destination if setting ImageNameTagDigestFile")
} }
// Update ignored paths // Update ignored paths
if opts.IgnoreVarRun { if opts.IgnoreVarRun {
@ -184,8 +203,8 @@ func addKanikoOptionsFlags() {
RootCmd.PersistentFlags().StringVarP(&ctxSubPath, "context-sub-path", "", "", "Sub path within the given context.") RootCmd.PersistentFlags().StringVarP(&ctxSubPath, "context-sub-path", "", "", "Sub path within the given context.")
RootCmd.PersistentFlags().StringVarP(&opts.Bucket, "bucket", "b", "", "Name of the GCS bucket from which to access build context as tarball.") RootCmd.PersistentFlags().StringVarP(&opts.Bucket, "bucket", "b", "", "Name of the GCS bucket from which to access build context as tarball.")
RootCmd.PersistentFlags().VarP(&opts.Destinations, "destination", "d", "Registry the final image should be pushed to. Set it repeatedly for multiple destinations.") RootCmd.PersistentFlags().VarP(&opts.Destinations, "destination", "d", "Registry the final image should be pushed to. Set it repeatedly for multiple destinations.")
RootCmd.PersistentFlags().StringVarP(&opts.SnapshotMode, "snapshotMode", "", "full", "Change the file attributes inspected during snapshotting") RootCmd.PersistentFlags().StringVarP(&opts.SnapshotMode, "snapshot-mode", "", "full", "Change the file attributes inspected during snapshotting")
RootCmd.PersistentFlags().StringVarP(&opts.CustomPlatform, "customPlatform", "", "", "Specify the build platform if different from the current host") RootCmd.PersistentFlags().StringVarP(&opts.CustomPlatform, "custom-platform", "", "", "Specify the build platform if different from the current host")
RootCmd.PersistentFlags().VarP(&opts.BuildArgs, "build-arg", "", "This flag allows you to pass in ARG values at build time. Set it repeatedly for multiple values.") RootCmd.PersistentFlags().VarP(&opts.BuildArgs, "build-arg", "", "This flag allows you to pass in ARG values at build time. Set it repeatedly for multiple values.")
RootCmd.PersistentFlags().BoolVarP(&opts.Insecure, "insecure", "", false, "Push to insecure registry using plain HTTP") RootCmd.PersistentFlags().BoolVarP(&opts.Insecure, "insecure", "", false, "Push to insecure registry using plain HTTP")
RootCmd.PersistentFlags().BoolVarP(&opts.SkipTLSVerify, "skip-tls-verify", "", false, "Push to insecure registry ignoring TLS verify") RootCmd.PersistentFlags().BoolVarP(&opts.SkipTLSVerify, "skip-tls-verify", "", false, "Push to insecure registry ignoring TLS verify")
@ -194,7 +213,7 @@ func addKanikoOptionsFlags() {
RootCmd.PersistentFlags().IntVar(&opts.PushRetry, "push-retry", 0, "Number of retries for the push operation") RootCmd.PersistentFlags().IntVar(&opts.PushRetry, "push-retry", 0, "Number of retries for the push operation")
RootCmd.PersistentFlags().IntVar(&opts.ImageFSExtractRetry, "image-fs-extract-retry", 0, "Number of retries for image FS extraction") RootCmd.PersistentFlags().IntVar(&opts.ImageFSExtractRetry, "image-fs-extract-retry", 0, "Number of retries for image FS extraction")
RootCmd.PersistentFlags().StringVarP(&opts.KanikoDir, "kaniko-dir", "", constants.DefaultKanikoPath, "Path to the kaniko directory, this takes precedence over the KANIKO_DIR environment variable.") RootCmd.PersistentFlags().StringVarP(&opts.KanikoDir, "kaniko-dir", "", constants.DefaultKanikoPath, "Path to the kaniko directory, this takes precedence over the KANIKO_DIR environment variable.")
RootCmd.PersistentFlags().StringVarP(&opts.TarPath, "tarPath", "", "", "Path to save the image in as a tarball instead of pushing") RootCmd.PersistentFlags().StringVarP(&opts.TarPath, "tar-path", "", "", "Path to save the image in as a tarball instead of pushing")
RootCmd.PersistentFlags().BoolVarP(&opts.SingleSnapshot, "single-snapshot", "", false, "Take a single snapshot at the end of the build.") RootCmd.PersistentFlags().BoolVarP(&opts.SingleSnapshot, "single-snapshot", "", false, "Take a single snapshot at the end of the build.")
RootCmd.PersistentFlags().BoolVarP(&opts.Reproducible, "reproducible", "", false, "Strip timestamps out of the image to make it reproducible") RootCmd.PersistentFlags().BoolVarP(&opts.Reproducible, "reproducible", "", false, "Strip timestamps out of the image to make it reproducible")
RootCmd.PersistentFlags().StringVarP(&opts.Target, "target", "", "", "Set the target build stage to build") RootCmd.PersistentFlags().StringVarP(&opts.Target, "target", "", "", "Set the target build stage to build")
@ -225,18 +244,10 @@ func addKanikoOptionsFlags() {
RootCmd.PersistentFlags().VarP(&opts.IgnorePaths, "ignore-path", "", "Ignore these paths when taking a snapshot. Set it repeatedly for multiple paths.") RootCmd.PersistentFlags().VarP(&opts.IgnorePaths, "ignore-path", "", "Ignore these paths when taking a snapshot. Set it repeatedly for multiple paths.")
RootCmd.PersistentFlags().BoolVarP(&opts.ForceBuildMetadata, "force-build-metadata", "", false, "Force add metadata layers to build image") RootCmd.PersistentFlags().BoolVarP(&opts.ForceBuildMetadata, "force-build-metadata", "", false, "Force add metadata layers to build image")
// Allow setting --registry-mirror using an environment variable. // Deprecated flags.
if val, ok := os.LookupEnv("KANIKO_REGISTRY_MIRROR"); ok { RootCmd.PersistentFlags().StringVarP(&opts.SnapshotModeDeprecated, "snapshotMode", "", "", "This flag is deprecated. Please use '--snapshot-mode'.")
opts.RegistryMirrors.Set(val) RootCmd.PersistentFlags().StringVarP(&opts.CustomPlatformDeprecated, "customPlatform", "", "", "This flag is deprecated. Please use '--custom-platform'.")
} RootCmd.PersistentFlags().StringVarP(&opts.TarPath, "tarPath", "", "", "This flag is deprecated. Please use '--tar-path'.")
// Default the custom platform flag to our current platform, and validate it.
if opts.CustomPlatform == "" {
opts.CustomPlatform = platforms.Format(platforms.Normalize(platforms.DefaultSpec()))
}
if _, err := v1.ParsePlatform(opts.CustomPlatform); err != nil {
logrus.Fatalf("Invalid platform %q: %v", opts.CustomPlatform, err)
}
} }
// addHiddenFlags marks certain flags as hidden from the executor help text // addHiddenFlags marks certain flags as hidden from the executor help text
@ -272,6 +283,26 @@ func checkContained() bool {
return proc.GetContainerRuntime(0, 0) != proc.RuntimeNotFound return proc.GetContainerRuntime(0, 0) != proc.RuntimeNotFound
} }
// checkNoDeprecatedFlags return an error if deprecated flags are used.
func checkNoDeprecatedFlags() {
// In version >=2.0.0 make it fail (`Warn` -> `Fatal`)
if opts.CustomPlatformDeprecated != "" {
logrus.Warn("Flag --customPlatform is deprecated. Use: --custom-platform")
opts.CustomPlatform = opts.CustomPlatformDeprecated
}
if opts.SnapshotModeDeprecated != "" {
logrus.Warn("Flag --snapshotMode is deprecated. Use: --snapshot-mode")
opts.SnapshotMode = opts.SnapshotModeDeprecated
}
if opts.TarPathDeprecated != "" {
logrus.Warn("Flag --tarPath is deprecated. Use: --tar-path")
opts.TarPath = opts.TarPathDeprecated
}
}
// cacheFlagsValid makes sure the flags passed in related to caching are valid // cacheFlagsValid makes sure the flags passed in related to caching are valid
func cacheFlagsValid() error { func cacheFlagsValid() error {
if !opts.Cache { if !opts.Cache {

View File

@ -3,7 +3,7 @@ steps:
args: args:
- --build-arg=NUM=${_COUNT} - --build-arg=NUM=${_COUNT}
- --no-push - --no-push
- --snapshotMode=redo - --snapshot-mode=redo
env: env:
- 'BENCHMARK_FILE=gs://$PROJECT_ID/gcb/benchmark_file_${_COUNT}' - 'BENCHMARK_FILE=gs://$PROJECT_ID/gcb/benchmark_file_${_COUNT}'
timeout: 2400s timeout: 2400s

View File

@ -4,4 +4,4 @@ RUN yum --disableplugin=subscription-manager install -y iputils
RUN setcap cap_net_raw+ep /bin/ping || exit 1 RUN setcap cap_net_raw+ep /bin/ping || exit 1
FROM base FROM base
RUN [ ! -z "$(getcap /bin/ping)" ] || exit 1 RUN [ ! -z "$(getcap /bin/ping)" ] || exit 1

View File

@ -82,7 +82,7 @@ var additionalDockerFlagsMap = map[string][]string{
var additionalKanikoFlagsMap = map[string][]string{ var additionalKanikoFlagsMap = map[string][]string{
"Dockerfile_test_add": {"--single-snapshot"}, "Dockerfile_test_add": {"--single-snapshot"},
"Dockerfile_test_run_new": {"--use-new-run=true"}, "Dockerfile_test_run_new": {"--use-new-run=true"},
"Dockerfile_test_run_redo": {"--snapshotMode=redo"}, "Dockerfile_test_run_redo": {"--snapshot-mode=redo"},
"Dockerfile_test_scratch": {"--single-snapshot"}, "Dockerfile_test_scratch": {"--single-snapshot"},
"Dockerfile_test_maintainer": {"--single-snapshot"}, "Dockerfile_test_maintainer": {"--single-snapshot"},
"Dockerfile_test_target": {"--target=second"}, "Dockerfile_test_target": {"--target=second"},

View File

@ -47,38 +47,41 @@ type RegistryOptions struct {
type KanikoOptions struct { type KanikoOptions struct {
RegistryOptions RegistryOptions
CacheOptions CacheOptions
Destinations multiArg Destinations multiArg
BuildArgs multiArg BuildArgs multiArg
Labels multiArg Labels multiArg
Git KanikoGitOptions Git KanikoGitOptions
IgnorePaths multiArg IgnorePaths multiArg
DockerfilePath string DockerfilePath string
SrcContext string SrcContext string
SnapshotMode string SnapshotMode string
CustomPlatform string SnapshotModeDeprecated string
Bucket string CustomPlatform string
TarPath string CustomPlatformDeprecated string
KanikoDir string Bucket string
Target string TarPath string
CacheRepo string TarPathDeprecated string
DigestFile string KanikoDir string
ImageNameDigestFile string Target string
ImageNameTagDigestFile string CacheRepo string
OCILayoutPath string DigestFile string
ImageFSExtractRetry int ImageNameDigestFile string
SingleSnapshot bool ImageNameTagDigestFile string
Reproducible bool OCILayoutPath string
NoPush bool ImageFSExtractRetry int
NoPushCache bool SingleSnapshot bool
Cache bool Reproducible bool
Cleanup bool NoPush bool
CompressedCaching bool NoPushCache bool
IgnoreVarRun bool Cache bool
SkipUnusedStages bool Cleanup bool
RunV2 bool CompressedCaching bool
CacheCopyLayers bool IgnoreVarRun bool
CacheRunLayers bool SkipUnusedStages bool
ForceBuildMetadata bool RunV2 bool
CacheCopyLayers bool
CacheRunLayers bool
ForceBuildMetadata bool
} }
type KanikoGitOptions struct { type KanikoGitOptions struct {