Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit085d462

Browse files
feat: improve terraform lock file change detection
Based on review feedback from@johnstcn, this commit improves theterraform lock file change detection by:1. **Logging actual diff**: Instead of just checksums, now logs the actual differences in the lock file, providing actionable troubleshooting information.2. **Neutral messaging**: Changed from WARNING to INFO level with neutral language that doesn't assume the cause of changes.3. **Official documentation**: Links to HashiCorp's official documentation about lock file changes instead of making assumptions about the cause.4. **Better user experience**: Users get helpful diff output and can understand what changed and why, rather than being sent down a potentially incorrect troubleshooting path.The implementation now:- Saves the original lock file before terraform init- Generates a simple diff showing added/removed lines- Provides informative messaging with official docs link- Includes comprehensive test coverageCo-authored-by: kylecarbs <7122116+kylecarbs@users.noreply.github.com>
1 parentb397d1e commit085d462

File tree

2 files changed

+111
-18
lines changed

2 files changed

+111
-18
lines changed

‎provisioner/terraform/executor.go

Lines changed: 73 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -224,9 +224,15 @@ func (e *executor) init(ctx, killCtx context.Context, logr logSink) error {
224224
e.mut.Lock()
225225
defere.mut.Unlock()
226226

227-
//Calculate checksum of.terraform.lock.hcl before running terraform init
227+
//Save.terraform.lock.hcl content before running terraform init
228228
lockFilePath:=getTerraformLockFilePath(e.workdir)
229-
preInitChecksum:=calculateFileChecksum(lockFilePath)
229+
preInitLockFile:=lockFilePath+".pre-init"
230+
231+
// Copy the lock file if it exists
232+
iflockFileData,err:=os.ReadFile(lockFilePath);err==nil {
233+
_=os.WriteFile(preInitLockFile,lockFileData,0644)
234+
deferos.Remove(preInitLockFile)// Clean up temporary file
235+
}
230236

231237
outWriter,doneOut:=logWriter(logr,proto.LogLevel_DEBUG)
232238
errWriter,doneErr:=logWriter(logr,proto.LogLevel_ERROR)
@@ -250,26 +256,23 @@ func (e *executor) init(ctx, killCtx context.Context, logr logSink) error {
250256
err:=e.execWriteOutput(ctx,killCtx,args,e.basicEnv(),outWriter,errBuf)
251257

252258
// Check if .terraform.lock.hcl was modified after terraform init
253-
postInitChecksum:=calculateFileChecksum(lockFilePath)
254-
ifpreInitChecksum!=""&&postInitChecksum!=""&&preInitChecksum!=postInitChecksum {
255-
// Logwarningabout lock file changes
256-
warningMsg:="WARNING: .terraform.lock.hcl was modified during 'terraform init'. "+
257-
"Thismay indicate that provider hashes are missing for your target architecture. "+
258-
"Consider regenerating thelockfile on the same OS/architecture as your Coder instance "+
259-
"to improve provisioning performance and avoid unnecessary provider downloads."
260-
261-
// Writewarningtobothdebugand error streams to ensure visibility
259+
diff:=generateFileDiff(preInitLockFile,lockFilePath)
260+
ifdiff!="" {
261+
// Loginformational messageabout lock file changes with diff
262+
infoMsg:="INFO: .terraform.lock.hcl was modified during 'terraform init'. "+
263+
"Thisis normal when Terraform downloads providers or updates dependencies. "+
264+
"See https://developer.hashicorp.com/terraform/language/files/dependency-lock#understanding-lock-file-changes "+
265+
"for more information about lock file changes."
266+
267+
// Writeinfo messageto debugstream
262268
ifoutWriter!=nil {
263-
_,_=outWriter.Write([]byte(warningMsg+"\n"))
264-
}
265-
iferrWriter!=nil {
266-
_,_=errWriter.Write([]byte(warningMsg+"\n"))
269+
_,_=outWriter.Write([]byte(infoMsg+"\n"))
270+
_,_=outWriter.Write([]byte("\nLock file changes:\n"+diff+"\n"))
267271
}
268272

269-
e.logger.Warn(ctx,"terraform lock file modified during init",
273+
e.logger.Info(ctx,"terraform lock file modified during init",
270274
slog.F("lock_file_path",lockFilePath),
271-
slog.F("pre_init_checksum",preInitChecksum),
272-
slog.F("post_init_checksum",postInitChecksum),
275+
slog.F("diff",diff),
273276
)
274277
}
275278

@@ -305,6 +308,58 @@ func calculateFileChecksum(filePath string) string {
305308
returnhex.EncodeToString(hash[:])
306309
}
307310

311+
// generateFileDiff generates a simple diff between two file contents.
312+
// Returns empty string if files can't be read or are identical.
313+
funcgenerateFileDiff(beforePath,afterPathstring)string {
314+
beforeData,err:=os.ReadFile(beforePath)
315+
iferr!=nil {
316+
return""
317+
}
318+
afterData,err:=os.ReadFile(afterPath)
319+
iferr!=nil {
320+
return""
321+
}
322+
323+
ifbytes.Equal(beforeData,afterData) {
324+
return""
325+
}
326+
327+
// Simple line-by-line diff
328+
beforeLines:=strings.Split(string(beforeData),"\n")
329+
afterLines:=strings.Split(string(afterData),"\n")
330+
331+
vardiff strings.Builder
332+
diff.WriteString("--- .terraform.lock.hcl (before terraform init)\n")
333+
diff.WriteString("+++ .terraform.lock.hcl (after terraform init)\n")
334+
335+
// Simple diff showing added/removed lines
336+
beforeMap:=make(map[string]bool)
337+
for_,line:=rangebeforeLines {
338+
beforeMap[line]=true
339+
}
340+
341+
afterMap:=make(map[string]bool)
342+
for_,line:=rangeafterLines {
343+
afterMap[line]=true
344+
}
345+
346+
// Show removed lines
347+
for_,line:=rangebeforeLines {
348+
if!afterMap[line]&&strings.TrimSpace(line)!="" {
349+
diff.WriteString("- "+line+"\n")
350+
}
351+
}
352+
353+
// Show added lines
354+
for_,line:=rangeafterLines {
355+
if!beforeMap[line]&&strings.TrimSpace(line)!="" {
356+
diff.WriteString("+ "+line+"\n")
357+
}
358+
}
359+
360+
returndiff.String()
361+
}
362+
308363
// revive:disable-next-line:flag-parameter
309364
func (e*executor)plan(ctx,killCtx context.Context,env,vars []string,logrlogSink,metadata*proto.Metadata) (*proto.PlanComplete,error) {
310365
ctx,span:=e.server.startTrace(ctx,tracing.FuncName())

‎provisioner/terraform/executor_internal_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,3 +216,41 @@ func TestCalculateFileChecksum(t *testing.T) {
216216
require.NotEqual(t,checksum1,checksum3)
217217
require.Len(t,checksum3,64)
218218
}
219+
220+
funcTestGenerateFileDiff(t*testing.T) {
221+
t.Parallel()
222+
223+
tmpDir:=t.TempDir()
224+
file1:=filepath.Join(tmpDir,"file1.txt")
225+
file2:=filepath.Join(tmpDir,"file2.txt")
226+
227+
// Test with non-existent files
228+
diff:=generateFileDiff("/non/existent/file1","/non/existent/file2")
229+
require.Equal(t,"",diff)
230+
231+
// Test with identical files
232+
content:="line1\nline2\nline3"
233+
err:=os.WriteFile(file1, []byte(content),0644)
234+
require.NoError(t,err)
235+
err=os.WriteFile(file2, []byte(content),0644)
236+
require.NoError(t,err)
237+
238+
diff=generateFileDiff(file1,file2)
239+
require.Equal(t,"",diff)
240+
241+
// Test with different files
242+
content1:="line1\nline2\nline3"
243+
content2:="line1\nmodified line2\nline3\nnew line4"
244+
err=os.WriteFile(file1, []byte(content1),0644)
245+
require.NoError(t,err)
246+
err=os.WriteFile(file2, []byte(content2),0644)
247+
require.NoError(t,err)
248+
249+
diff=generateFileDiff(file1,file2)
250+
require.NotEmpty(t,diff)
251+
require.Contains(t,diff,"--- .terraform.lock.hcl (before terraform init)")
252+
require.Contains(t,diff,"+++ .terraform.lock.hcl (after terraform init)")
253+
require.Contains(t,diff,"- line2")
254+
require.Contains(t,diff,"+ modified line2")
255+
require.Contains(t,diff,"+ new line4")
256+
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp