Skip to content

Commit

Permalink
feat: filter by id on sign pipe (#1233)
Browse files Browse the repository at this point in the history
Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com>
  • Loading branch information
caarlos0 committed Nov 8, 2019
1 parent 3d95590 commit 4719763
Show file tree
Hide file tree
Showing 6 changed files with 88 additions and 25 deletions.
3 changes: 2 additions & 1 deletion internal/artifact/artifact.go
Expand Up @@ -211,7 +211,8 @@ func ByIDs(ids ...string) Filter {
for _, id := range ids {
id := id
filters = append(filters, func(a *Artifact) bool {
return a.ExtraOr("ID", "") == id
// checksum are allways for all artifacts, so return always true.
return a.Type == Checksum || a.ExtraOr("ID", "") == id
})
}
return Or(filters...)
Expand Down
10 changes: 7 additions & 3 deletions internal/artifact/artifact_test.go
Expand Up @@ -222,15 +222,19 @@ func TestByIDs(t *testing.T) {
"ID": "check",
},
},
{
Name: "checksum",
Type: Checksum,
},
}
var artifacts = New()
for _, a := range data {
artifacts.Add(a)
}

require.Len(t, artifacts.Filter(ByIDs("check")).items, 1)
require.Len(t, artifacts.Filter(ByIDs("foo")).items, 2)
require.Len(t, artifacts.Filter(ByIDs("foo", "bar")).items, 3)
require.Len(t, artifacts.Filter(ByIDs("check")).items, 2)
require.Len(t, artifacts.Filter(ByIDs("foo")).items, 3)
require.Len(t, artifacts.Filter(ByIDs("foo", "bar")).items, 4)
}

func TestByFormats(t *testing.T) {
Expand Down
27 changes: 15 additions & 12 deletions internal/pipe/sign/sign.go
Expand Up @@ -59,26 +59,29 @@ func (Pipe) Run(ctx *context.Context) error {
for i := range ctx.Config.Signs {
cfg := ctx.Config.Signs[i]
g.Go(func() error {
var filters []artifact.Filter
switch cfg.Artifacts {
case "checksum":
var artifacts = ctx.Artifacts.
Filter(artifact.ByType(artifact.Checksum)).
List()
return sign(ctx, cfg, artifacts)
filters = append(filters, artifact.ByType(artifact.Checksum))
if len(cfg.IDs) > 0 {
log.Warn("when artifacts is `checksum`, `ids` has no effect. ignoring")
}
case "all":
var artifacts = ctx.Artifacts.
Filter(artifact.Or(
artifact.ByType(artifact.UploadableArchive),
artifact.ByType(artifact.UploadableBinary),
artifact.ByType(artifact.Checksum),
artifact.ByType(artifact.LinuxPackage),
)).List()
return sign(ctx, cfg, artifacts)
filters = append(filters, artifact.Or(
artifact.ByType(artifact.UploadableArchive),
artifact.ByType(artifact.UploadableBinary),
artifact.ByType(artifact.Checksum),
artifact.ByType(artifact.LinuxPackage),
))
if len(cfg.IDs) > 0 {
filters = append(filters, artifact.ByIDs(cfg.IDs...))
}
case "none":
return pipe.ErrSkipSignEnabled
default:
return fmt.Errorf("invalid list of artifacts to sign: %s", cfg.Artifacts)
}
return sign(ctx, cfg, ctx.Artifacts.Filter(artifact.And(filters...)).List())
})
}
return g.Wait()
Expand Down
65 changes: 56 additions & 9 deletions internal/pipe/sign/sign_test.go
Expand Up @@ -88,8 +88,8 @@ func TestSignArtifacts(t *testing.T) {
},
},
),
signaturePaths: []string{"artifact1.sig", "artifact2.sig", "artifact3.sig", "checksum.sig", "linux_amd64/artifact4.sig"},
signatureNames: []string{"artifact1.sig", "artifact2.sig", "artifact3_1.0.0_linux_amd64.sig", "checksum.sig", "artifact4_1.0.0_linux_amd64.sig"},
signaturePaths: []string{"artifact1.sig", "artifact2.sig", "artifact3.sig", "checksum.sig", "checksum2.sig", "linux_amd64/artifact4.sig"},
signatureNames: []string{"artifact1.sig", "artifact2.sig", "artifact3_1.0.0_linux_amd64.sig", "checksum.sig", "checksum2.sig", "artifact4_1.0.0_linux_amd64.sig"},
},
{
desc: "sign all artifacts",
Expand All @@ -102,8 +102,23 @@ func TestSignArtifacts(t *testing.T) {
},
},
),
signaturePaths: []string{"artifact1.sig", "artifact2.sig", "artifact3.sig", "checksum.sig", "linux_amd64/artifact4.sig"},
signatureNames: []string{"artifact1.sig", "artifact2.sig", "artifact3_1.0.0_linux_amd64.sig", "checksum.sig", "artifact4_1.0.0_linux_amd64.sig"},
signaturePaths: []string{"artifact1.sig", "artifact2.sig", "artifact3.sig", "checksum.sig", "checksum2.sig", "linux_amd64/artifact4.sig"},
signatureNames: []string{"artifact1.sig", "artifact2.sig", "artifact3_1.0.0_linux_amd64.sig", "checksum.sig", "checksum2.sig", "artifact4_1.0.0_linux_amd64.sig"},
},
{
desc: "sign filtered artifacts",
ctx: context.New(
config.Project{
Signs: []config.Sign{
{
Artifacts: "all",
IDs: []string{"foo"},
},
},
},
),
signaturePaths: []string{"artifact1.sig", "artifact3.sig", "checksum.sig", "checksum2.sig"},
signatureNames: []string{"artifact1.sig", "artifact3_1.0.0_linux_amd64.sig", "checksum.sig", "checksum2.sig"},
},
{
desc: "sign only checksums",
Expand All @@ -116,8 +131,23 @@ func TestSignArtifacts(t *testing.T) {
},
},
),
signaturePaths: []string{"checksum.sig"},
signatureNames: []string{"checksum.sig"},
signaturePaths: []string{"checksum.sig", "checksum2.sig"},
signatureNames: []string{"checksum.sig", "checksum2.sig"},
},
{
desc: "sign only filtered checksums",
ctx: context.New(
config.Project{
Signs: []config.Sign{
{
Artifacts: "checksum",
IDs: []string{"foo"},
},
},
},
),
signaturePaths: []string{"checksum.sig", "checksum2.sig"},
signatureNames: []string{"checksum.sig", "checksum2.sig"},
},
{
desc: "sign all artifacts with env",
Expand All @@ -141,8 +171,8 @@ func TestSignArtifacts(t *testing.T) {
},
},
),
signaturePaths: []string{"artifact1.sig", "artifact2.sig", "artifact3.sig", "checksum.sig", "linux_amd64/artifact4.sig"},
signatureNames: []string{"artifact1.sig", "artifact2.sig", "artifact3_1.0.0_linux_amd64.sig", "checksum.sig", "artifact4_1.0.0_linux_amd64.sig"},
signaturePaths: []string{"artifact1.sig", "artifact2.sig", "artifact3.sig", "checksum.sig", "checksum2.sig", "linux_amd64/artifact4.sig"},
signatureNames: []string{"artifact1.sig", "artifact2.sig", "artifact3_1.0.0_linux_amd64.sig", "checksum.sig", "checksum2.sig", "artifact4_1.0.0_linux_amd64.sig"},
},
}

