package config
|
|
|
|
import (
|
|
"gerrit.wikimedia.org/r/blubber/build"
|
|
)
|
|
|
|
// ArtifactsConfig declares files and directories to be copied from one place
|
|
// to another during the build, either from the "local" build context or from
|
|
// another variant.
|
|
//
|
|
// The most common use of the latter such "multi-stage" build is to compile
|
|
// and test the application using one variant image that contains a
|
|
// comprehensive set of development dependencies, and copy the application
|
|
// binaries or production only source files over into a smaller image that
|
|
// contains only production dependencies.
|
|
//
|
|
type ArtifactsConfig struct {
|
|
From string `json:"from" validate:"required,variantref"`
|
|
Source string `json:"source" validate:"requiredwith=destination,relativelocal"`
|
|
Destination string `json:"destination" validate:"requiredwith=source,relativelocal"`
|
|
}
|
|
|
|
// Expand returns the longhand configured artifact and/or the default
|
|
// artifacts for any configured by shorthand notation (i.e. on the `From`
|
|
// field).
|
|
//
|
|
func (ac ArtifactsConfig) Expand(appDirectory string) []ArtifactsConfig {
|
|
// check for shorthand configuration and return its expanded form
|
|
if ac.From != "" && ac.Source == "" && ac.Destination == "" {
|
|
if ac.From == LocalArtifactKeyword {
|
|
return []ArtifactsConfig{
|
|
{
|
|
From: ac.From,
|
|
Source: ".",
|
|
Destination: ".",
|
|
},
|
|
}
|
|
}
|
|
|
|
return []ArtifactsConfig{
|
|
{
|
|
From: ac.From,
|
|
Source: appDirectory,
|
|
Destination: appDirectory,
|
|
},
|
|
{
|
|
From: ac.From,
|
|
Source: LocalLibPrefix,
|
|
Destination: LocalLibPrefix,
|
|
},
|
|
}
|
|
}
|
|
|
|
return []ArtifactsConfig{ac}
|
|
}
|
|
|
|
// InstructionsForPhase injects instructions into the given build phase that
|
|
// copy configured artifacts.
|
|
//
|
|
// PhaseInstall
|
|
//
|
|
// In the case of a "local" build context copy, simply return a build.Copy
|
|
// with the configured source and destination. In the case of a variant copy,
|
|
// return a build.CopyFrom instruction for the variant name, source and
|
|
// destination paths.
|
|
//
|
|
func (ac ArtifactsConfig) InstructionsForPhase(phase build.Phase) []build.Instruction {
|
|
switch phase {
|
|
case build.PhaseInstall:
|
|
copy := build.Copy{[]string{ac.Source}, ac.Destination}
|
|
|
|
if ac.From == LocalArtifactKeyword {
|
|
return []build.Instruction{copy}
|
|
}
|
|
|
|
return []build.Instruction{
|
|
build.CopyFrom{ac.From, copy},
|
|
}
|
|
}
|
|
|
|
return []build.Instruction{}
|
|
}
|