Capistrano & rsync scm plugin

Jak jsem někde zmiňoval, tohle je statický web, tudíž nemám k dispozici žádné klikátko na správu obsahu. Použitím Jekylla (nebo jemu podobnému) mohu text editovat jakýmkoliv editorem a lehce verzovat/zálohovat.

Je tu ovšem větší pruda s uveřejněním změn. Vygenerovat html, zabalit, nahrát, rozbalit / nebo rovnou nahrát na server. Při troše šikovnosti rutiinní, nudná, zdlouhavá činnost. Nepočítaje zálohování, kdyby se něco pokazilo, hledání hesla k ftp… “Jakým klientem? Sem to dělal před měsícem… sakra”.

A nebo budu línější a napíšu si script, který to aspoň částečně za mě udělá. Jsem ještě línější a vzpomněl jsem si na Capistrano, se kterým jsem v předchozím zaměstnání vyváděli na virtualních hradech psí kusy - prznili sql servery, zálohovali co šlo, šablonili konfigurační soubory, vytvářeli příšerný konstrukce, abychom podchitili specifika instalace u klienta a apod.

Capistrano podporuje Jekyll pomocí gemu capistrano-jekyll, je tedy vyhráno. Aspoň do chvíle, než si uvědomíte, že se celý repositář stahuje na server a až tam se stránky vygenerují. K čemuž je samozřejmě třeba Jekylla a dalších gemů na serveru.

Začal jsem se pídit po nahrazení gitu rsyncem, čistě vytvořit lokální task, který mi sestaví stránky a v dalším kroku je nahraje na server.

Doba uběhla, člověk zapomíná, takže ač se solidními zkušenostmi, musel jsem se znovu probít dokumentací. Na druhou stranu to tentokrát šlo nějak rychleji. Pídil jsem se po nějakém rsync řešení, něco vyzkoušel a pokaždý to nebylo ono.

Nakonec jsem se protáhnul, a všiml si nasledujíciho varování během mých pokusů:

WARNING: `set :scm, :git` is deprecated.
         To ensure your project is compatible with future versions of
         Capistrano, remove the :scm setting and instead add these lines to
         your Capfile:

         require "capistrano/scm/git"
         install_plugin Capistrano::SCM::Git

Nu, tak jsme začal hledat Capistrano::SCM::Rsync a našel capistrnao-scm-rsync. Tudíž nainstalovat gem a nakonfiguroval.

$ gem install capistrano-scm-rsync

První úpravu jsem provedl v souboru Capfile,přidal jsem:

require "capistrano/scm/rsync"
install_plugin Capistrano::SCM::Rsync

Případně zakomentujeme jiný SCM plugin.

Konfigurace Capistrana je následující, soubor config/deploy.rb:

set :rsync_options,
  source: '_site',
  cache: 'cache',
  args: {
    local_to_remote: %w(--recursive --delete --info=progress2),
    cache_to_release: %w(--archive --acls --xattrs)
  }

set :deploy_to, '/path/to/site'
  • source: '_site' - lokální umístění sestavených html stránek
  • cache: 'cache' - cache sestavených html stránek na vzdálené straně
  • args - nastavení parametrů rsync, všimněte si parametru --info=progress2, ten sem neznal :).

Zároveň je dobré si nastavit proměnou JEKYLL_ENV pro sestavování stránek Jekyllem. V souboru konfigurace jednotlivých prostředí pro deploy si tuto proměnou nastavíme, v tomto případě prostředí prod, soubor config/deploy/prod.rb:

# cílový server, v tomto případě není třeba použití rolí
server "myserver.domain.tld", user: "useroid", roles: %{web}

# nastavení proměnné JEKYLL_ENV
set :default_env, { "JEKYLL_ENV" => "production" }

Výtečně, tak ještě ten task na vygenerování html. Vytvoříme soubor lib/capistrano/tasks/jekyll.rake:

desc 'Jekyll integration'
namespace :jekyll do
  desc 'Build site locally using Jekyll'
  task :build_local do
    on(:local) do
        execute :bundle, :exec, :jekyll, :build
    end
  end
  before 'rsync:copy_local_to_remote', 'jekyll:build_local'
end

Pokud máme vše správně, měli bychom mít k dispozici nové tasky:

$ cap prod -T
cap deploy                         # Deploy a new release
cap deploy:check                   # Check required files and directories exist
...
...
cap jekyll:build_local             # Build site locally using Jekyll
cap rsync:copy_local_to_remote     # Copy the local source directory to the remote cache o...
cap rsync:create_release           # Create new release

Zkusíme tedy nejdříve stránky sestavit:

$ cap prod jekyll:build_local
00:00 jekyll:build_local
      01 bundle exec jekyll build
      01 Configuration file: /path/to/site/_config.yml
      01             Source: /path/to/site/
      01        Destination: /path/to/site/_site
      01  Incremental build: disabled. Enable with --incremental
      01       Generating...
      01        Jekyll Feed: Generating feed for posts
      01                     done in 3.048 seconds.
      01  Auto-regeneration: disabled. Use --watch to enable.
    ✔ 01 useroid@localhost 4.854s

Tak je pojďme vystřelit do světa:

$ cap prod deploy
00:00 deploy:check:directories
      01 mkdir -p /path/to/site/shared /path/to/site/releases
    ✔ 01 useroid@myserver.domain.tld 1.024s
00:01 jekyll:build_local
      01 bundle exec jekyll build
      01 Configuration file: /home/useroid/Work/mysite/_config.yml
      01             Source: /home/useroid/Work/mysite
      01        Destination: /home/useroid/Work/mysite/_site
      01  Incremental build: disabled. Enable with --incremental
      01       Generating...
      01        Jekyll Feed: Generating feed for posts
      01                     done in 3.018 seconds.
      01  Auto-regeneration: disabled. Use --watch to enable.
    ✔ 01 useroid@localhost 4.630s
rsync --recursive --delete --info=progress2 _site/ useroid@myserver.domain.tld:/path/to/site/shared/cache
     31,445,632 100%   41.94MB/s    0:00:00 (xfr#112, to-chk=0/137)
00:07 rsync:create_release
      01 mkdir -p /path/to/site/releases/20200502223824
    ✔ 01 useroid@myserver.domain.tld 0.142s
      02 rsync --archive --acls --xattrs /path/to/site/shared/cache/ .
    ✔ 02 useroid@myserver.domain.tld 0.328s
00:08 deploy:set_current_revision
      01 echo "20200502223824" > REVISION
    ✔ 01 useroid@myserver.domain.tld 0.210s
00:09 deploy:symlink:release
      01 ln -s /path/to/site/releases/20200502223824 /path/to/site/releases/curr…
    ✔ 01 useroid@myserver.domain.tld 0.189s
      02 mv /path/to/site/releases/current /path/to/site/
    ✔ 02 useroid@myserver.domain.tld 0.309s
00:09 deploy:cleanup
      Keeping 3 of 4 deployed releases on myserver.domain.tld
      01 rm -rf /path/to/site/releases/20200427204014
    ✔ 01 useroid@myserver.domain.tld 0.262s
00:10 deploy:log_revision
      01 echo "Branch master (at 20200502223824) deployed as release 20200502223824 by useroid" >> /path/to/site/.…
    ✔ 01 useroid@myserver.domain.tld 0.184s

No není to krásné?

2020

Capistrano & rsync scm plugin

Jak jsem někde zmiňoval, tohle je statický web, tudíž nemám k dispozici žádné klikátko na správu obsahu. Použitím Jekylla (nebo jemu podobnému) mohu text edi...

Nahoru ↑

2019

Tesla NC500

Čas od času vídám, že gramofon Tesla NC500 byl jeden z nejlepších gramofonů, které se v Litovli za dob komárů vyráběly. A nebo úplně opačnou pohádku. Podívám...

Malý elektronek #1

Byl to hukot. Jednalo se o dobu, kdy se věci spravovali a nebo rovnou vyráběly doma na koleně. Nebo v trucovně.

Computers #1

Consul 2717 - neboli Zbrojováček. To už se jednalo o počítač, který jsem ovládal relativně pravidelně a navíc se podobal počítači. Trošku podezírám Apple, že...

Computers #0

První můj opravdový počítač, tj. že jsem byl jeho majitelem, bylo až Pentium 100, 32MB RAM, FDD Mitsumi 3,5” 1,44MB, HDD WD 210MB,CD Mitsumi 8x, SVGA (S3 něc...

Babetta typ 210

Jelikož mi žena nepovolí motocykl, ačkoliv jsem si před časem nechal vytisknout nový řidičák s právy jízdy na velké máše, tak jsem se rozhodl restaurovat Bab...

Nahoru ↑