[warning]

Status: Deprecated

deploy illustration for: Status: Deprecated

This article covers a version of CentOS that is no longer supported. If you are currently operating a server running CentOS 6, we highly recommend upgrading or migrating to a supported version of CentOS.

Reason:

CentOS 6 reached end of life (EOL) on November 30th, 2020 and no longer receives security patches or updates. For this reason, this guide is no longer maintained.

See Instead:

This guide might still be useful as a reference, but may not work on other CentOS releases. If available, we strongly recommend using a guide written for the version of CentOS you are using.

Introduction

If you are looking for a way to facilitate some of the actions you perform daily, as a simple search will show, there are more than a handful of tools available. If you check them you'll see that all of them claim to make the procedure of putting your application online (i.e. deploying it) easier for you. However, they hardly differ from one another – and they can be quite complicated to use as well.

Mina deployer and automation tool, which might appear no different than the rest, is actually quite special. In this the cloud provider article we are going to learn a different way to automate remote server tasks, covering a large area from managing processes to actually deploying applications, using Mina: a Bash script generator and remote execution tool built on RAKE.

Glossary

1. Understanding Mina & Rake

  1. Mina Deployer And Automation Tool
  1. RAKE – Ruby Make

2. Getting Mina

  1. Preparing The System
  1. Setting Up Ruby Environment and Rails
  1. Installing Mina

3. Getting Started With Using Mina

  1. Initiating Mina
  1. Creating A Deployer User On The Deployment Server

4. Working With config/deploy.rb

  1. Defining The Server
  1. Deploying Applications
  1. Defining Deployment Tasks
  1. Working With Tasks & Sub-Tasks

5. Example: Deploying A Rails Application

Understanding Mina And RAKE

Fortunately, there is no "rocket science" behind Mina. It is a very simple to use Ruby/RAKE tool that helps you with automating execution of remote tasks – usually related to deployment.

Mina Deployer And Automation Tool

Mina is a Ruby based tool. It is there to help people with creating scripts which contain a list of tasks to perform, grouped under a name, to facilitate everyday operations. Mina converts these RAKE based programming files to Bash scripts, connects to a defined remote server, and executes them.

It's actually pretty fast, and perhaps as fast as a tool of its genre can get, since all it does is connect to the server and run the Bash programmes.

Although some criticize Mina and call it primitive, with its excellent features (e.g. queuing of tasks, very handy!) a lot can be achieved very smoothly, without hiccups, with great speed.

To provide you a better understanding of not just Mina but such tools in general, here is a short list of what can be done and when Mina might come in handy:

  • Preparing and setting up a server: If you need to repeatedly create and destroy virtual servers, you will be spending a lot of time setting them up. Using Mina, you can automate the process.
  • Deploying applications: Whether you have HTTP server applications in place or not, you can use Mina to update your application's source code on the deployment machine(s) and automatically bring the new version up and running without dealing with FTP or other tools.
  • Managing processes: This sounds very generic, but imagine just how many times (probably per day) you need to manage some process running on a server, such as an application server, a proxy, or your typical Nginx front-facing reverse proxy. With Mina's tasks, you can facilitate this and gain a good amount of momentum — keeping everything organized at the same time.
  • Living in a Rails-less world: Mina can do all the above, and more, without having any strict reliance, dependence, or allegiance to Rails. With Mina, you can deploy almost everything.

Mina's deploy.rb scripts are actually RAKE files with a bunch of grouped tasks. Everything is written in Ruby without dealing with other sorts of configurations — you do not need to get familiar with anything new that you'll hardly ever use again.

RAKE - Ruby Make

Web developers, programmers, and anyone dealing with science or computers should have a good understanding of the tools they use. In Mina's case, the magic comes from *RAKE*.

However, what is RAKE?

RAKE is a series of components, tools, and definitions similar in nature to GNU Make. Make is one of the most widespread and popular utilities, which has been built into Unix systems since its introduction in late 1970s. It became really popular for its system-independent nature and the ability it offers to combine commands and instructions into a single file, which are referred as "makefiles". These files and Make as a tool are used to build applications (i.e. compile the source code and generate executable binaries).

Rake can be referred to as a *build language*. It is used for easily defining tasks in a structured way to be executed in the command line. By nature, these commands are usually system administration related, such as application deployment or managing servers. This structure of Rake can be referred as a *domain specific language*, written in Ruby, whereby everything is defined and set in a certain way within boundaries. It is called a build tool since, as described previously, its operations are usually related to constructing something (e.g. a library, an application, etc.)

RAKE can be obtained through RubyGems.

To visit the official RAKE project page, click rake.rubyforge.org. To learn more about RAKE, check out this excellent, detailed article on the subject: Using the Rake Build Language.

Getting Mina

When using Mina, you need to make sure to have a stable Ruby environment with necessary dependencies installed and operating fine – such as gem.

