gantry

package module
v0.5.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 28, 2019 License: Apache-2.0 Imports: 20 Imported by: 0

README

Gantry (Container Crane)

GoDoc Licence Build Status Go Report Card Release AUR package

Gantry is a pipeline management tool using containers for all relevant steps. It supports a basic docker-compose subset allowing docker-compose like deployments with wharfer. If wharfer is not installed docker will be used directly.

Services and Steps

Services define docker containers which provide a continued service to other tasks in and outside of the pipeline. They directly resemble the service concept from docker-compose and once started run concurrently to the rest of the pipeline including anything depending on the service.

Steps on the other hand run to completion and only then are their dependents executed. Note however, that independent steps are executed concurrently with each other. Steps are often used for tasks that produce a result that is needed by their dependents such as a download, creation of a database index or training of a machine learning model.

The End-to-End tests of QLever example demonstrates the usage and interaction of both container types.

Installation

Download a prebuild Release

Binary releases are provided as github releases.

cd /tmp
rm gantry_$(uname -m).tar.bz2
wget https://github.com/ad-freiburg/gantry/releases/download/v0.5.0/gantry_$(uname -m).tar.bz2
tar -xavf gantry_$(uname -m).tar.bz2
sudo mv gantry_$(uname -m)/gantry /usr/local/bin/gantry

gantry --version
Arch Linux

Gantry is available in the AUR as gantry and gantry-git

From source

To install gantry into the users ~/go/bin path it is enough to just run

go install -ldflags="-X github.com/ad-freiburg/gantry.Version=$(git describe --always --long --dirty)" ./...

To install gantry globally copy it from ~/go/bin path or use

go build -ldflags="-X github.com/ad-freiburg/gantry.Version=$(git describe --always --long --dirty)" cmd/gantry/gantry.go
sudo mv gantry /usr/local/bin/

gantry --version
Using go get

Gantry is go getable through

go get github.com/ad-freiburg/gantry/cmd/gantry

This will result in a binary without a set version.

Building a (new) Release

To build a release version first make sure everything works, then edit the Download a prebuild release section of this Readme so the download link points to the future version. Only after committing this final change tag the release

git tag -a vX.Y.Z -m <message>

Then build with -ldflags such that the version is added to the binary

go build -ldflags="-X github.com/ad-freiburg/gantry.Version=$(git describe --always --long --dirty)" cmd/gantry/gantry.go

Finally use the GitHub Releases mechanism to release a new version.

Documentation

Index

Constants

View Source
const AnsiForegroundColorBlack int = 30

AnsiForegroundColorBlack stores int value for black foreground

View Source
const AnsiForegroundColorBlue int = 34

AnsiForegroundColorBlue stores int value for blue foreground

View Source
const AnsiForegroundColorCyan int = 36

AnsiForegroundColorCyan stores int value for cyan foreground

View Source
const AnsiForegroundColorDarkGray int = 90

AnsiForegroundColorDarkGray stores int value for dark gray foreground

View Source
const AnsiForegroundColorGreen int = 32

AnsiForegroundColorGreen stores int value for green foreground

View Source
const AnsiForegroundColorLightBlue int = 94

AnsiForegroundColorLightBlue stores int value for light blue foreground

View Source
const AnsiForegroundColorLightCyan int = 96

AnsiForegroundColorLightCyan stores int value for light cyan foreground

View Source
const AnsiForegroundColorLightGray int = 37

AnsiForegroundColorLightGray stores int value for light gray foreground

View Source
const AnsiForegroundColorLightGreen int = 92

AnsiForegroundColorLightGreen stores int value for light green foreground

View Source
const AnsiForegroundColorLightMagenta int = 95

AnsiForegroundColorLightMagenta stores int value for light magenta foreground

View Source
const AnsiForegroundColorLightRed int = 91

AnsiForegroundColorLightRed stores int value for light red foreground

View Source
const AnsiForegroundColorLightYellow int = 93

AnsiForegroundColorLightYellow stores int value for light yellow foreground

View Source
const AnsiForegroundColorMagenta int = 35

AnsiForegroundColorMagenta stores int value for magenta foreground

View Source
const AnsiForegroundColorRed int = 31

AnsiForegroundColorRed stores int value for red foreground

View Source
const AnsiForegroundColorWhite int = 97

AnsiForegroundColorWhite stores int value for white foreground

View Source
const AnsiForegroundColorYellow int = 33

AnsiForegroundColorYellow stores int value for yellow foreground

View Source
const AnsiStyleBold int = 1

AnsiStyleBold stores int value for bold style

View Source
const AnsiStyleDim int = 2

AnsiStyleDim stores int value for dim style

View Source
const AnsiStyleItalic int = 3

AnsiStyleItalic stores int value for italic style

View Source
const AnsiStyleNormal int = 0

AnsiStyleNormal stores int value for normal style

View Source
const AnsiStyleStrikethrough int = 9

AnsiStyleStrikethrough stores int value for strikethrough style

View Source
const AnsiStyleUnderline int = 4

AnsiStyleUnderline stores int value for underline style

View Source
const DockerCompose string = "docker-compose.yml"

DockerCompose stores the default name of a docker compose file.

View Source
const GantryDef string = "gantry.def.yml"

GantryDef stores the default name of a gantry definition.

View Source
const GantryEnv string = "gantry.env.yml"

GantryEnv stores the default name of a gantry environment.

View Source
const GenericStringFormat string = "\u001b[%sm%s\u001b[0m"

GenericStringFormat provides formatting for a single string enclodes in ANSI formatting tags.

View Source
const PrefixedWriterFormat string = "%s\u001b[0m %s\u001b[0m"

PrefixedWriterFormat provides formatting for to space separated strings resetting ANSI formatting after each string.

Variables

View Source
var (
	// Version of the program
	Version = "no-version"
	// Verbose is a global verbosity flag
	Verbose = false
	// ShowContainerCommands is a global flag to signal printing of commands run.
	ShowContainerCommands = false
	// ProjectName stores the global prefix for networks and containers.
	ProjectName = ""
	// ForceWharfer is a global flag to force the usage of wharfer even
	// if the user could use docker directly.
	ForceWharfer = false
)

Functions

func ApplyAnsiStyle

func ApplyAnsiStyle(text string, style ...int) string

ApplyAnsiStyle applies ansi integer styles to text

func BuildAnsiStyle

func BuildAnsiStyle(parts ...int) string

BuildAnsiStyle combines style integers with ;

func GetNextFriendlyColor

func GetNextFriendlyColor() int

GetNextFriendlyColor returns the next friendly color from the global friendlyColors store.

Types

type BuildInfo

type BuildInfo struct {
	Context    string          `json:"context"`
	Dockerfile string          `json:"dockerfile"`
	Args       types.StringMap `json:"args"`
}

BuildInfo represents the build-keyword in a docker-compse.yml.

type ColorStore

type ColorStore struct {
	// contains filtered or unexported fields
}

ColorStore provides a synced looping stylelist.

func NewColorStore

func NewColorStore(colors []int) *ColorStore

NewColorStore creates a ColorStore for the provided list of styles.

func (*ColorStore) NextColor

func (c *ColorStore) NextColor() int

NextColor returns the next color. Loops if list is exhausted.

type ExecutionError added in v0.5.0

type ExecutionError struct {
	// contains filtered or unexported fields
}

ExecutionError is an error which stores an additional exit code.

func (ExecutionError) Error added in v0.5.0

func (e ExecutionError) Error() string

Error returns the string representation of the error.

func (ExecutionError) ExitCode added in v0.5.0

func (e ExecutionError) ExitCode() int

ExitCode returns the integer with which the programm shall exit.

type LocalRunner

type LocalRunner struct {
	// contains filtered or unexported fields
}

LocalRunner creates functions running on localhost.

func NewLocalRunner

func NewLocalRunner(prefix string, stdout io.Writer, stderr io.Writer) *LocalRunner

NewLocalRunner returns a LocalRunner using provided defaults.

func (*LocalRunner) ContainerKiller added in v0.4.0

func (r *LocalRunner) ContainerKiller(step Step) func() (int, error)

ContainerKiller returns a function to kill the container for the given step.

func (*LocalRunner) ContainerLogReader added in v0.5.0

func (r *LocalRunner) ContainerLogReader(step Step, follow bool) func() error

ContainerLogReader returns a function retrieving all logs for a given step.

func (*LocalRunner) ContainerRemover added in v0.4.0

func (r *LocalRunner) ContainerRemover(step Step) func() error

ContainerRemover returns a function to remove the container for the given step.

func (*LocalRunner) ContainerRunner added in v0.4.0

func (r *LocalRunner) ContainerRunner(step Step, network Network) func() error

ContainerRunner returns a function to run the given step.

func (*LocalRunner) Copy added in v0.4.0

func (r *LocalRunner) Copy() Runner

Copy returns a new Instance with copied values.

func (*LocalRunner) Exec

func (r *LocalRunner) Exec(args []string) error

Exec executes given arguments with the containerExecutable.

func (*LocalRunner) ImageBuilder added in v0.4.0

func (r *LocalRunner) ImageBuilder(step Step, pull bool) func() error

ImageBuilder returns a function to build the image for the given step.

func (*LocalRunner) ImageExistenceChecker added in v0.4.0

func (r *LocalRunner) ImageExistenceChecker(step Step) func() error

ImageExistenceChecker returns a function which checks if the image for the given step exists.

func (*LocalRunner) ImagePuller added in v0.4.0

func (r *LocalRunner) ImagePuller(step Step) func() error

ImagePuller retunrs a function to pull the image for the given step.

func (*LocalRunner) NetworkCreator added in v0.4.0

func (r *LocalRunner) NetworkCreator(network Network) func() error

NetworkCreator returns a function to create the given network.

func (*LocalRunner) NetworkRemover added in v0.4.0

func (r *LocalRunner) NetworkRemover(network Network) func() error

NetworkRemover returns a function to remove the given network.

func (*LocalRunner) Output

func (r *LocalRunner) Output(args []string) ([]byte, error)

Output executes given arguments with the containerExecutable and returns the output.

type Network added in v0.4.0

type Network string

Network is the string name of a docker network

type NoopRunner added in v0.4.0

type NoopRunner struct {
	// contains filtered or unexported fields
}

NoopRunner is a runner that does nothing.

func NewNoopRunner added in v0.4.0

func NewNoopRunner(silent bool) *NoopRunner

NewNoopRunner returns a NoopRunner.

func (*NoopRunner) ContainerKiller added in v0.4.0

func (r *NoopRunner) ContainerKiller(step Step) func() (int, error)

ContainerKiller returns a function to kill the container for the given step.

func (*NoopRunner) ContainerLogReader added in v0.5.0

func (r *NoopRunner) ContainerLogReader(step Step, follow bool) func() error

ContainerLogReader returns a function retrieving all logs for a given step.

func (*NoopRunner) ContainerRemover added in v0.4.0

func (r *NoopRunner) ContainerRemover(step Step) func() error

ContainerRemover returns a function to remove the container for the given step.

func (*NoopRunner) ContainerRunner added in v0.4.0

func (r *NoopRunner) ContainerRunner(step Step, network Network) func() error

ContainerRunner returns a function to run the given step.

func (*NoopRunner) Copy added in v0.4.0

func (r *NoopRunner) Copy() Runner

Copy returns the same instance.

func (*NoopRunner) ImageBuilder added in v0.4.0

func (r *NoopRunner) ImageBuilder(step Step, force bool) func() error

ImageBuilder returns a function to build the image for the given step.

func (*NoopRunner) ImageExistenceChecker added in v0.4.0

func (r *NoopRunner) ImageExistenceChecker(step Step) func() error

ImageExistenceChecker returns a function which checks if the image for the given step exists.

func (*NoopRunner) ImagePuller added in v0.4.0

func (r *NoopRunner) ImagePuller(step Step) func() error

ImagePuller returns a function to pull the image for the given step.

func (*NoopRunner) NetworkCreator added in v0.4.0

func (r *NoopRunner) NetworkCreator(network Network) func() error

NetworkCreator returns a function to create the given network.

func (*NoopRunner) NetworkRemover added in v0.4.0

func (r *NoopRunner) NetworkRemover(network Network) func() error

NetworkRemover returns a function to create the given network.

func (*NoopRunner) NumCalled added in v0.4.0

func (r *NoopRunner) NumCalled(key string) int

NumCalled returns how many functions with the given key were executed.

func (*NoopRunner) NumCalls added in v0.4.0

func (r *NoopRunner) NumCalls(key string) int

NumCalls returns how many functions with the given key were created.

type Pipeline

type Pipeline struct {
	Definition  *PipelineDefinition
	Environment *PipelineEnvironment
	Network     Network
	// contains filtered or unexported fields
}

Pipeline stores all definitions and settings regarding a deployment.

func NewPipeline

func NewPipeline(definitionPath, environmentPath string, environment types.StringMap, ignoredSteps types.StringSet, selectedSteps types.StringSet) (*Pipeline, error)

NewPipeline creates a new Pipeline from given files which ignores the existence of steps with names provided in ignoreSteps.

func (Pipeline) BuildImages

func (p Pipeline) BuildImages(force bool) error

BuildImages builds all buildable images of Pipeline p in parallel.

func (Pipeline) Check

func (p Pipeline) Check() error

Check validates Pipeline p, checks if all required information is present.

func (*Pipeline) CleanUp

func (p *Pipeline) CleanUp(signal os.Signal) error

CleanUp removes containers and temporary data.

func (Pipeline) CreateNetwork

func (p Pipeline) CreateNetwork() error

CreateNetwork creates a network using the NetworkName of the Pipeline p.

func (Pipeline) ExecuteSteps

func (p Pipeline) ExecuteSteps() error

ExecuteSteps runs all not ignored steps/services in the order defined by there dependencies. Each step/service is run as soon as possible.

func (Pipeline) GetRunnerForMeta added in v0.4.0

func (p Pipeline) GetRunnerForMeta(meta ServiceMeta) Runner

GetRunnerForMeta selects a suitable runner given a ServiceMeta instance.

func (Pipeline) KillContainers

func (p Pipeline) KillContainers(preRun bool) error

KillContainers kills all running containers of Pipeline p.

func (Pipeline) Logs added in v0.5.0

func (p Pipeline) Logs(follow bool) error

Logs retrievs the logs of all containers.

func (Pipeline) PullImages

func (p Pipeline) PullImages(force bool) error

PullImages pulls all pullable images of Pipeline p in parallel.

func (Pipeline) RemoveContainers

func (p Pipeline) RemoveContainers(preRun bool) error

RemoveContainers removes all stopped containers of Pipeline p.

func (Pipeline) RemoveNetwork

func (p Pipeline) RemoveNetwork() error

RemoveNetwork removes the network of Pipeline p.

func (Pipeline) RemoveTempDirData

func (p Pipeline) RemoveTempDirData() error

RemoveTempDirData deletes all data stored in temporary directories.

type PipelineDefinition

type PipelineDefinition struct {
	Version string
	Steps   StepList
	// contains filtered or unexported fields
}

PipelineDefinition stores docker-compose services and gantry steps.

func NewPipelineDefinition

func NewPipelineDefinition(path string, env *PipelineEnvironment) (*PipelineDefinition, error)

NewPipelineDefinition generates a pipeline definition from a path and an environment.

func (*PipelineDefinition) Pipelines

func (p *PipelineDefinition) Pipelines() (*Pipelines, error)

Pipelines calculates and verifies dependencies and ordering for steps defined in the PipelineDefinition p.

func (*PipelineDefinition) UnmarshalJSON

func (p *PipelineDefinition) UnmarshalJSON(data []byte) error

UnmarshalJSON loads a PipelineDefinition from json using the pipelineJSON struct.

type PipelineEnvironment

type PipelineEnvironment struct {
	Version            string
	Substitutions      types.StringMap
	TempDirPath        string
	TempDirNoAutoClean bool
	Steps              ServiceMetaList
	ProjectName        string
	// contains filtered or unexported fields
}

PipelineEnvironment stores additional data for pipelines and steps.

func NewPipelineEnvironment

func NewPipelineEnvironment(path string, substitutions types.StringMap, ignoredSteps types.StringSet, selectedSteps types.StringSet) (*PipelineEnvironment, error)

NewPipelineEnvironment builds a new environment merging the current environment, the environment given by path and the user provided steps to ignore.

func (*PipelineEnvironment) ApplyTo

func (e *PipelineEnvironment) ApplyTo(rawFile []byte) ([]byte, error)

ApplyTo executes the environment template parser on the provided data.

func (*PipelineEnvironment) CleanUp

func (e *PipelineEnvironment) CleanUp(signal os.Signal) error

CleanUp tries to remove all managed temporary files and directories.

func (*PipelineEnvironment) UnmarshalJSON

func (e *PipelineEnvironment) UnmarshalJSON(data []byte) error

UnmarshalJSON loads a PipelineDefinition from json using the pipelineJSON struct.

