Alergarea din perspectiva unui începător

Pantofii mei de alergat Nike Wildhorse 4

Da, m-am apucat de alergat.

Nu știu exact cum să încep așa că voi începe cu motivația: m-am cam delăsat în iarnă și cum mă simțeam foarte îmbâcsit și fără energie mă gândeam să mă re-apuc anul acesta de mișcare. Am căutat o alternativă la bicicletă căci după cum probabil știți sunt un părinte ocupat și nu mai am timp de ieșiri care durează cu orele. De fapt găsisem alternativa în 2014 când am alergat de câteva ori, dar nu prea îmi mai amintesc exact nici de ce m-am apucat (probabil din curiozitate) și nici de ce am renunțat. Știu doar că îmi luasem un ceas pentru alergare de la Garmin care l-am dus cu mine la Cluj în delegație și acolo am făcut primele alergări în părculețul Iuliu Prodan aflat în imediata apropiere a apartamentului în care eram cazat.

Sincer să spun încă nu a ajuns să mă sperie cântarul căci am o constituție destul de subțirică, doar că, având o muncă sedentară de birou tot ce se depune se depune pe burta care arată… rău. Ziceam că îmi luasem un ceas Garmin. Ei bine, i s-a rupt cureaua anul trecut și cândva prin martie anul curent i-am montat noua curea comandată de pe Aliexpress, moment din care am reînceput să port ceasul.

După multe insistențe din partea unui coleg de la muncă, am ieșit la o primă alergare într-o dimineață de duminică la final de aprilie. Apoi la început de mai am dat târcoale pădurilor din periferia Băii Sprii și am fost mirat de cât de rapid am parcurs locurile cunoscute semi-alergând. Au rezultat imediat planuri mari de alergat pe poteci și am început să-mi caut pantofi de trail running cât mai bine amortizați (vedeți mai jos motivul). După o scurtă cercetare m-am fixat pe La Sportiva Akasha și a urmat o întreagă saga de probat / cerut număr mai mare / probat iar / cerut iar număr mai mare cu care probabil am disperat-o pe amica de la magazinul local de articole pentru montaniarzi, dar ce să-i faci, am degetul mare de la picior drept mai special, atingeam cu unghia tavanul pantofului și era super incomod. Până la urma nu am luat La Sportiva ci am întrebat pe Reddit de alternative, am mers și am probat mai multe mărci în Intersport și în final am comandat aproximativ orbește de pe Internet o pereche de Nike Wildhorse 4 care s-au dovedit a-mi fi buni. Până atunci am alergat cu perechea de Puma care mi-i luasem prin 2014.

Am ușoare probleme la genunchiul drept, l-am verificat la doctor și aparent e totul OK dar tot mă incomodează când îl țin îndoit - adică aproape toată ziua cât stau la serviciu pe scaun. Eu cred că mi l-am stricat cu mulți ani de dat pe snowboard într-o poziție incorectă și cu echipament uzat, dar din păcate nu mai pot da timpul înapoi să repar greșeala. Dar pot și trebuie să-mi dozez efortul dacă nu vreau să-mi fie agonizantă recuperarea.

Am alergat la început intervale (ceea ce înseamnă câteva minute de alergare efectivă urmate de câteva minute de pas mai mult sau mai puțin alert) și apoi dintr-un punct am încercat să alerg fără să mai revin la pas. Întâi mi-au ieșit 3 kilometri, apoi 4 și apoi am făcut pasul cel mare la cei 5 km “standard” care, sincer să fiu, deocamdată îi resimt destul de bine și mai am de “lucrat” până să devin comfortabil cu această distanță și să încerc s-o cresc din nou.

Calendarul animat al alergărilor mele

