github.com/joselitofilho/goreleaser@v0.155.1-0.20210123221854-e4891856c593/internal/pipe/nfpm/nfpm_test.go (about)

     1  package nfpm
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"path/filepath"
     7  	"runtime"
     8  	"testing"
     9  
    10  	"github.com/goreleaser/goreleaser/internal/artifact"
    11  	"github.com/goreleaser/goreleaser/internal/testlib"
    12  	"github.com/goreleaser/goreleaser/pkg/config"
    13  	"github.com/goreleaser/goreleaser/pkg/context"
    14  	"github.com/goreleaser/nfpm/v2/files"
    15  	"github.com/stretchr/testify/require"
    16  )
    17  
    18  func TestDescription(t *testing.T) {
    19  	require.NotEmpty(t, Pipe{}.String())
    20  }
    21  
    22  func TestRunPipeNoFormats(t *testing.T) {
    23  	var ctx = &context.Context{
    24  		Version: "1.0.0",
    25  		Git: context.GitInfo{
    26  			CurrentTag: "v1.0.0",
    27  		},
    28  		Config: config.Project{
    29  			NFPMs: []config.NFPM{
    30  				{},
    31  			},
    32  		},
    33  		Parallelism: runtime.NumCPU(),
    34  	}
    35  	require.NoError(t, Pipe{}.Default(ctx))
    36  	testlib.AssertSkipped(t, Pipe{}.Run(ctx))
    37  }
    38  
    39  func TestRunPipeInvalidFormat(t *testing.T) {
    40  	var ctx = context.New(config.Project{
    41  		ProjectName: "nope",
    42  		NFPMs: []config.NFPM{
    43  			{
    44  				Bindir:  "/usr/bin",
    45  				Formats: []string{"nope"},
    46  				Builds:  []string{"foo"},
    47  				NFPMOverridables: config.NFPMOverridables{
    48  					PackageName:      "foo",
    49  					FileNameTemplate: defaultNameTemplate,
    50  				},
    51  			},
    52  		},
    53  	})
    54  	ctx.Version = "1.2.3"
    55  	ctx.Git = context.GitInfo{
    56  		CurrentTag: "v1.2.3",
    57  	}
    58  	for _, goos := range []string{"linux", "darwin"} {
    59  		for _, goarch := range []string{"amd64", "386"} {
    60  			ctx.Artifacts.Add(&artifact.Artifact{
    61  				Name:   "mybin",
    62  				Path:   "testdata/testfile.txt",
    63  				Goarch: goarch,
    64  				Goos:   goos,
    65  				Type:   artifact.Binary,
    66  				Extra: map[string]interface{}{
    67  					"ID": "foo",
    68  				},
    69  			})
    70  		}
    71  	}
    72  	require.Contains(t, Pipe{}.Run(ctx).Error(), `no packager registered for the format nope`)
    73  }
    74  
    75  func TestRunPipe(t *testing.T) {
    76  	var folder = t.TempDir()
    77  	var dist = filepath.Join(folder, "dist")
    78  	require.NoError(t, os.Mkdir(dist, 0755))
    79  	require.NoError(t, os.Mkdir(filepath.Join(dist, "mybin"), 0755))
    80  	var binPath = filepath.Join(dist, "mybin", "mybin")
    81  	_, err := os.Create(binPath)
    82  	require.NoError(t, err)
    83  	var ctx = context.New(config.Project{
    84  		ProjectName: "mybin",
    85  		Dist:        dist,
    86  		NFPMs: []config.NFPM{
    87  			{
    88  				ID:          "someid",
    89  				Bindir:      "/usr/bin",
    90  				Builds:      []string{"default"},
    91  				Formats:     []string{"deb", "rpm", "apk"},
    92  				Section:     "somesection",
    93  				Priority:    "standard",
    94  				Description: "Some description",
    95  				License:     "MIT",
    96  				Maintainer:  "me@me",
    97  				Vendor:      "asdf",
    98  				Homepage:    "https://goreleaser.github.io",
    99  				NFPMOverridables: config.NFPMOverridables{
   100  					FileNameTemplate: defaultNameTemplate + "-{{ .Release }}-{{ .Epoch }}",
   101  					PackageName:      "foo",
   102  					Dependencies:     []string{"make"},
   103  					Recommends:       []string{"svn"},
   104  					Suggests:         []string{"bzr"},
   105  					Replaces:         []string{"fish"},
   106  					Conflicts:        []string{"git"},
   107  					EmptyFolders:     []string{"/var/log/foobar"},
   108  					Release:          "10",
   109  					Epoch:            "20",
   110  					Contents: []*files.Content{
   111  						{
   112  							Source:      "./testdata/testfile.txt",
   113  							Destination: "/usr/share/testfile.txt",
   114  						},
   115  						{
   116  							Source:      "./testdata/testfile.txt",
   117  							Destination: "/etc/nope.conf",
   118  							Type:        "config",
   119  						},
   120  						{
   121  							Source:      "./testdata/testfile.txt",
   122  							Destination: "/etc/nope-rpm.conf",
   123  							Type:        "config",
   124  							Packager:    "rpm",
   125  						},
   126  						{
   127  							Source:      "/etc/nope.conf",
   128  							Destination: "/etc/nope2.conf",
   129  							Type:        "symlink",
   130  						},
   131  					},
   132  					Replacements: map[string]string{
   133  						"linux": "Tux",
   134  					},
   135  				},
   136  			},
   137  		},
   138  	})
   139  	ctx.Version = "1.0.0"
   140  	ctx.Git = context.GitInfo{CurrentTag: "v1.0.0"}
   141  	for _, goos := range []string{"linux", "darwin"} {
   142  		for _, goarch := range []string{"amd64", "386"} {
   143  			ctx.Artifacts.Add(&artifact.Artifact{
   144  				Name:   "mybin",
   145  				Path:   binPath,
   146  				Goarch: goarch,
   147  				Goos:   goos,
   148  				Type:   artifact.Binary,
   149  				Extra: map[string]interface{}{
   150  					"ID": "default",
   151  				},
   152  			})
   153  		}
   154  	}
   155  	require.NoError(t, Pipe{}.Run(ctx))
   156  	var packages = ctx.Artifacts.Filter(artifact.ByType(artifact.LinuxPackage)).List()
   157  	require.Len(t, packages, 6)
   158  	for _, pkg := range packages {
   159  		var format = pkg.ExtraOr("Format", "").(string)
   160  		require.NotEmpty(t, format)
   161  		require.Equal(t, pkg.Name, "mybin_1.0.0_Tux_"+pkg.Goarch+"-10-20."+format)
   162  		require.Equal(t, pkg.ExtraOr("ID", ""), "someid")
   163  		require.ElementsMatch(t, []string{
   164  			"/usr/share/testfile.txt",
   165  			"/etc/nope.conf",
   166  			"/etc/nope-rpm.conf",
   167  			"/etc/nope2.conf",
   168  			"/usr/bin/mybin",
   169  		}, destinations(pkg.ExtraOr("Files", files.Contents{}).(files.Contents)))
   170  	}
   171  	require.Len(t, ctx.Config.NFPMs[0].Contents, 4, "should not modify the config file list")
   172  }
   173  
   174  func TestInvalidNameTemplate(t *testing.T) {
   175  	var ctx = &context.Context{
   176  		Parallelism: runtime.NumCPU(),
   177  		Artifacts:   artifact.New(),
   178  		Config: config.Project{
   179  			NFPMs: []config.NFPM{
   180  				{
   181  					NFPMOverridables: config.NFPMOverridables{
   182  						PackageName:      "foo",
   183  						FileNameTemplate: "{{.Foo}",
   184  					},
   185  					Formats: []string{"deb"},
   186  					Builds:  []string{"default"},
   187  				},
   188  			},
   189  		},
   190  	}
   191  	ctx.Artifacts.Add(&artifact.Artifact{
   192  		Name:   "mybin",
   193  		Goos:   "linux",
   194  		Goarch: "amd64",
   195  		Type:   artifact.Binary,
   196  		Extra: map[string]interface{}{
   197  			"ID": "default",
   198  		},
   199  	})
   200  	require.Contains(t, Pipe{}.Run(ctx).Error(), `template: tmpl:1: unexpected "}" in operand`)
   201  }
   202  
   203  func TestNoBuildsFound(t *testing.T) {
   204  	var ctx = &context.Context{
   205  		Parallelism: runtime.NumCPU(),
   206  		Artifacts:   artifact.New(),
   207  		Config: config.Project{
   208  			NFPMs: []config.NFPM{
   209  				{
   210  					Formats: []string{"deb"},
   211  					Builds:  []string{"nope"},
   212  				},
   213  			},
   214  		},
   215  	}
   216  	ctx.Artifacts.Add(&artifact.Artifact{
   217  		Name:   "mybin",
   218  		Goos:   "linux",
   219  		Goarch: "amd64",
   220  		Type:   artifact.Binary,
   221  		Extra: map[string]interface{}{
   222  			"ID": "default",
   223  		},
   224  	})
   225  	require.EqualError(t, Pipe{}.Run(ctx), `no linux binaries found for builds [nope]`)
   226  }
   227  
   228  func TestCreateFileDoesntExist(t *testing.T) {
   229  	var folder = t.TempDir()
   230  	var dist = filepath.Join(folder, "dist")
   231  	require.NoError(t, os.Mkdir(dist, 0755))
   232  	require.NoError(t, os.Mkdir(filepath.Join(dist, "mybin"), 0755))
   233  	var ctx = context.New(config.Project{
   234  		Dist:        dist,
   235  		ProjectName: "asd",
   236  		NFPMs: []config.NFPM{
   237  			{
   238  				Formats: []string{"deb", "rpm"},
   239  				Builds:  []string{"default"},
   240  				NFPMOverridables: config.NFPMOverridables{
   241  					PackageName: "foo",
   242  					Contents: []*files.Content{
   243  						{
   244  							Source:      "testdata/testfile.txt",
   245  							Destination: "/var/lib/test/testfile.txt",
   246  						},
   247  					},
   248  				},
   249  			},
   250  		},
   251  	})
   252  	ctx.Version = "1.2.3"
   253  	ctx.Git = context.GitInfo{
   254  		CurrentTag: "v1.2.3",
   255  	}
   256  	ctx.Artifacts.Add(&artifact.Artifact{
   257  		Name:   "mybin",
   258  		Path:   filepath.Join(dist, "mybin", "mybin"),
   259  		Goos:   "linux",
   260  		Goarch: "amd64",
   261  		Type:   artifact.Binary,
   262  		Extra: map[string]interface{}{
   263  			"ID": "default",
   264  		},
   265  	})
   266  	require.Contains(t, Pipe{}.Run(ctx).Error(), `dist/mybin/mybin": file does not exist`)
   267  }
   268  
   269  func TestInvalidConfig(t *testing.T) {
   270  	var folder = t.TempDir()
   271  	var dist = filepath.Join(folder, "dist")
   272  	require.NoError(t, os.Mkdir(dist, 0755))
   273  	require.NoError(t, os.Mkdir(filepath.Join(dist, "mybin"), 0755))
   274  	var ctx = context.New(config.Project{
   275  		Dist: dist,
   276  		NFPMs: []config.NFPM{
   277  			{
   278  				Formats: []string{"deb"},
   279  				Builds:  []string{"default"},
   280  			},
   281  		},
   282  	})
   283  	ctx.Git.CurrentTag = "v1.2.3"
   284  	ctx.Version = "v1.2.3"
   285  	ctx.Artifacts.Add(&artifact.Artifact{
   286  		Name:   "mybin",
   287  		Path:   filepath.Join(dist, "mybin", "mybin"),
   288  		Goos:   "linux",
   289  		Goarch: "amd64",
   290  		Type:   artifact.Binary,
   291  		Extra: map[string]interface{}{
   292  			"ID": "default",
   293  		},
   294  	})
   295  	require.Contains(t, Pipe{}.Run(ctx).Error(), `invalid nfpm config: package name must be provided`)
   296  }
   297  
   298  func TestDefault(t *testing.T) {
   299  	var ctx = &context.Context{
   300  		Config: config.Project{
   301  			ProjectName: "foobar",
   302  			NFPMs: []config.NFPM{
   303  				{},
   304  			},
   305  			Builds: []config.Build{
   306  				{ID: "foo"},
   307  				{ID: "bar"},
   308  			},
   309  		},
   310  	}
   311  	require.NoError(t, Pipe{}.Default(ctx))
   312  	require.Equal(t, "/usr/local/bin", ctx.Config.NFPMs[0].Bindir)
   313  	require.Equal(t, []string{"foo", "bar"}, ctx.Config.NFPMs[0].Builds)
   314  	require.Equal(t, defaultNameTemplate, ctx.Config.NFPMs[0].FileNameTemplate)
   315  	require.Equal(t, ctx.Config.ProjectName, ctx.Config.NFPMs[0].PackageName)
   316  }
   317  
   318  func TestDefaultDeprecatedOptions(t *testing.T) {
   319  	var ctx = &context.Context{
   320  		Config: config.Project{
   321  			ProjectName: "foobar",
   322  			NFPMs: []config.NFPM{
   323  				{
   324  					NFPMOverridables: config.NFPMOverridables{
   325  						Files: map[string]string{
   326  							"testdata/testfile.txt": "/bin/foo",
   327  						},
   328  						ConfigFiles: map[string]string{
   329  							"testdata/testfile.txt": "/etc/foo.conf",
   330  						},
   331  						Symlinks: map[string]string{
   332  							"/etc/foo.conf": "/etc/foov2.conf",
   333  						},
   334  						RPM: config.NFPMRPM{
   335  							GhostFiles: []string{"/etc/ghost.conf"},
   336  							ConfigNoReplaceFiles: map[string]string{
   337  								"testdata/testfile.txt": "/etc/foo_keep.conf",
   338  							},
   339  						},
   340  						Deb: config.NFPMDeb{
   341  							VersionMetadata: "beta1",
   342  						},
   343  					},
   344  				},
   345  			},
   346  			Builds: []config.Build{
   347  				{ID: "foo"},
   348  				{ID: "bar"},
   349  			},
   350  		},
   351  	}
   352  	require.NoError(t, Pipe{}.Default(ctx))
   353  	require.Equal(t, "/usr/local/bin", ctx.Config.NFPMs[0].Bindir)
   354  	require.Equal(t, []string{"foo", "bar"}, ctx.Config.NFPMs[0].Builds)
   355  	require.ElementsMatch(t, []*files.Content{
   356  		{Source: "testdata/testfile.txt", Destination: "/bin/foo"},
   357  		{Source: "testdata/testfile.txt", Destination: "/etc/foo.conf", Type: "config"},
   358  		{Source: "/etc/foo.conf", Destination: "/etc/foov2.conf", Type: "symlink"},
   359  		{Destination: "/etc/ghost.conf", Type: "ghost", Packager: "rpm"},
   360  		{Source: "testdata/testfile.txt", Destination: "/etc/foo_keep.conf", Type: "config|noreplace", Packager: "rpm"},
   361  	}, ctx.Config.NFPMs[0].Contents)
   362  	require.Equal(t, defaultNameTemplate, ctx.Config.NFPMs[0].FileNameTemplate)
   363  	require.Equal(t, ctx.Config.ProjectName, ctx.Config.NFPMs[0].PackageName)
   364  	require.Equal(t, "beta1", ctx.Config.NFPMs[0].VersionMetadata)
   365  }
   366  
   367  func TestDefaultSet(t *testing.T) {
   368  	var ctx = &context.Context{
   369  		Config: config.Project{
   370  			Builds: []config.Build{
   371  				{ID: "foo"},
   372  				{ID: "bar"},
   373  			},
   374  			NFPMs: []config.NFPM{
   375  				{
   376  					Builds: []string{"foo"},
   377  					Bindir: "/bin",
   378  					NFPMOverridables: config.NFPMOverridables{
   379  						FileNameTemplate: "foo",
   380  					},
   381  				},
   382  			},
   383  		},
   384  	}
   385  	require.NoError(t, Pipe{}.Default(ctx))
   386  	require.Equal(t, "/bin", ctx.Config.NFPMs[0].Bindir)
   387  	require.Equal(t, "foo", ctx.Config.NFPMs[0].FileNameTemplate)
   388  	require.Equal(t, []string{"foo"}, ctx.Config.NFPMs[0].Builds)
   389  }
   390  
   391  func TestOverrides(t *testing.T) {
   392  	var ctx = &context.Context{
   393  		Config: config.Project{
   394  			NFPMs: []config.NFPM{
   395  				{
   396  					Bindir: "/bin",
   397  					NFPMOverridables: config.NFPMOverridables{
   398  						FileNameTemplate: "foo",
   399  					},
   400  					Overrides: map[string]config.NFPMOverridables{
   401  						"deb": {
   402  							FileNameTemplate: "bar",
   403  						},
   404  					},
   405  				},
   406  			},
   407  		},
   408  	}
   409  	require.NoError(t, Pipe{}.Default(ctx))
   410  	merged, err := mergeOverrides(ctx.Config.NFPMs[0], "deb")
   411  	require.NoError(t, err)
   412  	require.Equal(t, "/bin", ctx.Config.NFPMs[0].Bindir)
   413  	require.Equal(t, "foo", ctx.Config.NFPMs[0].FileNameTemplate)
   414  	require.Equal(t, "bar", ctx.Config.NFPMs[0].Overrides["deb"].FileNameTemplate)
   415  	require.Equal(t, "bar", merged.FileNameTemplate)
   416  }
   417  
   418  func TestDebSpecificConfig(t *testing.T) {
   419  	var folder = t.TempDir()
   420  	var dist = filepath.Join(folder, "dist")
   421  	require.NoError(t, os.Mkdir(dist, 0755))
   422  	require.NoError(t, os.Mkdir(filepath.Join(dist, "mybin"), 0755))
   423  	var binPath = filepath.Join(dist, "mybin", "mybin")
   424  	_, err := os.Create(binPath)
   425  	require.NoError(t, err)
   426  	var ctx = context.New(config.Project{
   427  		ProjectName: "mybin",
   428  		Dist:        dist,
   429  		NFPMs: []config.NFPM{
   430  			{
   431  				ID:      "someid",
   432  				Builds:  []string{"default"},
   433  				Formats: []string{"deb"},
   434  				NFPMOverridables: config.NFPMOverridables{
   435  					PackageName: "foo",
   436  					Contents: []*files.Content{
   437  						{
   438  							Source:      "testdata/testfile.txt",
   439  							Destination: "/usr/share/testfile.txt",
   440  						},
   441  					},
   442  					Deb: config.NFPMDeb{
   443  						Signature: config.NFPMDebSignature{
   444  							KeyFile: "./testdata/privkey.gpg",
   445  						},
   446  					},
   447  				},
   448  			},
   449  		},
   450  	})
   451  	ctx.Version = "1.0.0"
   452  	ctx.Git = context.GitInfo{CurrentTag: "v1.0.0"}
   453  	for _, goos := range []string{"linux", "darwin"} {
   454  		for _, goarch := range []string{"amd64", "386"} {
   455  			ctx.Artifacts.Add(&artifact.Artifact{
   456  				Name:   "mybin",
   457  				Path:   binPath,
   458  				Goarch: goarch,
   459  				Goos:   goos,
   460  				Type:   artifact.Binary,
   461  				Extra: map[string]interface{}{
   462  					"ID": "default",
   463  				},
   464  			})
   465  		}
   466  	}
   467  
   468  	t.Run("no passphrase set", func(t *testing.T) {
   469  		require.Contains(
   470  			t,
   471  			Pipe{}.Run(ctx).Error(),
   472  			`key is encrypted but no passphrase was provided`,
   473  		)
   474  	})
   475  
   476  	t.Run("general passphrase set", func(t *testing.T) {
   477  		ctx.Env = map[string]string{
   478  			"NFPM_SOMEID_PASSPHRASE": "hunter2",
   479  		}
   480  		require.NoError(t, Pipe{}.Run(ctx))
   481  	})
   482  
   483  	t.Run("packager specific passphrase set", func(t *testing.T) {
   484  		ctx.Env = map[string]string{
   485  			"NFPM_SOMEID_DEB_PASSPHRASE": "hunter2",
   486  		}
   487  		require.NoError(t, Pipe{}.Run(ctx))
   488  	})
   489  }
   490  
   491  func TestRPMSpecificConfig(t *testing.T) {
   492  	var folder = t.TempDir()
   493  	var dist = filepath.Join(folder, "dist")
   494  	require.NoError(t, os.Mkdir(dist, 0755))
   495  	require.NoError(t, os.Mkdir(filepath.Join(dist, "mybin"), 0755))
   496  	var binPath = filepath.Join(dist, "mybin", "mybin")
   497  	_, err := os.Create(binPath)
   498  	require.NoError(t, err)
   499  	var ctx = context.New(config.Project{
   500  		ProjectName: "mybin",
   501  		Dist:        dist,
   502  		NFPMs: []config.NFPM{
   503  			{
   504  				ID:      "someid",
   505  				Builds:  []string{"default"},
   506  				Formats: []string{"rpm"},
   507  				NFPMOverridables: config.NFPMOverridables{
   508  					PackageName: "foo",
   509  					Contents: []*files.Content{
   510  						{
   511  							Source:      "testdata/testfile.txt",
   512  							Destination: "/usr/share/testfile.txt",
   513  						},
   514  					},
   515  					RPM: config.NFPMRPM{
   516  						Signature: config.NFPMRPMSignature{
   517  							KeyFile: "./testdata/privkey.gpg",
   518  						},
   519  					},
   520  				},
   521  			},
   522  		},
   523  	})
   524  	ctx.Version = "1.0.0"
   525  	ctx.Git = context.GitInfo{CurrentTag: "v1.0.0"}
   526  	for _, goos := range []string{"linux", "darwin"} {
   527  		for _, goarch := range []string{"amd64", "386"} {
   528  			ctx.Artifacts.Add(&artifact.Artifact{
   529  				Name:   "mybin",
   530  				Path:   binPath,
   531  				Goarch: goarch,
   532  				Goos:   goos,
   533  				Type:   artifact.Binary,
   534  				Extra: map[string]interface{}{
   535  					"ID": "default",
   536  				},
   537  			})
   538  		}
   539  	}
   540  
   541  	t.Run("no passphrase set", func(t *testing.T) {
   542  		require.Contains(
   543  			t,
   544  			Pipe{}.Run(ctx).Error(),
   545  			`key is encrypted but no passphrase was provided`,
   546  		)
   547  	})
   548  
   549  	t.Run("general passphrase set", func(t *testing.T) {
   550  		ctx.Env = map[string]string{
   551  			"NFPM_SOMEID_PASSPHRASE": "hunter2",
   552  		}
   553  		require.NoError(t, Pipe{}.Run(ctx))
   554  	})
   555  
   556  	t.Run("packager specific passphrase set", func(t *testing.T) {
   557  		ctx.Env = map[string]string{
   558  			"NFPM_SOMEID_RPM_PASSPHRASE": "hunter2",
   559  		}
   560  		require.NoError(t, Pipe{}.Run(ctx))
   561  	})
   562  }
   563  
   564  func TestAPKSpecificConfig(t *testing.T) {
   565  	var folder = t.TempDir()
   566  	var dist = filepath.Join(folder, "dist")
   567  	require.NoError(t, os.Mkdir(dist, 0755))
   568  	require.NoError(t, os.Mkdir(filepath.Join(dist, "mybin"), 0755))
   569  	var binPath = filepath.Join(dist, "mybin", "mybin")
   570  	_, err := os.Create(binPath)
   571  	require.NoError(t, err)
   572  	var ctx = context.New(config.Project{
   573  		ProjectName: "mybin",
   574  		Dist:        dist,
   575  		NFPMs: []config.NFPM{
   576  			{
   577  				ID:         "someid",
   578  				Maintainer: "me@me",
   579  				Builds:     []string{"default"},
   580  				Formats:    []string{"apk"},
   581  				NFPMOverridables: config.NFPMOverridables{
   582  					PackageName: "foo",
   583  					Contents: []*files.Content{
   584  						{
   585  							Source:      "testdata/testfile.txt",
   586  							Destination: "/usr/share/testfile.txt",
   587  						},
   588  					},
   589  					APK: config.NFPMAPK{
   590  						Signature: config.NFPMAPKSignature{
   591  							KeyFile: "./testdata/rsa.priv",
   592  						},
   593  					},
   594  				},
   595  			},
   596  		},
   597  	})
   598  	ctx.Version = "1.0.0"
   599  	ctx.Git = context.GitInfo{CurrentTag: "v1.0.0"}
   600  	for _, goos := range []string{"linux", "darwin"} {
   601  		for _, goarch := range []string{"amd64", "386"} {
   602  			ctx.Artifacts.Add(&artifact.Artifact{
   603  				Name:   "mybin",
   604  				Path:   binPath,
   605  				Goarch: goarch,
   606  				Goos:   goos,
   607  				Type:   artifact.Binary,
   608  				Extra: map[string]interface{}{
   609  					"ID": "default",
   610  				},
   611  			})
   612  		}
   613  	}
   614  
   615  	t.Run("no passphrase set", func(t *testing.T) {
   616  		require.Contains(
   617  			t,
   618  			Pipe{}.Run(ctx).Error(),
   619  			`key is encrypted but no passphrase was provided`,
   620  		)
   621  	})
   622  
   623  	t.Run("general passphrase set", func(t *testing.T) {
   624  		ctx.Env = map[string]string{
   625  			"NFPM_SOMEID_PASSPHRASE": "hunter2",
   626  		}
   627  		require.NoError(t, Pipe{}.Run(ctx))
   628  	})
   629  
   630  	t.Run("packager specific passphrase set", func(t *testing.T) {
   631  		ctx.Env = map[string]string{
   632  			"NFPM_SOMEID_APK_PASSPHRASE": "hunter2",
   633  		}
   634  		require.NoError(t, Pipe{}.Run(ctx))
   635  	})
   636  }
   637  
   638  func TestSeveralNFPMsWithTheSameID(t *testing.T) {
   639  	var ctx = &context.Context{
   640  		Config: config.Project{
   641  			NFPMs: []config.NFPM{
   642  				{
   643  					ID: "a",
   644  				},
   645  				{
   646  					ID: "a",
   647  				},
   648  			},
   649  		},
   650  	}
   651  	require.EqualError(t, Pipe{}.Default(ctx), "found 2 nfpms with the ID 'a', please fix your config")
   652  }
   653  
   654  func TestMeta(t *testing.T) {
   655  	var folder = t.TempDir()
   656  	var dist = filepath.Join(folder, "dist")
   657  	require.NoError(t, os.Mkdir(dist, 0755))
   658  	require.NoError(t, os.Mkdir(filepath.Join(dist, "mybin"), 0755))
   659  	var binPath = filepath.Join(dist, "mybin", "mybin")
   660  	_, err := os.Create(binPath)
   661  	require.NoError(t, err)
   662  	var ctx = context.New(config.Project{
   663  		ProjectName: "mybin",
   664  		Dist:        dist,
   665  		NFPMs: []config.NFPM{
   666  			{
   667  				ID:          "someid",
   668  				Bindir:      "/usr/bin",
   669  				Builds:      []string{"default"},
   670  				Formats:     []string{"deb", "rpm"},
   671  				Section:     "somesection",
   672  				Priority:    "standard",
   673  				Description: "Some description",
   674  				License:     "MIT",
   675  				Maintainer:  "me@me",
   676  				Vendor:      "asdf",
   677  				Homepage:    "https://goreleaser.github.io",
   678  				Meta:        true,
   679  				NFPMOverridables: config.NFPMOverridables{
   680  					FileNameTemplate: defaultNameTemplate + "-{{ .Release }}-{{ .Epoch }}",
   681  					PackageName:      "foo",
   682  					Dependencies:     []string{"make"},
   683  					Recommends:       []string{"svn"},
   684  					Suggests:         []string{"bzr"},
   685  					Replaces:         []string{"fish"},
   686  					Conflicts:        []string{"git"},
   687  					EmptyFolders:     []string{"/var/log/foobar"},
   688  					Release:          "10",
   689  					Epoch:            "20",
   690  					Contents: []*files.Content{
   691  						{
   692  							Source:      "testdata/testfile.txt",
   693  							Destination: "/usr/share/testfile.txt",
   694  						},
   695  						{
   696  							Source:      "./testdata/testfile.txt",
   697  							Destination: "/etc/nope.conf",
   698  							Type:        "config",
   699  						},
   700  						{
   701  							Source:      "./testdata/testfile.txt",
   702  							Destination: "/etc/nope-rpm.conf",
   703  							Type:        "config",
   704  							Packager:    "rpm",
   705  						},
   706  					},
   707  					Replacements: map[string]string{
   708  						"linux": "Tux",
   709  					},
   710  				},
   711  			},
   712  		},
   713  	})
   714  	ctx.Version = "1.0.0"
   715  	ctx.Git = context.GitInfo{CurrentTag: "v1.0.0"}
   716  	for _, goos := range []string{"linux", "darwin"} {
   717  		for _, goarch := range []string{"amd64", "386"} {
   718  			ctx.Artifacts.Add(&artifact.Artifact{
   719  				Name:   "mybin",
   720  				Path:   binPath,
   721  				Goarch: goarch,
   722  				Goos:   goos,
   723  				Type:   artifact.Binary,
   724  				Extra: map[string]interface{}{
   725  					"ID": "default",
   726  				},
   727  			})
   728  		}
   729  	}
   730  	require.NoError(t, Pipe{}.Run(ctx))
   731  	var packages = ctx.Artifacts.Filter(artifact.ByType(artifact.LinuxPackage)).List()
   732  	require.Len(t, packages, 4)
   733  	for _, pkg := range packages {
   734  		var format = pkg.ExtraOr("Format", "").(string)
   735  		require.NotEmpty(t, format)
   736  		require.Equal(t, pkg.Name, "mybin_1.0.0_Tux_"+pkg.Goarch+"-10-20."+format)
   737  		require.Equal(t, pkg.ExtraOr("ID", ""), "someid")
   738  		require.ElementsMatch(t, []string{
   739  			"/usr/share/testfile.txt",
   740  			"/etc/nope.conf",
   741  			"/etc/nope-rpm.conf",
   742  		}, destinations(pkg.ExtraOr("Files", files.Contents{}).(files.Contents)))
   743  	}
   744  
   745  	require.Len(t, ctx.Config.NFPMs[0].Contents, 3, "should not modify the config file list")
   746  }
   747  
   748  func TestSkipSign(t *testing.T) {
   749  	folder, err := ioutil.TempDir("", "archivetest")
   750  	require.NoError(t, err)
   751  	var dist = filepath.Join(folder, "dist")
   752  	require.NoError(t, os.Mkdir(dist, 0755))
   753  	require.NoError(t, os.Mkdir(filepath.Join(dist, "mybin"), 0755))
   754  	var binPath = filepath.Join(dist, "mybin", "mybin")
   755  	_, err = os.Create(binPath)
   756  	require.NoError(t, err)
   757  	var ctx = context.New(config.Project{
   758  		ProjectName: "mybin",
   759  		Dist:        dist,
   760  		NFPMs: []config.NFPM{
   761  			{
   762  				ID:      "someid",
   763  				Builds:  []string{"default"},
   764  				Formats: []string{"deb", "rpm", "apk"},
   765  				NFPMOverridables: config.NFPMOverridables{
   766  					PackageName:      "foo",
   767  					FileNameTemplate: defaultNameTemplate,
   768  					Contents: []*files.Content{
   769  						{
   770  							Source:      "testdata/testfile.txt",
   771  							Destination: "/usr/share/testfile.txt",
   772  						},
   773  					},
   774  					Deb: config.NFPMDeb{
   775  						Signature: config.NFPMDebSignature{
   776  							KeyFile: "/does/not/exist.gpg",
   777  						},
   778  					},
   779  					RPM: config.NFPMRPM{
   780  						Signature: config.NFPMRPMSignature{
   781  							KeyFile: "/does/not/exist.gpg",
   782  						},
   783  					},
   784  					APK: config.NFPMAPK{
   785  						Signature: config.NFPMAPKSignature{
   786  							KeyFile: "/does/not/exist.gpg",
   787  						},
   788  					},
   789  				},
   790  			},
   791  		},
   792  	})
   793  	ctx.Version = "1.0.0"
   794  	ctx.Git = context.GitInfo{CurrentTag: "v1.0.0"}
   795  	for _, goos := range []string{"linux", "darwin"} {
   796  		for _, goarch := range []string{"amd64", "386"} {
   797  			ctx.Artifacts.Add(&artifact.Artifact{
   798  				Name:   "mybin",
   799  				Path:   binPath,
   800  				Goarch: goarch,
   801  				Goos:   goos,
   802  				Type:   artifact.Binary,
   803  				Extra: map[string]interface{}{
   804  					"ID": "default",
   805  				},
   806  			})
   807  		}
   808  	}
   809  
   810  	t.Run("skip sign not set", func(t *testing.T) {
   811  		require.Contains(
   812  			t,
   813  			Pipe{}.Run(ctx).Error(),
   814  			`open /does/not/exist.gpg: no such file or directory`,
   815  		)
   816  	})
   817  
   818  	t.Run("skip sign set", func(t *testing.T) {
   819  		ctx.SkipSign = true
   820  		require.NoError(t, Pipe{}.Run(ctx))
   821  	})
   822  }