type Pipelines

type Pipelines [][]Step

Pipelines stores parallel and dependent steps/services.

func NewTarjan

func NewTarjan(steps map[string]Step) (*Pipelines, error)

NewTarjan performs tarjans algorithm to convert steps to pipelines.

func (Pipelines) AllSteps

func (p Pipelines) AllSteps() []Step

AllSteps returns all in p defined steps without ordering information.

func (*Pipelines) Check

func (p *Pipelines) Check() error

Check performs checks for cyclic dependencies and requirements fulfillment.

type PrefixedLogger

type PrefixedLogger struct {
	// contains filtered or unexported fields
}

PrefixedLogger is a logger with a prefix.

func NewPrefixedLogger

func NewPrefixedLogger(prefix string, logger *log.Logger) *PrefixedLogger

NewPrefixedLogger creates a PrefixedLogger from a prefix and a logger.

func (*PrefixedLogger) Printf

func (p *PrefixedLogger) Printf(format string, v ...interface{})

Printf format prints to the logger.

func (*PrefixedLogger) Println

func (p *PrefixedLogger) Println(v ...interface{})

Println prints a line to the logger.

func (*PrefixedLogger) Write

func (p *PrefixedLogger) Write(b []byte) (int, error)

Write writes given bytes to the logger.

type PrefixedWriter

type PrefixedWriter struct {
	// contains filtered or unexported fields
}

PrefixedWriter is a writer which prefixes all lines with given prefix.

func NewPrefixedWriter

func NewPrefixedWriter(prefix string, target io.Writer) *PrefixedWriter

NewPrefixedWriter returns a PrefixWriter for given prefix and target.

func (*PrefixedWriter) Output

func (p *PrefixedWriter) Output() error

Output generates lines from the internal buffer and prefixes them.

func (*PrefixedWriter) Write

func (p *PrefixedWriter) Write(b []byte) (int, error)

Write writes bytes to an internal buffer and outputs the data to the internal target.

type Runner

type Runner interface {
	Copy() Runner
	ImageBuilder(Step, bool) func() error
	ImagePuller(Step) func() error
	ImageExistenceChecker(Step) func() error
	ContainerKiller(Step) func() (int, error)
	ContainerRemover(Step) func() error
	ContainerRunner(Step, Network) func() error
	ContainerLogReader(Step, bool) func() error
	NetworkCreator(Network) func() error
	NetworkRemover(Network) func() error
}

Runner represents generic container runners.

type Service

type Service struct {
	BuildInfo   BuildInfo                 `json:"build"`
	Command     types.StringOrStringSlice `json:"command"`
	Entrypoint  types.StringOrStringSlice `json:"entrypoint"`
	Image       string                    `json:"image"`
	Ports       []string                  `json:"ports"`
	Volumes     []string                  `json:"volumes"`
	Environment types.StringMap           `json:"environment"`
	DependsOn   types.StringSet           `json:"depends_on"`
	Restart     string                    `json:"restart"`
	Name        string
	Meta        ServiceMeta
	// contains filtered or unexported fields
}

Service provides a service definition from docker-compose.

func (Service) ColoredContainerName

func (s Service) ColoredContainerName() string

ColoredContainerName returns the container name of s with color applied.

func (Service) ColoredName

func (s Service) ColoredName() string

ColoredName returns the name of s with color applied.

func (Service) ContainerName

func (s Service) ContainerName() string

ContainerName returns the name for a container of s prefixed with the current project name.

func (Service) ImageName

func (s Service) ImageName() string

ImageName returns the name of the image of s. The name of the step is used if non is specified.

func (*Service) InitColor

func (s *Service) InitColor()

InitColor initializes the color of s.

func (Service) RawContainerName

func (s Service) RawContainerName() string

RawContainerName returns the name for a container of s.

type ServiceKeepAlive

type ServiceKeepAlive int

ServiceKeepAlive stores the KeepAlive state of the service.

const (
	// KeepAliveYes signals that the service will keep running after gantry exits.
	KeepAliveYes ServiceKeepAlive = iota
	// KeepAliveNo signals that the service will be killed when gantry stops.
	KeepAliveNo
	// KeepAliveReplace signals that the service is killed prior to replacement.
	KeepAliveReplace
)

func (*ServiceKeepAlive) UnmarshalJSON

