Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: implement nfpm archlinux packages #3470

Merged
merged 5 commits into from Nov 2, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions .goreleaser.yaml
Expand Up @@ -242,6 +242,7 @@ nfpms:
- apk
- deb
- rpm
- archlinux
dependencies:
- git
recommends:
Expand Down
15 changes: 12 additions & 3 deletions internal/pipe/nfpm/nfpm.go
Expand Up @@ -22,9 +22,10 @@ import (
"github.com/goreleaser/nfpm/v2/files"
"github.com/imdario/mergo"

_ "github.com/goreleaser/nfpm/v2/apk" // blank import to register the format
_ "github.com/goreleaser/nfpm/v2/deb" // blank import to register the format
_ "github.com/goreleaser/nfpm/v2/rpm" // blank import to register the format
_ "github.com/goreleaser/nfpm/v2/apk" // blank import to register the format
_ "github.com/goreleaser/nfpm/v2/arch" // blank import to register the format
_ "github.com/goreleaser/nfpm/v2/deb" // blank import to register the format
_ "github.com/goreleaser/nfpm/v2/rpm" // blank import to register the format
)

const (
Expand Down Expand Up @@ -355,6 +356,14 @@ func create(ctx *context.Context, fpm config.NFPM, format string, binaries []*ar
PostUpgrade: overridden.APK.Scripts.PostUpgrade,
},
},
ArchLinux: nfpm.ArchLinux{
Pkgbase: overridden.ArchLinux.Pkgbase,
Packager: overridden.ArchLinux.Packager,
Scripts: nfpm.ArchLinuxScripts{
PreUpgrade: overridden.ArchLinux.Scripts.PreUpgrade,
PostUpgrade: overridden.ArchLinux.Scripts.PostUpgrade,
},
},
},
}

