A deployment tool with Consul / Serf event.
src: s3://example.com/app.tar.gz
checksum: e0840daaa97cd2cf2175f9e5d133ffb3324a2b93
dest: /home/stretcher/app
commands:
pre:
- echo 'staring deploy'
post:
- echo 'deploy done'
success:
- echo 'deploy success'
failure:
- echo 'deploy failed!!'
- cat >> /path/to/failure.log
excludes:
- "*.pid"
- "*.socket"
$ stretcher -h
Usage of stretcher:
-max-bandwidth string
max bandwidth for download src archives (Bytes/sec)
-random-delay float
sleep [0,random-delay) sec on start
-retry int
retry count for download src archives
-retry-wait int
wait for retry download src archives (sec) (default 3)
-timeout int
timeout for download src archives (sec)
-v show version
-version
show version
A stretcher agent is designed as running under "consul watch" and will be kicked by Consul event.
$ consul watch -type event -name deploy /path/to/stretcher
-name
: your deployment identity name.
A stretcher agent can be running as Serf event handler.
$ serf agent -event-handler="user:deploy=/path/to/stretcher >> /path/to/stretcher.log 2>&1"
When you specify a S3 URL in manifest, requires a AWS credential setting one of below.
- ~/.aws/config and ~/.aws/credentials (overridden by
AWS_CONFIG_FILE
environment variable.)AWS_DEFAULT_PROFILE
is supported to select a profile from multiple credentials in file.
AWS_ACCESS_KEY_ID
,AWS_SECRET_ACCESS_KEY
, andAWS_DEFAULT_REGION
environment variable.- EC2 IAM role.
- requires
AWS_DEFAULT_REGION
environment variable.
- requires
This process is not included in a stretcher agent.
- Create a tar(or tar.gz) archive for deployment.
- Upload the archive file to remote server (S3 or HTTP(S)).
- Create a manifest file (YAML) and upload it to remote server.
Create a consul event to kick stretcher agents.
$ consul event -name [event_name] [manifest_url]
$ consul event -name deploy s3://example.com/deploy-20141117-112233.yml
-name
: consul event name (specified by consul watch-name
)
Create a serf user event to kick stretcher agents.
$ serf event [event_name] [manifest_url]
$ serf event deploy s3://example.com/deploy-20141117-112233.yml
- event_name: user event name (specified by serf event handler).
Stretcher can read a manifest URL from stdin simply.
$ echo s3://example.com/deploy-20141117-112233.yml | stretcher
You can execute stretcher via ssh or any other methods.
A stretcher agent executes a following process.
- Receive a manifest URL as Consul/Serf event's payload.
- Get a manifest.
- Get src URL and store it to a temporary file, and Check
checksum
. - Invoke
pre
commands. - Extract
src
archive to a temporary directory. - Sync files from extracted archive to
dest
directory.
- use
rsync -a --delete
ormv
- sync strategy is switched by
sync_strategy
- Invoke
post
commands.
- Invoke
success
commands when the deployment process succeeded. - Invoke
failure
commands when the deployment process failed.
Source archive URL.
- URL schema: 's3', 'http', 'file'
- Format: 'tar', 'tar.gz'
src: http://example.com/src/archive.tar.gz
Checksum of source archive.
- Type: 'md5', 'sha1', 'sha256', 'sha512'
checksum: e0840daaa97cd2cf2175f9e5d133ffb3324a2b93
Destination directory.
dest: /home/stretcher/app
Destination directory mode. Default: 0755
dest_mode: 0711
Destination directory mode will be set as...
src
archive includes.
=> same as.
in the archive.src
archive does not include.
=>dest_mode
pre
: Commands which will be invoked at beforesrc
archive extracted.post
: Commands which will be invoked at afterdest
directory synced.success
: Commands which will be invoked at deployment process is succeeded.failure
: Commands which will be invoked at deployment process is failed.
commands:
pre:
- echo 'staring deploy'
post:
- echo 'deploy done'
success:
- echo 'deploy success'
failure:
- echo 'deploy failed!!'
- cat >> /path/to/failure.log
stretcher agent logs will be passed to STDIN of success
and failure
commands.
Pass to rsync --exclude
arguments.
excludes:
- "*.pid"
- "*.socket"
Pass to rsync --exclude-from
arguments.
The file must be included in src
archive.
exclude_from: exclude.list
A strategy for syncing src extracted directory to dest directory.
rsync
: Default- Use rsync(1) command with option
-av --delete
- Use rsync(1) command with option
mv
- Use
os.Rename()
of Golang. - Deployment will be failed if
dest
directory is already exists.
- Use
- tar
- rsync
tar and rsync must be exist in PATH environment.
If you use stretcher under systemd, You can see unfinished stdout with journald.
You should add RateLimitBurst=0
into /etc/systemd/journald.conf
for getting stdout completely.
If src
is not defined in a manifest, Stretcher runs pre
/post
and success
/failure
commands simply.
The MIT License (MIT)
Copyright (c) 2014- FUJIWARA Shunichiro