Skip to content

Commit

Permalink
feat: enabled the configuration of the build-agent through argument o…
Browse files Browse the repository at this point in the history
…f config file
  • Loading branch information
JulesFaucherre committed Jan 17, 2023
1 parent 353a0c2 commit 162f425
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 4 deletions.
2 changes: 2 additions & 0 deletions cmd/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ func newLocalExecuteCommand(config *settings.Config) *cobra.Command {
}

local.AddFlagsForDocumentation(buildCommand.Flags())
buildAgentVersionUsage := `The version of the build agent image you want to use. This can be configured by writing in $HOME/.circleci/build_agent_settings.json: '{"LatestSha256":"<version-of-build-agent>"}'`
buildCommand.Flags().String("build-agent-version", "", buildAgentVersionUsage)
buildCommand.Flags().StringP("org-slug", "o", "", "organization slug (for example: github/example-org), used when a config depends on private orbs belonging to that org")
buildCommand.Flags().String("org-id", "", "organization id, used when a config depends on private orbs belonging to that org")

Expand Down
66 changes: 62 additions & 4 deletions local/local.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package local

import (
"encoding/json"
"fmt"
"io"
"io/ioutil"
"os"
"os/exec"
"path"
"regexp"
"strings"
"syscall"
Expand Down Expand Up @@ -73,7 +75,8 @@ func Execute(flags *pflag.FlagSet, cfg *settings.Config) error {
return err
}

image, err := picardImage(os.Stdout)
picardVersion, _ := flags.GetString("build-agent-version")
image, err := picardImage(os.Stdout, picardVersion)

if err != nil {
return errors.Wrap(err, "Could not find picard image")
Expand Down Expand Up @@ -131,7 +134,7 @@ func buildAgentArguments(flags *pflag.FlagSet) ([]string, string) {

// build a list of all supplied flags, that we will pass on to build-agent
flags.Visit(func(flag *pflag.Flag) {
if flag.Name != "org-slug" && flag.Name != "config" && flag.Name != "debug" && flag.Name != "org-id" {
if flag.Name != "build-agent-version" && flag.Name != "org-slug" && flag.Name != "config" && flag.Name != "debug" && flag.Name != "org-id" {
result = append(result, unparseFlag(flags, flag)...)
}
})
Expand All @@ -142,11 +145,11 @@ func buildAgentArguments(flags *pflag.FlagSet) ([]string, string) {
return result, configPath
}

func picardImage(output io.Writer) (string, error) {
func picardImage(output io.Writer, picardVersion string) (string, error) {

fmt.Fprintf(output, "Fetching latest build environment...\n")
sha, err := findLatestPicardSha()

sha, err := getPicardSha(output, picardVersion)
if err != nil {
return "", err
}
Expand All @@ -155,6 +158,31 @@ func picardImage(output io.Writer) (string, error) {
return fmt.Sprintf("%s@%s", picardRepo, sha), nil
}

func getPicardSha(output io.Writer, picardVersion string) (string, error) {
// If the version was passed as argument, we take it
if picardVersion != "" {
return picardVersion, nil
}

var sha string
var err error

sha, err = loadBuildAgentShaFromConfig()
if sha != "" && err == nil {
return sha, nil
}
if err != nil && !os.IsNotExist(err) {
fmt.Fprintf(output, "Unable to parse JSON file %s because: %s\n", buildAgentSettingsPath(), err)
fmt.Fprintf(output, "Falling back to latest build-agent version\n")
}

sha, err = findLatestPicardSha()
if err != nil {
return "", err
}
return sha, nil
}

func ensureDockerIsAvailable() (string, error) {

dockerPath, err := exec.LookPath("docker")
Expand Down Expand Up @@ -196,6 +224,36 @@ func findLatestPicardSha() (string, error) {
return latest, nil
}

type buildAgentSettings struct {
LatestSha256 string
}

func loadBuildAgentShaFromConfig() (string, error) {
if _, err := os.Stat(buildAgentSettingsPath()); os.IsNotExist(err) {
// Settings file does not exist.
return "", nil
}

file, err := os.Open(buildAgentSettingsPath())
if err != nil {
return "", errors.Wrap(err, "Could not open build settings config")
}
defer file.Close()

var settings buildAgentSettings

if err := json.NewDecoder(file).Decode(&settings); err != nil {

return "", errors.Wrap(err, "Could not parse build settings config")
}

return settings.LatestSha256, nil
}

func buildAgentSettingsPath() string {
return path.Join(settings.SettingsPath(), "build_agent_settings.json")
}

// Write data to a temp file, and return the path to that file.
func writeStringToTempFile(data string) (string, error) {
// It's important to specify `/tmp` here as the location of the temp file.
Expand Down

0 comments on commit 162f425

Please sign in to comment.