Și uite așa m-am trezit că am alergat cu sfințenie în fiecare luni, miercuri și vineri pe tot parcursul lunii iunie. Am realizat destul de rapid că-mi place să alerg minimalist, adică fără să duc cu mine telefonul sau alte zorzoane. Dacă alerg pe pista sintetică din parc îmi lipsește câteodată muzica care ar ajuta la a-mi păcăli creierul să nu mai fie atent la cât mai am de tras. Dar momentan alerg doar cu ceasul, câteodata cureaua de ritm cardiac și cheile de la mașină în buzunarul din spate al pantalonilor (legate fedeleș cu gume de păr să nu zdrăngăne).

Recent am făcut și upgrade la ceas la un Garmin Forerunner 235, ceea ce nu a fost neapărat necesar dar la mine un gadget nou mai adaugă la motivație. Ăsta are deja senzor de ritm cardiac integrat, nu mai e neapărat necesar să iau cureaua anterior menționată cu mine, un ecran mai mare și mai ușor de citit când mi-s ochii cețoși de la efort, precizie mai bună, sincronizare prin Bluetooth și mai multe alte facilități care încă nu le-am descoperit pe deplin. Am citit mai de mult un review sau comentariu în care Forerunner 15 (ceasul anterior) a fost numit “plastic landfill” dar eu zic că m-a servit excelent și sper să-l servească la fel de bine și pe următorul proprietar. Cât despre ceasul curent, cu puțină grijă, prevăd că mă va ține mult și bine…

Ar mai trebui să ating aici subiectul controversat al publicării activităților pe Strava că sunt unii care au zis că Strava și aplicațiile asemănătoare au omorât partea distractivă a sporturilor. Ei bine, în primul rând, eu nu alerg să mă distrez, alerg să mă simt bine după aia și îmi place: 1. să am un jurnal al activităților 2. să pot să-mi urmăresc eventuala îmbunătățire a performanțelor. Binențeles că e inevitabil să mă compar cu alții, dar țin mereu minte că eu de abia am început. Poate că la bicicletă scade factorul de distracție dacă tu mergi cu planul de a te da lejer și cineva din gașcă trage tare să obțină recorduri personale dar alergarea din câte am văzut până acum e o activitate destul de solitară… Nu cred că supăr pe nimeni dacă atunci când mă duc singur decid să trag mai tare.

Pentru încheiere iată o anecdotă legată de János și relația lui cu sporturile de enduranță: în școala generală și liceu nu eram cunoscut ca un mare sportiv, din contră, sprinturile îmi ieșeau catastrofal, la fotbal nu participam aproape niciodată că mă împiedicam în propriile picioare, la baschet îmi dădea mingea în cap… De plictiseală cândva în clasa a XI-a sau a XII-a am tot mers cu bicicleta până am reușit să fac de 2 ori Gutinul, adică din Baia Sprie pe ceea ce numim serpentine, până la Hanul Pintea. Menționez că nu aveam bicicletă cu viteze ci doar un Pegas simplu pentru adulți care era pe-deasupra și pentru dame. A urmat alergarea de rezistență și țin minte că mi-am zis s-o iau încet să nu obosesc căci în anii anteriori a fost o agonie respectiva probă. Și alergând eu așa lejer m-am trezit cu o jumate de lungime teren în avans față de restul și am câștigat detașat spre mirarea colegilor, a profesorului de educație fizică și mai ales a mea. :-)

Baia Sprie văzută din dronă

Doamnelor, domnișoarelor și domnilor, probabil cea mai reușită mini-panoramă de-a mea:

Mini panoramă cu orașul Baia Sprie

De fapt acest articol este deznodământul “trilogiei” Baia Sprie văzută din dronă iarna, începută destul de stângaci prin ‘Imagini aeriene de final de an’ și continuată mai reușit prin ‘Lacul Albastru văzut din dronă’ în care speram că va exista o “dată viitoare” pentru un set cu orașul Baia Sprie în sine.

