Bu örneğimizde, bir vagrant sunucusundan diğer bir vagrant sunucusuna capistrano ile uygulama yükleyeceğiz. Uygulamayı staging ve production sunucularına yükleyeceğiz. Yükleme işlemi ise dev sunucusunda gerçekleşecek. Daha fazla bilgi için Capistrano sayfasını ziyaret edin.


Önkoşullar


Herşeyden önce üç sunucunuzun da GitHub kütüphanenize ulaşabilir olmalı, bu nedenle SSH anahtarlarını GitHub'a ekleyin.


Aşağıdakileri sadece yükleme işlemini yapacağınız sunucuda gerçekleştirin.


Ruby kurulumu


$ sudo add-apt-repository -y ppa:brightbox/ruby-ng
$ sudo apt-get update -y
$ sudo apt-get install -y ruby2.2

Capistrano kurulumu


$ sudo gem install capistrano
$ sudo gem install capistrano-ext

Bundler kurulumu


$ sudo gem install bundler

Staging ve Production sunucuları


Bunlar önemli olan Vagrantfile bilgileri. Varsayılan vagrant login bilgileri vagrant:vagrant.


private_network IP: 192.168.99.40 # Staging
private_network IP: 192.168.99.50 # Production
synced_folder: /srv/www

Dev sunucusu


Bu yükleme işleminin yapılacağı yerdir. Uygulamanızı GIT ile daha önceden bu sunucuya kopyaladığınızı ve SSH'in kurulu olduğunu varsayıyorum. Test uygulamamızın ismi football.


SSH authorized_keys


Eğer bu işlemi dev sunucusu üzerinde yapmazsanız, uygulamanızı staging ve production sunucularına yüklerken, her zaman bu sunucuların şifresini girmeniz gerekecek. Şifre ise bu örneğimize mahsus olarak vagrant olacak. Eğer sisteminizde ~/.ssh/id_rsa.pub dosyası yoksa, ssh-keygen -t rsa komutu ile bir tane yaratabilirsiniz.


$ cat ~/.ssh/id_rsa.pub | ssh vagrant@192.168.99.40 'cat >> /home/vagrant/.ssh/authorized_keys'
$ cat ~/.ssh/id_rsa.pub | ssh vagrant@192.168.99.50 'cat >> /home/vagrant/.ssh/authorized_keys'

Bundler


Manuel olarak Gemfile dosyasını yaratın. Daha fazla bilgi için Bundler sayfasını ziyaret edin.


$ cd /projects/football
football$ cat > Gemfile <<EOD
source 'https://rubygems.org'

gem 'capistrano', '~> 3.8'
EOD

Gemfile kütüphanelerini yüklme işlemi, uygulama içinde "Gemfile.lock" dosyasını yaratacaktır.


football$ bundle install

Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/.
Resolving dependencies...
Installing rake 12.0.0
Using net-ssh 4.1.0
Using i18n 0.8.1
Using bundler 1.14.6
Using net-scp 1.2.1
Using sshkit 1.13.1
Using airbrussh 1.1.2
Using capistrano 3.8.0
Bundle complete! 1 Gemfile dependency, 8 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.

Capistrano


Aşağıdaki aktifleştirme işlemi çalışmanız için gerekli olan dosya ve klasörleri yaratacaktır. Dosyaların içinde örnek konfigürasyonlar bulunur. Biz bunları daha sonradan değiştireceğiz. Daha fazla bilgi için configuration sayfasını ziyaret edin.


$ cd /projects/football
football$ cap install

mkdir -p config/deploy
[created] config/deploy.rb
[created] config/deploy/staging.rb
[created] config/deploy/production.rb
mkdir -p lib/capistrano/tasks
[created] create Capfile already exists
Capified

Burada dosya konfigürasyonlarını değiştireceğiz. Örnek bir .gitignore dosyası yaratıp, içine log ve lib klasörlerini ekleyin.


Capfile


# Load plugins.

require "capistrano/setup"
require "capistrano/deploy"
require "capistrano/scm/git"

install_plugin Capistrano::SCM::Git

deploy.rb


# Locked capistrano version.
lock "3.8.0"

# The name of the application.
set :application, "football"

# The path on the remote server where the application will be deployed.
# This must be owned and have RW permissions by/for "vagrant" user.
set :deploy_to, "/srv/www/#{fetch(:application)}"

# The application repository.
set :repo_url, "git@github.com:Inanzzz/football.git"

# Asks branch to deploy.
ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp

# Output styling.
set :format, :airbrussh

# Amount of releases to keep.
set :keep_releases, 5

staging.rb


# The settings for remote staging server.
server "192.168.99.40", user: "vagrant", roles: %w{app db web}

production.rb


# The settings for remote production server.
server "192.168.99.50", user: "vagrant", roles: %w{app db web}

Yükleme bilgileri


Uygulamayı yükleyeceğimiz staging ve production sunucularına sahibiz. İlk yükleme işlemimiz /srv/www altında football klasörü yaratacak. Bu klasör içinde aşağıdaki dosya ve klasörler otomatik olarak yaratılacak.


$ ls -l /srv/www/football/
total 8
lrwxr-xr-x 1 vagrant vagrant 41 Apr 7 2017 current -> /srv/www/football/releases/20170407215525
drwxr-xr-x 1 vagrant vagrant 102 Apr 7 2017 releases
drwxr-xr-x 1 vagrant vagrant 408 Apr 7 2017 repo
-rw-r--r-- 1 vagrant vagrant 106 Apr 7 2017 revisions.log
drwxr-xr-x 1 vagrant vagrant 68 Apr 7 2017 shared


Daha fazla bilgi için structure sayfasını ziyaret edin.


Yükleme


Komut sonuna --trace eklenmesi, yükleme ile ilgili daha fazla bilgi verir bundle exec cap .... deploy --trace. Yükleme sırasında şifre girmeniz istenecek. Bu şifre yüklemenin yapılacağı sunucunun şifresidir yani vagrant. Bununla birlikte yüklemek istediğiniz branch sorulacaktır.


$ cd /projects/football
football$ bundle exec cap {staging|production} deploy

Çıktı


00:00 git:wrapper
01 mkdir -p /tmp
vagrant@192.168.99.40's password:
✔ 01 vagrant@192.168.99.40 10.360s
Uploading /tmp/git-ssh-football-staging-vagrant.sh 100.0%
02 chmod 700 /tmp/git-ssh-football-staging-vagrant.sh
✔ 02 vagrant@192.168.99.40 0.005s
Please enter branch (develop): master
00:14 git:check
01 git ls-remote git@github.com:Inanzzz/football.git HEAD
01 11d9954321c5d83c9039d35336cdefdb87753333 HEAD
✔ 01 vagrant@192.168.99.40 1.674s
00:15 deploy:check:directories
01 mkdir -p /srv/www/football/shared /srv/www/football/releases
✔ 01 vagrant@192.168.99.40 0.006s
00:15 git:clone
The repository mirror is at /srv/www/football/repo
00:15 git:update
01 git remote set-url origin git@github.com:Inanzzz/football.git
✔ 01 vagrant@192.168.99.40 0.016s
02 git remote update --prune
02 Fetching origin
02 From github.com:Inanzzz/football
02 33ea35c..99d9954 develop -> develop
✔ 02 vagrant@192.168.99.40 1.516s
00:17 git:create_release
01 mkdir -p /srv/www/football/releases/20170407233938
✔ 01 vagrant@192.168.99.40 0.009s
02 git archive master | /usr/bin/env tar -x -f - -C /srv/www/football/releases/20170407233938
✔ 02 vagrant@192.168.99.40 0.128s
00:17 deploy:set_current_revision
01 echo "9n3426851299e4bac6f1b51729b623859c70ef90" >> REVISION
✔ 01 vagrant@192.168.99.40 0.017s
00:17 deploy:symlink:release
01 ln -s /srv/www/football/releases/20170407233938 /srv/www/football/releases/current
✔ 01 vagrant@192.168.99.40 0.007s
02 mv /srv/www/football/releases/current /srv/www/football
✔ 02 vagrant@192.168.99.40 0.013s
00:17 deploy:log_revision
01 echo "Branch master (at 9n3426851299e4bac6f1b51729b623859c70ef90) deployed as release 20170407233938 by vagrant" >> /srv/www/footb…
✔ 01 vagrant@192.168.99.40 0.012s

Geri yükleme


Eğer hatalı bir yükleme yaptıysanız, bir önceki yüklemeye rahatlıkla geri dönebilirsiniz. Aşağıdaki çıktı geri yükleme yapmadan önceki mevcut durumu gösteriyor.


vagrant@prod:~$ ls -lt /srv/www/football/
lrwxr-xr-x 1 vagrant vagrant 41 Apr 8 2017 current -> /srv/www/football/releases/20170408032202
drwxr-xr-x 1 vagrant vagrant 238 Apr 8 2017 releases
-rw-r--r-- 1 vagrant vagrant 636 Apr 8 2017 revisions.log
drwxr-xr-x 1 vagrant vagrant 408 Apr 8 2017 repo
drwxr-xr-x 1 vagrant vagrant 68 Apr 7 21:58 shared

vagrant@prod:~$ ls -lt /srv/www/football/releases/
drwxr-xr-x 1 vagrant vagrant 476 Apr 8 2017 20170408032202
drwxr-xr-x 1 vagrant vagrant 68 Apr 8 2017 20170408032150
drwxr-xr-x 1 vagrant vagrant 68 Apr 8 2017 20170408030058
drwxr-xr-x 1 vagrant vagrant 476 Apr 8 2017 20170408024838
drwxr-xr-x 1 vagrant vagrant 68 Apr 8 2017 20170408024828

Geri yükleme yapıyoruz.


$ bundle exec cap production deploy:rollback

Aşağıdaki çıktıdan ne tür bir işlem yapıldığını anlayabilirsiniz.


lrwxr-xr-x 1 vagrant vagrant    41 Apr  8  2017 current -> /srv/www/football/releases/20170408032150
drwxr-xr-x 1 vagrant vagrant 204 Apr 8 2017 releases
-rw-r--r-- 1 vagrant vagrant 682 Apr 8 2017 revisions.log
-rw-r--r-- 1 vagrant vagrant 40091 Apr 8 2017 rolled-back-release-20170408032202.tar.gz
drwxr-xr-x 1 vagrant vagrant 408 Apr 8 2017 repo
drwxr-xr-x 1 vagrant vagrant 68 Apr 7 21:58 shared

vagrant@prod:~$ ls -lt /srv/www/football/releases/
drwxr-xr-x 1 vagrant vagrant 68 Apr 8 2017 20170408032150
drwxr-xr-x 1 vagrant vagrant 68 Apr 8 2017 20170408030058
drwxr-xr-x 1 vagrant vagrant 476 Apr 8 2017 20170408024838
drwxr-xr-x 1 vagrant vagrant 68 Apr 8 2017 20170408024828