Skip to content

Commit 89d8a29

Browse files
authored
fix: tar: do not archive .tfvars (#11208)
1 parent 211e59b commit 89d8a29

File tree

3 files changed

+41
-14
lines changed

3 files changed

+41
-14
lines changed

cli/templatepush.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ func (pf *templateUploadFlags) upload(inv *clibase.Invocation, client *codersdk.
7878

7979
pipeReader, pipeWriter := io.Pipe()
8080
go func() {
81-
err := provisionersdk.Tar(pipeWriter, pf.directory, provisionersdk.TemplateArchiveLimit)
81+
err := provisionersdk.Tar(pipeWriter, inv.Logger, pf.directory, provisionersdk.TemplateArchiveLimit)
8282
_ = pipeWriter.CloseWithError(err)
8383
}()
8484
defer pipeReader.Close()

provisionersdk/archive.go

+10-1
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@ package provisionersdk
22

33
import (
44
"archive/tar"
5+
"context"
56
"io"
67
"os"
78
"path/filepath"
89
"strings"
910

1011
"golang.org/x/xerrors"
1112

13+
"cdr.dev/slog"
14+
1215
"github.com/coder/coder/v2/coderd/util/xio"
1316
)
1417

@@ -39,7 +42,7 @@ func DirHasLockfile(dir string) (bool, error) {
3942
}
4043

4144
// Tar archives a Terraform directory.
42-
func Tar(w io.Writer, directory string, limit int64) error {
45+
func Tar(w io.Writer, logger slog.Logger, directory string, limit int64) error {
4346
// The total bytes written must be under the limit, so use -1
4447
w = xio.NewLimitWriter(w, limit-1)
4548
tarWriter := tar.NewWriter(w)
@@ -94,6 +97,12 @@ func Tar(w io.Writer, directory string, limit int64) error {
9497
}
9598
if strings.Contains(rel, ".tfstate") {
9699
// Don't store tfstate!
100+
logger.Debug(context.Background(), "skip state", slog.F("name", rel))
101+
return nil
102+
}
103+
if rel == "terraform.tfvars" || rel == "terraform.tfvars.json" || strings.HasSuffix(rel, ".auto.tfvars") || strings.HasSuffix(rel, ".auto.tfvars.json") {
104+
// Don't store .tfvars, as Coder uses their own variables file.
105+
logger.Debug(context.Background(), "skip variable definitions", slog.F("name", rel))
97106
return nil
98107
}
99108
// Use unix paths in the tar archive.

provisionersdk/archive_test.go

+30-12
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,16 @@ import (
1010

1111
"github.com/stretchr/testify/require"
1212

13+
"cdr.dev/slog/sloggers/slogtest"
14+
1315
"github.com/coder/coder/v2/provisionersdk"
1416
)
1517

1618
func TestTar(t *testing.T) {
1719
t.Parallel()
20+
21+
log := slogtest.Make(t, &slogtest.Options{IgnoreErrors: true})
22+
1823
t.Run("NoFollowSymlink", func(t *testing.T) {
1924
t.Parallel()
2025
dir := t.TempDir()
@@ -28,7 +33,7 @@ func TestTar(t *testing.T) {
2833
err = os.Symlink("no-exists", filepath.Join(dir, "link"))
2934
require.NoError(t, err)
3035

31-
err = provisionersdk.Tar(io.Discard, dir, 1024*1024)
36+
err = provisionersdk.Tar(io.Discard, log, dir, 1024*1024)
3237
require.NoError(t, err)
3338
})
3439
t.Run("HeaderBreakLimit", func(t *testing.T) {
@@ -38,7 +43,7 @@ func TestTar(t *testing.T) {
3843
require.NoError(t, err)
3944
_ = file.Close()
4045
// A header is 512 bytes
41-
err = provisionersdk.Tar(io.Discard, dir, 100)
46+
err = provisionersdk.Tar(io.Discard, log, dir, 100)
4247
require.Error(t, err)
4348
})
4449
t.Run("HeaderAndContent", func(t *testing.T) {
@@ -49,11 +54,11 @@ func TestTar(t *testing.T) {
4954
_, _ = file.Write(make([]byte, 100))
5055
_ = file.Close()
5156
// Pay + header is 1024 bytes (padding)
52-
err = provisionersdk.Tar(io.Discard, dir, 1025)
57+
err = provisionersdk.Tar(io.Discard, log, dir, 1025)
5358
require.NoError(t, err)
5459

5560
// Limit is 1 byte too small (n == limit is a failure, must be under)
56-
err = provisionersdk.Tar(io.Discard, dir, 1024)
61+
err = provisionersdk.Tar(io.Discard, log, dir, 1024)
5762
require.Error(t, err)
5863
})
5964

@@ -63,7 +68,7 @@ func TestTar(t *testing.T) {
6368
file, err := os.CreateTemp(dir, "")
6469
require.NoError(t, err)
6570
_ = file.Close()
66-
err = provisionersdk.Tar(io.Discard, dir, 1024)
71+
err = provisionersdk.Tar(io.Discard, log, dir, 1024)
6772
require.Error(t, err)
6873
})
6974
t.Run("Valid", func(t *testing.T) {
@@ -72,7 +77,7 @@ func TestTar(t *testing.T) {
7277
file, err := os.CreateTemp(dir, "*.tf")
7378
require.NoError(t, err)
7479
_ = file.Close()
75-
err = provisionersdk.Tar(io.Discard, dir, 1024)
80+
err = provisionersdk.Tar(io.Discard, log, dir, 1024)
7681
require.NoError(t, err)
7782
})
7883
t.Run("ValidJSON", func(t *testing.T) {
@@ -81,7 +86,7 @@ func TestTar(t *testing.T) {
8186
file, err := os.CreateTemp(dir, "*.tf.json")
8287
require.NoError(t, err)
8388
_ = file.Close()
84-
err = provisionersdk.Tar(io.Discard, dir, 1024)
89+
err = provisionersdk.Tar(io.Discard, log, dir, 1024)
8590
require.NoError(t, err)
8691
})
8792
t.Run("HiddenFiles", func(t *testing.T) {
@@ -122,6 +127,18 @@ func TestTar(t *testing.T) {
122127
}, {
123128
Name: "terraform.tfstate",
124129
Archives: false,
130+
}, {
131+
Name: "terraform.tfvars",
132+
Archives: false,
133+
}, {
134+
Name: "terraform.tfvars.json",
135+
Archives: false,
136+
}, {
137+
Name: "*.auto.tfvars",
138+
Archives: false,
139+
}, {
140+
Name: "*.auto.tfvars.json",
141+
Archives: false,
125142
},
126143
}
127144
for _, file := range files {
@@ -149,31 +166,32 @@ func TestTar(t *testing.T) {
149166
}
150167
archive := new(bytes.Buffer)
151168
// Headers are chonky so raise the limit to something reasonable
152-
err := provisionersdk.Tar(archive, dir, 1024<<2)
169+
err := provisionersdk.Tar(archive, log, dir, 1024<<3)
153170
require.NoError(t, err)
154171
dir = t.TempDir()
155172
err = provisionersdk.Untar(dir, archive)
156173
require.NoError(t, err)
157174
for _, file := range files {
158175
_, err = os.Stat(filepath.Join(dir, file.Name))
159-
t.Logf("stat %q %+v", file.Name, err)
160176
if file.Archives {
161-
require.NoError(t, err)
177+
require.NoError(t, err, "stat %q, got error: %+v", file.Name, err)
162178
} else {
163-
require.ErrorIs(t, err, os.ErrNotExist)
179+
require.ErrorIs(t, err, os.ErrNotExist, "stat %q, expected ErrNotExist, got: %+v", file.Name, err)
164180
}
165181
}
166182
})
167183
}
168184

169185
func TestUntar(t *testing.T) {
170186
t.Parallel()
187+
log := slogtest.Make(t, &slogtest.Options{IgnoreErrors: true})
188+
171189
dir := t.TempDir()
172190
file, err := os.CreateTemp(dir, "*.tf")
173191
require.NoError(t, err)
174192
_ = file.Close()
175193
archive := new(bytes.Buffer)
176-
err = provisionersdk.Tar(archive, dir, 1024)
194+
err = provisionersdk.Tar(archive, log, dir, 1024)
177195
require.NoError(t, err)
178196
dir = t.TempDir()
179197
err = provisionersdk.Untar(dir, archive)

0 commit comments

Comments
 (0)