In this section, we'll begin with creating a Ruby environment on a CentOS 6 system. From thereon, you will be able to use Mina to automate procedures on your deployment servers.

Preparing The System

In order to install Ruby, we first need to prepare the minimally shipped CentOS server.

Run the following command to update the default tools of your CentOS based VPS:

yum -y update

Install the bundle containing development tools by executing the following command:

yum groupinstall -y 'development tools'

Some of the handy libraries and packages (e.g. libyaml-devel, nginx etc.) are *not* found within the official CentOS repository. To simplify things and not to deal with manually installing them, we will add the EPEL software repository for YUM package manager to use. This will enable the simple download of additional softare.

sudo su -c 'rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm'

yum -y update

Finally, we need to get curl-devel and several other tools and libraries for this tutorial (e.g. Rails needs sqlite-devel).

In order to install them, run the following:

yum install -y curl-devel nano sqlite-devel libyaml-devel

Setting Up Ruby Environment and Rails

Note: This section is a summary of our dedicated article How To Install Ruby 2.1.0 On CentOS 6.5.

We are going to be using Ruby Version Manager (RVM) to download and install a Ruby interpreter.

Run the following two commands to install RVM and create a system environment for Ruby:

curl -L get.rvm.io | bash -s stable

source /etc/profile.d/rvm.sh

Finally, to finish installing Ruby on our system, let's get RVM to download and install Ruby version 2.1.0:

rvm reload

rvm install 2.1.0

Since Rails needs first and foremost a JavaScript interpreter to work, we will also need to set up Node.js. For this purpose, we will be using the default system package manager YUM.

Run the following to download and install nodejs using yum:

yum install -y nodejs

Execute the following command to download and install rails using gem:

gem install bundler rails

Installing Mina

There are a couple of ways to download Mina. The simplest way is to use RubyGems.

Run the following to download and install Mina:

gem install mina

Getting Started With Using Mina

When introducing mina to your project, the first things that is needed is to initiate mina inside the project directory.

Afterwards, you can edit the config/deploy.rb created by Mina to define your server and tasks to perform.

Initiating Mina

Enter your project directory and run the following command:

cd ~/project_dir

mina init

Creating A Deployer User On The Deployment Server

It is a sane choice to create a user, other than root, to perform the actions of deployment which will be used and invoked by Mina. For this purpose, let's create on the remote host a deployer user.

Create a new system user:

adduser deployer

Set up deployer's password:

passwd deployer

Edit /etc/sudoers using the text editor nano:

nano /etc/sudoers

Scroll down the file and find where root is defined:

..

The COMMANDS section may have other options added to it.

##

Allow root to run any commands anywhere

root ALL=(ALL) ALL

..

Append the following right after root ALL=(ALL) ALL:

deployer ALL=(ALL) ALL

This section of the /etc/sudoers file should now look like this:

..

The COMMANDS section may have other options added to it.

##

Allow root to run any commands anywhere

root ALL=(ALL) ALL

deployer ALL=(ALL) ALL

..

Press CTRL+X and confirm with Y to save and exit.

Working With config/deploy.rb

Next, open up the deploy.rb file, created by Mina, to define your deployment server and to set tasks.

nano config/deploy.rb

Defining The Server

The first step is to edit the :domain line to set your server's address.

Find and amend the relevant configuration to match your virtual server's:

set :domain, 'server.domain.tld'

set :user, 'deployer'

set :port, '22'

Deploying Applications

Using Mina, you can easily deploy your applications from a central and hosted repository such as Github. As mentioned in the previous section, you can achieve this with setting the deploy_to and repository parameters, as well as branch if necessary.

Example:

set :deploy_to, '/var/www/my_app'

set :repository, 'git://…'

set :branch, 'master'

Defining Deployment Tasks

Mina's deploy.rb file comes with some example tasks set, targeting Rails for mina deploy command.

Example:

desc "Deploys the current version to the server."

task :deploy => :environment do

deploy do

invoke :'git:clone'

invoke :'deploy:link_shared_paths'

invoke :'bundle:install'

invoke :'rails:db_migrate'

invoke :'rails:assets_precompile'

to :launch do

queue "touch #{deploy_to}/tmp/restart.txt"

end

end

end

Working With Tasks & Sub-Tasks

You can define and chain tasks with Mina which can be really handy in many scenarios.

Below is an example of working with tasks and chaining them from the official documentation:

task :down do

invoke :maintenance_on

invoke :restart

end

task :maintenance_on

queue 'touch maintenance.txt'

end

task :restart

queue 'sudo service restart apache'

end

Example: Deploying A Rails Application

To learn about how to deploy an actual Rails application and how to work with deploy.rb accordingly, check out How To Use Mina to Deploy a Ruby on Rails Application in the the cloud provider community articles section.

Note: Using the same principals, you can deploy any type of application with Mina.

href="https://twitter.com/ostezer">O.S. Tezer</a></div>