227 lines
7.2 KiB
Go
227 lines
7.2 KiB
Go
// 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 engine
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/drone/runner-go/environ"
|
|
"github.com/drone/runner-go/pipeline/runtime"
|
|
)
|
|
|
|
type (
|
|
|
|
// Spec provides the pipeline spec. This provides the
|
|
// required instructions for reproducible pipeline
|
|
// execution.
|
|
Spec struct {
|
|
Platform Platform `json:"platform,omitempty"`
|
|
Steps []*Step `json:"steps,omitempty"`
|
|
Internal []*Step `json:"internal,omitempty"`
|
|
Volumes []*Volume `json:"volumes,omitempty"`
|
|
Network Network `json:"network"`
|
|
}
|
|
|
|
// Step defines a pipeline step.
|
|
Step struct {
|
|
ID string `json:"id,omitempty"`
|
|
Auth *Auth `json:"auth,omitempty"`
|
|
Command []string `json:"args,omitempty"`
|
|
CPUPeriod int64 `json:"cpu_period,omitempty"`
|
|
CPUQuota int64 `json:"cpu_quota,omitempty"`
|
|
CPUShares int64 `json:"cpu_shares,omitempty"`
|
|
CPUSet []string `json:"cpu_set,omitempty"`
|
|
Detach bool `json:"detach,omitempty"`
|
|
DependsOn []string `json:"depends_on,omitempty"`
|
|
Devices []*VolumeDevice `json:"devices,omitempty"`
|
|
DNS []string `json:"dns,omitempty"`
|
|
DNSSearch []string `json:"dns_search,omitempty"`
|
|
Entrypoint []string `json:"entrypoint,omitempty"`
|
|
Envs map[string]string `json:"environment,omitempty"`
|
|
ErrPolicy runtime.ErrPolicy `json:"err_policy,omitempty"`
|
|
ExtraHosts []string `json:"extra_hosts,omitempty"`
|
|
IgnoreStdout bool `json:"ignore_stderr,omitempty"`
|
|
IgnoreStderr bool `json:"ignore_stdout,omitempty"`
|
|
Image string `json:"image,omitempty"`
|
|
Labels map[string]string `json:"labels,omitempty"`
|
|
MemSwapLimit int64 `json:"memswap_limit,omitempty"`
|
|
MemLimit int64 `json:"mem_limit,omitempty"`
|
|
Name string `json:"name,omitempty"`
|
|
Network string `json:"network,omitempty"`
|
|
Networks []string `json:"networks,omitempty"`
|
|
Privileged bool `json:"privileged,omitempty"`
|
|
Pull PullPolicy `json:"pull,omitempty"`
|
|
RunPolicy runtime.RunPolicy `json:"run_policy,omitempty"`
|
|
Secrets []*Secret `json:"secrets,omitempty"`
|
|
ShmSize int64 `json:"shm_size,omitempty"`
|
|
User string `json:"user,omitempty"`
|
|
Volumes []*VolumeMount `json:"volumes,omitempty"`
|
|
WorkingDir string `json:"working_dir,omitempty"`
|
|
}
|
|
|
|
// Secret represents a secret variable.
|
|
Secret struct {
|
|
Name string `json:"name,omitempty"`
|
|
Env string `json:"env,omitempty"`
|
|
Data []byte `json:"data,omitempty"`
|
|
Mask bool `json:"mask,omitempty"`
|
|
}
|
|
|
|
// Platform defines the target platform.
|
|
Platform struct {
|
|
OS string `json:"os,omitempty"`
|
|
Arch string `json:"arch,omitempty"`
|
|
Variant string `json:"variant,omitempty"`
|
|
Version string `json:"version,omitempty"`
|
|
}
|
|
|
|
// Volume that can be mounted by containers.
|
|
Volume struct {
|
|
EmptyDir *VolumeEmptyDir `json:"temp,omitempty"`
|
|
HostPath *VolumeHostPath `json:"host,omitempty"`
|
|
}
|
|
|
|
// VolumeMount describes a mounting of a Volume
|
|
// within a container.
|
|
VolumeMount struct {
|
|
Name string `json:"name,omitempty"`
|
|
Path string `json:"path,omitempty"`
|
|
}
|
|
|
|
// VolumeEmptyDir mounts a temporary directory from the
|
|
// host node's filesystem into the container. This can
|
|
// be used as a shared scratch space.
|
|
VolumeEmptyDir struct {
|
|
ID string `json:"id,omitempty"`
|
|
Name string `json:"name,omitempty"`
|
|
Medium string `json:"medium,omitempty"`
|
|
SizeLimit int64 `json:"size_limit,omitempty"`
|
|
Labels map[string]string `json:"labels,omitempty"`
|
|
}
|
|
|
|
// VolumeHostPath mounts a file or directory from the
|
|
// host node's filesystem into your container.
|
|
VolumeHostPath struct {
|
|
ID string `json:"id,omitempty"`
|
|
Name string `json:"name,omitempty"`
|
|
Path string `json:"path,omitempty"`
|
|
Labels map[string]string `json:"labels,omitempty"`
|
|
ReadOnly bool `json:"read_only,omitempty"`
|
|
}
|
|
|
|
// VolumeDevice describes a mapping of a raw block
|
|
// device within a container.
|
|
VolumeDevice struct {
|
|
Name string `json:"name,omitempty"`
|
|
DevicePath string `json:"path,omitempty"`
|
|
}
|
|
|
|
// Network that is created and attached to containers
|
|
Network struct {
|
|
ID string `json:"id,omitempty"`
|
|
Labels map[string]string `json:"labels,omitempty"`
|
|
Options map[string]string `json:"options,omitempty"`
|
|
}
|
|
|
|
// Auth defines dockerhub authentication credentials.
|
|
Auth struct {
|
|
Address string `json:"address,omitempty"`
|
|
Username string `json:"username,omitempty"`
|
|
Password string `json:"password,omitempty"`
|
|
}
|
|
)
|
|
|
|
//
|
|
// implements the Spec interface
|
|
//
|
|
|
|
func (s *Spec) StepLen() int { return len(s.Steps) }
|
|
func (s *Spec) StepAt(i int) runtime.Step { return s.Steps[i] }
|
|
func (s *Spec) String() string {
|
|
return fmt.Sprintf(`{
|
|
Platform: %+v
|
|
Steps: %+v
|
|
Internal: %+v
|
|
Volumes: %+v
|
|
Network: %+v
|
|
}`, s.Platform, s.Steps, s.Internal,
|
|
s.Volumes, s.Network,
|
|
)
|
|
}
|
|
|
|
//
|
|
// implements the Secret interface
|
|
//
|
|
|
|
func (s *Secret) GetName() string { return s.Name }
|
|
func (s *Secret) GetValue() string { return string(s.Data) }
|
|
func (s *Secret) IsMasked() bool { return s.Mask }
|
|
|
|
//
|
|
// implements the Step interface
|
|
//
|
|
|
|
func (s *Step) GetName() string { return s.Name }
|
|
func (s *Step) GetDependencies() []string { return s.DependsOn }
|
|
func (s *Step) GetEnviron() map[string]string { return s.Envs }
|
|
func (s *Step) SetEnviron(env map[string]string) { s.Envs = env }
|
|
func (s *Step) GetErrPolicy() runtime.ErrPolicy { return s.ErrPolicy }
|
|
func (s *Step) GetRunPolicy() runtime.RunPolicy { return s.RunPolicy }
|
|
func (s *Step) GetSecretAt(i int) runtime.Secret { return s.Secrets[i] }
|
|
func (s *Step) GetSecretLen() int { return len(s.Secrets) }
|
|
func (s *Step) IsDetached() bool { return s.Detach }
|
|
func (s *Step) GetImage() string { return s.Image }
|
|
func (s *Step) Clone() runtime.Step {
|
|
dst := new(Step)
|
|
*dst = *s
|
|
dst.Envs = environ.Combine(s.Envs)
|
|
return dst
|
|
}
|
|
func (s *Step) String() string {
|
|
return fmt.Sprintf(`{
|
|
ID: %s
|
|
Auth: %+v
|
|
Command: %+v
|
|
CPUPeriod: %d
|
|
CPUQuota: %d
|
|
CPUShares: %d
|
|
CPUSet: %+v
|
|
Detach: %t
|
|
DependsOn: %+v
|
|
Devices: %+v
|
|
DNS: %+v
|
|
DNSSearch: %+v
|
|
Entrypoint: %+v
|
|
Envs: %+v
|
|
ErrPolicy: %+v
|
|
ExtraHosts: %+v
|
|
IgnoreStdout: %t
|
|
IgnoreStderr: %t
|
|
Image: %s
|
|
Labels: %+v
|
|
MemSwapLimit: %d
|
|
MemLimit: %d
|
|
Name: %s
|
|
Network: %s
|
|
Networks: %+v
|
|
Privileged: %t
|
|
Pull: %+v
|
|
RunPolicy: %+v
|
|
Secrets: %+v
|
|
ShmSize: %d
|
|
User: %s
|
|
Volumes: %+v
|
|
WorkingDir: %s
|
|
}`, s.ID, s.Auth, s.Command, s.CPUPeriod,
|
|
s.CPUQuota, s.CPUShares, s.CPUSet, s.Detach,
|
|
s.DependsOn, s.Devices, s.DNS, s.DNSSearch,
|
|
s.Entrypoint, s.Envs, s.ErrPolicy, s.ExtraHosts,
|
|
s.IgnoreStdout, s.IgnoreStderr, s.Image, s.Labels,
|
|
s.MemSwapLimit, s.MemLimit, s.Name, s.Network,
|
|
s.Networks, s.Privileged, s.Pull, s.RunPolicy,
|
|
s.Secrets, s.ShmSize, s.User, s.Volumes, s.WorkingDir,
|
|
)
|
|
}
|