1
1
Fork 0
mirror of https://github.com/goreleaser/nfpm synced 2024-05-20 14:26:39 +02:00
nfpm/acceptance_test.go

334 lines
9.0 KiB
Go
Raw Normal View History

//go:build acceptance
// +build acceptance
package nfpm_test
2018-03-11 18:58:53 +01:00
2018-03-11 19:14:24 +01:00
import (
"fmt"
2018-03-11 19:14:24 +01:00
"os"
"os/exec"
"path/filepath"
2021-11-13 22:10:55 +01:00
"strings"
2018-03-11 19:14:24 +01:00
"testing"
"github.com/goreleaser/nfpm/v2"
_ "github.com/goreleaser/nfpm/v2/apk"
_ "github.com/goreleaser/nfpm/v2/deb"
_ "github.com/goreleaser/nfpm/v2/rpm"
"github.com/stretchr/testify/require"
2018-03-11 19:14:24 +01:00
)
2019-03-04 14:14:05 +01:00
// nolint: gochecknoglobals
var formatArchs = map[string][]string{
2021-11-14 01:19:11 +01:00
"apk": {"amd64", "arm64", "386", "ppc64le", "armv6", "armv7", "s390x"},
"deb": {"amd64", "arm64", "ppc64le", "armv7", "s390x"},
2021-11-14 00:48:43 +01:00
"rpm": {"amd64", "arm64", "ppc64le", "armv7"},
}
func TestCore(t *testing.T) {
t.Parallel()
testNames := []string{
"min",
"simple",
"no-glob",
"complex",
"env-var-version",
"overrides",
"meta",
"withchangelog",
"symlink",
"signed",
}
for _, name := range testNames {
for format, architecture := range formatArchs {
for _, arch := range architecture {
2021-11-14 01:19:11 +01:00
func(t *testing.T, testName, testFormat, testArch string) {
t.Run(fmt.Sprintf("%s/%s/%s", testFormat, testArch, testName), func(t *testing.T) {
t.Parallel()
if testArch == "ppc64le" && os.Getenv("NO_TEST_PPC64LE") == "true" {
2021-11-14 01:19:11 +01:00
t.Skip("ppc64le arch not supported in pipeline")
}
2021-11-14 01:19:11 +01:00
accept(t, acceptParms{
Name: fmt.Sprintf("%s_%s", testName, testArch),
Conf: fmt.Sprintf("core.%s.yaml", testName),
Format: testFormat,
Docker: dockerParams{
File: fmt.Sprintf("%s.dockerfile", testFormat),
Target: testName,
Arch: testArch,
},
})
})
}(t, name, format, arch)
}
}
}
}
func TestUpgrade(t *testing.T) {
t.Parallel()
testNames := []string{
"upgrade",
}
for _, name := range testNames {
for format, architecture := range formatArchs {
for _, arch := range architecture {
2021-11-14 01:19:11 +01:00
func(t *testing.T, testName, testFormat, testArch string) {
t.Run(fmt.Sprintf("%s/%s/%s", testFormat, testArch, testName), func(t *testing.T) {
t.Parallel()
if testArch == "ppc64le" && os.Getenv("NO_TEST_PPC64LE") == "true" {
2021-11-14 01:19:11 +01:00
t.Skip("ppc64le arch not supported in pipeline")
}
2021-11-13 22:34:09 +01:00
arch := strings.ReplaceAll(testArch, "armv", "arm/")
oldpkg := fmt.Sprintf("tmp/%s_%s.v1.%s", testName, testArch, testFormat)
target := fmt.Sprintf("./testdata/acceptance/%s", oldpkg)
require.NoError(t, os.MkdirAll("./testdata/acceptance/tmp", 0o700))
config, err := nfpm.ParseFileWithEnvMapping(fmt.Sprintf("./testdata/acceptance/%s.v1.yaml", testName),
func(s string) string {
switch s {
case "BUILD_ARCH":
2021-11-13 22:34:09 +01:00
return strings.ReplaceAll(arch, "/", "")
case "SEMVER":
return "v1.0.0-0.1.b1+git.abcdefgh"
default:
return os.Getenv(s)
}
},
)
require.NoError(t, err)
info, err := config.Get(testFormat)
require.NoError(t, err)
require.NoError(t, nfpm.Validate(info))
pkg, err := nfpm.Get(testFormat)
require.NoError(t, err)
f, err := os.Create(target)
require.NoError(t, err)
defer f.Close()
info.Target = target
require.NoError(t, pkg.Package(nfpm.WithDefaults(info), f))
2021-11-14 01:19:11 +01:00
accept(t, acceptParms{
Name: fmt.Sprintf("%s_%s.v2", testName, testArch),
Conf: fmt.Sprintf("%s.v2.yaml", testName),
Format: testFormat,
Docker: dockerParams{
File: fmt.Sprintf("%s.dockerfile", testFormat),
Target: testName,
Arch: testArch,
BuildArgs: []string{fmt.Sprintf("oldpackage=%s", oldpkg)},
},
})
})
}(t, name, format, arch)
}
}
}
}
func TestRPMCompression(t *testing.T) {
t.Parallel()
format := "rpm"
compressFormats := []string{"gzip", "xz", "lzma"}
for _, arch := range formatArchs[format] {
for _, compFormat := range compressFormats {
2021-11-14 01:19:11 +01:00
func(t *testing.T, testCompFormat, testArch string) {
t.Run(fmt.Sprintf("%s/%s/%s", format, testArch, testCompFormat), func(t *testing.T) {
t.Parallel()
if testArch == "ppc64le" && os.Getenv("NO_TEST_PPC64LE") == "true" {
2021-11-14 01:19:11 +01:00
t.Skip("ppc64le arch not supported in pipeline")
}
2021-11-14 01:19:11 +01:00
accept(t, acceptParms{
Name: fmt.Sprintf("%s_compression_%s", testCompFormat, testArch),
Conf: fmt.Sprintf("rpm.%s.compression.yaml", testCompFormat),
Format: format,
Docker: dockerParams{
File: fmt.Sprintf("%s.dockerfile", format),
Target: "compression",
Arch: testArch,
BuildArgs: []string{fmt.Sprintf("compression=%s", testCompFormat)},
},
})
})
}(t, compFormat, arch)
}
}
}
func TestDebCompression(t *testing.T) {
t.Parallel()
format := "deb"
compressFormats := []string{"gzip", "xz", "none"}
for _, arch := range formatArchs[format] {
for _, compFormat := range compressFormats {
2021-11-14 01:19:11 +01:00
func(t *testing.T, testCompFormat, testArch string) {
t.Run(fmt.Sprintf("%s/%s/%s", format, testArch, testCompFormat), func(t *testing.T) {
t.Parallel()
if testArch == "ppc64le" && os.Getenv("NO_TEST_PPC64LE") == "true" {
2021-11-14 01:19:11 +01:00
t.Skip("ppc64le arch not supported in pipeline")
}
2021-11-14 01:19:11 +01:00
accept(t, acceptParms{
Name: fmt.Sprintf("%s_compression_%s", testCompFormat, testArch),
Conf: fmt.Sprintf("deb.%s.compression.yaml", testCompFormat),
Format: format,
Docker: dockerParams{
File: fmt.Sprintf("%s.dockerfile", format),
Target: "compression",
Arch: testArch,
},
})
})
}(t, compFormat, arch)
}
}
}
func TestRPMSpecific(t *testing.T) {
t.Parallel()
format := "rpm"
testNames := []string{
"release",
"directories",
}
for _, name := range testNames {
for _, arch := range formatArchs[format] {
2021-11-14 01:19:11 +01:00
func(t *testing.T, testName, testArch string) {
t.Run(fmt.Sprintf("%s/%s/%s", format, testArch, testName), func(t *testing.T) {
t.Parallel()
if testArch == "ppc64le" && os.Getenv("NO_TEST_PPC64LE") == "true" {
2021-11-14 01:19:11 +01:00
t.Skip("ppc64le arch not supported in pipeline")
}
2021-11-14 01:19:11 +01:00
accept(t, acceptParms{
Name: fmt.Sprintf("%s_%s", testName, testArch),
Conf: fmt.Sprintf("%s.%s.yaml", format, testName),
Format: format,
Docker: dockerParams{
File: fmt.Sprintf("%s.dockerfile", format),
Target: testName,
Arch: testArch,
},
})
})
}(t, name, arch)
}
}
}
func TestDebSpecific(t *testing.T) {
t.Parallel()
format := "deb"
testNames := []string{
"rules",
"triggers",
"breaks",
}
for _, name := range testNames {
for _, arch := range formatArchs[format] {
2021-11-14 01:19:11 +01:00
func(t *testing.T, testName, testArch string) {
t.Run(fmt.Sprintf("%s/%s/%s", format, testArch, testName), func(t *testing.T) {
t.Parallel()
if testArch == "ppc64le" && os.Getenv("NO_TEST_PPC64LE") == "true" {
2021-11-14 01:19:11 +01:00
t.Skip("ppc64le arch not supported in pipeline")
}
2021-11-14 01:19:11 +01:00
accept(t, acceptParms{
Name: fmt.Sprintf("%s_%s", testName, testArch),
Conf: fmt.Sprintf("%s.%s.yaml", format, testName),
Format: format,
Docker: dockerParams{
File: fmt.Sprintf("%s.dockerfile", format),
Target: testName,
Arch: testArch,
},
})
})
}(t, name, arch)
}
}
}
type acceptParms struct {
Name string
Conf string
Format string
Docker dockerParams
}
type dockerParams struct {
File string
Target string
Arch string
BuildArgs []string
2018-07-09 04:20:39 +02:00
}
type testWriter struct {
*testing.T
}
func (t testWriter) Write(p []byte) (n int, err error) {
t.Log(string(p))
return len(p), nil
}
2018-07-09 04:20:39 +02:00
func accept(t *testing.T, params acceptParms) {
t.Helper()
2021-11-13 22:10:55 +01:00
2021-11-13 22:34:09 +01:00
arch := strings.ReplaceAll(params.Docker.Arch, "armv", "arm/")
configFile := filepath.Join("./testdata/acceptance/", params.Conf)
tmp, err := filepath.Abs("./testdata/acceptance/tmp")
2018-03-11 19:14:24 +01:00
require.NoError(t, err)
packageName := params.Name + "." + params.Format
target := filepath.Join(tmp, packageName)
feat: apk support (#207) * first attempt at apk, built from Issue #39 * inspector cleanups * read the contrib note, ran linter, fixes made. Noice! * linter went wonky * linter went wonky * fix some lint issues * fix some lint issues * lightweight file validation, while I try to refactor method into smaller chunks * refactorings to get `make ci` to pass. ain't pretty, but hopefully doesn't make things worse. * add ignore file to get workdir created in CI * try to get a successful test run on CI (file sizes differ on CI). * must remember to run liner (make ci) before pushing * Doh! Detect CI via correct env var name * tweak CI expected file sizes * blech. try to get a range of values for CI * better message if value fails conditions * better message if value fails conditions * initial impl of Package interface - just hoping I don't already have the arch mapping backwards. * missed non-altered arch case * ci failures * refactor io.File to Writer * add note about command to test apk install in docker * remove absolute paths from test (prep for replacement with info.Files). * rename test files folder * get ci file size ranges happy after path changes * get ci file size ranges happy after path changes * move COPY towards end, allowing more caching of layers - feedback from @tcurdt * remove Gz from function name * rename combine function * add skipVerify flag to preserve generated .apk file for use in dockerfile manual test. Thanks @tcurdt * make ci is my friend * remove useless comment * start conversion to nfpm.Info * use base64 encoded string for private signing key * remove old runit() method, as we can now test using Default.Package. add some tests lifted from deb_test.go. * duck and cover: register the apk packager * use the metadata from nfpm (does not handle scripts/pre/post, etc) * getting closer to removing size assertions, but not just yet * getting closer to removing size assertions, but not just yet * add niffty import for init - Blank identifier comes to the rescue. Thanks @tcurdt. add apk to overrides parse test. * I will very much enjoy deleting this assertion...soon, soon. * add PrivateKeyFile option, which is subordinate to PrivateKey * move PrivateKey configs to root config struct. expand PrivateKey configs from env vars if set. * provide the user a hint if privatekey config is missing for .apk packager * lovin' the linter now. learning language from linter loudness. didn't know switch could work like that. * add support for 'scripts' in control file * fix control metadata * make signing keyname configurable * goofy size fix * remove temporary test and related files * fix template copy/pasta error * remove old print statements * first take at integration tests. should remove need for --allow-untrusted in `apk add` command. * fix: merge issues, remove signature support Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com> * fix: tests Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com> * fix: lint issues Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com> * fix: tests Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com> * test: meta Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com> * fix: datahash seems unused Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com> * fix: improve test code Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com> * fix: unused params Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com> * fix: tests Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com> * test: changelog test Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com> * test: fix Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com> * fix: img Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com> * test: symlink Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com> * fix: uneeded deletes Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com> * feat: symlinks Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com> Co-authored-by: Dan Rollo <danrollo@gmail.com>
2020-08-17 22:28:38 +02:00
t.Log("package: " + target)
2018-03-11 19:14:24 +01:00
require.NoError(t, os.MkdirAll(tmp, 0o700))
2018-03-11 19:14:24 +01:00
envFunc := func(s string) string {
switch s {
case "BUILD_ARCH":
2021-11-13 22:34:09 +01:00
return strings.ReplaceAll(arch, "/", "")
case "SEMVER":
return "v1.0.0-0.1.b1+git.abcdefgh"
default:
return os.Getenv(s)
}
}
config, err := nfpm.ParseFileWithEnvMapping(configFile, envFunc)
2018-03-11 19:14:24 +01:00
require.NoError(t, err)
2018-07-09 04:20:39 +02:00
info, err := config.Get(params.Format)
2018-03-11 19:14:24 +01:00
require.NoError(t, err)
2018-04-05 04:13:47 +02:00
require.NoError(t, nfpm.Validate(info))
2018-07-09 04:20:39 +02:00
pkg, err := nfpm.Get(params.Format)
2018-03-11 19:14:24 +01:00
require.NoError(t, err)
cmdArgs := []string{
"build", "--rm", "--force-rm",
2021-11-13 22:10:55 +01:00
"--platform", fmt.Sprintf("linux/%s", arch),
"-f", params.Docker.File,
"--target", params.Docker.Target,
"--build-arg", "package=" + filepath.Join("tmp", packageName),
}
for _, arg := range params.Docker.BuildArgs {
cmdArgs = append(cmdArgs, "--build-arg", arg)
}
cmdArgs = append(cmdArgs, ".")
2021-11-13 22:27:53 +01:00
f, err := os.OpenFile(target, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0o764)
2018-03-11 19:14:24 +01:00
require.NoError(t, err)
info.Target = target
2018-03-11 19:14:24 +01:00
require.NoError(t, pkg.Package(nfpm.WithDefaults(info), f))
2018-09-12 18:17:59 +02:00
//nolint:gosec
cmd := exec.Command("docker", cmdArgs...)
cmd.Dir = "./testdata/acceptance"
cmd.Stderr = testWriter{t}
cmd.Stdout = cmd.Stderr
t.Log("will exec:", cmd.Args, "with env BUILD_ARCH:", envFunc("BUILD_ARCH"))
require.NoError(t, cmd.Run())
2018-03-11 18:58:53 +01:00
}