Come sfruttare l’on demand di AWS per un server di CI

server CI

Ognuno di noi certamente conoscerà diversi SaaS di Continuous Integration, pensiamo ad esempio a TravisCI, CircleCI o ParallelCI.

Questi servizi richiedono un canone mensile: per TravisCI, parliamo di circa 100$ al mese per sole due build concorrenti, senza considerare che l’utente non ha controllo (o almeno non subito) direttamente degli host verso cui vengono lanciate le build.
Inoltre l’utente è spesso limitato dalle versioni possibili da installare dei vari servizi conosciuti (PHP. Elasticsearch, MongoDB…) o da policy particolarmente stringenti.

Come è possibile ridurre i costi del nostro sistema di Continuous Integration acquisendo maggior potenza computazionale e personalizzando a proprio piacimento le build?

La risposta può essere data dalle istanze on-demand di Amazon Web Services.

Le istanze on demand, sono rappresentate dalla classica caratteristica del Cloud Computing in cui un utente può acquisire capacità computazionale pagando solo per l’effettiva capacità consumata senza impegni a lungo termine o pagamenti anticipati.
Considerando un’ istanza performante quale una c4 xlarge:

server ci

sfruttandola solo in orario lavorativo, dal Lunedì al Venerdì dalle 9 alle 18 per un totale di 180 ore, il costo si ridurrebbe da 138€ a 32€ al mese.

Le attività giornaliere legate alla creazione e alla distruzione della macchina però potrebbero non risultare convenienti se svolte manualmente.
Per automatizzare il processo è possibile utilizzare uno dei due strumenti:  Rundeck, strumento con interfaccia web ancora poco matura, le AWS CLI combinate ai cron classici che conosciamo tutti.

Di seguito troverai una possibile implementazione dei cronjob che sfruttano le AWS CLI per automatizzare la creazione e la dismissione dell’istanza del server di Continuous Integration.

https://gist.github.com/alemazz/c9bc5d753d590f2ccd8b
https://gist.github.com/alemazz/69beae9129faf60bd29a
https://gist.github.com/alemazz/02a1cff134b91fca6c58

Un’obiezione che ti potresti porre è “TravisCI mi permette di eseguire i test rispetto diverse versioni dei miei componenti software, un esempio possono esserlo le diverse versioni di PHP. Come può una singola istanza risolvermi questo problema?

Ti lascio una breve presentazione che ti fornirà una possibile risposta a quest’ultima domanda, integrando Docker su JenkinsCI.

Qui anche il video della nostra #ideatopills!