Expand Down
36 changes: 29 additions & 7 deletions internal/pipe/nfpm/nfpm_test.go
Expand Up @@ -10,6 +10,7 @@ import (
"github.com/goreleaser/goreleaser/internal/testlib"
"github.com/goreleaser/goreleaser/pkg/config"
"github.com/goreleaser/goreleaser/pkg/context"
"github.com/goreleaser/nfpm/v2"
"github.com/goreleaser/nfpm/v2/files"
"github.com/stretchr/testify/require"
)
Expand Down Expand Up @@ -92,7 +93,7 @@ func TestRunPipe(t *testing.T) {
ID: "someid",
Bindir: "/usr/bin",
Builds: []string{"default"},
Formats: []string{"deb", "rpm", "apk", "termux.deb"},
Formats: []string{"deb", "rpm", "apk", "termux.deb", "archlinux"},
Section: "somesection",
Priority: "standard",
Description: "Some description with {{ .Env.DESC }}",
Expand Down Expand Up @@ -223,7 +224,7 @@ func TestRunPipe(t *testing.T) {
}
require.NoError(t, Pipe{}.Run(ctx))
packages := ctx.Artifacts.Filter(artifact.ByType(artifact.LinuxPackage)).List()
require.Len(t, packages, 40)
require.Len(t, packages, 51)
for _, pkg := range packages {
format := pkg.Format()
require.NotEmpty(t, format)
Expand All @@ -237,10 +238,21 @@ func TestRunPipe(t *testing.T) {
if pkg.Gomips != "" {
arch += "_" + pkg.Gomips
}

ext := "." + format
if format != "termux.deb" {
packager, err := nfpm.Get(format)
require.NoError(t, err)

if packager, ok := packager.(nfpm.PackagerWithExtension); ok {
ext = packager.ConventionalExtension()
}
}

if pkg.Goos == "linux" {
require.Equal(t, "foo_1.0.0_Tux_"+arch+"-10-20."+format, pkg.Name)
require.Equal(t, "foo_1.0.0_Tux_"+arch+"-10-20"+ext, pkg.Name)
} else {
require.Equal(t, "foo_1.0.0_ios_arm64-10-20."+format, pkg.Name)
require.Equal(t, "foo_1.0.0_ios_arm64-10-20"+ext, pkg.Name)
}
require.Equal(t, "someid", pkg.ID())
require.ElementsMatch(t, []string{
Expand Down Expand Up @@ -289,7 +301,7 @@ func TestRunPipeConventionalNameTemplate(t *testing.T) {
{
ID: "someid",
Builds: []string{"default"},
Formats: []string{"deb", "rpm", "apk"},
Formats: []string{"deb", "rpm", "apk", "archlinux"},
Section: "somesection",
Priority: "standard",
Description: "Some description ",
Expand All @@ -299,7 +311,7 @@ func TestRunPipeConventionalNameTemplate(t *testing.T) {
Homepage: "https://goreleaser.com/",
Bindir: "/usr/bin",
NFPMOverridables: config.NFPMOverridables{
FileNameTemplate: `{{ trimsuffix (trimsuffix (trimsuffix .ConventionalFileName ".deb") ".rpm") ".apk" }}{{ if not (eq .Amd64 "v1")}}{{ .Amd64 }}{{ end }}`,
FileNameTemplate: `{{ trimsuffix (trimsuffix (trimsuffix (trimsuffix .ConventionalFileName ".pkg.tar.zst") ".deb") ".rpm") ".apk" }}{{ if not (eq .Amd64 "v1")}}{{ .Amd64 }}{{ end }}`,
PackageName: "foo",
},
},
Expand Down Expand Up @@ -368,7 +380,7 @@ func TestRunPipeConventionalNameTemplate(t *testing.T) {
}
require.NoError(t, Pipe{}.Run(ctx))
packages := ctx.Artifacts.Filter(artifact.ByType(artifact.LinuxPackage)).List()
require.Len(t, packages, 30)
require.Len(t, packages, 40)
for _, pkg := range packages {
format := pkg.Format()
require.NotEmpty(t, format)
Expand Down Expand Up @@ -402,6 +414,16 @@ func TestRunPipeConventionalNameTemplate(t *testing.T) {
"foo_1.0.0_x86_64v2.apk",
"foo_1.0.0_x86_64v3.apk",
"foo_1.0.0_x86_64v4.apk",
"foo-1.0.0-1-aarch64.pkg.tar.zst",
"foo-1.0.0-1-armv6h.pkg.tar.zst",
"foo-1.0.0-1-armv7h.pkg.tar.zst",
"foo-1.0.0-1-i686.pkg.tar.zst",
"foo-1.0.0-1-x86_64.pkg.tar.zst",
"foo-1.0.0-1-x86_64v2.pkg.tar.zst",
"foo-1.0.0-1-x86_64v3.pkg.tar.zst",
"foo-1.0.0-1-x86_64v4.pkg.tar.zst",
"foo-1.0.0-1-mipssoftfloat.pkg.tar.zst",
"foo-1.0.0-1-mipshardfloat.pkg.tar.zst",
}, pkg.Name, "package name is not expected")
require.Equal(t, "someid", pkg.ID())
require.ElementsMatch(t, []string{binPath}, sources(artifact.ExtraOr(*pkg, extraFiles, files.Contents{})))
Expand Down
12 changes: 12 additions & 0 deletions pkg/config/config.go
Expand Up @@ -634,6 +634,17 @@ type NFPMAPK struct {
Signature NFPMAPKSignature `yaml:"signature,omitempty" json:"signature,omitempty"`
}

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

type NFPMArchLinux struct {
Pkgbase string `yaml:"pkgbase,omitempty" json:"pkgbase,omitempty"`
Packager string `yaml:"packager,omitempty" json:"packager,omitempty"`
Scripts NFPMArchLinuxScripts `yaml:"scripts,omitempty" json:"scripts,omitempty"`
}

// NFPMOverridables is used to specify per package format settings.
type NFPMOverridables struct {
FileNameTemplate string `yaml:"file_name_template,omitempty" json:"file_name_template,omitempty"`
Expand All @@ -654,6 +665,7 @@ type NFPMOverridables struct {
RPM NFPMRPM `yaml:"rpm,omitempty" json:"rpm,omitempty"`
Deb NFPMDeb `yaml:"deb,omitempty" json:"deb,omitempty"`
APK NFPMAPK `yaml:"apk,omitempty" json:"apk,omitempty"`
ArchLinux NFPMArchLinux `yaml:"archlinux,omitempty" json:"archlinux,omitempty"`
}

// SBOM config.
Expand Down
19 changes: 18 additions & 1 deletion www/docs/customization/nfpm.md
@@ -1,7 +1,7 @@
# Linux packages (via nFPM)

GoReleaser can be wired to [nfpm](https://github.com/goreleaser/nfpm) to
generate and publish `.deb`, `.rpm` and `.apk` packages.
generate and publish `.deb`, `.rpm`, `.apk`, and Archlinux packages.

Available options:

Expand Down Expand Up @@ -67,6 +67,7 @@ nfpms:
- deb
- rpm
- termux.deb # Since GoReleaser v1.11.
- archlinux

# Packages your package depends on. (overridable)
dependencies:
Expand Down Expand Up @@ -364,6 +365,22 @@ nfpms:
# is matched to the public key store in /etc/apk/keys/<key_name>.rsa.pub.
# If unset, it defaults to the maintainer email address.
key_name: origin
archlinux:
# Archlinux-specific scripts
scripts:
# The preupgrade script runs before pacman upgrades the package.
preupgrade: ./scripts/preupgrade.sh
# The postupgrade script runs after pacman upgrades the package.
postupgrade: ./scripts/postupgrade.sh

# The pkgbase can be used to explicitly specify the name to be used to refer
# to a group of packages. See: https://wiki.archlinux.org/title/PKGBUILD#pkgbase.
pkgbase: foo

# The packager refers to the organization packaging the software, not to be confused
# with the maintainer, which is the person who maintains the software.
packager: GoReleaser <staff@goreleaser.com>

```

!!! tip
Expand Down