bump changelog to 1.5.0

pull/1/head
Brad Rydzewski 5 years ago
parent edde4db0f3
commit d95e7c057b

@ -3,8 +3,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
### Added
## [1.5.0] - 2019-12-09
- support for global environment variables
- support for external environment variables from an external service
- abstraction for pipeline execution
## [1.4.0] - 2019-11-05
### Added

@ -2,7 +2,7 @@
// Use of this source code is governed by the Polyform License
// that can be found in the LICENSE file.
package driver
package runtime
import (
"bytes"

@ -2,7 +2,7 @@
// Use of this source code is governed by the Polyform License
// that can be found in the LICENSE file.
package driver
package runtime
import (
"bytes"

@ -12,8 +12,6 @@ import (
"github.com/drone/runner-go/environ"
"github.com/drone/runner-go/logger"
"github.com/drone/runner-go/pipeline"
"github.com/drone/runner-go/pipeline/runtime/driver"
"github.com/drone/runner-go/pipeline/runtime/internal/replacer"
"github.com/hashicorp/go-multierror"
"github.com/natessilva/dag"
@ -23,7 +21,7 @@ import (
// Execer executes the pipeline.
type Execer struct {
mu sync.Mutex
engine driver.Engine
engine Engine
reporter pipeline.Reporter
streamer pipeline.Streamer
sem *semaphore.Weighted
@ -33,7 +31,7 @@ type Execer struct {
func NewExecer(
reporter pipeline.Reporter,
streamer pipeline.Streamer,
engine driver.Engine,
engine Engine,
threads int64,
) *Execer {
exec := &Execer{
@ -51,7 +49,7 @@ func NewExecer(
// Exec executes the intermediate representation of the pipeline
// and returns an error if execution fails.
func (e *Execer) Exec(ctx context.Context, spec driver.Spec, state *pipeline.State) error {
func (e *Execer) Exec(ctx context.Context, spec Spec, state *pipeline.State) error {
defer e.engine.Destroy(noContext, spec)
if err := e.engine.Setup(noContext, spec); err != nil {
@ -92,7 +90,7 @@ func (e *Execer) Exec(ctx context.Context, spec driver.Spec, state *pipeline.Sta
return result
}
func (e *Execer) exec(ctx context.Context, state *pipeline.State, spec driver.Spec, step driver.Step) error {
func (e *Execer) exec(ctx context.Context, state *pipeline.State, spec Spec, step Step) error {
var result error
select {
@ -131,14 +129,14 @@ func (e *Execer) exec(ctx context.Context, state *pipeline.State, spec driver.Sp
return nil
case state.Cancelled():
return nil
case step.GetRunPolicy() == driver.RunNever:
case step.GetRunPolicy() == RunNever:
return nil
case step.GetRunPolicy() == driver.RunAlways:
case step.GetRunPolicy() == RunAlways:
break
case step.GetRunPolicy() == driver.RunOnFailure && state.Failed() == false:
case step.GetRunPolicy() == RunOnFailure && state.Failed() == false:
state.Skip(step.GetName())
return e.reporter.ReportStep(noContext, state, step.GetName())
case step.GetRunPolicy() == driver.RunOnSuccess && state.Failed():
case step.GetRunPolicy() == RunOnSuccess && state.Failed():
state.Skip(step.GetName())
return e.reporter.ReportStep(noContext, state, step.GetName())
}
@ -166,7 +164,7 @@ func (e *Execer) exec(ctx context.Context, state *pipeline.State, spec driver.Sp
// writer used to stream build logs.
wc := e.streamer.Stream(noContext, state, step.GetName())
wc = replacer.New(wc, secretSlice(step))
wc = newReplacer(wc, secretSlice(step))
// if the step is configured as a daemon, it is detached
// from the main process and executed separately.
@ -228,8 +226,8 @@ func findStep(state *pipeline.State, name string) *drone.Step {
// helper function returns an array of secrets from the
// pipeline step.
func secretSlice(step driver.Step) []driver.Secret {
var secrets []driver.Secret
func secretSlice(step Step) []Secret {
var secrets []Secret
for i := 0; i < step.GetSecretLen(); i++ {
secrets = append(secrets, step.GetSecretAt(i))
}

@ -1,5 +0,0 @@
// Copyright 2019 Drone.IO Inc. All rights reserved.
// Use of this source code is governed by the Polyform License
// that can be found in the LICENSE file.
package internal

@ -2,27 +2,23 @@
// Use of this source code is governed by the Polyform License
// that can be found in the LICENSE file.
// Package replacer provides helper functions to mask
// secrets in data streams.
package replacer
package runtime
import (
"io"
"strings"
"github.com/drone/runner-go/pipeline/runtime/driver"
)
const maskedF = "[secret:%s]"
// Replacer is an io.Writer that finds and masks sensitive data.
type Replacer struct {
// replacer is an io.Writer that finds and masks sensitive data.
type replacer struct {
w io.WriteCloser
r *strings.Replacer
}
// New returns a replacer that wraps io.Writer w.
func New(w io.WriteCloser, secrets []driver.Secret) io.WriteCloser {
// newReplacer returns a replacer that wraps io.Writer w.
func newReplacer(w io.WriteCloser, secrets []Secret) io.WriteCloser {
var oldnew []string
for _, secret := range secrets {
if len(secret.GetValue()) == 0 || secret.IsMasked() == false {
@ -41,7 +37,7 @@ func New(w io.WriteCloser, secrets []driver.Secret) io.WriteCloser {
if len(oldnew) == 0 {
return w
}
return &Replacer{
return &replacer{
w: w,
r: strings.NewReplacer(oldnew...),
}
@ -49,12 +45,12 @@ func New(w io.WriteCloser, secrets []driver.Secret) io.WriteCloser {
// Write writes p to the base writer. The method scans for any
// sensitive data in p and masks before writing.
func (r *Replacer) Write(p []byte) (n int, err error) {
func (r *replacer) Write(p []byte) (n int, err error) {
_, err = r.w.Write([]byte(r.r.Replace(string(p))))
return len(p), err
}
// Close closes the base writer.
func (r *Replacer) Close() error {
func (r *replacer) Close() error {
return r.w.Close()
}

@ -2,25 +2,23 @@
// Use of this source code is governed by the Polyform License
// that can be found in the LICENSE file.
package replacer
package runtime
import (
"bytes"
"io"
"testing"
"github.com/drone/runner-go/pipeline/runtime/driver"
)
func TestReplace(t *testing.T) {
secrets := []driver.Secret{
&secret{Name: "DOCKER_USERNAME", Data: "octocat", Mask: false},
&secret{Name: "DOCKER_PASSWORD", Data: "correct-horse-batter-staple", Mask: true},
&secret{Name: "DOCKER_EMAIL", Data: "", Mask: true},
secrets := []Secret{
&mockSecret{Name: "DOCKER_USERNAME", Data: "octocat", Mask: false},
&mockSecret{Name: "DOCKER_PASSWORD", Data: "correct-horse-batter-staple", Mask: true},
&mockSecret{Name: "DOCKER_EMAIL", Data: "", Mask: true},
}
buf := new(bytes.Buffer)
w := New(&nopCloser{buf}, secrets)
w := newReplacer(&nopCloser{buf}, secrets)
w.Write([]byte("username octocat password correct-horse-batter-staple"))
w.Close()
@ -32,14 +30,14 @@ func TestReplace(t *testing.T) {
// this test verifies that if there are no secrets to scan and
// mask, the io.WriteCloser is returned as-is.
func TestReplaceNone(t *testing.T) {
secrets := []driver.Secret{
&secret{Name: "DOCKER_USERNAME", Data: "octocat", Mask: false},
&secret{Name: "DOCKER_PASSWORD", Data: "correct-horse-batter-staple", Mask: false},
secrets := []Secret{
&mockSecret{Name: "DOCKER_USERNAME", Data: "octocat", Mask: false},
&mockSecret{Name: "DOCKER_PASSWORD", Data: "correct-horse-batter-staple", Mask: false},
}
buf := new(bytes.Buffer)
w := &nopCloser{buf}
r := New(w, secrets)
r := newReplacer(w, secrets)
if w != r {
t.Errorf("Expect buffer returned with no replacer")
}
@ -53,12 +51,12 @@ func (*nopCloser) Close() error {
return nil
}
type secret struct {
type mockSecret struct {
Name string
Data string
Mask bool
}
func (s *secret) GetName() string { return s.Name }
func (s *secret) GetValue() string { return s.Data }
func (s *secret) IsMasked() bool { return s.Mask }
func (s *mockSecret) GetName() string { return s.Name }
func (s *mockSecret) GetValue() string { return s.Data }
func (s *mockSecret) IsMasked() bool { return s.Mask }

@ -16,7 +16,6 @@ import (
"github.com/drone/runner-go/logger"
"github.com/drone/runner-go/manifest"
"github.com/drone/runner-go/pipeline"
"github.com/drone/runner-go/pipeline/runtime/driver"
"github.com/drone/runner-go/secret"
"github.com/drone/drone-go/drone"
@ -37,7 +36,7 @@ type Runner struct {
// Compiler is responsible for compiling the pipeline
// configuration to the intermediate representation.
Compiler driver.Compiler
Compiler Compiler
// Reporter reports pipeline status and logs back to the
// remote server.
@ -45,7 +44,7 @@ type Runner struct {
// Execer is responsible for executing intermediate
// representation of the pipeline and returns its results.
Exec func(context.Context, driver.Spec, *pipeline.State) error
Exec func(context.Context, Spec, *pipeline.State) error
// Lint is responsible for linting the pipeline
// and failing if any rules are broken.
@ -202,7 +201,7 @@ func (s *Runner) Run(ctx context.Context, stage *drone.Stage) error {
// compile the yaml configuration file to an intermediate
// representation, and then
args := driver.CompilerArgs{
args := CompilerArgs{
Pipeline: resource,
Manifest: manifest,
Build: data.Build,
@ -219,7 +218,7 @@ func (s *Runner) Run(ctx context.Context, stage *drone.Stage) error {
// steps that are skipped are ignored and are not stored
// in the drone database, nor displayed in the UI.
if src.GetRunPolicy() == driver.RunNever {
if src.GetRunPolicy() == RunNever {
continue
}
stage.Steps = append(stage.Steps, &drone.Step{
@ -227,7 +226,7 @@ func (s *Runner) Run(ctx context.Context, stage *drone.Stage) error {
Number: len(stage.Steps) + 1,
StageID: stage.ID,
Status: drone.StatusPending,
ErrIgnore: src.GetErrPolicy() == driver.ErrIgnore,
ErrIgnore: src.GetErrPolicy() == ErrIgnore,
})
}

@ -2,9 +2,7 @@
// Use of this source code is governed by the Polyform License
// that can be found in the LICENSE file.
// Package driver defines interfaces to be implemented by
// pipeline drivers as used by package runtime.
package driver
package runtime
import (
"context"
Loading…
Cancel
Save