Expand All @@ -164,7 +194,7 @@ func testSign(t *testing.T, ctx *context.Context, signaturePaths []string, signa
ctx.Config.Dist = tmpdir

// create some fake artifacts
var artifacts = []string{"artifact1", "artifact2", "artifact3", "checksum"}
var artifacts = []string{"artifact1", "artifact2", "artifact3", "checksum", "checksum2"}
err = os.Mkdir(filepath.Join(tmpdir, "linux_amd64"), os.ModePerm)
assert.NoError(t, err)
for _, f := range artifacts {
Expand All @@ -177,26 +207,43 @@ func testSign(t *testing.T, ctx *context.Context, signaturePaths []string, signa
Name: "artifact1",
Path: filepath.Join(tmpdir, "artifact1"),
Type: artifact.UploadableArchive,
Extra: map[string]interface{}{
"ID": "foo",
},
})
ctx.Artifacts.Add(&artifact.Artifact{
Name: "artifact2",
Path: filepath.Join(tmpdir, "artifact2"),
Type: artifact.UploadableArchive,
Extra: map[string]interface{}{
"ID": "foo3",
},
})
ctx.Artifacts.Add(&artifact.Artifact{
Name: "artifact3_1.0.0_linux_amd64",
Path: filepath.Join(tmpdir, "artifact3"),
Type: artifact.UploadableBinary,
Extra: map[string]interface{}{
"ID": "foo",
},
})
ctx.Artifacts.Add(&artifact.Artifact{
Name: "checksum",
Path: filepath.Join(tmpdir, "checksum"),
Type: artifact.Checksum,
})
ctx.Artifacts.Add(&artifact.Artifact{
Name: "checksum2",
Path: filepath.Join(tmpdir, "checksum2"),
Type: artifact.Checksum,
})
ctx.Artifacts.Add(&artifact.Artifact{
Name: "artifact4_1.0.0_linux_amd64",
Path: filepath.Join(tmpdir, "linux_amd64", "artifact4"),
Type: artifact.UploadableBinary,
Extra: map[string]interface{}{
"ID": "foo3",
},
})

// configure the pipeline
Expand Down
1 change: 1 addition & 0 deletions pkg/config/config.go
Expand Up @@ -230,6 +230,7 @@ type Sign struct {
Args []string `yaml:"args,omitempty"`
Signature string `yaml:"signature,omitempty"`
Artifacts string `yaml:"artifacts,omitempty"`
IDs []string `yaml:"ids,omitempty"`
}

// SnapcraftAppMetadata for the binaries that will be in the snap package
Expand Down
7 changes: 7 additions & 0 deletions www/content/sign.md
Expand Up @@ -56,4 +56,11 @@ signs:
#
# defaults to `none`
artifacts: all

# IDs of the artifacts to sign.
# Defaults to all.
# If `artifacts` is checksum, this fields has no effect.
ids:
- foo
- bar
```

0 comments on commit 4719763

Please sign in to comment.