Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions builder/build/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@ func (b *Build) LoadBuildEnv() (map[string]string, error) {
if val, ok := os.LookupEnv("ALLOW_EOL_SHIMMED_BUILDER"); ok {
env["ALLOW_EOL_SHIMMED_BUILDER"] = val
}
// map CodeBuild-specific vars to neutral CI vars and pass as build args
env["CI_COMMIT_REF"] = GetenvFallback([]string{"CODEBUILD_WEBHOOK_HEAD_REF", "CODEBUILD_SOURCE_VERSION"})
env["CI_COMMIT_SHA"] = os.Getenv("CODEBUILD_RESOLVED_SOURCE_VERSION")
env["CI_BUILD_STARTED_AT"] = os.Getenv("CODEBUILD_START_TIME")
env["CI_REPOSITORY_URL"] = os.Getenv("CODEBUILD_SOURCE_REPO_URL")
params, err := b.aws.GetParametersByPath(paths[0])
stripParamPrefix(params, paths[0], &env)
if err != nil {
Expand Down
65 changes: 65 additions & 0 deletions builder/build/build_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,71 @@ func TestLoadEnvInheritance(t *testing.T) {
}
}

func TestLoadBuildEnvCIVars(t *testing.T) {
appName := "test-app"
mockedAWS := new(MockAWS)
appConfigPrefix := fmt.Sprintf("/apppack/apps/%s/config/", appName)
mockedAWS.On("GetParametersByPath", appConfigPrefix).Return(map[string]string{}, nil)
mockedState := emptyState()
mockedState.On("ReadEnvFile").Return(&map[string]string{}, nil)

t.Setenv("CODEBUILD_WEBHOOK_HEAD_REF", "refs/heads/main")
t.Setenv("CODEBUILD_RESOLVED_SOURCE_VERSION", "deadbeef1234")
t.Setenv("CODEBUILD_START_TIME", "1234567890")
t.Setenv("CODEBUILD_SOURCE_REPO_URL", "https://github.com/org/repo")

b := Build{
Appname: appName,
CodebuildBuildId: CodebuildBuildId,
aws: mockedAWS,
state: mockedState,
Ctx: testContext,
}
env, err := b.LoadBuildEnv()
if err != nil {
t.Fatalf("expected no error, got %s", err)
}
if env["CI_COMMIT_REF"] != "refs/heads/main" {
t.Errorf("expected CI_COMMIT_REF=refs/heads/main, got %s", env["CI_COMMIT_REF"])
}
if env["CI_COMMIT_SHA"] != "deadbeef1234" {
t.Errorf("expected CI_COMMIT_SHA=deadbeef1234, got %s", env["CI_COMMIT_SHA"])
}
if env["CI_BUILD_STARTED_AT"] != "1234567890" {
t.Errorf("expected CI_BUILD_STARTED_AT=1234567890, got %s", env["CI_BUILD_STARTED_AT"])
}
if env["CI_REPOSITORY_URL"] != "https://github.com/org/repo" {
t.Errorf("expected CI_REPOSITORY_URL=https://github.com/org/repo, got %s", env["CI_REPOSITORY_URL"])
}
}

func TestLoadBuildEnvCIVarsFallback(t *testing.T) {
// When CODEBUILD_WEBHOOK_HEAD_REF is not set, CI_COMMIT_REF should fall back to CODEBUILD_SOURCE_VERSION
appName := "test-app"
mockedAWS := new(MockAWS)
appConfigPrefix := fmt.Sprintf("/apppack/apps/%s/config/", appName)
mockedAWS.On("GetParametersByPath", appConfigPrefix).Return(map[string]string{}, nil)
mockedState := emptyState()
mockedState.On("ReadEnvFile").Return(&map[string]string{}, nil)

t.Setenv("CODEBUILD_SOURCE_VERSION", "refs/heads/feature-branch")

b := Build{
Appname: appName,
CodebuildBuildId: CodebuildBuildId,
aws: mockedAWS,
state: mockedState,
Ctx: testContext,
}
env, err := b.LoadBuildEnv()
if err != nil {
t.Fatalf("expected no error, got %s", err)
}
if env["CI_COMMIT_REF"] != "refs/heads/feature-branch" {
t.Errorf("expected CI_COMMIT_REF=refs/heads/feature-branch, got %s", env["CI_COMMIT_REF"])
}
}

func TestGenerateDockerEnvStrings(t *testing.T) {
env := map[string]string{
"FOO": "bar",
Expand Down
Loading