Hap helps manage build scripts with git and run them concurrently on multiple remote hosts using composable blocks.
First, hap create
to setup a new local repo. Then add hosts to the generated Hapfile. Once hosts are in place, run hap build
to execute the build blocks and commands specified in the Hapfile for each host. After hap build
a .happened file is saved with the current sha of remote repo. To run hap build
again a new commit is required or use the --force
param.
To run arbitrary commands use hap c
, and to execute individual scripts with hap exec
.
hap c
will not push the latest or run from the current directory or use the environment files, those must be added as part of the command.
hap exec
will push the latest, use the current directory and the environment.
If you only have one host, just use the default
section. Then the -h,--host
flag while running hap
is not necessary.
Make sure every build script is executable before committing to the local repo.
go get -u github.com/gwoo/hap/cmd/hap
darwin/amd64
curl -L -C - -o /usr/local/bin/hap https://github.com/gwoo/hap/releases/download/v2.6/hap-darwin-amd64; chmod a+x /usr/local/bin/hap
linux/amd64
curl -L -C - -o /usr/local/bin/hap https://github.com/gwoo/hap/releases/download/v2.6/hap-linux-amd64; chmod a+x /usr/local/bin/hap
- Run
hap create <name>
- Modify
Hapfile
- Run
hap -h <host> build
Hap exports HAP_HOSTNAME
, HAP_USER
, HAP_ADDR
, HAP_IP
, HAP_PORT
for use in scripts. You can add your own by using the env
section or the env
statement in the host
section.
The Hapfile uses git-config syntax. There are 5 sections, default
, host
, build
, include
, and env
. The default
section holds host config that will be applied to all hosts. The host
section holds a named host config. A host config includes addr
, username
, password
, identity
, build
, and cmd
, env
. Only addr
is required. The identity
should point to a local ssh private key that has access to the host via the authorized_keys. The build
section holds mulitple cmds that could be applied to a host. Multiple build
, cmd
, or env
are permitted for each host. In addition, an include
section accepts multiple path
statements and an env
section accepts multiple file
statements.
host
: Holds the configuration for a machineaddr
: the host:port of the remote machinedir
: base directory on the remote machineusername
: the name of the user to login and run commandspassword
: password for ssh password based authenticationidentity
: path to ssh private key for key based authenticationbuild
: one or more groups of commands to runcmd
: one or more commands to run on a specific hostenv
: one or more environment files to apply to this host (can override env sections)
deploy
: Holds the configuration for a deployhost
: one or more hostsbuild
: one or more groups of commands to runcmd
: one or more commands to run on a specific hostenv
: one or more environment files to apply to this host (can override env sections)
build
: sets of commands to runcmd
: one or more commands to run
default
: Holds the standard configurations that can be applied to all hostsinclude
: Allows other files to be included in the current configurationpath
: a path to the Hapfile the hap
env
: make variables available to the all commandsfile
: path to a file that can be sourced
A default build is specified, so init.sh and update.sh are executed for each host.
Host one
specifies two commands, notify.sh and cleanup.sh, to be run after the default build commands. For host one
, the HAP_HOSTNAME
will be one
, the HAP_USER
will be root
, and the HAP_ADDR
will be 10.0.20.10:22
. Host two
specifies no commands, so only the default build will be applied. For host two
, the HAP_HOSTNAME
will be two
, the HAP_USER
will be admin
, and the HAP_ADDR
will be 10.0.20.11:22
. There is also a deploy
that will return the hostname for one
and two
.
[default]
username = "root"
identity = "~/.ssh/id_rsa"
build = "initialize" ; applied to all hosts
[host "one"]
addr = "10.0.20.10:22"
cmd = "./notify.sh"
cmd = "./cleanup.sh"
[host "two"]
username = "admin"
identity = "~/.ssh/admin_rsa"
addr = "10.0.20.11:22"
[deploy "get-hostname"]
host = one
host = two
cmd = hostname
[build "initialize"]
cmd = ./init.sh
cmd = ./update.sh
cmd = echo "initialized"
Usage of ./bin/hap:
--dry=false: Show commands without running them.
-f, --file="Hapfile": Location of a Hapfile.
--force=false: Force build even if it happened before.
--help=false: Show help
-h, --host="": Host to use for commands. Use glob patterns to match multiple hosts. Use --host=* for all hosts.
-v, --verbose=false: [deprecated] Verbose mode is always on
Available Commands:
hap build Run the builds and commands from the Hapfile.
hap c <command> Run an arbitrary command on the remote host.
hap create <name> Create a new Hapfile at <name>.
hap deploy <name> Run the named deploy defined in the Hapfile.
hap exec <script> Execute a script on the remote host.
hap push Push current repo to the remote.
Sometimes you want to build
more than one host. If the hosts follow a similar pattern
you can reference all the hosts with a *
. For example, app-01
and app-02
are configured.
Then you can build both with hap -h app-* build
or hap -h a* build
.
Sometimes you have a lot of hosts that you want to manage in clusters. If you create multiple files
you can use the --file
flag to specify the location of the config. The file can be named anything.
For example, hap -f Appfile -h app* push
, will push all the app hosts in the Appfile.
The BSD License http://opensource.org/licenses/bsd-license.php.