项目作者: stackbuilders

项目描述 :
Deploy tool for Haskell applications, like Capistrano for Rails
高级语言: Haskell
项目地址: git://github.com/stackbuilders/hapistrano.git
创建时间: 2014-05-20T23:27:52Z
项目社区:https://github.com/stackbuilders/hapistrano

开源协议:MIT License

下载


Build

All Contributors

Draft
Release

Hapistrano

Description

Hapistrano is a deployment library for Haskell applications similar to
Ruby’s Capistrano.

Purpose

We created Hapistrano because:

  • Deploys should be simple, but as close to atomic as possible (eg,
    they shouldn’t require much application downtime).
  • Rollback should be trivial to achieve to bring the application back
    to the last-deployed state.
  • Deploys shouldn’t fail because of dependency problems.

How it Works

Hapistrano (like Capistrano for Ruby) deploys applications to a new
directory marked with a timestamp on the remote host. It creates this
new directory quickly by placing a git repository for caching purposes
on the remote server.

When the build process completes, it switches a symlink to the current
release directory, and optionally restarts the web server.

By default, Hapistrano keeps the last five releases on the target host
filesystem and deletes previous releases to avoid filling up the disk.

Usage

Hapistrano 0.4.0.0 looks for a configuration file called hap.yaml that
typically looks like this:

  1. deploy_path: '/var/projects/my-project'
  2. host: user@myserver.com
  3. port: 2222
  4. # To perform version control operations
  5. repo: 'https://github.com/stackbuilders/hapistrano.git'
  6. revision: origin/main
  7. # To copy the contents of the directory
  8. local_directory: '/tmp/my-project'
  9. build_script:
  10. - stack setup
  11. - stack build
  12. restart_command: systemd restart my-app-service

The following parameters are required:

  • deploy_path — the root of the deploy target on the remote host.
  • Related to the source of the repository, you have the following options:
    • Git repository default — consists of two parameters. When these are set,
      hapistrano will perform version control related operations.
      Note: Only GitHub is supported.
      • repo — the origin repository.
      • revision — the SHA1 or branch to deploy. If a branch, you will need to
        specify it as origin/branch_name due to the way that the cache repo is
        configured.
    • local_directory — when this parameter is set, hapistrano will copy the
      contents of the directory.

The following parameters are optional:

  • host — the target host, if missing, localhost will be assumed (which
    is useful for testing and playing with hap locally). You can specify the
    user that is going to connect to the server here. Example: user@server.com.
  • port — SSH port number to use. If missing, 22 will be used.
  • shell — Shell to use. Currently supported: zsh ans bash. If missing, Bash will be used.
  • ssh_args — Optional ssh arguments. Only -p is passed via the port variable.
  • build_script — instructions how to build the application in the form of
    shell commands.
  • restart_command — if you need to restart a remote web server after a
    successful rollback, specify the command that you use in this variable. It
    will be run after both deploy and rollback.
  • vc_action - Controls if version control related activity should
    take place. It defaults to true. When you don’t want activity like
    cloning, fetching etc. to take place, set this to false.
  • linux - Specify, whether or not, the target system where Hapistrano will
    deploy to is a GNU/Linux or other UNIX (g.e. BSD, Mac). This is set to true
    by default so unless the target system is not GNU/Linux, this should not be
    necessary. The platform where Hapistrano is running won’t affect the
    available options for commands (g.e. A Mac deploying to an Ubuntu machine,
    doesn’t need this flag)
  • release_format - The release timestamp format, the
    ‘—release-format’ argument passed via the CLI takes precedence over this
    value. If neither CLI nor configuration file value is specified, it defaults
    to ‘short’
  • keep_releases - The number of releases to keep, the
    ‘—keep-releases’ argument passed via the CLI takes precedence over this
    value. If neither CLI nor configuration file value is specified, it defaults
    to ‘5’
  • keep_one_failed - A boolean specifying whether to keep all failed releases
    or just one (the latest failed release), the ‘—keep-one-failed’ flag passed via
    the CLI takes precedence over this value. If neither CLI nor configuration file value is specified,
    it defaults to false (i.e. keep all failed releases).
  • linked_files:- Listed files that will be symlinked from the {deploy_path}/shared folder
    into each release directory during deployment. Can be used for configuration files
    that need to be persisted (e.g. dotenv files). NOTE: The directory structure must
    be similar in your release directories in case you need to link a file inside a
    nested directory (e.g. shared/foo/file.txt).
  • linked_dirs:- Listed directories that will be symlinked from the {deploy_path}/shared folder
    into each release directory during deployment. Can be used for data directories
    that need to be persisted (e.g. upload directories). NOTE: Do not add a slash /
    at the end of the directory (e.g. foo/) because we use parseRelFile to create
    the symlink.
  • run_locally:- Instructions to run locally on your machine in the
    form of shell commands. Example:
  1. run_locally:
  2. - pwd
  3. - bash deploy.sh

Note how we are even able to execute a bash script named deploy.sh
above. Be sure to use set -e in your bash script to avoid
headaches. Hapistrano will stop the execution on non-zero exit
codes. Without the usage of set -e, there is a possibility that your
bash script may return a zero exit code even if your intermediate
command resulted in an error.

After creating a configuration file as above, deploying is as simple as:

  1. $ hap deploy

Rollback is also trivial:

  1. $ hap rollback # to rollback to previous successful deploy
  2. $ hap rollback -n 2 # go two deploys back in time, etc.
  • maintenance_directory:- The name of the directory on which the maintenance file will be placed. {deploy_path}/{maintenance_directory}. The default directory name is maintenance
  • maintenance_filename:- The name of the file that is going to be created in the maintenance_directory. It has to have the .html extension to be seen in the browser. {deploy_path}/{maintenance_directory}/{maintenance_filename}. The default filename is maintenance.html