Am încercat să mă conformez în 11 februarie dar vremea nu a ținut cu mine: am pornit pe soare din Baia Mare dar până am ajuns la Baia Sprie s-a înorat urât și nu prea am mai avut chef să decolez. Chiar dacă am făcut-o până la urmă la insistențele Ioanei nu mi-a ieșit panorama dorită. Dar nu a fost complet pierdută ieșirea căci am continuat pe munte unde am combinat o plimbare de duminică cu un zbor de explorare. Am filmat și fotografiat în jurul gurii de aerisire numite Poni de pe Dealul Minei și după câte se poate vedea, chiar dacă nu a plouat vremea a fost mohorâtă rău. De fapt, vreme tipică de februarie.

Apoi nu am mai reușit să zbor o vreme, ori fiind vremea nasoală ori fiind eu prins cu alte treburi dar până la urmă la începutul lui martie a venit weekend-ul cu zăpada surpriză (vineri, 2 martie, a nins aproape continuu). Am profitat imediat sâmbăta explorând cu prietenii rute de pădure pe snowboard iar duminică am fost la Baia Sprie unde am zburat din belșug iar rezultatele sunt vizibile mai jos (și în poza care deschide articolul).

Ceva ce doream să fac este o poză cu centrul de la mare înălțime (cca 300 de metri de la locul decolării):

Centrul Baia Sprie

Am avut niște emoții la aterizare, fiindcă drona coboară destul de încet și mă uitam obsesiv la cum scădea nivelul bateriei în timp ce drona abia se târa în jos din cer… Dar până la urma a fost bine.

Am făcut binențeles și panorama necesară și suficientă (din nou, cei care mă citiți prin feed, dați un click):

Exact ca și data trecută voi pun modestia la o parte și voi spune că mi se pare că a ieșit foarte bine. Am reușit iarăși să creez un material la care mă pot uita minute în șir să recunosc locurile unde am trăit 20 de ani…

După ce s-a topit zăpada tot peisajul a dat într-un gri depresiv și din cauza asta ziceam că momentan trilogia se încheie, dar voi reveni probabil cu material după zborurile de primăvară / vară. A da, și probabil voi face și cu “cartierul” (zona de vest a orașului) că am avut cereri. :)

Cryptobolunzenia

O imagine cu monede cu logo-ul Bitcoin peste ele

Cei care nu știu ce însemnă bolund să arunce o privire în DEX. De fapt am să vă spun eu ca să vă scutesc de un click: înseamnă nebun. E destul de ușor de dedus că bolunzenie înseamnă nebunie.

Iar dacă lucrați în IT sau aveți cunoștințe care-s pe val cu ce se întâmplă în lumea tehnologiei inevitabil ați auzit în ultimea perioadă cuvântul magic: Bitcoin! Dacă v-am tradus bolund am să vă traduc și Bitcoin: înseamnă “cum să te îmbogățești rapid, ediția 2018”.

Și de ce am denumit însemnarea așa? În afară de dorința de a inventa un cuvânt nou, fiindcă am auzit recent un coleg de la lucru zicând: “da, am cumpărat ceva Bitcoin, nu mult, de 1000 de euro”. Nu știu alții cum sunt dar mie mi se par cam mult de riscat 1000 de euro investindu-i în ceva atât de volatil ca și criptomonedele. Însă se pare că în ultima vreme mulți au căzut pradă acestei “nebunii”.

Dar stați, nu mă judecați, nu sunt eu anti-criptomonede, ca de obicei încerc să mă mențin undeva la mijloc, ascultând și documentându-mă cu argumentele ambilor părți.

Să le luăm pe rând. În mod evident nu sunt economist, dar am să vă spun de ce cred eu că au valoare:

  • Primesc ceva valoare din conversia curentului și a hardware-ului care trebuie să fie cumpărat să se poată mina / produce. Mi se șoptește în cască cum că acest argument nu ar fi valid, dar când am început să mă gândesc inițial cam la asta m-a dus pe mine mintea.
  • Există (mai corect: va exista) o cantitate finită corelată cu cererea, care este momentan foarte mare.
  • De fapt se bazează pe o înțelegere: societatea se poate înțelege despre un anumit lucru și să-i acorde acelui lucru valoare. Un exemplu ar fi colecționabilele de genul cartonașelor cu jucători de baseball (îmi pare rău dar nu mi-a venit în minte niciun echivalent românesc). Sunt practic niște bucăți de hârtie, îți poți tipări oricând ceva identic sau foarte apropiat, dar oamenii s-au înțeles că ele au valoare și uite așa se vând cu mii de dolari bucata. De fapt nici banii obișnuiți nu sunt departe de conceptul acesta și din câte am citit au fost destui sceptici în momentul adoptării bancnotelor - dar în ziua de azi nu cred că se mai întreabă nimeni de valoarea unei bucăți de hârtie cu Eminescu pe ea.

Pe de altă parte există bule și chestii disruptive. Bulele se întâmplă atunci când din varii motive ceva capătă valoare supraestimată. O chestie disruptivă este ceva care se bagă în cursul normal al lucrurilor și-l “strică” (nu neapărat la modul rău). Un exemplu de serviciu disruptiv al zilelor noastre poate fi Uber - a se vedea cât sunt de supărați taximetriștii pe ei. Ei bine, eu am impresia că Bitcoin-ul este acum o combinație între aceste două fenomene: pentru moment este sus pe val, mult supraevaluat și mai mult ca sigur va cădea dar nu va dispărea, și probabil că pe viitor ne vom obișnui că pe lângă banii propriu ziși îi vom avea și pe cei “virtuali”. Și cu toate că există și vor mai apărea multe criptomonede alternative eu cred că Bitcoin va rămâne mult timp etalonul.

De ce nu-mi place fenomenul? Păi se revoltă geek-ul din mine pentru că a existat o perioadă relativ recent când puteai să-ți faci un PC destul de puternic fără să cheltui o avere fiindcă lumea prefera să dea banii pe telefoane deștepte, tablete sau laptop-uri. Acum din cauza “minerilor” nu prea mai găsești componente performante, mai ales la capitolul plăci video și surse puternice unde suflă vântul prin stocuri. Și chiar dacă ar exista stocuri, din cauza cererii groase prețurile sunt mult prea umflate.

Un alt lucru care mă enervează tare sunt eu. Adică de ce nu m-am băgat când trebuia!? De fapt m-am băgat, dar nu am stat. Nu se înțelege? Să trecem la un mic istoric al lui “Janos și criptomondele”.

Primul contact l-am avut prin 2012 când citind despre Silk Road am aflat că acolo băieții răi plătesc pentru “marfă” cu Bitcoin. Și curios fiind, m-am uitat eu cam cu ce s-ar mânca acest Bitcoin, dar recunosc că nici nu am prea înțeles cum funcționează și nici nu am dat peste un ghid de minat “pentru to(n)ți”. În consecință am lăsat-o baltă până mai spre finalul lui 2014 când mi s-a resuscitat interesul, în acel moment fiind deja disponibile criptomonedele alternative. Eu având pe atunci un server dedicat pentru care plăteam un abonament lunar și care stătea în mare parte nefolosit m-am documentat ce criptmonedă aș poate mina cu procesorul și am găsit Primecoin. Am instalat softul de minat și i-am dat drumul, mai mult să nu stea respectiva mașină degeaba. Prin ceva coincidență și noroc enorm în câteva ore am reușit să minez primul bloc pentru care am primit răsplată un anumit număr de prime coins. Apoi cam în aceași perioadă i-am trimis cuiva o invitație pentru editorul Atom proaspăt lansat și respectivul, fiind foarte generos, mi-a trimis niște Dogecoin (o criptomonedă lansată la mișto) mai mult sau mai puțin în glumă. Atât Primecoin cât și Dogecoin din dotare i-am convertit în Bitcoin și am constatat că aveau ceva valoare. Mi-au ajuns să cumpăr două bundle-uri de la Humble Bundle: primul, niște mese pentru un joc de pinball, pentru care am dat 0.01582433 BTC (atunci $6.01) și al doilea, niște benzi desenate cu Archie pentru 0.0287556 BTC (atunci $6.20). Mi-a mai rămas ceva mărunțis care i-am ținut în portmoneul virtual, mărunțiș care valorează acum peste 60 de lei. Iar valoarea sumei inițiale care am deținut-o (0.04639 BTC) ar fi acum pe la 340 de Euro… Binențeles că îmi smulg părul din cap de ce i-am cheltuit atunci, dar asta e.

De aici trag concluzia că poate percepția mea e complet eronată și poate fi super greșit tot ceea ce ați citit mai sus. De fapt nevastă-mea a zis a zis că noi cam repetăm greșelile părinților noștri și a dat ca asemănare Caritasul… Știu că nu se poate compara Caritasul cu Bitcoin, dar asemănarea este că nici părinții nu s-au băgat când trebuia ci doar la final, când binențeles că au pierdut banii.

Cam atât despre smulsul părului (care nu-l am) din cap. Planuri mărețe de viitor:

Minez și acum, Monero, o moneda destul de controversată din cauza minerului JavaScript denumit Coinhive care se poate instala pe un site și care profită de puterea de calcul a vizitatorilor. În mare parte din timp fără știrea lor… Nu recurg la așa ceva, minez tot așa, pe serverul închiriat și câteodata îi mai dau un bobârnac cu calculatorul de acasă, mult mai puternic, dar care nu vreau să-l storc de vlagă minând cu el. Îndată ce voi mina cantitatea minimă și îmi voi primi cei 0.3 Monero îi voi transforma în Bitcoin care îi voi ține până la următoarea bulă. Că nu prea sunt eu genul care să stea toata ziua cu ochii în graficele burselor cripto, mai bine scriu articole de mare valoare ca acesta.

Vă voi lăsă parafrazând o vorbă înțeleaptă din popor: vom trăi și vom mina.

Poză din antet a fost luată de pe Flickr. Că eu nu am fost în stare să fac o poză asemănătoare tot weekend-ul și azi deja mă ardea lumânarea pe deget să public articolul că la cum pică Bitcoin devenea din ce în ce mai irelevant cu trecerea fiecărei zile…

Lacul Albastru văzut din dronă

Când am publicat însemnarea cu pozele aeriene din Baia Sprie mi-am promis că voi reveni să le refac și în varianta cu zăpadă. Așa că astăzi iar mi-am prelungit pauza de masă, iar am ușchit-o la Baia Sprie și iar am zburat cu drona. De data asta nu mi-am mai stabilit baza în curte ci am urcat cu mașina cât am putut apoi aproape că am alergat până la lac de unde am decolat și am zburat mult mai relaxat având timp să încadrez mai bine pozele și filmările.

Rezultate:

Lacul Albastru iarna văzut din dronă

Această primă poză am ales-o la sugestia Ioanei căci în colțul stânga sus vede turnul combinatului din Baia Mare care dă un context peisajului, nu mai e un lac oarecare, ci e lacul acela de lângă Baia Mare. În poză se mai văd câteva locuri de care mă leagă amintiri dragi: gura de aerisire a minei unde asistam la meciuri epice de tuberman, ruinele cetății (de fapt ale unei anexe de mină) unde s-au tras niște chefuri, câmpia unde am început să mă dau cu snowboard-ul și unde mergeam la tradiționalul grătar de 1 mai…

Lacul Albastru iarna văzut din dronă

Lacul Albastru iarna văzut din dronă

Două poze făcute la sugestia mai multor persoane în stil top-down, adică cu camera îndreptată drept în jos. În ambele e vizibil János și ghiozdanul lui într-un colț al lacului.

Și acum partea multimedia (acei doi inși care mă citiți prin feed, merită să dați click!):

Un survol lejer al lacului tot cu camera îndreptată în jos.

Și în final ceea pentru ce m-am dus de fapt, o panoramă interactivă:

