github.com/ahmet2mir/goreleaser@v0.180.3-0.20210927151101-8e5ee5a9b8c5/internal/exec/exec_test.go (about) 1 package exec 2 3 import ( 4 "fmt" 5 "os" 6 "path/filepath" 7 "testing" 8 9 "github.com/goreleaser/goreleaser/internal/artifact" 10 "github.com/goreleaser/goreleaser/pkg/config" 11 "github.com/goreleaser/goreleaser/pkg/context" 12 "github.com/stretchr/testify/require" 13 ) 14 15 func TestExecute(t *testing.T) { 16 ctx := context.New(config.Project{ 17 ProjectName: "blah", 18 Archives: []config.Archive{ 19 { 20 Replacements: map[string]string{ 21 "linux": "Linux", 22 }, 23 }, 24 }, 25 }) 26 ctx.Env["TEST_A_SECRET"] = "x" 27 ctx.Env["TEST_A_USERNAME"] = "u2" 28 ctx.Version = "2.1.0" 29 30 // Preload artifacts 31 ctx.Artifacts = artifact.New() 32 folder := t.TempDir() 33 for _, a := range []struct { 34 id string 35 ext string 36 typ artifact.Type 37 }{ 38 {"debpkg", "deb", artifact.LinuxPackage}, 39 {"binary", "bin", artifact.Binary}, 40 {"archive", "tar", artifact.UploadableArchive}, 41 {"ubinary", "ubi", artifact.UploadableBinary}, 42 {"checksum", "sum", artifact.Checksum}, 43 {"signature", "sig", artifact.Signature}, 44 } { 45 file := filepath.Join(folder, "a."+a.ext) 46 require.NoError(t, os.WriteFile(file, []byte("lorem ipsum"), 0o644)) 47 ctx.Artifacts.Add(&artifact.Artifact{ 48 Name: "a." + a.ext, 49 Goos: "linux", 50 Goarch: "amd64", 51 Path: file, 52 Type: a.typ, 53 Extra: map[string]interface{}{ 54 "ID": a.id, 55 }, 56 }) 57 } 58 59 ctx.Artifacts.Add(&artifact.Artifact{ 60 Name: "foo/bar:amd64", 61 Goos: "linux", 62 Goarch: "amd64", 63 Path: "foo/bar:amd64", 64 Type: artifact.DockerImage, 65 Extra: map[string]interface{}{ 66 "ID": "img", 67 }, 68 }) 69 ctx.Artifacts.Add(&artifact.Artifact{ 70 Name: "foo/bar", 71 Path: "foo/bar", 72 Type: artifact.DockerManifest, 73 Extra: map[string]interface{}{ 74 "ID": "mnf", 75 }, 76 }) 77 78 osEnv := func(ignores ...string) []string { 79 var result []string 80 outer: 81 for _, key := range passthroughEnvVars { 82 for _, ignore := range ignores { 83 if key == ignore { 84 continue outer 85 } 86 } 87 if value := os.Getenv(key); value != "" { 88 result = append(result, key+"="+value) 89 } 90 } 91 return result 92 } 93 94 testCases := []struct { 95 name string 96 publishers []config.Publisher 97 expectErr error 98 }{ 99 { 100 "filter by IDs", 101 []config.Publisher{ 102 { 103 Name: "test", 104 IDs: []string{"archive"}, 105 Cmd: MockCmd + " {{ .ArtifactName }}", 106 Env: []string{ 107 MarshalMockEnv(&MockData{ 108 AnyOf: []MockCall{ 109 {ExpectedArgs: []string{"a.tar"}, ExitCode: 0, ExpectedEnv: osEnv()}, 110 }, 111 }), 112 }, 113 }, 114 }, 115 nil, 116 }, 117 { 118 "no filter", 119 []config.Publisher{ 120 { 121 Name: "test", 122 Cmd: MockCmd + " {{ .ArtifactName }}", 123 Env: []string{ 124 MarshalMockEnv(&MockData{ 125 AnyOf: []MockCall{ 126 {ExpectedArgs: []string{"a.deb"}, ExitCode: 0, ExpectedEnv: osEnv()}, 127 {ExpectedArgs: []string{"a.ubi"}, ExitCode: 0, ExpectedEnv: osEnv()}, 128 {ExpectedArgs: []string{"a.tar"}, ExitCode: 0, ExpectedEnv: osEnv()}, 129 {ExpectedArgs: []string{"foo/bar"}, ExitCode: 0, ExpectedEnv: osEnv()}, 130 {ExpectedArgs: []string{"foo/bar:amd64"}, ExitCode: 0, ExpectedEnv: osEnv()}, 131 }, 132 }), 133 }, 134 }, 135 }, 136 nil, 137 }, 138 { 139 "include checksum", 140 []config.Publisher{ 141 { 142 Name: "test", 143 Checksum: true, 144 Cmd: MockCmd + " {{ .ArtifactName }}", 145 Env: []string{ 146 MarshalMockEnv(&MockData{ 147 AnyOf: []MockCall{ 148 {ExpectedArgs: []string{"a.deb"}, ExitCode: 0, ExpectedEnv: osEnv()}, 149 {ExpectedArgs: []string{"a.ubi"}, ExitCode: 0, ExpectedEnv: osEnv()}, 150 {ExpectedArgs: []string{"a.tar"}, ExitCode: 0, ExpectedEnv: osEnv()}, 151 {ExpectedArgs: []string{"a.sum"}, ExitCode: 0, ExpectedEnv: osEnv()}, 152 {ExpectedArgs: []string{"foo/bar"}, ExitCode: 0, ExpectedEnv: osEnv()}, 153 {ExpectedArgs: []string{"foo/bar:amd64"}, ExitCode: 0, ExpectedEnv: osEnv()}, 154 }, 155 }), 156 }, 157 }, 158 }, 159 nil, 160 }, 161 { 162 "include signatures", 163 []config.Publisher{ 164 { 165 Name: "test", 166 Signature: true, 167 Cmd: MockCmd + " {{ .ArtifactName }}", 168 Env: []string{ 169 MarshalMockEnv(&MockData{ 170 AnyOf: []MockCall{ 171 {ExpectedArgs: []string{"a.deb"}, ExitCode: 0, ExpectedEnv: osEnv()}, 172 {ExpectedArgs: []string{"a.ubi"}, ExitCode: 0, ExpectedEnv: osEnv()}, 173 {ExpectedArgs: []string{"a.tar"}, ExitCode: 0, ExpectedEnv: osEnv()}, 174 {ExpectedArgs: []string{"a.sig"}, ExitCode: 0, ExpectedEnv: osEnv()}, 175 {ExpectedArgs: []string{"foo/bar"}, ExitCode: 0, ExpectedEnv: osEnv()}, 176 {ExpectedArgs: []string{"foo/bar:amd64"}, ExitCode: 0, ExpectedEnv: osEnv()}, 177 }, 178 }), 179 }, 180 }, 181 }, 182 nil, 183 }, 184 { 185 "docker", 186 []config.Publisher{ 187 { 188 Name: "test", 189 IDs: []string{"img", "mnf"}, 190 Cmd: MockCmd + " {{ .ArtifactName }}", 191 Env: []string{ 192 MarshalMockEnv(&MockData{ 193 AnyOf: []MockCall{ 194 {ExpectedArgs: []string{"foo/bar"}, ExitCode: 0, ExpectedEnv: osEnv()}, 195 {ExpectedArgs: []string{"foo/bar:amd64"}, ExitCode: 0, ExpectedEnv: osEnv()}, 196 }, 197 }), 198 }, 199 }, 200 }, 201 nil, 202 }, 203 { 204 "try dir templating", 205 []config.Publisher{ 206 { 207 Name: "test", 208 Signature: true, 209 IDs: []string{"debpkg"}, 210 Dir: "{{ dir .ArtifactPath }}", 211 Cmd: MockCmd + " {{ .ArtifactName }}", 212 Env: []string{ 213 MarshalMockEnv(&MockData{ 214 AnyOf: []MockCall{ 215 {ExpectedArgs: []string{"a.deb"}, ExitCode: 0, ExpectedEnv: osEnv()}, 216 }, 217 }), 218 }, 219 }, 220 }, 221 nil, 222 }, 223 { 224 "check env templating", 225 []config.Publisher{ 226 { 227 Name: "test", 228 IDs: []string{"debpkg"}, 229 Cmd: MockCmd, 230 Env: []string{ 231 "PROJECT={{.ProjectName}}", 232 "ARTIFACT={{.ArtifactName}}", 233 "SECRET={{.Env.TEST_A_SECRET}}", 234 MarshalMockEnv(&MockData{ 235 AnyOf: []MockCall{ 236 { 237 ExpectedEnv: append( 238 []string{"PROJECT=blah", "ARTIFACT=a.deb", "SECRET=x"}, 239 osEnv()..., 240 ), 241 ExitCode: 0, 242 }, 243 }, 244 }), 245 }, 246 }, 247 }, 248 nil, 249 }, 250 { 251 "override path", 252 []config.Publisher{ 253 { 254 Name: "test", 255 IDs: []string{"debpkg"}, 256 Cmd: MockCmd, 257 Env: []string{ 258 "PATH=/something-else", 259 MarshalMockEnv(&MockData{ 260 AnyOf: []MockCall{ 261 { 262 ExpectedEnv: append( 263 []string{"PATH=/something-else"}, 264 osEnv("PATH")..., 265 ), 266 ExitCode: 0, 267 }, 268 }, 269 }), 270 }, 271 }, 272 }, 273 nil, 274 }, 275 { 276 "command error", 277 []config.Publisher{ 278 { 279 Name: "test", 280 IDs: []string{"debpkg"}, 281 Cmd: MockCmd + " {{.ArtifactName}}", 282 Env: []string{ 283 MarshalMockEnv(&MockData{ 284 AnyOf: []MockCall{ 285 { 286 ExpectedArgs: []string{"a.deb"}, 287 ExpectedEnv: osEnv(), 288 Stderr: "test error", 289 ExitCode: 1, 290 }, 291 }, 292 }), 293 }, 294 }, 295 }, 296 // stderr is sent to output via logger 297 fmt.Errorf(`publishing: %s failed: exit status 1: test error`, MockCmd), 298 }, 299 } 300 301 for i, tc := range testCases { 302 t.Run(fmt.Sprintf("%d-%s", i, tc.name), func(t *testing.T) { 303 err := Execute(ctx, tc.publishers) 304 if tc.expectErr == nil { 305 require.NoError(t, err) 306 return 307 } 308 require.Error(t, err) 309 require.Equal(t, tc.expectErr.Error(), err.Error()) 310 }) 311 } 312 }