Skip to content

Commit 9f920bf

Browse files
ipmbclaude
andcommitted
Pass standard CI vars as build args into Docker/buildpack builds
Maps CodeBuild-specific env vars to neutral industry-standard names and injects them into the build environment: - CODEBUILD_WEBHOOK_HEAD_REF (or CODEBUILD_SOURCE_VERSION) → CI_COMMIT_REF - CODEBUILD_RESOLVED_SOURCE_VERSION → CI_COMMIT_SHA - CODEBUILD_START_TIME → CI_BUILD_STARTED_AT - CODEBUILD_SOURCE_REPO_URL → CI_REPOSITORY_URL Closes #13 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent c1cf649 commit 9f920bf

File tree

2 files changed

+70
-0
lines changed

2 files changed

+70
-0
lines changed

builder/build/build.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ func (b *Build) LoadBuildEnv() (map[string]string, error) {
3838
if val, ok := os.LookupEnv("ALLOW_EOL_SHIMMED_BUILDER"); ok {
3939
env["ALLOW_EOL_SHIMMED_BUILDER"] = val
4040
}
41+
// map CodeBuild-specific vars to neutral CI vars and pass as build args
42+
env["CI_COMMIT_REF"] = GetenvFallback([]string{"CODEBUILD_WEBHOOK_HEAD_REF", "CODEBUILD_SOURCE_VERSION"})
43+
env["CI_COMMIT_SHA"] = os.Getenv("CODEBUILD_RESOLVED_SOURCE_VERSION")
44+
env["CI_BUILD_STARTED_AT"] = os.Getenv("CODEBUILD_START_TIME")
45+
env["CI_REPOSITORY_URL"] = os.Getenv("CODEBUILD_SOURCE_REPO_URL")
4146
params, err := b.aws.GetParametersByPath(paths[0])
4247
stripParamPrefix(params, paths[0], &env)
4348
if err != nil {

builder/build/build_test.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,71 @@ func TestLoadEnvInheritance(t *testing.T) {
8080
}
8181
}
8282

83+
func TestLoadBuildEnvCIVars(t *testing.T) {
84+
appName := "test-app"
85+
mockedAWS := new(MockAWS)
86+
appConfigPrefix := fmt.Sprintf("/apppack/apps/%s/config/", appName)
87+
mockedAWS.On("GetParametersByPath", appConfigPrefix).Return(map[string]string{}, nil)
88+
mockedState := emptyState()
89+
mockedState.On("ReadEnvFile").Return(&map[string]string{}, nil)
90+
91+
t.Setenv("CODEBUILD_WEBHOOK_HEAD_REF", "refs/heads/main")
92+
t.Setenv("CODEBUILD_RESOLVED_SOURCE_VERSION", "deadbeef1234")
93+
t.Setenv("CODEBUILD_START_TIME", "1234567890")
94+
t.Setenv("CODEBUILD_SOURCE_REPO_URL", "https://github.com/org/repo")
95+
96+
b := Build{
97+
Appname: appName,
98+
CodebuildBuildId: CodebuildBuildId,
99+
aws: mockedAWS,
100+
state: mockedState,
101+
Ctx: testContext,
102+
}
103+
env, err := b.LoadBuildEnv()
104+
if err != nil {
105+
t.Fatalf("expected no error, got %s", err)
106+
}
107+
if env["CI_COMMIT_REF"] != "refs/heads/main" {
108+
t.Errorf("expected CI_COMMIT_REF=refs/heads/main, got %s", env["CI_COMMIT_REF"])
109+
}
110+
if env["CI_COMMIT_SHA"] != "deadbeef1234" {
111+
t.Errorf("expected CI_COMMIT_SHA=deadbeef1234, got %s", env["CI_COMMIT_SHA"])
112+
}
113+
if env["CI_BUILD_STARTED_AT"] != "1234567890" {
114+
t.Errorf("expected CI_BUILD_STARTED_AT=1234567890, got %s", env["CI_BUILD_STARTED_AT"])
115+
}
116+
if env["CI_REPOSITORY_URL"] != "https://github.com/org/repo" {
117+
t.Errorf("expected CI_REPOSITORY_URL=https://github.com/org/repo, got %s", env["CI_REPOSITORY_URL"])
118+
}
119+
}
120+
121+
func TestLoadBuildEnvCIVarsFallback(t *testing.T) {
122+
// When CODEBUILD_WEBHOOK_HEAD_REF is not set, CI_COMMIT_REF should fall back to CODEBUILD_SOURCE_VERSION
123+
appName := "test-app"
124+
mockedAWS := new(MockAWS)
125+
appConfigPrefix := fmt.Sprintf("/apppack/apps/%s/config/", appName)
126+
mockedAWS.On("GetParametersByPath", appConfigPrefix).Return(map[string]string{}, nil)
127+
mockedState := emptyState()
128+
mockedState.On("ReadEnvFile").Return(&map[string]string{}, nil)
129+
130+
t.Setenv("CODEBUILD_SOURCE_VERSION", "refs/heads/feature-branch")
131+
132+
b := Build{
133+
Appname: appName,
134+
CodebuildBuildId: CodebuildBuildId,
135+
aws: mockedAWS,
136+
state: mockedState,
137+
Ctx: testContext,
138+
}
139+
env, err := b.LoadBuildEnv()
140+
if err != nil {
141+
t.Fatalf("expected no error, got %s", err)
142+
}
143+
if env["CI_COMMIT_REF"] != "refs/heads/feature-branch" {
144+
t.Errorf("expected CI_COMMIT_REF=refs/heads/feature-branch, got %s", env["CI_COMMIT_REF"])
145+
}
146+
}
147+
83148
func TestGenerateDockerEnvStrings(t *testing.T) {
84149
env := map[string]string{
85150
"FOO": "bar",

0 commit comments

Comments
 (0)