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{} }