Skip to content

Commit 97640fd

Browse files
authored
Merge pull request #275 from buildkite/pdp-2023-underlying-parse-error-does-not-print-if-using-gitenvfrom
Skip checkout when there are parse errors
2 parents b3f3fc2 + 945540c commit 97640fd

File tree

3 files changed

+29
-14
lines changed

3 files changed

+29
-14
lines changed

.buildkite/steps/tests.sh

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,5 @@ export IMAGE
1313

1414
gotestsum --junitfile "junit-${BUILDKITE_JOB_ID}.xml" -- \
1515
-count=1 \
16-
-failfast \
1716
-ldflags="-X ${package}.branch=${branch}" \
1817
./...

internal/controller/scheduler/scheduler.go

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ func (w *worker) Create(ctx context.Context, job *api.CommandJob) error {
6767
logger := w.logger.With(zap.String("uuid", job.Uuid))
6868
logger.Info("creating job")
6969
jobWrapper := NewJobWrapper(w.logger, job, w.cfg).ParsePlugins()
70-
kjob, err := jobWrapper.Build()
70+
kjob, err := jobWrapper.Build(false)
7171
if err != nil {
7272
kjob, err = jobWrapper.BuildFailureJob(err)
7373
if err != nil {
@@ -146,7 +146,7 @@ func (w *jobWrapper) ParsePlugins() *jobWrapper {
146146
return w
147147
}
148148

149-
func (w *jobWrapper) Build() (*batchv1.Job, error) {
149+
func (w *jobWrapper) Build(skipCheckout bool) (*batchv1.Job, error) {
150150
// if previous steps have failed, error immediately
151151
if w.err != nil {
152152
return nil, w.err
@@ -231,7 +231,11 @@ func (w *jobWrapper) Build() (*batchv1.Job, error) {
231231
volumeMounts := []corev1.VolumeMount{{Name: "workspace", MountPath: "/workspace"}}
232232
volumeMounts = append(volumeMounts, w.k8sPlugin.ExtraVolumeMounts...)
233233

234-
const systemContainers = 1
234+
systemContainerCount := 0
235+
if !skipCheckout {
236+
systemContainerCount = 1
237+
}
238+
235239
ttl := int32(w.cfg.JobTTL.Seconds())
236240
kjob.Spec.TTLSecondsAfterFinished = &ttl
237241

@@ -261,7 +265,7 @@ func (w *jobWrapper) Build() (*batchv1.Job, error) {
261265
},
262266
corev1.EnvVar{
263267
Name: "BUILDKITE_CONTAINER_ID",
264-
Value: strconv.Itoa(i + systemContainers),
268+
Value: strconv.Itoa(i + systemContainerCount),
265269
},
266270
corev1.EnvVar{
267271
Name: "BUILDKITE_PLUGINS_PATH",
@@ -294,7 +298,7 @@ func (w *jobWrapper) Build() (*batchv1.Job, error) {
294298
podSpec.Containers[i] = c
295299
}
296300

297-
containerCount := len(podSpec.Containers) + systemContainers
301+
containerCount := len(podSpec.Containers) + systemContainerCount
298302

299303
for i, c := range w.k8sPlugin.Sidecars {
300304
if c.Name == "" {
@@ -366,10 +370,12 @@ func (w *jobWrapper) Build() (*batchv1.Job, error) {
366370
},
367371
}
368372
agentContainer.Env = append(agentContainer.Env, env...)
373+
podSpec.Containers = append(podSpec.Containers, agentContainer)
369374

370-
checkoutContainer := w.createCheckoutContainer(kjob, env, volumeMounts)
375+
if !skipCheckout {
376+
podSpec.Containers = append(podSpec.Containers, w.createCheckoutContainer(kjob, env, volumeMounts))
377+
}
371378

372-
podSpec.Containers = append(podSpec.Containers, agentContainer, checkoutContainer)
373379
podSpec.InitContainers = append(podSpec.InitContainers, corev1.Container{
374380
Name: "copy-agent",
375381
Image: w.cfg.Image,
@@ -495,14 +501,24 @@ func (w *jobWrapper) BuildFailureJob(err error) (*batchv1.Job, error) {
495501
PodSpec: &corev1.PodSpec{
496502
Containers: []corev1.Container{
497503
{
498-
Image: w.cfg.Image,
504+
// the configured agent image may be private. If there is an error in specifying the
505+
// secrets for this image, we should still be able to run the failure job. So, we
506+
// bypass the potentially private image and use a public one. We could use a
507+
// thinner public image like `alpine:latest`, but it's generally unwise to depend
508+
// on an image that's not published by us.
509+
//
510+
// TODO: pin the version of the agent image and use that here.
511+
// Currently, DefaultAgentImage has a latest tag. That's not ideal as
512+
// a given version of agent stack-k8s may use different versions of the agent image over
513+
// time. We should consider using a specific version of the agent image here.
514+
Image: config.DefaultAgentImage,
499515
Command: []string{fmt.Sprintf("echo %q && exit 1", err.Error())},
500516
},
501517
},
502518
},
503519
}
504520
w.otherPlugins = nil
505-
return w.Build()
521+
return w.Build(true)
506522
}
507523

508524
func (w *jobWrapper) labelWithAgentTags() {

internal/controller/scheduler/scheduler_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ func TestJobPluginConversion(t *testing.T) {
6363
input,
6464
scheduler.Config{AgentToken: "token-secret"},
6565
)
66-
result, err := wrapper.ParsePlugins().Build()
66+
result, err := wrapper.ParsePlugins().Build(false)
6767
require.NoError(t, err)
6868

6969
assert.Len(t, result.Spec.Template.Spec.Containers, 3)
@@ -122,7 +122,7 @@ func TestTagEnv(t *testing.T) {
122122
AgentQueryRules: []string{"queue=kubernetes"},
123123
}
124124
wrapper := scheduler.NewJobWrapper(logger, input, scheduler.Config{AgentToken: "token-secret"})
125-
result, err := wrapper.ParsePlugins().Build()
125+
result, err := wrapper.ParsePlugins().Build(false)
126126
require.NoError(t, err)
127127

128128
container := findContainer(t, result.Spec.Template.Spec.Containers, "agent")
@@ -152,7 +152,7 @@ func TestJobWithNoKubernetesPlugin(t *testing.T) {
152152
AgentQueryRules: []string{},
153153
}
154154
wrapper := scheduler.NewJobWrapper(zaptest.NewLogger(t), input, scheduler.Config{})
155-
result, err := wrapper.ParsePlugins().Build()
155+
result, err := wrapper.ParsePlugins().Build(false)
156156
require.NoError(t, err)
157157

158158
require.Len(t, result.Spec.Template.Spec.Containers, 3)
@@ -179,7 +179,7 @@ func TestFailureJobs(t *testing.T) {
179179
AgentQueryRules: []string{"queue=kubernetes"},
180180
}
181181
wrapper := scheduler.NewJobWrapper(zaptest.NewLogger(t), input, scheduler.Config{})
182-
_, err = wrapper.ParsePlugins().Build()
182+
_, err = wrapper.ParsePlugins().Build(false)
183183
require.Error(t, err)
184184

185185
result, err := wrapper.BuildFailureJob(err)

0 commit comments

Comments
 (0)