Skip to content

Commit

Permalink
feat: add support for alpine pre and post upgrade scripts and add an …
Browse files Browse the repository at this point in the history
…upgrade test (#323)
  • Loading branch information
Dj Gilcrease committed Apr 20, 2021
1 parent fb9b6f4 commit 501e743
Show file tree
Hide file tree
Showing 21 changed files with 457 additions and 112 deletions.
82 changes: 56 additions & 26 deletions acceptance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,37 +64,67 @@ func TestCore(t *testing.T) {
}
}

func TestConfigNoReplace(t *testing.T) {
func TestUpgrade(t *testing.T) {
t.Parallel()
target := "./testdata/acceptance/tmp/noreplace_old_rpm.rpm"
require.NoError(t, os.MkdirAll("./testdata/acceptance/tmp", 0o700))
testNames := []string{
"upgrade",
}
for _, name := range testNames {
for format, architecture := range formatArchs {
for _, arch := range architecture {
func(tt *testing.T, testName, testFormat, testArch string) {
tt.Run(fmt.Sprintf("%s/%s/%s", testFormat, testArch, testName), func(ttt *testing.T) {
ttt.Parallel()
if testArch == "ppc64le" && os.Getenv("NO_TEST_PPC64LE") == "true" {
ttt.Skip("ppc64le arch not supported in pipeline")
}
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.ParseFile("./testdata/acceptance/rpm.config-noreplace-old.yaml")
require.NoError(t, err)
config, err := nfpm.ParseFileWithEnvMapping(fmt.Sprintf("./testdata/acceptance/%s.v1.yaml", testName),
func(s string) string {
switch s {
case "BUILD_ARCH":
return testArch
case "SEMVER":
return "v1.0.0-0.1.b1+git.abcdefgh"
default:
return os.Getenv(s)
}
},
)
require.NoError(t, err)

info, err := config.Get("rpm")
require.NoError(t, err)
require.NoError(t, nfpm.Validate(info))
info, err := config.Get(testFormat)
require.NoError(t, err)
require.NoError(t, nfpm.Validate(info))

pkg, err := nfpm.Get("rpm")
require.NoError(t, err)
pkg, err := nfpm.Get(testFormat)
require.NoError(t, err)

f, err := os.Create(target)
require.NoError(t, err)
info.Target = target
require.NoError(t, pkg.Package(nfpm.WithDefaults(info), f))
t.Run("rpm/config-noreplace", func(t *testing.T) {
accept(t, acceptParms{
Name: "noreplace_rpm",
Conf: "rpm.config-noreplace.yaml",
Format: "rpm",
Docker: dockerParams{
File: "rpm.dockerfile",
Target: "config-noreplace",
Arch: "amd64",
},
})
})
f, err := os.Create(target)
require.NoError(t, err)
defer f.Close()
info.Target = target
require.NoError(t, pkg.Package(nfpm.WithDefaults(info), f))

accept(ttt, 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 TestCompression(t *testing.T) {
Expand Down
10 changes: 6 additions & 4 deletions apk/apk.go
Original file line number Diff line number Diff line change
Expand Up @@ -340,10 +340,12 @@ func createBuilderControl(info *nfpm.Info, size int64, dataDigest []byte) func(t
//
// exit 0
for script, dest := range map[string]string{
info.Scripts.PreInstall: ".pre-install",
info.Scripts.PostInstall: ".post-install",
info.Scripts.PreRemove: ".pre-deinstall",
info.Scripts.PostRemove: ".post-deinstall",
info.Scripts.PreInstall: ".pre-install",
info.APK.Scripts.PreUpgrade: ".pre-upgrade",
info.Scripts.PostInstall: ".post-install",
info.APK.Scripts.PostUpgrade: ".post-upgrade",
info.Scripts.PreRemove: ".pre-deinstall",
info.Scripts.PostRemove: ".post-deinstall",
} {
if script != "" {
if err := newScriptInsideTarGz(tw, script, dest); err != nil {
Expand Down
61 changes: 39 additions & 22 deletions apk/apk_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import (
"path/filepath"
"testing"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

"github.com/goreleaser/nfpm/v2"
Expand Down Expand Up @@ -101,8 +100,8 @@ func verifyArch(t *testing.T, nfpmArch, expectedArch string) {
info := exampleInfo()
info.Arch = nfpmArch

assert.NoError(t, Default.Package(info, ioutil.Discard))
assert.Equal(t, expectedArch, info.Arch)
require.NoError(t, Default.Package(info, ioutil.Discard))
require.Equal(t, expectedArch, info.Arch)
}

func TestCreateBuilderData(t *testing.T) {
Expand All @@ -115,9 +114,9 @@ func TestCreateBuilderData(t *testing.T) {
var buf bytes.Buffer
tw := tar.NewWriter(&buf)

assert.NoError(t, builderData(tw))
require.NoError(t, builderData(tw))

assert.Equal(t, 11784, buf.Len())
require.Equal(t, 11784, buf.Len())
}

func TestCombineToApk(t *testing.T) {
Expand All @@ -129,8 +128,8 @@ func TestCombineToApk(t *testing.T) {

var bufTarget bytes.Buffer

assert.NoError(t, combineToApk(&bufTarget, &bufData, &bufControl))
assert.Equal(t, 2, bufTarget.Len())
require.NoError(t, combineToApk(&bufTarget, &bufData, &bufControl))
require.Equal(t, 2, bufTarget.Len())
}

func TestPathsToCreate(t *testing.T) {
Expand All @@ -142,7 +141,7 @@ func TestPathsToCreate(t *testing.T) {
parts := parts
pathToTest := pathToTest
t.Run(fmt.Sprintf("pathToTest: '%s'", pathToTest), func(t *testing.T) {
assert.Equal(t, parts, pathsToCreate(pathToTest))
require.Equal(t, parts, pathsToCreate(pathToTest))
})
}
}
Expand Down Expand Up @@ -182,7 +181,7 @@ func TestDefaultWithArch(t *testing.T) {

func TestNoInfo(t *testing.T) {
err := Default.Package(nfpm.WithDefaults(&nfpm.Info{}), ioutil.Discard)
assert.Error(t, err)
require.Error(t, err)
}

func TestFileDoesNotExist(t *testing.T) {
Expand Down Expand Up @@ -218,7 +217,7 @@ func TestFileDoesNotExist(t *testing.T) {
}),
ioutil.Discard,
)
assert.EqualError(t, err, fmt.Sprintf("matching \"%s\": file does not exist", filepath.ToSlash(abs)))
require.EqualError(t, err, fmt.Sprintf("matching \"%s\": file does not exist", filepath.ToSlash(abs)))
}

func TestNoFiles(t *testing.T) {
Expand All @@ -241,7 +240,7 @@ func TestNoFiles(t *testing.T) {
}),
ioutil.Discard,
)
assert.NoError(t, err)
require.NoError(t, err)
}

func TestCreateBuilderControl(t *testing.T) {
Expand All @@ -253,16 +252,16 @@ func TestCreateBuilderControl(t *testing.T) {

var w bytes.Buffer
tw := tar.NewWriter(&w)
assert.NoError(t, builderControl(tw))
require.NoError(t, builderControl(tw))

control := string(extractFromTar(t, w.Bytes(), ".PKGINFO"))
golden := "testdata/TestCreateBuilderControl.golden"
if *update {
require.NoError(t, ioutil.WriteFile(golden, []byte(control), 0o655)) // nolint: gosec
}
bts, err := ioutil.ReadFile(golden) //nolint:gosec
assert.NoError(t, err)
assert.Equal(t, string(bts), control)
require.NoError(t, err)
require.Equal(t, string(bts), control)
}

func TestCreateBuilderControlScripts(t *testing.T) {
Expand All @@ -273,6 +272,10 @@ func TestCreateBuilderControlScripts(t *testing.T) {
PreRemove: "../testdata/scripts/preremove.sh",
PostRemove: "../testdata/scripts/postremove.sh",
}
info.APK.Scripts = nfpm.APKScripts{
PreUpgrade: "../testdata/scripts/preupgrade.sh",
PostUpgrade: "../testdata/scripts/postupgrade.sh",
}
err := info.Validate()
require.NoError(t, err)

Expand All @@ -281,21 +284,35 @@ func TestCreateBuilderControlScripts(t *testing.T) {

var w bytes.Buffer
tw := tar.NewWriter(&w)
assert.NoError(t, builderControl(tw))
require.NoError(t, builderControl(tw))

control := string(extractFromTar(t, w.Bytes(), ".PKGINFO"))
golden := "testdata/TestCreateBuilderControlScripts.golden"
if *update {
require.NoError(t, ioutil.WriteFile(golden, []byte(control), 0o655)) // nolint: gosec
}
bts, err := ioutil.ReadFile(golden) //nolint:gosec
assert.NoError(t, err)
assert.Equal(t, string(bts), control)
require.NoError(t, err)
require.Equal(t, string(bts), control)

// Validate scripts are correct
script := string(extractFromTar(t, w.Bytes(), ".pre-install"))
require.Contains(t, script, `echo "Preinstall" > /dev/null`)
script = string(extractFromTar(t, w.Bytes(), ".post-install"))
require.Contains(t, script, `echo "Postinstall" > /dev/null`)
script = string(extractFromTar(t, w.Bytes(), ".pre-upgrade"))
require.Contains(t, script, `echo "PreUpgrade" > /dev/null`)
script = string(extractFromTar(t, w.Bytes(), ".post-upgrade"))
require.Contains(t, script, `echo "PostUpgrade" > /dev/null`)
script = string(extractFromTar(t, w.Bytes(), ".pre-deinstall"))
require.Contains(t, script, `echo "Preremove" > /dev/null`)
script = string(extractFromTar(t, w.Bytes(), ".post-deinstall"))
require.Contains(t, script, `echo "Postremove" > /dev/null`)
}

func TestControl(t *testing.T) {
var w bytes.Buffer
assert.NoError(t, writeControl(&w, controlData{
require.NoError(t, writeControl(&w, controlData{
Info: exampleInfo(),
InstalledSize: 10,
}))
Expand All @@ -304,8 +321,8 @@ func TestControl(t *testing.T) {
require.NoError(t, ioutil.WriteFile(golden, w.Bytes(), 0o655)) // nolint: gosec
}
bts, err := ioutil.ReadFile(golden) //nolint:gosec
assert.NoError(t, err)
assert.Equal(t, string(bts), w.String())
require.NoError(t, err)
require.Equal(t, string(bts), w.String())
}

func TestSignature(t *testing.T) {
Expand Down Expand Up @@ -450,7 +467,7 @@ func TestAPKConventionalFileName(t *testing.T) {
Release: testCase.Release,
Prerelease: testCase.Prerelease,
}
assert.Equal(t, testCase.Expect, Default.ConventionalFileName(info))
require.Equal(t, testCase.Expect, Default.ConventionalFileName(info))
}
}

Expand All @@ -463,5 +480,5 @@ func TestPackageSymlinks(t *testing.T) {
Type: "symlink",
},
}
assert.NoError(t, Default.Package(info, ioutil.Discard))
require.NoError(t, Default.Package(info, ioutil.Discard))
}
6 changes: 6 additions & 0 deletions nfpm.go
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,7 @@ type RPMSignature struct {

type APK struct {
Signature APKSignature `yaml:"signature,omitempty"`
Scripts APKScripts `yaml:"scripts,omitempty"`
}

type APKSignature struct {
Expand All @@ -275,6 +276,11 @@ type APKSignature struct {
KeyName string `yaml:"key_name,omitempty"`
}

type APKScripts struct {
PreUpgrade string `yaml:"preupgrade,omitempty"`
PostUpgrade string `yaml:"postupgrade,omitempty"`
}

// Deb is custom configs that are only available on deb packages.
type Deb struct {
Scripts DebScripts `yaml:"scripts,omitempty"`
Expand Down
25 changes: 25 additions & 0 deletions testdata/acceptance/apk.dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -102,3 +102,28 @@ RUN export FOUND_VER="$(cat found)" && \
# ---- changelog test ----
FROM min AS withchangelog
RUN echo "No Changelog support for apk?"


# ---- upgrade test ----
FROM test_base AS upgrade
ARG oldpackage
RUN echo "${oldpackage}"
COPY ${oldpackage} /tmp/old_foo.apk
RUN apk add --allow-untrusted /tmp/old_foo.apk

RUN test -f /tmp/preinstall-proof
RUN cat /tmp/preinstall-proof | grep "Install"

RUN test -f /tmp/postinstall-proof
RUN cat /tmp/postinstall-proof | grep "Install"

RUN test ! -f /tmp/preupgrade-proof
RUN test ! -f /tmp/postupgrade-proof

RUN echo modified > /etc/regular.conf
RUN echo modified > /etc/noreplace.conf

RUN apk add --allow-untrusted /tmp/foo.apk

RUN test -f /tmp/preupgrade-proof
RUN test -f /tmp/postupgrade-proof
4 changes: 4 additions & 0 deletions testdata/acceptance/core.complex.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,7 @@ scripts:
postinstall: ./testdata/acceptance/scripts/postinstall.sh
preremove: ./testdata/acceptance/scripts/preremove.sh
postremove: ./testdata/acceptance/scripts/postremove.sh
apk:
scripts:
preupgrade: ./testdata/acceptance/scripts/preupgrade.sh
postupgrade: ./testdata/acceptance/scripts/postupgrade.sh
30 changes: 29 additions & 1 deletion testdata/acceptance/deb.dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -144,4 +144,32 @@ RUN dpkg -i /tmp/dummy.deb
RUN dpkg -i /tmp/foo.deb 2>&1 | grep "foo breaks dummy"
# make sure foo can be installed if dummy is not installed
RUN dpkg -r dummy
RUN dpkg -i /tmp/foo.deb
RUN dpkg -i /tmp/foo.deb


# ---- upgrade test ----
FROM test_base AS upgrade
ARG oldpackage
RUN echo "${oldpackage}"
COPY ${oldpackage} /tmp/old_foo.deb
RUN dpkg -i /tmp/old_foo.deb

RUN test -f /tmp/preinstall-proof
RUN cat /tmp/preinstall-proof | grep "Install"

RUN test -f /tmp/postinstall-proof
RUN cat /tmp/postinstall-proof | grep "Install"

RUN dpkg -i /tmp/foo.deb

RUN test -f /tmp/preremove-proof
RUN cat /tmp/preremove-proof | grep "Upgrade"

RUN test -f /tmp/postremove-proof
RUN cat /tmp/postremove-proof | grep "Upgrade"

RUN test -f /tmp/preinstall-proof
RUN cat /tmp/preinstall-proof | grep "Upgrade"

RUN test -f /tmp/postinstall-proof
RUN cat /tmp/postinstall-proof | grep "Upgrade"
15 changes: 0 additions & 15 deletions testdata/acceptance/rpm.config-noreplace-old.yaml

This file was deleted.

Loading

1 comment on commit 501e743

@vercel
Copy link

@vercel vercel bot commented on 501e743 Apr 20, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.