Skip to content

Commit

Permalink
fix: Put back build-agent customisation
Browse files Browse the repository at this point in the history
  • Loading branch information
JulesFaucherre committed Jun 15, 2023
1 parent b675973 commit 0d9fa65
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 4 deletions.
1 change: 1 addition & 0 deletions cmd/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ func newLocalExecuteCommand(config *settings.Config) *cobra.Command {
}

local.AddFlagsForDocumentation(buildCommand.Flags())
buildCommand.Flags().String("build-agent-version", "", `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().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
70 changes: 66 additions & 4 deletions local/local.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package local

import (
"encoding/json"
"fmt"
"io"
"os"
"os/exec"
"path"
"regexp"
"strings"
"syscall"
Expand Down Expand Up @@ -71,7 +73,8 @@ func Execute(flags *pflag.FlagSet, cfg *settings.Config, args []string) 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 @@ -130,7 +133,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" && flag.Name != "docker-socket-path" {
if flag.Name != "build-agent-version" && flag.Name != "org-slug" && flag.Name != "config" && flag.Name != "debug" && flag.Name != "org-id" && flag.Name != "docker-socket-path" {
result = append(result, unparseFlag(flags, flag)...)
}
})
Expand All @@ -141,10 +144,10 @@ 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 @@ -153,6 +156,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 @@ -247,3 +275,37 @@ func unparseFlag(flags *pflag.FlagSet, flag *pflag.Flag) []string {
}
return result
}

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

buf, err := io.ReadAll(file)
if err != nil {
return "", errors.Wrap(err, "Couldn't read from build settings file")
}

if err = json.Unmarshal(buf, &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")
}

0 comments on commit 0d9fa65

Please sign in to comment.