From e2369d49ac1e616e793d832b9d779a1a8ee25c07 Mon Sep 17 00:00:00 2001 From: Vadim Rutkovsky Date: Wed, 25 Aug 2021 18:21:59 +0200 Subject: [PATCH] prowgen: support overriding prowjob timeout Add "Timeout" param to the test, which would reset `decoration_config.timeout` so that some tests could run longer than 4 hours --- cmd/ci-operator-prowgen/main_test.go | 67 +++++++++++++ ...rConfigToProwYaml_Custom_test_timeout.yaml | 73 ++++++++++++++ ...rConfigToProwYaml_Custom_test_timeout.yaml | 99 +++++++++++++++++++ pkg/api/types.go | 6 ++ pkg/api/zz_generated.deepcopy.go | 10 ++ pkg/prowgen/prowgen.go | 33 ++++--- pkg/prowgen/prowgen_test.go | 8 +- pkg/validation/test.go | 5 + .../zz_generated.ci_operator_reference.go | 8 ++ 9 files changed, 291 insertions(+), 18 deletions(-) create mode 100644 cmd/ci-operator-prowgen/testdata/zz_fixture_postsubmit_TestFromCIOperatorConfigToProwYaml_Custom_test_timeout.yaml create mode 100644 cmd/ci-operator-prowgen/testdata/zz_fixture_presubmit_TestFromCIOperatorConfigToProwYaml_Custom_test_timeout.yaml diff --git a/cmd/ci-operator-prowgen/main_test.go b/cmd/ci-operator-prowgen/main_test.go index 1ac57dea44f..33e39a2e7a5 100644 --- a/cmd/ci-operator-prowgen/main_test.go +++ b/cmd/ci-operator-prowgen/main_test.go @@ -182,6 +182,73 @@ tests: requests: cpu: 10m serviceAccountName: ci-operator +`), + }, { + id: "Custom test timeout", + org: "super", + component: "duper", + branch: "branch", + configYAML: []byte(`base_images: + base: + name: origin-v3.11 + namespace: openshift + tag: base +images: +- from: base + to: service-serving-cert-signer +resources: + '*': + limits: + cpu: 500Mi + requests: + cpu: 10Mi +tag_specification: + name: origin-v3.11 + namespace: openshift + tag: '' +promotion: + name: test + namespace: ci +build_root: + image_stream_tag: + namespace: openshift + name: release + tag: golang-1.10 +tests: +- as: unit + timeout: 8h + steps: + test: + - as: test + commands: make unit + from: src + resources: + requests: + cpu: 100m + workflow: ipi-aws +`), + prowOldPresubmitYAML: []byte(""), + prowOldPostsubmitYAML: []byte(`postsubmits: + super/duper: + - agent: kubernetes + decorate: true + decoration_config: + skip_cloning: true + name: branch-ci-super-duper-branch-do-not-overwrite + spec: + containers: + - args: + - --give-pr-author-access-to-namespace=true + - --target=unit + command: + - ci-operator + image: ci-operator:latest + imagePullPolicy: Always + name: "" + resources: + requests: + cpu: 10m + serviceAccountName: ci-operator `), }, } diff --git a/cmd/ci-operator-prowgen/testdata/zz_fixture_postsubmit_TestFromCIOperatorConfigToProwYaml_Custom_test_timeout.yaml b/cmd/ci-operator-prowgen/testdata/zz_fixture_postsubmit_TestFromCIOperatorConfigToProwYaml_Custom_test_timeout.yaml new file mode 100644 index 00000000000..404cc4995ef --- /dev/null +++ b/cmd/ci-operator-prowgen/testdata/zz_fixture_postsubmit_TestFromCIOperatorConfigToProwYaml_Custom_test_timeout.yaml @@ -0,0 +1,73 @@ +postsubmits: + super/duper: + - agent: kubernetes + decorate: true + decoration_config: + skip_cloning: true + name: branch-ci-super-duper-branch-do-not-overwrite + spec: + containers: + - args: + - --give-pr-author-access-to-namespace=true + - --target=unit + command: + - ci-operator + image: ci-operator:latest + imagePullPolicy: Always + name: "" + resources: + requests: + cpu: 10m + serviceAccountName: ci-operator + - agent: kubernetes + branches: + - ^branch$ + decorate: true + decoration_config: + skip_cloning: true + labels: + ci-operator.openshift.io/is-promotion: "true" + ci-operator.openshift.io/prowgen-controlled: "true" + max_concurrency: 1 + name: branch-ci-super-duper-branch-images + spec: + containers: + - args: + - --gcs-upload-secret=/secrets/gcs/service-account.json + - --image-import-pull-secret=/etc/pull-secret/.dockerconfigjson + - --image-mirror-push-secret=/etc/push-secret/.dockerconfigjson + - --promote + - --report-credentials-file=/etc/report/credentials + - --target=[images] + command: + - ci-operator + image: ci-operator:latest + imagePullPolicy: Always + name: "" + resources: + requests: + cpu: 10m + volumeMounts: + - mountPath: /secrets/gcs + name: gcs-credentials + readOnly: true + - mountPath: /etc/pull-secret + name: pull-secret + readOnly: true + - mountPath: /etc/push-secret + name: push-secret + readOnly: true + - mountPath: /etc/report + name: result-aggregator + readOnly: true + serviceAccountName: ci-operator + volumes: + - name: pull-secret + secret: + secretName: registry-pull-credentials + - name: push-secret + secret: + secretName: registry-push-credentials-ci-central + - name: result-aggregator + secret: + secretName: result-aggregator diff --git a/cmd/ci-operator-prowgen/testdata/zz_fixture_presubmit_TestFromCIOperatorConfigToProwYaml_Custom_test_timeout.yaml b/cmd/ci-operator-prowgen/testdata/zz_fixture_presubmit_TestFromCIOperatorConfigToProwYaml_Custom_test_timeout.yaml new file mode 100644 index 00000000000..4557dfcd66d --- /dev/null +++ b/cmd/ci-operator-prowgen/testdata/zz_fixture_presubmit_TestFromCIOperatorConfigToProwYaml_Custom_test_timeout.yaml @@ -0,0 +1,99 @@ +presubmits: + super/duper: + - agent: kubernetes + always_run: true + branches: + - ^branch$ + - ^branch- + context: ci/prow/images + decorate: true + decoration_config: + skip_cloning: true + labels: + ci-operator.openshift.io/prowgen-controlled: "true" + pj-rehearse.openshift.io/can-be-rehearsed: "true" + name: pull-ci-super-duper-branch-images + rerun_command: /test images + spec: + containers: + - args: + - --gcs-upload-secret=/secrets/gcs/service-account.json + - --image-import-pull-secret=/etc/pull-secret/.dockerconfigjson + - --report-credentials-file=/etc/report/credentials + - --target=[images] + command: + - ci-operator + image: ci-operator:latest + imagePullPolicy: Always + name: "" + resources: + requests: + cpu: 10m + volumeMounts: + - mountPath: /secrets/gcs + name: gcs-credentials + readOnly: true + - mountPath: /etc/pull-secret + name: pull-secret + readOnly: true + - mountPath: /etc/report + name: result-aggregator + readOnly: true + serviceAccountName: ci-operator + volumes: + - name: pull-secret + secret: + secretName: registry-pull-credentials + - name: result-aggregator + secret: + secretName: result-aggregator + trigger: (?m)^/test( | .* )images,?($|\s.*) + - agent: kubernetes + always_run: true + branches: + - ^branch$ + - ^branch- + context: ci/prow/unit + decorate: true + decoration_config: + skip_cloning: true + timeout: 8h0m0s + labels: + ci-operator.openshift.io/prowgen-controlled: "true" + pj-rehearse.openshift.io/can-be-rehearsed: "true" + name: pull-ci-super-duper-branch-unit + rerun_command: /test unit + spec: + containers: + - args: + - --gcs-upload-secret=/secrets/gcs/service-account.json + - --image-import-pull-secret=/etc/pull-secret/.dockerconfigjson + - --report-credentials-file=/etc/report/credentials + - --target=unit + command: + - ci-operator + image: ci-operator:latest + imagePullPolicy: Always + name: "" + resources: + requests: + cpu: 10m + volumeMounts: + - mountPath: /secrets/gcs + name: gcs-credentials + readOnly: true + - mountPath: /etc/pull-secret + name: pull-secret + readOnly: true + - mountPath: /etc/report + name: result-aggregator + readOnly: true + serviceAccountName: ci-operator + volumes: + - name: pull-secret + secret: + secretName: registry-pull-credentials + - name: result-aggregator + secret: + secretName: result-aggregator + trigger: (?m)^/test( | .* )unit,?($|\s.*) diff --git a/pkg/api/types.go b/pkg/api/types.go index 628c994dfec..0da7a487097 100644 --- a/pkg/api/types.go +++ b/pkg/api/types.go @@ -656,6 +656,9 @@ type TestStepConfiguration struct { // SkipIfOnlyChanged is a regex that will result in the test being skipped if all changed files match that regex. SkipIfOnlyChanged string `json:"skip_if_only_changed,omitempty"` + // Timeout overrides maximum prowjob duration + Timeout *prowv1.Duration `json:"timeout,omitempty"` + // Only one of the following can be not-null. ContainerTestConfiguration *ContainerTestConfiguration `json:"container,omitempty"` MultiStageTestConfiguration *MultiStageTestConfiguration `json:"steps,omitempty"` @@ -1016,6 +1019,9 @@ type MultiStageTestConfigurationLiteral struct { // DependencyOverrides allows a step to override a dependency with a fully-qualified pullspec. This will probably only ever // be used with rehearsals. Otherwise, the overrides should be passed in as parameters to ci-operator. DependencyOverrides DependencyOverrides `json:"dependency_overrides,omitempty"` + + // Override job timeout + Timeout *prowv1.Duration `json:"timeout,omitempty"` } // TestEnvironment has the values of parameters for multi-stage tests. diff --git a/pkg/api/zz_generated.deepcopy.go b/pkg/api/zz_generated.deepcopy.go index 323a1c79661..d3c9589e27b 100644 --- a/pkg/api/zz_generated.deepcopy.go +++ b/pkg/api/zz_generated.deepcopy.go @@ -738,6 +738,11 @@ func (in *MultiStageTestConfigurationLiteral) DeepCopyInto(out *MultiStageTestCo (*out)[key] = val } } + if in.Timeout != nil { + in, out := &in.Timeout, &out.Timeout + *out = new(v1.Duration) + **out = **in + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MultiStageTestConfigurationLiteral. @@ -1808,6 +1813,11 @@ func (in *TestStepConfiguration) DeepCopyInto(out *TestStepConfiguration) { *out = new(ClusterClaim) (*in).DeepCopyInto(*out) } + if in.Timeout != nil { + in, out := &in.Timeout, &out.Timeout + *out = new(v1.Duration) + **out = **in + } if in.ContainerTestConfiguration != nil { in, out := &in.ContainerTestConfiguration, &out.ContainerTestConfiguration *out = new(ContainerTestConfiguration) diff --git a/pkg/prowgen/prowgen.go b/pkg/prowgen/prowgen.go index b868712f0bd..5f6e223199d 100644 --- a/pkg/prowgen/prowgen.go +++ b/pkg/prowgen/prowgen.go @@ -5,6 +5,7 @@ import ( "path/filepath" "regexp" "strings" + "time" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" @@ -168,20 +169,20 @@ func GenerateJobs(configSpec *cioperatorapi.ReleaseBuildConfiguration, info *Pro if element.Interval != nil { interval = *element.Interval } - periodic := generatePeriodicForTest(element.As, info, podSpec, true, cron, interval, element.ReleaseController, configSpec.CanonicalGoRepository, jobRelease, skipCloning) + periodic := generatePeriodicForTest(element.As, info, podSpec, true, cron, interval, element.ReleaseController, configSpec.CanonicalGoRepository, jobRelease, skipCloning, element.Timeout) if element.Cluster != "" { periodic.Labels[cioperatorapi.ClusterLabel] = string(element.Cluster) } periodics = append(periodics, *periodic) } else if element.Postsubmit { - postsubmit := generatePostsubmitForTest(element.As, info, podSpec, configSpec.CanonicalGoRepository, jobRelease, skipCloning) + postsubmit := generatePostsubmitForTest(element.As, info, podSpec, configSpec.CanonicalGoRepository, jobRelease, skipCloning, element.Timeout) postsubmit.MaxConcurrency = 1 if element.Cluster != "" { postsubmit.Labels[cioperatorapi.ClusterLabel] = string(element.Cluster) } postsubmits[orgrepo] = append(postsubmits[orgrepo], *postsubmit) } else { - presubmit := *generatePresubmitForTest(element.As, info, podSpec, configSpec.CanonicalGoRepository, jobRelease, skipCloning, element.RunIfChanged, element.SkipIfOnlyChanged, element.Optional) + presubmit := *generatePresubmitForTest(element.As, info, podSpec, configSpec.CanonicalGoRepository, jobRelease, skipCloning, element.RunIfChanged, element.SkipIfOnlyChanged, element.Optional, element.Timeout) v, requestingKVM := configSpec.Resources.RequirementsForStep(element.As).Requests[cioperatorapi.KVMDeviceLabel] if requestingKVM { presubmit.Labels[cioperatorapi.KVMDeviceLabel] = v @@ -211,7 +212,7 @@ func GenerateJobs(configSpec *cioperatorapi.ReleaseBuildConfiguration, info *Pro presubmitTargets = append(presubmitTargets, "[release:latest]") } podSpec := generateCiOperatorPodSpec(info, nil, presubmitTargets, skipCloning) - presubmits[orgrepo] = append(presubmits[orgrepo], *generatePresubmitForTest("images", info, podSpec, configSpec.CanonicalGoRepository, jobRelease, skipCloning, "", "", false)) + presubmits[orgrepo] = append(presubmits[orgrepo], *generatePresubmitForTest("images", info, podSpec, configSpec.CanonicalGoRepository, jobRelease, skipCloning, "", "", false, nil)) if configSpec.PromotionConfiguration != nil { @@ -229,7 +230,7 @@ func GenerateJobs(configSpec *cioperatorapi.ReleaseBuildConfiguration, info *Pro Secret: &corev1.SecretVolumeSource{SecretName: cioperatorapi.RegistryPushCredentialsCICentralSecret}, }, }) - postsubmit := generatePostsubmitForTest("images", info, podSpec, configSpec.CanonicalGoRepository, jobRelease, skipCloning) + postsubmit := generatePostsubmitForTest("images", info, podSpec, configSpec.CanonicalGoRepository, jobRelease, skipCloning, nil) postsubmit.MaxConcurrency = 1 if postsubmit.Labels == nil { postsubmit.Labels = map[string]string{} @@ -248,11 +249,11 @@ func GenerateJobs(configSpec *cioperatorapi.ReleaseBuildConfiguration, info *Pro } indexName := api.IndexName(bundle.As) podSpec := generateCiOperatorPodSpec(info, nil, []string{indexName}, skipCloning) - presubmits[orgrepo] = append(presubmits[orgrepo], *generatePresubmitForTest(indexName, info, podSpec, configSpec.CanonicalGoRepository, jobRelease, skipCloning, "", "", false)) + presubmits[orgrepo] = append(presubmits[orgrepo], *generatePresubmitForTest(indexName, info, podSpec, configSpec.CanonicalGoRepository, jobRelease, skipCloning, "", "", false, nil)) } if containsUnnamedBundle { podSpec := generateCiOperatorPodSpec(info, nil, []string{string(api.PipelineImageStreamTagReferenceIndexImage)}, skipCloning) - presubmits[orgrepo] = append(presubmits[orgrepo], *generatePresubmitForTest(string(api.PipelineImageStreamTagReferenceIndexImage), info, podSpec, configSpec.CanonicalGoRepository, jobRelease, skipCloning, "", "", false)) + presubmits[orgrepo] = append(presubmits[orgrepo], *generatePresubmitForTest(string(api.PipelineImageStreamTagReferenceIndexImage), info, podSpec, configSpec.CanonicalGoRepository, jobRelease, skipCloning, "", "", false, nil)) } } @@ -445,9 +446,9 @@ func addLeaseClient(s *corev1.PodSpec) { }) } -func generatePresubmitForTest(name string, info *ProwgenInfo, podSpec *corev1.PodSpec, pathAlias *string, jobRelease string, skipCloning bool, runIfChanged, skipIfOnlyChanged string, optional bool) *prowconfig.Presubmit { +func generatePresubmitForTest(name string, info *ProwgenInfo, podSpec *corev1.PodSpec, pathAlias *string, jobRelease string, skipCloning bool, runIfChanged, skipIfOnlyChanged string, optional bool, timeout *prowv1.Duration) *prowconfig.Presubmit { shortName := info.TestName(name) - base := generateJobBase(name, jc.PresubmitPrefix, info, podSpec, true, pathAlias, jobRelease, skipCloning) + base := generateJobBase(name, jc.PresubmitPrefix, info, podSpec, true, pathAlias, jobRelease, skipCloning, timeout) return &prowconfig.Presubmit{ JobBase: base, AlwaysRun: runIfChanged == "" && skipIfOnlyChanged == "", @@ -465,16 +466,16 @@ func generatePresubmitForTest(name string, info *ProwgenInfo, podSpec *corev1.Po } } -func generatePostsubmitForTest(name string, info *ProwgenInfo, podSpec *corev1.PodSpec, pathAlias *string, jobRelease string, skipCloning bool) *prowconfig.Postsubmit { - base := generateJobBase(name, jc.PostsubmitPrefix, info, podSpec, false, pathAlias, jobRelease, skipCloning) +func generatePostsubmitForTest(name string, info *ProwgenInfo, podSpec *corev1.PodSpec, pathAlias *string, jobRelease string, skipCloning bool, timeout *prowv1.Duration) *prowconfig.Postsubmit { + base := generateJobBase(name, jc.PostsubmitPrefix, info, podSpec, false, pathAlias, jobRelease, skipCloning, timeout) return &prowconfig.Postsubmit{ JobBase: base, Brancher: prowconfig.Brancher{Branches: []string{ExactlyBranch(info.Branch)}}, } } -func generatePeriodicForTest(name string, info *ProwgenInfo, podSpec *corev1.PodSpec, rehearsable bool, cron string, interval string, releaseController bool, pathAlias *string, jobRelease string, skipCloning bool) *prowconfig.Periodic { - base := generateJobBase(name, jc.PeriodicPrefix, info, podSpec, rehearsable, nil, jobRelease, skipCloning) +func generatePeriodicForTest(name string, info *ProwgenInfo, podSpec *corev1.PodSpec, rehearsable bool, cron string, interval string, releaseController bool, pathAlias *string, jobRelease string, skipCloning bool, timeout *prowv1.Duration) *prowconfig.Periodic { + base := generateJobBase(name, jc.PeriodicPrefix, info, podSpec, rehearsable, nil, jobRelease, skipCloning, timeout) // periodics are not associated with a repo per se, but we can add in an // extra ref so that periodics which want to access the repo tha they are // defined for can have that information @@ -598,7 +599,7 @@ func generateConfigMapVolume(name string, templates []string) corev1.Volume { return ret } -func generateJobBase(name, prefix string, info *ProwgenInfo, podSpec *corev1.PodSpec, rehearsable bool, pathAlias *string, jobRelease string, skipCloning bool) prowconfig.JobBase { +func generateJobBase(name, prefix string, info *ProwgenInfo, podSpec *corev1.PodSpec, rehearsable bool, pathAlias *string, jobRelease string, skipCloning bool, timeout *prowv1.Duration) prowconfig.JobBase { labels := map[string]string{jc.LabelGenerated: string(jc.NewlyGenerated)} if rehearsable { @@ -619,6 +620,10 @@ func generateJobBase(name, prefix string, info *ProwgenInfo, podSpec *corev1.Pod } else if !skipCloning && info.Config.Private { decorationConfig = &prowv1.DecorationConfig{OauthTokenSecret: &prowv1.OauthTokenSecret{Key: api.OauthTokenSecretKey, Name: api.OauthTokenSecretName}} } + maxCustomDuration := time.Hour * 8 + if timeout != nil && timeout.Duration <= maxCustomDuration { + decorationConfig.Timeout = timeout + } base := prowconfig.JobBase{ Agent: string(prowv1.KubernetesAgent), Labels: labels, diff --git a/pkg/prowgen/prowgen_test.go b/pkg/prowgen/prowgen_test.go index 43d3963eab5..2010efe8dd7 100644 --- a/pkg/prowgen/prowgen_test.go +++ b/pkg/prowgen/prowgen_test.go @@ -344,7 +344,7 @@ func TestGeneratePresubmitForTest(t *testing.T) { for _, tc := range tests { t.Run(tc.description, func(t *testing.T) { // podSpec tested in generatePodSpec - testhelper.CompareWithFixture(t, generatePresubmitForTest(tc.test, tc.repoInfo, nil, nil, tc.jobRelease, !tc.clone, tc.runIfChanged, tc.skipIfOnlyChanged, tc.optional)) + testhelper.CompareWithFixture(t, generatePresubmitForTest(tc.test, tc.repoInfo, nil, nil, tc.jobRelease, !tc.clone, tc.runIfChanged, tc.skipIfOnlyChanged, tc.optional, nil)) }) } } @@ -406,7 +406,7 @@ func TestGeneratePeriodicForTest(t *testing.T) { for _, tc := range tests { t.Run(tc.description, func(t *testing.T) { // podSpec tested in generatePodSpec - testhelper.CompareWithFixture(t, generatePeriodicForTest(tc.test, tc.repoInfo, nil, true, tc.cron, tc.interval, tc.releaseController, nil, tc.jobRelease, !tc.clone)) + testhelper.CompareWithFixture(t, generatePeriodicForTest(tc.test, tc.repoInfo, nil, true, tc.cron, tc.interval, tc.releaseController, nil, tc.jobRelease, !tc.clone, nil)) }) } } @@ -456,7 +456,7 @@ func TestGeneratePostSubmitForTest(t *testing.T) { for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { // podSpec tested in generatePodSpec - testhelper.CompareWithFixture(t, generatePostsubmitForTest(tc.name, tc.repoInfo, nil, nil, tc.jobRelease, !tc.clone)) + testhelper.CompareWithFixture(t, generatePostsubmitForTest(tc.name, tc.repoInfo, nil, nil, tc.jobRelease, !tc.clone, nil)) }) } } @@ -773,7 +773,7 @@ func TestGenerateJobBase(t *testing.T) { for _, testCase := range testCases { t.Run(testCase.testName, func(t *testing.T) { - testhelper.CompareWithFixture(t, generateJobBase(testCase.name, testCase.prefix, testCase.info, testCase.podSpec, testCase.rehearsable, testCase.pathAlias, "", !testCase.clone)) + testhelper.CompareWithFixture(t, generateJobBase(testCase.name, testCase.prefix, testCase.info, testCase.podSpec, testCase.rehearsable, testCase.pathAlias, "", !testCase.clone, nil)) }) } } diff --git a/pkg/validation/test.go b/pkg/validation/test.go index eb2847f41d4..c567817f2c5 100644 --- a/pkg/validation/test.go +++ b/pkg/validation/test.go @@ -183,6 +183,11 @@ func (v *Validator) validateTestStepConfiguration( } } + maxJobTimeout := time.Hour * 8 + if test.Timeout != nil && test.Timeout.Duration > maxJobTimeout { + validationErrors = append(validationErrors, fmt.Errorf("%s: job timeout is limited to %s", fieldRootN, maxJobTimeout)) + } + // Validate Secret/Secrets if test.Secret != nil && test.Secrets != nil { validationErrors = append(validationErrors, fmt.Errorf("test.Secret and test.Secrets cannot both be set")) diff --git a/pkg/webreg/zz_generated.ci_operator_reference.go b/pkg/webreg/zz_generated.ci_operator_reference.go index 3d99e2770db..e2051e96bae 100644 --- a/pkg/webreg/zz_generated.ci_operator_reference.go +++ b/pkg/webreg/zz_generated.ci_operator_reference.go @@ -724,6 +724,8 @@ const ciOperatorReferenceYaml = "# The list of base images describe\n" + " run_as_script: false\n" + " # Timeout is how long the we will wait before aborting a job with SIGINT.\n" + " timeout: 0s\n" + + " # Override job timeout\n" + + " timeout: 0s\n" + " openshift_ansible:\n" + " cluster_profile: ' '\n" + " openshift_ansible_custom:\n" + @@ -999,6 +1001,8 @@ const ciOperatorReferenceYaml = "# The list of base images describe\n" + " # Workflow is the name of the workflow to be used for this configuration. For fields defined in both\n" + " # the config and the workflow, the fields from the config will override what is set in Workflow.\n" + " workflow: \"\"\n" + + " # Timeout overrides maximum prowjob duration\n" + + " timeout: 0s\n" + "# Releases maps semantic release payload identifiers\n" + "# to the names that they will be exposed under. For\n" + "# instance, an 'initial' name will be exposed as\n" + @@ -1438,6 +1442,8 @@ const ciOperatorReferenceYaml = "# The list of base images describe\n" + " run_as_script: false\n" + " # Timeout is how long the we will wait before aborting a job with SIGINT.\n" + " timeout: 0s\n" + + " # Override job timeout\n" + + " timeout: 0s\n" + " openshift_ansible:\n" + " cluster_profile: ' '\n" + " openshift_ansible_custom:\n" + @@ -1713,6 +1719,8 @@ const ciOperatorReferenceYaml = "# The list of base images describe\n" + " # Workflow is the name of the workflow to be used for this configuration. For fields defined in both\n" + " # the config and the workflow, the fields from the config will override what is set in Workflow.\n" + " workflow: \"\"\n" + + " # Timeout overrides maximum prowjob duration\n" + + " timeout: 0s\n" + "zz_generated_metadata:\n" + " branch: ' '\n" + " org: ' '\n" +