Environment Variables

Configuration files are parsed using
loadYamlSettings,
therefore, variable substitution is supported. Considering the following configuration file:

  1. revision: "_env:HAPISTRANO_REVISION:origin/main
  2. ...

The revision value could be overwritten as follows:

  1. HAPISTRANO_REVISION=origin/feature_branch hap deploy

What to do when compiling on server is not viable

Sometimes the target machine (server) is not capable of compiling your
application because e.g. it has not enough memory and GHC exhausts it all.
You can copy pre-compiled files from local machine or CI server using
copy_files and copy_dirs parameters:

  1. copy_files:
  2. - src: '/home/stackbuilders/my-file.txt'
  3. dest: 'my-file.txt'
  4. copy_dirs:
  5. - src: .stack-work
  6. dest: .stack-work

src maybe absolute or relative, it’s path to file or directory on local
machine, dest may only be relative (it’s expanded relatively to cloned
repo) and specifies where to put the files/directories on target machine.
Directories and files with clashing names will be overwritten. Directories
are copied recursively.

Deploying to multiple machines concurrently

Beginning with Hapistrano 0.3.1.0 it’s possible to deploy to several
machines concurrently. The only things you need to do is to adjust your
configuration file and use targets parameter instead of host and port,
like this:

  1. targets:
  2. - host: myserver-a.com
  3. port: 2222
  4. - host: myserver-b.com
  5. # the rest is the same

Additionally, starting with 0.4.9.0 it is possible to run commands only on the
lead target during a concurrent deploying process ensuring that certain tasks
only get executed once. The lead target is considered the first entry in the
targets list:

  1. targets:
  2. - host: app1.example.com # lead server
  3. - host: app2.example.com
  4. build_script:
  5. - command: ./run_database_migrations
  6. only_lead: true
  7. - ./build
  8. # the rest is the same

A few things to note here:

  • host item is required for every target, but port may be omitted and
    then it defaults to 22.

  • The deployment will run concurrently and finish when interactions with all
    targets have finished either successfully or not. If at least one
    interaction was unsuccessful, the hap tool will exit with non-zero exit
    code.

  • The log is printed in such a way that messages from several machines get
    intermixed, but it’s guaranteed that they won’t overlap (printing itself
    is sequential) and the headers will tell you exactly which machine was
    executing which command.

If you don’t specify host and targets, hap will assume localhost as
usually, which is mainly useful for testing.

Docker

Starting with version 0.4.4.0 all new Docker images would be published to
[GitHub’s Container Registry][ghcr], while the old versions remain available on
[Docker Hub][dockerhub]. To download the latest version available, change the
image reference as follows:

  1. - stackbuilders/hapistrano:latest
  2. + ghcr.io/stackbuilders/hapistrano:latest

GH Actions

Check the documentation here

Development

Requirements

  • Install Zsh
  • Use GHCup to install:
    • GHC 8.10.x or 9.0.x (it is recommended to try both for backward
      compatibility)
    • Cabal 3.x

Alternatively, install only Nix following the instructions detailed
here.

Getting Started

Update package index:

  1. cabal update

Enable tests:

  1. cabal configure --enable-tests

Install project dependencies:

  1. cabal build --only-dependencies

Compile the project:

  1. cabal build

Run tests:

  1. cabal test

Enable/disable maintenance mode

Present a maintenance page to visitors. Disables your application’s web interface by writing a {maintenance_filename} file to each web server. The servers must be configured to detect the presence of this file, and if it is present, always display it instead of performing the request.

The maintenance page will just say the site is down for maintenance, and will be back shortly.

To enable maintenance mode run:

  1. hap maintenance enable

Disabling maintenance mode will remove the file from the {maintenance_directory} it can be done with the following command:

  1. hap maintenance disable

Notes

  • Hapistrano is not supported on Windows. Please check: Issue #96.

Contributors ✨

Thanks goes to these wonderful people (emoji key):












































Juan Paucar
Juan Paucar

💻
Justin S. Leitgeb
Justin S. Leitgeb

💻
David Mazarro
David Mazarro

💻
Sebastián Estrella
Sebastián Estrella

💻
Mark Karpov
Mark Karpov

💻
Juan Pedro Villa Isaza
Juan Pedro Villa Isaza

💻
Cristhian Motoche
Cristhian Motoche

💻
Sibi Prabakaran
Sibi Prabakaran

💻
Esteban Ibarra
Esteban Ibarra

💻
William R. Arellano
William R. Arellano

💻
Götz
Götz

💻
Javier Casas
Javier Casas

💻
Jakub Arnold
Jakub Arnold

💻
Nicko Vivar D.
Nicko Vivar D.

💻
Felix Miño
Felix Miño

💻
Luis Fernando Alvarez
Luis Fernando Alvarez

💻
Stefani Castellanos
Stefani Castellanos

💻
Alexis Crespo
Alexis Crespo

💻
David Proaño
David Proaño

💻
Franz Guzmán
Franz Guzmán

💻
Hugh JF Chen
Hugh JF Chen

💻
Jean Karlo Obando Ramos
Jean Karlo Obando Ramos

💻
Nitin Gupta
Nitin Gupta

💻
Omar García
Omar García

💻
wanderer163
wanderer163

💻
Gautier DI FOLCO
Gautier DI FOLCO

💻
Óscar Izquierdo Valentín
Óscar Izquierdo Valentín

💻


Add your contributions

This project follows the all-contributors specification. Contributions of any kind welcome!

License

MIT, see the LICENSE file.

Contributing

Do you want to contribute to this project? Please take a look at our contributing guideline to know how you can help us build it.


Stack Builders
Check out our libraries | Join our team