Giter Club home page Giter Club logo

shuttle's Introduction

Shuttle logo

A CLI for handling shared build and deploy tools between many projects no matter what technologies the project is using.
Report bug · Request feature · Releases · Latest release

Table of contents

What is shuttle?

shuttle is a CLI for handling shared build and deploy tools between many projects no matter what technologies the project is using.

Status

DISCLAIMER: shuttle is in beta, so stuff may change. However we are using shuttle heavily at Lunar Way and we use it to deploy to production, so it is pretty battle proven.

Build Status Go Report Card

How?

Projects that use shuttle are always referencing a shuttle plan. A plan describes what can be done with shuttle. Fx:

# plan.yaml file
scripts:
  build:
    description: Build the docker image
    args:
    - name: tag
      required: true
    actions:
    - shell: docker -f $plan/Dockerfile build -t (shuttle get docker.image):$tag
  test:
    description: Run test for the project
    actions:
    - shell: go test

The plan.yaml is located at the root of the plan directory which is located elsewhere of the actual project using it. The plan directory can be locally stored or in a git repository. The directory structure could be something like:

workspace
│
└───moon-base          # project
│   │   shuttle.yaml   # project specific shuttle.yaml file
│   │   main.go
│
└───station-plan       # plan to be shared by projects
    │   plan.yaml
    │   Dockerfile

To use a plan a project must specify the shuttle.yaml file:

plan: ../the-plan
vars:
  docker:
    image: earth-united/moon-base

With this in place a docker image can be built:

$ cd workspace/moon-base
$ shuttle run build tag=v1

Features

  • Fetch shuttle plans from git repositories
  • Create any script you like in the plan
  • Overwrite scripts in local projects when they defer from the plan
  • Write templates in plans and overwrite them in projects when they defer
  • ...

Documentation

Documentation is under development

Git Plan

When using a git plan a url should look like:

  • https://github.com/lunarway/shuttle-example-go-plan.git
  • [email protected]:lunarway/shuttle-example-go-plan.git
  • https://github.com/lunarway/shuttle-example-go-plan.git#change-build
  • [email protected]:lunarway/shuttle-example-go-plan.git#change-build

The #change-build points the plan to a specific branch, which by default would be master. It can also be used to point to a tag or a git SHA, like this:

  • https://github.com/lunarway/shuttle-example-go-plan.git#v1.2.3
  • [email protected]:lunarway/shuttle-example-go-plan.git#46ce3cc

Overloading the plan

It is possible to overload the plan specified in shuttle.yaml file by using the --plan argument or the SHUTTLE_PLAN_OVERLOAD environment variable. Following arguments are supported

  • A path to a local plan like --plan ../local-checkout-of-plan. Absolute paths is also supported
  • Another git plan like --plan git://github.com/some-org/some-plan
  • A git tag to append to the plan like --plan #some-branch, --plan #some-tag or a SHA --plan #2b52c21

Installing

Mac OS

curl -LO https://github.com/lunarway/shuttle/releases/download/$(curl -Lso /dev/null -w %{url_effective} https://github.com/lunarway/shuttle/releases/latest | grep -o '[^/]*$')/shuttle-darwin-amd64
chmod +x shuttle-darwin-amd64
sudo mv shuttle-darwin-amd64 /usr/local/bin/shuttle

Linux

curl -LO https://github.com/lunarway/shuttle/releases/download/$(curl -Lso /dev/null -w %{url_effective} https://github.com/lunarway/shuttle/releases/latest | grep -o '[^/]*$')/shuttle-linux-amd64
chmod +x shuttle-linux-amd64
sudo mv shuttle-linux-amd64 /usr/local/bin/shuttle

Functions

shuttle get <variable>

Used to get a variable defined in shuttle.yaml

$ shuttle get some.variable
> some variable content

$ shuttle get does.not.exist
> # nothing

shuttle plan

Inspect the plan in use for a project. Use the template flag to customize the output to your needs.

$ shuttle plan
https://github.com/lunarway/shuttle-example-go-plan.git

shuttle has <variable>

It is possible to easily check if a variable or script is defined

shuttle has some.variable
shuttle has --script integration

Output is either statuscode=0 if variable is found or statuscode=1 if variables isn't found. The output can also be a stdout boolean like

$ shuttle has my.docker.image --stdout
> false

Template functions

The template command along with commands taking a --template flag has multiple templating functions available. Examples are based on the below shuttle.yaml file.

Function Description Example Output
array <path> <value> Get array from path. If value is a map, the values of the map is returned in deterministic order. array "args" . helloworld
fileExists <file-path> Returns whether a file exists. fileExists ".gitignore" true
fromYaml <value> Unmarshal YAML string to a map[string]interface{}. In case of YAML parsing errors the Error key in the result contains the error message. See notes below on usage. fromYaml "api: v1" map[api:v1]
get <path> <value> Get a value from a field path. . is read as nested nested objects get "docker.image" . earth-united/moon-base
getFileContent <file-path> Get raw contents of a file. getFileContent ".gitignore" dist/
vendor/
...
getFiles <directory-path> Returns a slice of files in the provided directory as os.FileInfo structs. {{ range $i, $f := (getFiles "./") }}{{ .Name }} {{ end }} .git .gitignore ...
int <path> <value> Get int value without formatting. Note that this is a direct int cast ie. value 1.2 will generate an error. int "replicas" . 1
is <value-a> <value-b> Equality indication by Go's == comparison. is "foo" "bar" false
isnt <value-a> <value-b> Inequality indication by Go's != comparison. isnt "foo" "bar" true
objectArray <path> <value> Get object key-value pairs from path. Each key-value is returned in a { Key Value} object. {{ range objectArray "docker" . }}{{ .Key }} -> {{ .Value }}{{ end }} image -> earth-united/moon-base
rightPad <string> <padding> Add space padding to the right of a string. {{ rightPad "padded" 10 }}string padded string
strConst <value> Convert string to upper snake casing converting . to _. strConst "a.value" A_VALUE
string <path> <value> Format any value as a string. string "replicas" . "1"
toYaml <value> Marshal value to YAML. In case of non-parsable string an empty string is returned. See notes below on usage. toYaml (get "args" .) - hello
- world
trim <string> Trim leading and trailing whitespaces. Uses strings.TrimSpace. trim " a string " a string
upperFirst <string> Upper case first character in string. upperFirst "a string" A string
plan: ../the-plan
vars:
  docker:
    image: earth-united/moon-base
  replicas: 1
  args:
  - 'hello'
  - 'world'

Notes on YAML parsers: The toYaml and fromYaml template functions are intented to be used inside file templates (not template flags). Because of this they ignore errors and some YAML documents canont be parsed.

Release History

See the releases for more information on changes between releases.

shuttle's People

Contributors

emilingerslev avatar crevil avatar kaspernissen avatar

Watchers

James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.