func (d *ServiceKeepAlive) UnmarshalJSON(b []byte) error

UnmarshalJSON sets ServiceKeepAlive d.

type ServiceList

type ServiceList map[string]Step

ServiceList stores docker-compose service definitions as steps.

func (*ServiceList) UnmarshalJSON

func (r *ServiceList) UnmarshalJSON(data []byte) error

UnmarshalJSON sets *r to a copy of data.

type ServiceLog

type ServiceLog struct {
	Handler ServiceLogHandler `json:"handler"`
	Path    string            `json:"path"`
	// contains filtered or unexported fields
}

ServiceLog stores log configuration for an output stream.

func (*ServiceLog) Close

func (l *ServiceLog) Close()

Close closes the output file if one is used.

func (*ServiceLog) Open

func (l *ServiceLog) Open(std *os.File) error

Open handles output initialisation by setting defaults and creating files.

func (ServiceLog) Write

func (l ServiceLog) Write(p []byte) (int, error)

Write writes data to an output stream or discards if LogHandlerDiscard is configured.

type ServiceLogHandler

type ServiceLogHandler int

ServiceLogHandler stores the logging configuration of the service.

const (
	// LogHandlerStdout signals that the standard location (stdout or stderr) is used.
	LogHandlerStdout ServiceLogHandler = iota
	// LogHandlerFile signals that the log shall be stored in a file.
	LogHandlerFile
	// LogHandlerBoth signals that the log is printed into a file and to the standard location.
	LogHandlerBoth
	// LogHandlerDiscard signals that the log shall be discarded.
	LogHandlerDiscard
)

func (*ServiceLogHandler) UnmarshalJSON

func (d *ServiceLogHandler) UnmarshalJSON(b []byte) error

UnmarshalJSON sets ServiceLogHandler d.

type ServiceMeta

type ServiceMeta struct {
	KeepAlive        ServiceKeepAlive `json:"keep_alive"`
	Stdout           ServiceLog       `json:"stdout"`
	Stderr           ServiceLog       `json:"stderr"`
	Type             ServiceType
	ExitCodeOverride int  `json:"exit_code_override"`
	Ignore           bool `json:"ignore"`
	IgnoreFailure    bool `json:"ignore_failure"`
	Selected         bool
}

ServiceMeta stores all metainformation for a step.

func (*ServiceMeta) Close

func (m *ServiceMeta) Close()

Close closes stderr and stdout writers.

func (*ServiceMeta) Open

func (m *ServiceMeta) Open() error

Open handles output initialisation by setting defaults.

type ServiceMetaList

type ServiceMetaList map[string]ServiceMeta

ServiceMetaList stores ServiceMeta as a map[stepname]Meta.

type ServiceType

type ServiceType int

ServiceType stores the type of the service.

const (
	// ServiceTypeService signals a normal docker service.
	ServiceTypeService ServiceType = iota
	// ServiceTypeStep signals a gantry step.
	ServiceTypeStep
)

type Step

type Step struct {
	Service
	After types.StringSet `json:"after"`
}

Step provides an extended service.

func (Step) BuildCommand

func (s Step) BuildCommand(pull bool) []string

BuildCommand returns the command to build a new image for s.

func (Step) Check added in v0.4.0

func (s Step) Check() error

Check validates Step s, returns nil if ok, otherwise returns found error.

func (Step) Dependencies

func (s Step) Dependencies() types.StringSet

Dependencies returns all steps needed for running s.

func (Step) IsBuildable added in v0.4.0

func (s Step) IsBuildable() bool

IsBuildable returns whether or not the step can be build.

func (Step) IsPullable added in v0.4.0

func (s Step) IsPullable() bool

IsPullable returns whether or not a image is pulled for this step.

func (Step) PullCommand

func (s Step) PullCommand() []string

PullCommand returns the command to pull the image for step s.

func (Step) RunCommand

func (s Step) RunCommand(network Network) []string

RunCommand returns the command to run an instance of step s.

type StepList

type StepList map[string]Step

StepList stores gantry steps as steps.

func (*StepList) UnmarshalJSON

func (r *StepList) UnmarshalJSON(data []byte) error

UnmarshalJSON sets *r to a copy of data.

Directories

Path Synopsis
cmd
Package types implements types which can be unmarshaled from json.
Package types implements types which can be unmarshaled from json.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL