github.com/triarius/goreleaser@v1.12.5/internal/pipe/release/release_test.go (about) 1 package release 2 3 import ( 4 "os" 5 "path/filepath" 6 "strings" 7 "testing" 8 9 "github.com/triarius/goreleaser/internal/artifact" 10 "github.com/triarius/goreleaser/internal/client" 11 "github.com/triarius/goreleaser/internal/testlib" 12 "github.com/triarius/goreleaser/pkg/config" 13 "github.com/triarius/goreleaser/pkg/context" 14 "github.com/stretchr/testify/require" 15 ) 16 17 func TestPipeDescription(t *testing.T) { 18 require.NotEmpty(t, Pipe{}.String()) 19 } 20 21 func createTmpFile(tb testing.TB, folder, path string) string { 22 tb.Helper() 23 f, err := os.Create(filepath.Join(folder, path)) 24 require.NoError(tb, err) 25 require.NoError(tb, f.Close()) 26 return f.Name() 27 } 28 29 func TestRunPipeWithoutIDsThenDoesNotFilter(t *testing.T) { 30 folder := t.TempDir() 31 tarfile := createTmpFile(t, folder, "bin.tar.gz") 32 srcfile := createTmpFile(t, folder, "source.tar.gz") 33 debfile := createTmpFile(t, folder, "bin.deb") 34 checksumfile := createTmpFile(t, folder, "checksum") 35 checksumsigfile := createTmpFile(t, folder, "checksum.sig") 36 checksumpemfile := createTmpFile(t, folder, "checksum.pem") 37 filteredtarfile := createTmpFile(t, folder, "filtered.tar.gz") 38 filtereddebfile := createTmpFile(t, folder, "filtered.deb") 39 40 config := config.Project{ 41 Dist: folder, 42 Release: config.Release{ 43 GitHub: config.Repo{ 44 Owner: "test", 45 Name: "test", 46 }, 47 }, 48 } 49 ctx := context.New(config) 50 ctx.Git = context.GitInfo{CurrentTag: "v1.0.0"} 51 ctx.Artifacts.Add(&artifact.Artifact{ 52 Type: artifact.UploadableArchive, 53 Name: "bin.tar.gz", 54 Path: tarfile, 55 Extra: map[string]interface{}{ 56 artifact.ExtraID: "foo", 57 }, 58 }) 59 ctx.Artifacts.Add(&artifact.Artifact{ 60 Type: artifact.LinuxPackage, 61 Name: "bin.deb", 62 Path: debfile, 63 Extra: map[string]interface{}{ 64 artifact.ExtraID: "foo", 65 }, 66 }) 67 ctx.Artifacts.Add(&artifact.Artifact{ 68 Type: artifact.UploadableArchive, 69 Name: "filtered.tar.gz", 70 Path: filteredtarfile, 71 Extra: map[string]interface{}{ 72 artifact.ExtraID: "bar", 73 }, 74 }) 75 ctx.Artifacts.Add(&artifact.Artifact{ 76 Type: artifact.LinuxPackage, 77 Name: "filtered.deb", 78 Path: filtereddebfile, 79 Extra: map[string]interface{}{ 80 artifact.ExtraID: "bar", 81 }, 82 }) 83 ctx.Artifacts.Add(&artifact.Artifact{ 84 Type: artifact.UploadableSourceArchive, 85 Name: "source.tar.gz", 86 Path: srcfile, 87 Extra: map[string]interface{}{ 88 artifact.ExtraFormat: "tar.gz", 89 }, 90 }) 91 92 ctx.Artifacts.Add(&artifact.Artifact{ 93 Type: artifact.Checksum, 94 Name: "checksum", 95 Path: checksumfile, 96 Extra: map[string]interface{}{ 97 artifact.ExtraID: "bar", 98 }, 99 }) 100 ctx.Artifacts.Add(&artifact.Artifact{ 101 Type: artifact.Signature, 102 Name: "checksum.sig", 103 Path: checksumsigfile, 104 Extra: map[string]interface{}{ 105 artifact.ExtraID: "bar", 106 }, 107 }) 108 ctx.Artifacts.Add(&artifact.Artifact{ 109 Type: artifact.Certificate, 110 Name: "checksum.pem", 111 Path: checksumpemfile, 112 Extra: map[string]interface{}{ 113 artifact.ExtraID: "bar", 114 }, 115 }) 116 client := &client.Mock{} 117 require.NoError(t, doPublish(ctx, client)) 118 require.True(t, client.CreatedRelease) 119 require.True(t, client.UploadedFile) 120 require.Contains(t, client.UploadedFileNames, "source.tar.gz") 121 require.Contains(t, client.UploadedFileNames, "bin.deb") 122 require.Contains(t, client.UploadedFileNames, "bin.tar.gz") 123 require.Contains(t, client.UploadedFileNames, "filtered.deb") 124 require.Contains(t, client.UploadedFileNames, "filtered.tar.gz") 125 require.Contains(t, client.UploadedFileNames, "checksum") 126 require.Contains(t, client.UploadedFileNames, "checksum.pem") 127 require.Contains(t, client.UploadedFileNames, "checksum.sig") 128 } 129 130 func TestRunPipeWithIDsThenFilters(t *testing.T) { 131 folder := t.TempDir() 132 tarfile, err := os.Create(filepath.Join(folder, "bin.tar.gz")) 133 require.NoError(t, err) 134 require.NoError(t, tarfile.Close()) 135 debfile, err := os.Create(filepath.Join(folder, "bin.deb")) 136 require.NoError(t, err) 137 require.NoError(t, debfile.Close()) 138 filteredtarfile, err := os.Create(filepath.Join(folder, "filtered.tar.gz")) 139 require.NoError(t, err) 140 require.NoError(t, filteredtarfile.Close()) 141 filtereddebfile, err := os.Create(filepath.Join(folder, "filtered.deb")) 142 require.NoError(t, err) 143 require.NoError(t, filtereddebfile.Close()) 144 145 config := config.Project{ 146 Dist: folder, 147 Release: config.Release{ 148 GitHub: config.Repo{ 149 Owner: "test", 150 Name: "test", 151 }, 152 IDs: []string{"foo"}, 153 ExtraFiles: []config.ExtraFile{ 154 {Glob: "./testdata/**/*"}, 155 }, 156 }, 157 } 158 ctx := context.New(config) 159 ctx.Git = context.GitInfo{CurrentTag: "v1.0.0"} 160 ctx.Artifacts.Add(&artifact.Artifact{ 161 Type: artifact.UploadableArchive, 162 Name: "bin.tar.gz", 163 Path: tarfile.Name(), 164 Extra: map[string]interface{}{ 165 artifact.ExtraID: "foo", 166 }, 167 }) 168 ctx.Artifacts.Add(&artifact.Artifact{ 169 Type: artifact.LinuxPackage, 170 Name: "bin.deb", 171 Path: debfile.Name(), 172 Extra: map[string]interface{}{ 173 artifact.ExtraID: "foo", 174 }, 175 }) 176 ctx.Artifacts.Add(&artifact.Artifact{ 177 Type: artifact.UploadableArchive, 178 Name: "filtered.tar.gz", 179 Path: filteredtarfile.Name(), 180 Extra: map[string]interface{}{ 181 artifact.ExtraID: "bar", 182 }, 183 }) 184 ctx.Artifacts.Add(&artifact.Artifact{ 185 Type: artifact.LinuxPackage, 186 Name: "filtered.deb", 187 Path: filtereddebfile.Name(), 188 Extra: map[string]interface{}{ 189 artifact.ExtraID: "bar", 190 }, 191 }) 192 client := &client.Mock{} 193 require.NoError(t, doPublish(ctx, client)) 194 require.True(t, client.CreatedRelease) 195 require.True(t, client.UploadedFile) 196 require.Contains(t, client.UploadedFileNames, "bin.deb") 197 require.Contains(t, client.UploadedFileNames, "bin.tar.gz") 198 require.Contains(t, client.UploadedFileNames, "f1") 199 require.NotContains(t, client.UploadedFileNames, "filtered.deb") 200 require.NotContains(t, client.UploadedFileNames, "filtered.tar.gz") 201 } 202 203 func TestRunPipeReleaseCreationFailed(t *testing.T) { 204 config := config.Project{ 205 Release: config.Release{ 206 GitHub: config.Repo{ 207 Owner: "test", 208 Name: "test", 209 }, 210 }, 211 } 212 ctx := context.New(config) 213 ctx.Git = context.GitInfo{CurrentTag: "v1.0.0"} 214 client := &client.Mock{ 215 FailToCreateRelease: true, 216 } 217 require.Error(t, doPublish(ctx, client)) 218 require.False(t, client.CreatedRelease) 219 require.False(t, client.UploadedFile) 220 } 221 222 func TestRunPipeWithFileThatDontExist(t *testing.T) { 223 config := config.Project{ 224 Release: config.Release{ 225 GitHub: config.Repo{ 226 Owner: "test", 227 Name: "test", 228 }, 229 }, 230 } 231 ctx := context.New(config) 232 ctx.Git = context.GitInfo{CurrentTag: "v1.0.0"} 233 ctx.Artifacts.Add(&artifact.Artifact{ 234 Type: artifact.UploadableArchive, 235 Name: "bin.tar.gz", 236 Path: "/nope/nope/nope", 237 }) 238 client := &client.Mock{} 239 require.Error(t, doPublish(ctx, client)) 240 require.True(t, client.CreatedRelease) 241 require.False(t, client.UploadedFile) 242 } 243 244 func TestRunPipeUploadFailure(t *testing.T) { 245 folder := t.TempDir() 246 tarfile, err := os.Create(filepath.Join(folder, "bin.tar.gz")) 247 require.NoError(t, err) 248 config := config.Project{ 249 Release: config.Release{ 250 GitHub: config.Repo{ 251 Owner: "test", 252 Name: "test", 253 }, 254 }, 255 } 256 ctx := context.New(config) 257 ctx.Git = context.GitInfo{CurrentTag: "v1.0.0"} 258 ctx.Artifacts.Add(&artifact.Artifact{ 259 Type: artifact.UploadableArchive, 260 Name: "bin.tar.gz", 261 Path: tarfile.Name(), 262 }) 263 client := &client.Mock{ 264 FailToUpload: true, 265 } 266 require.EqualError(t, doPublish(ctx, client), "failed to upload bin.tar.gz after 1 tries: upload failed") 267 require.True(t, client.CreatedRelease) 268 require.False(t, client.UploadedFile) 269 } 270 271 func TestRunPipeExtraFileNotFound(t *testing.T) { 272 config := config.Project{ 273 Release: config.Release{ 274 GitHub: config.Repo{ 275 Owner: "test", 276 Name: "test", 277 }, 278 ExtraFiles: []config.ExtraFile{ 279 {Glob: "./testdata/f1.txt"}, 280 {Glob: "./nope"}, 281 }, 282 }, 283 } 284 ctx := context.New(config) 285 ctx.Git = context.GitInfo{CurrentTag: "v1.0.0"} 286 client := &client.Mock{} 287 require.EqualError(t, doPublish(ctx, client), "globbing failed for pattern ./nope: matching \"./nope\": file does not exist") 288 require.True(t, client.CreatedRelease) 289 require.False(t, client.UploadedFile) 290 } 291 292 func TestRunPipeExtraOverride(t *testing.T) { 293 config := config.Project{ 294 Release: config.Release{ 295 GitHub: config.Repo{ 296 Owner: "test", 297 Name: "test", 298 }, 299 ExtraFiles: []config.ExtraFile{ 300 {Glob: "./testdata/**/*"}, 301 {Glob: "./testdata/upload_same_name/f1"}, 302 }, 303 }, 304 } 305 ctx := context.New(config) 306 ctx.Git = context.GitInfo{CurrentTag: "v1.0.0"} 307 client := &client.Mock{} 308 require.NoError(t, doPublish(ctx, client)) 309 require.True(t, client.CreatedRelease) 310 require.True(t, client.UploadedFile) 311 require.Contains(t, client.UploadedFileNames, "f1") 312 require.True(t, strings.HasSuffix(client.UploadedFilePaths["f1"], "testdata/upload_same_name/f1")) 313 } 314 315 func TestRunPipeUploadRetry(t *testing.T) { 316 folder := t.TempDir() 317 tarfile, err := os.Create(filepath.Join(folder, "bin.tar.gz")) 318 require.NoError(t, err) 319 config := config.Project{ 320 Release: config.Release{ 321 GitHub: config.Repo{ 322 Owner: "test", 323 Name: "test", 324 }, 325 }, 326 } 327 ctx := context.New(config) 328 ctx.Git = context.GitInfo{CurrentTag: "v1.0.0"} 329 ctx.Artifacts.Add(&artifact.Artifact{ 330 Type: artifact.UploadableArchive, 331 Name: "bin.tar.gz", 332 Path: tarfile.Name(), 333 }) 334 client := &client.Mock{ 335 FailFirstUpload: true, 336 } 337 require.NoError(t, doPublish(ctx, client)) 338 require.True(t, client.CreatedRelease) 339 require.True(t, client.UploadedFile) 340 } 341 342 func TestDefault(t *testing.T) { 343 testlib.Mktmp(t) 344 testlib.GitInit(t) 345 testlib.GitRemoteAdd(t, "git@github.com:goreleaser/goreleaser.git") 346 347 ctx := context.New(config.Project{}) 348 ctx.TokenType = context.TokenTypeGitHub 349 ctx.Config.GitHubURLs.Download = "https://github.com" 350 ctx.Git.CurrentTag = "v1.0.0" 351 require.NoError(t, Pipe{}.Default(ctx)) 352 require.Equal(t, "goreleaser", ctx.Config.Release.GitHub.Name) 353 require.Equal(t, "goreleaser", ctx.Config.Release.GitHub.Owner) 354 require.Equal(t, "https://github.com/triarius/goreleaser/releases/tag/v1.0.0", ctx.ReleaseURL) 355 } 356 357 func TestDefaultInvalidURL(t *testing.T) { 358 testlib.Mktmp(t) 359 testlib.GitInit(t) 360 testlib.GitRemoteAdd(t, "git@github.com:goreleaser.git") 361 362 ctx := context.New(config.Project{}) 363 ctx.TokenType = context.TokenTypeGitHub 364 ctx.Config.GitHubURLs.Download = "https://github.com" 365 ctx.Git.CurrentTag = "v1.0.0" 366 require.Error(t, Pipe{}.Default(ctx)) 367 } 368 369 func TestDefaultWithGitlab(t *testing.T) { 370 testlib.Mktmp(t) 371 testlib.GitInit(t) 372 testlib.GitRemoteAdd(t, "git@gitlab.com:gitlabowner/gitlabrepo.git") 373 374 ctx := context.New(config.Project{}) 375 ctx.TokenType = context.TokenTypeGitLab 376 ctx.Config.GitLabURLs.Download = "https://gitlab.com" 377 ctx.Git.CurrentTag = "v1.0.0" 378 require.NoError(t, Pipe{}.Default(ctx)) 379 require.Equal(t, "gitlabrepo", ctx.Config.Release.GitLab.Name) 380 require.Equal(t, "gitlabowner", ctx.Config.Release.GitLab.Owner) 381 require.Equal(t, "https://gitlab.com/gitlabowner/gitlabrepo/-/releases/v1.0.0", ctx.ReleaseURL) 382 } 383 384 func TestDefaultWithGitlabInvalidURL(t *testing.T) { 385 testlib.Mktmp(t) 386 testlib.GitInit(t) 387 testlib.GitRemoteAdd(t, "git@gitlab.com:gitlabrepo.git") 388 389 ctx := context.New(config.Project{}) 390 ctx.TokenType = context.TokenTypeGitLab 391 ctx.Config.GitLabURLs.Download = "https://gitlab.com" 392 ctx.Git.CurrentTag = "v1.0.0" 393 require.Error(t, Pipe{}.Default(ctx)) 394 } 395 396 func TestDefaultWithGitea(t *testing.T) { 397 testlib.Mktmp(t) 398 testlib.GitInit(t) 399 testlib.GitRemoteAdd(t, "git@gitea.example.com:giteaowner/gitearepo.git") 400 401 ctx := context.New(config.Project{}) 402 ctx.TokenType = context.TokenTypeGitea 403 ctx.Config.GiteaURLs.Download = "https://git.honk.com" 404 ctx.Git.CurrentTag = "v1.0.0" 405 require.NoError(t, Pipe{}.Default(ctx)) 406 require.Equal(t, "gitearepo", ctx.Config.Release.Gitea.Name) 407 require.Equal(t, "giteaowner", ctx.Config.Release.Gitea.Owner) 408 require.Equal(t, "https://git.honk.com/giteaowner/gitearepo/releases/tag/v1.0.0", ctx.ReleaseURL) 409 } 410 411 func TestDefaultWithGiteaInvalidURL(t *testing.T) { 412 testlib.Mktmp(t) 413 testlib.GitInit(t) 414 testlib.GitRemoteAdd(t, "git@gitea.example.com:gitearepo.git") 415 416 ctx := context.New(config.Project{}) 417 ctx.TokenType = context.TokenTypeGitea 418 ctx.Config.GiteaURLs.Download = "https://git.honk.com" 419 ctx.Git.CurrentTag = "v1.0.0" 420 require.Error(t, Pipe{}.Default(ctx)) 421 } 422 423 func TestDefaultPreRelease(t *testing.T) { 424 testlib.Mktmp(t) 425 testlib.GitInit(t) 426 testlib.GitRemoteAdd(t, "git@github.com:goreleaser/goreleaser.git") 427 428 t.Run("prerelease", func(t *testing.T) { 429 ctx := context.New(config.Project{ 430 Release: config.Release{ 431 Prerelease: "true", 432 }, 433 }) 434 ctx.TokenType = context.TokenTypeGitHub 435 ctx.Semver = context.Semver{ 436 Major: 1, 437 Minor: 0, 438 Patch: 0, 439 } 440 require.NoError(t, Pipe{}.Default(ctx)) 441 require.True(t, ctx.PreRelease) 442 }) 443 444 t.Run("release", func(t *testing.T) { 445 ctx := context.New(config.Project{ 446 Release: config.Release{ 447 Prerelease: "false", 448 }, 449 }) 450 ctx.TokenType = context.TokenTypeGitHub 451 ctx.Semver = context.Semver{ 452 Major: 1, 453 Minor: 0, 454 Patch: 0, 455 Prerelease: "rc1", 456 } 457 require.NoError(t, Pipe{}.Default(ctx)) 458 require.False(t, ctx.PreRelease) 459 }) 460 461 t.Run("auto-release", func(t *testing.T) { 462 ctx := context.New(config.Project{ 463 Release: config.Release{ 464 Prerelease: "auto", 465 }, 466 }) 467 ctx.TokenType = context.TokenTypeGitHub 468 ctx.Semver = context.Semver{ 469 Major: 1, 470 Minor: 0, 471 Patch: 0, 472 } 473 require.NoError(t, Pipe{}.Default(ctx)) 474 require.Equal(t, false, ctx.PreRelease) 475 }) 476 477 t.Run("auto-rc", func(t *testing.T) { 478 ctx := context.New(config.Project{ 479 Release: config.Release{ 480 Prerelease: "auto", 481 }, 482 }) 483 ctx.TokenType = context.TokenTypeGitHub 484 ctx.Semver = context.Semver{ 485 Major: 1, 486 Minor: 0, 487 Patch: 0, 488 Prerelease: "rc1", 489 } 490 require.NoError(t, Pipe{}.Default(ctx)) 491 require.Equal(t, true, ctx.PreRelease) 492 }) 493 494 t.Run("auto-rc-github-setup", func(t *testing.T) { 495 ctx := context.New(config.Project{ 496 Release: config.Release{ 497 GitHub: config.Repo{ 498 Name: "foo", 499 Owner: "foo", 500 }, 501 Prerelease: "auto", 502 }, 503 }) 504 ctx.TokenType = context.TokenTypeGitHub 505 ctx.Semver = context.Semver{ 506 Major: 1, 507 Minor: 0, 508 Patch: 0, 509 Prerelease: "rc1", 510 } 511 require.NoError(t, Pipe{}.Default(ctx)) 512 require.Equal(t, true, ctx.PreRelease) 513 }) 514 } 515 516 func TestDefaultPipeDisabled(t *testing.T) { 517 testlib.Mktmp(t) 518 testlib.GitInit(t) 519 testlib.GitRemoteAdd(t, "git@github.com:goreleaser/goreleaser.git") 520 521 ctx := context.New(config.Project{ 522 Release: config.Release{ 523 Disable: true, 524 }, 525 }) 526 ctx.TokenType = context.TokenTypeGitHub 527 require.NoError(t, Pipe{}.Default(ctx)) 528 require.Equal(t, "goreleaser", ctx.Config.Release.GitHub.Name) 529 require.Equal(t, "goreleaser", ctx.Config.Release.GitHub.Owner) 530 } 531 532 func TestDefaultFilled(t *testing.T) { 533 testlib.Mktmp(t) 534 testlib.GitInit(t) 535 testlib.GitRemoteAdd(t, "git@github.com:goreleaser/goreleaser.git") 536 537 ctx := context.New(config.Project{ 538 Release: config.Release{ 539 GitHub: config.Repo{ 540 Name: "foo", 541 Owner: "bar", 542 }, 543 }, 544 }) 545 ctx.TokenType = context.TokenTypeGitHub 546 require.NoError(t, Pipe{}.Default(ctx)) 547 require.Equal(t, "foo", ctx.Config.Release.GitHub.Name) 548 require.Equal(t, "bar", ctx.Config.Release.GitHub.Owner) 549 } 550 551 func TestDefaultNotAGitRepo(t *testing.T) { 552 testlib.Mktmp(t) 553 ctx := context.New(config.Project{}) 554 ctx.TokenType = context.TokenTypeGitHub 555 require.EqualError(t, Pipe{}.Default(ctx), "current folder is not a git repository") 556 require.Empty(t, ctx.Config.Release.GitHub.String()) 557 } 558 559 func TestDefaultGitRepoWithoutOrigin(t *testing.T) { 560 testlib.Mktmp(t) 561 ctx := context.New(config.Project{}) 562 ctx.TokenType = context.TokenTypeGitHub 563 testlib.GitInit(t) 564 require.EqualError(t, Pipe{}.Default(ctx), "no remote configured to list refs from") 565 require.Empty(t, ctx.Config.Release.GitHub.String()) 566 } 567 568 func TestDefaultNotAGitRepoSnapshot(t *testing.T) { 569 testlib.Mktmp(t) 570 ctx := context.New(config.Project{}) 571 ctx.TokenType = context.TokenTypeGitHub 572 ctx.Snapshot = true 573 require.NoError(t, Pipe{}.Default(ctx)) 574 require.Empty(t, ctx.Config.Release.GitHub.String()) 575 } 576 577 func TestDefaultGitRepoWithoutRemote(t *testing.T) { 578 testlib.Mktmp(t) 579 ctx := context.New(config.Project{}) 580 ctx.TokenType = context.TokenTypeGitHub 581 require.Error(t, Pipe{}.Default(ctx)) 582 require.Empty(t, ctx.Config.Release.GitHub.String()) 583 } 584 585 func TestDefaultMultipleReleasesDefined(t *testing.T) { 586 ctx := context.New(config.Project{ 587 Release: config.Release{ 588 GitHub: config.Repo{ 589 Owner: "githubName", 590 Name: "githubName", 591 }, 592 GitLab: config.Repo{ 593 Owner: "gitlabOwner", 594 Name: "gitlabName", 595 }, 596 Gitea: config.Repo{ 597 Owner: "giteaOwner", 598 Name: "giteaName", 599 }, 600 }, 601 }) 602 require.EqualError(t, Pipe{}.Default(ctx), ErrMultipleReleases.Error()) 603 } 604 605 func TestSkip(t *testing.T) { 606 t.Run("skip", func(t *testing.T) { 607 ctx := context.New(config.Project{ 608 Release: config.Release{ 609 Disable: true, 610 }, 611 }) 612 require.True(t, Pipe{}.Skip(ctx)) 613 }) 614 615 t.Run("skip upload", func(t *testing.T) { 616 ctx := context.New(config.Project{ 617 Release: config.Release{ 618 SkipUpload: true, 619 }, 620 }) 621 client := &client.Mock{} 622 testlib.AssertSkipped(t, doPublish(ctx, client)) 623 require.True(t, client.CreatedRelease) 624 require.False(t, client.UploadedFile) 625 }) 626 627 t.Run("dont skip", func(t *testing.T) { 628 require.False(t, Pipe{}.Skip(context.New(config.Project{}))) 629 }) 630 }