Voi pune modestia la o parte și voi spune că sunt încântat de cum a ieșit. Vă recomand să vă uitați drept în jos. :-)

Din păcate prima baterie mi-am consumat-o cu poze, încadrări și zburat hai-hui iar a doua cu panorama așa că nu am mai putut reface poza cu orașul în straie de iarnă. Dar mereu există o data viitoare. (Sper să țină și zăpada.)

Use Travis to build and deploy your Jekyll site through SSH

An image of bricks with the Jekyll, GitHub and Travis logos on it

After transitioning my blog to Jekyll my next goal was to have the site built and deployed via an external service which is automatically triggered by pushing to a certain GitHub branch (in my case master).

I achieved this a few years ago by using DeployBot but their free plan only supports the deployment of one site and it wasn’t ideal anyway because I had to run the build on my end, so I started researching how can this be done with one of the continuous integration services out there which support unlimited open source builds.

While searching around I found plenty of articles dealing with deploying to GitHub pages (this looks to be the most popular scenario) but only a handful about deploying to your own server. This motivated me to document my solution, so that if I happen to change the hosting I don’t have to figure out everything again and maybe also help others who stumble upon this article.

I choose Travis as the CI service because I’ve used it for jekyll_asset_pipeline and some other open source side projects I’m working on.

Build

Building a piece of software usually consists of the build part itself followed by automated testing. The actual build part in Jekyll’s case is straight forward, the command is even called jekyll build, but I was wondering about the second part: as opposed to an application what can you test on a static site? The answer came as html-proofer which checks your site’s HTML files for the correctness of local and outbound links, image references, the presence of alt tags on the images, etc.

Continuous integration of a Jekyll site with Travis is documented on the official site so I will only describe what I changed.

I decided to run html-proofer through rake instead of a stand alone command so I could add configuration more easily. My Rakefile looks like this:

require 'html-proofer'
task :test do
  options = {
    disable_external: true,
    url_ignore: [
      '/feed/'
    ]
  }
  HTMLProofer.check_directory("./_site/", options).run
end

I disabled the checking of external links because this blog has some ancient content with links that died a long time ago. The /feed/ directory is redirected from the vhost config so I set that to be ignored.

Try it out by running rake test (after running jekyll build of course). Does it pass? Great! It doesn’t? Get editing!

At this point my .travis.yml read:

language: ruby
rvm:
- 2.4
env:
  global:
  - NOKOGIRI_USE_SYSTEM_LIBRARIES=true # speeds up installation of html-proofer
branches:
  only:
  - master
script:
  - bundle exec jekyll build
  - bundle exec rake test

I’d say it’s pretty self explanatory. The one line that isn’t comes with a comment.

Don’t forget to add rake and html-proofer to your Gemfile to be able to run the build on Travis. Also don’t forget to add vendor to your exclude: list in Jekyll’s _config.yml or else all hell will break loose. I warned you.

After pushing to the master branch on GitHub the project should successfully build on Travis.

Deploy

On to the deploy part which is based on this article.

In this step we’ll be deploying the _site directory which we generated during the previous step to our hosting server through a secure SSH connection. To be able to do this we’ll need to generate an RSA key pair, add the public key as trusted to our hosting server and give Travis the private key. Wait, what? But how do we protect it from the public eye? Never fear, Travis provides us with the means to encrypt it, by using the travis utility which has to be installed to the local machine by running gem install travis.

Let’s get to work!

First of all it is recommended to create a separate deploy user on the hosting server and set the directory which the site is served from to be writable by this user. Then generate the RSA keypair by running the following command in the project’s directory on the local machine:

$ ssh-keygen -t rsa -b 4096 -C 'build@travis-ci.org' -f ./deploy_rsa

This results in deploy_rsa and deploy_rsa.pub, the private and public keys respectively. Whatever you do, don’t check these into your site’s git repository and don’t build your site while they’re sitting there. We’ll delete them soon.

Now encrypt the private key:

$ travis encrypt-file deploy_rsa --add

If this is the first time you’re running the travis utility you will get:

not logged in - try running travis login --org

Which should be done in order to associate the Travis build with this directory and make our life easier in the future.

But what happened? The utility created a deploy_rsa.enc (an encrypted version of the private key), with a decryption key that it stored as an environment variable on Travis and also added some lines to the .travis.yml file which will decrypt the private key file during the build.

Now add the public key to the list of accepted keys on the hosting server:

$ ssh-copy-id -i deploy_rsa.pub <ssh-user>@<deploy-host>

The unencrypted private key as well as the public key can now be deleted from the local machine:

$ rm -f deploy_rsa deploy_rsa.pub

Once this is done the previous no-check-in / no-build ban is lifted so add deploy_rsa.enc to the git repository.

Now edit .travis.yml and move the decryption line from the script: section to the before_deploy: section and modify as follows:

before_deploy:
- openssl aes-256-cbc -K $encrypted_<...>_key -iv $encrypted_<...>_iv
  -in deploy_rsa.enc -out /tmp/deploy_rsa -d
- eval "$(ssh-agent -s)"
- chmod 600 /tmp/deploy\_rsa
- ssh-add /tmp/deploy\_rsa

This ensures that before the deploy is done the private key is decrypted and loaded into memory.

What’s left to do is the deployment itself. This will be done with rsync and we want to keep the deployment host, user and directory secret because we don’t want script kiddies sniffing around our hosting server now, do we?

Run these on the local machine in the project directory:

$ travis encrypt DEPLOY_DIRECTORY=<deploy directory> --add
$ travis encrypt DEPLOY_HOST=<deploy host> --add
$ travis encrypt DEPLOY_USER=<deploy user> --add

These will add three lines starting with - secure to the env.global: section of .travis.yml. Add the following to the before_deploy: section of the same file:

- echo -e "Host $DEPLOY_HOST\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config

This ensures that the deploy process doesn’t hang waiting for user input.

And now for the grand finale! Add to the end of .travis.yml:

deploy:
  provider: script
  skip_cleanup: true
  script: rsync -r --quiet --delete-after _site/* $DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_DIRECTORY
  on:
    branch: master

skip_cleanup ensures that the result of the build is not deleted before we transfer it. --delete-after’s effect is that it will clean the directory on the hosting server before uploading the freshly built site so that there are no left overs or forgotten files.

The final version of my .travis.yml file looks something like this:

language: ruby
rvm:
- 2.4
env:
  global:
  - NOKOGIRI_USE_SYSTEM_LIBRARIES=true
  - secure: <secure $DEPLOY_USER>=
  - secure: <secure $DEPLOY_HOST>=
  - secure: <secure $DEPLOY_DIRECTORY>=
branches:
  only:
  - master
script:
- bundle exec jekyll build
- bundle exec rake test
before_deploy:
- openssl aes-256-cbc -K $encrypted_<stuff>_key -iv $encrypted_<stuff>_iv
  -in ./deploy_rsa.enc -out /tmp/deploy_rsa -d
- eval "$(ssh-agent -s)"
- chmod 600 /tmp/deploy_rsa
- ssh-add /tmp/deploy_rsa
- echo -e
  "Host $DEPLOY_HOST\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
deploy:
  provider: script
  skip_cleanup: true
  script: rsync -r --quiet --delete-after _site/*
    $DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_DIRECTORY
  on:
    branch: master

And with this we’re done! Push to the master branch on GitHub and sit back and relax while your site is automagically deployed by Jenkins. Well, possibly it won’t happen on the first try, but hey, once it does I guarantee an overwhelming feeling of satisfaction for the nerd inside you.

As an additional note, when I’m proof reading my site and making small changes to many files by multiple commits through the GitHub web interface I usually add [ci skip] to the commit messages so that I don’t overwhelm Travis. They’re giving me something for free and I tend to respect that by not abusing their service.

Header image by Alan Levine, found on Flickr.