Τα τελευταία χρόνια παρατηρείται μια ραγδαία ανάπτυξη στο τομέα των υπηρεσιών νέφους(cloud computing) η οποία προκάλεσε το ενδιαφέρον πολλών επιχειρήσεων, με τη ζήτησή τους να αυξάνεται συνεχώς όπως επίσης και ο αριθμός των παρόχων που προσφέρουν αυτές τις υπηρεσίες. Όμως, παρά το ότι έχει εδραιωθεί η χρήση του cloud computing προσφέροντας πολλά πλεονεκτήματα, ανακύπτουν και διάφορες προκλήσεις, όπως η ασφάλεια των δεδομένων. Βασικό στοιχείο της διαδικασίας ανάπτυξης λογισμικού αποτελεί η συχνή πραγματοποίηση ελέγχων (tests) στην εφαρμογή, που αποσκοπεί στην διασφάλιση της ποιότητας, και την ελαχιστοποίηση των σφαλμάτων (bugs) , κάτι που επιτυγχάνεται μέσω των συστημάτων συνεχούς ενσωμάτωσης (Continuous Integration, CI). Μετά την επιτυχημένη εκτέλεση των αυτοματοποιημένων ελέγχων, το CI αποστέλλει και εκτελεί την τελευταία έκδοση του κώδικα στο δοκιμαστικό (staging) ή στο τελικό (production) περιβάλλον αυτόματα μέσω των συστημάτων Continuous Deployment (CD) και Continuous Delivery (CDE). Ο σκοπός της παρούσας εργασίας είναι η σύγκριση των παρόχων cloud, και ακολούθως η ανάπτυξη μιας μεθοδολογίας, μέσω της οποίας να απλοποιείται η χρήση ενός συστήματος CI + CD/CDE. Η προσέγγισή μας ενσωματώνει επίσης στατική ανάλυση και αξιολόγηση ποιότητας κώδικα. Η υλοποίηση του CI καθώς και των διαδικασιών CD/CDE γίνονται μέσω του διαδικτυακού εργαλείου ανοιχτού κώδικα Gitlab, όπου γίνεται χρήση έτοιμων pipelines με υποστήριξη εφαρμογών Node.js και Django, ενώ η στατική ανάλυση πραγματοποιείται μέσω του Code Quality που υπάρχει ενσωματωμένο στο Gitlab και βασίζεται στο εργαλείο Code Climate. Η αυτοματοποίηση της εγκατάστασης των προαπαιτούμενων για το deployment της εφαρμογής,δηλαδή η προετοιμασία του server, και το πρώτο deployment , πραγματοποιoύνται μέσω του εργαλείου διαχείρισης διαμόρφωσης λογισμικού Ansible. Ακόμη, δίνεται η δυνατότητα στο χρήστη για deployment της εφαρμογής στη cloud πλατφόρμα Heroku χωρίς να χρειάζεται η χρήση του Ansible. Το προϊόν της εργασίας απευθύνεται κυρίως σε φοιτητές ή προγραμματιστές με μικρή εμπειρία οι οποίοι θέλουν να ασχοληθούν και να κάνουν τα πρώτα τους βήματα με το CI του Gitlab.
4. Continuous Integration (CI)
Συχνή συγχώνευση κώδικα (merging)
Αυτοματοποιημένοι έλεγχοι
Λειτουργικό προϊόν σε κάθε συγχώνευση
Προσθήκη λειτουργιών σε κάθε έκδοση
5. Πλεονεκτήματα του CI
Γρήγορη εύρεση και ελαχιστοποίηση σφαλμάτων κώδικα (bugs)
Ελαχιστοποίηση και αποφυγή προβλημάτων ενσωμάτωσης
Προβλήματα συγχώνευσης (merge conflicts)
Ασυμβατότητα στοιχείων εφαρμογής
Γρηγορότερη ανάπτυξη ποιοτικού και αξιόπιστου λογισμικού
Υψηλή απόδοση και μείωση κόστους
6. Σκοπός της Διπλωματικής
Απλοποίηση χρήσης ενός συστημάτος CI
Χρήση εύκολα παραμετροποιήσιμων προτύπων(templates) pipelines
Αυτόματη μεταφορά εφαρμογής σε δοκιμαστικό (staging) περιβάλλον
Δυνατότητα αυτόματης ενημέρωσης στο τελικό(production) περιβάλλον
Δυνατότητα επιλογής deployment στη cloud πλατφόρμα Heroku
Δυνατότητα επιλογής deployment σε remote server/virtual machine
Yποστήριξη web εφαρμογών Node.js και Django
Διευκόλυνση εκμάθησης διαδικασίας CI
Απευθύνεται σε φοιτητές και προγραμματιστές με μικρή εμπειρία
9. Συστήματα CI (1/2)
Έναρξη pipeline αυτόματα μετά από merge/commit
Μεταγλώττιση(complile)
Αυτόματοι Έλεγχοι (tests)
Unit tests
API tests
Deploy
Local CIs
CI-as-a-Service (cloud based)
10. Συστήματα CI (2/2)
Local CI
Jenkins CI
- Open και Closed source έργα
- Πληθώρα Plugins
- Μεγάλη Υποστήριξη
- Δωρεάν
CI-as-a-Service
Travis CI
-Δημοφιλές cloud based CI
-Χρήση μέσω Github
Circle CI
-Συνεργασία με Github , BitBucket
-Υποστήριξη λιγότερων γλωσσών από το Travis
Gitlab CI
-Kώδικας και υλοποίηση μαζί ενσωματωμένα
-Γλώσσα Yaml
Github Actions
-Δημοφιλές-Μεγάλη κοινότητα
-Github hosted / Self-hosted εκδόσεις
11. Επιλογή Συστήματος CI
Πλεονεκτήματα Gitlab και Github
Κώδικας και υλοποίηση μαζί ενσωματωμένα
Διευκόλυνση διαδικασίας CI + CD/CDE
Mικρές διαφορές μεταξύ Gitlab CI και Github Actions
Επιλογή Gitlab CI
13. Continuous Deployment (CD)
Continuous Delivery (CDE) (1/2)
Επέκταση του CI
Εγκατάσταση νέας έκδοσης κώδικα στο επιθυμητό
περιβάλλον(staging/production) μετά την επιτυχία των βημάτων CI
Αυτόματη εκτέλεση CD
Αποδοχή χρήστη-χειροκίνητη εκτέλεση CDE
14. Continuous Deployment (CD)
Continuous Delivery (CDE) (2/2)
Στην παρούσα εργασία
Χρήση CD για εγκατάσταση κώδικα στο staging περιβάλλον
Χρήση CDE για εγκατάσταση κώδικα στο production περιβάλλον
Χρήση Gitlab και κάποιου εργαλείου διαχείρισης διαμόρφωσης
λογισμικού (software configuration management, scm) για υλοποίηση
των CD/CDE σε εικονικές μηχανές (virtual machines)
Πρώτο deployment με χρήση του εργαλείου scm και μετά μέσω Gitlab
15. Εργαλεία Software Configuration
Management (1/3)
Καταγραφή αλλαγών σε έναν server
Εγκατάσταση πακέτων
Ρύθμιση υπηρεσιών,παραμέτρων συστήματος
Εγκατάσταση κώδικα κ.α
Στόχος η επαναπραγματοποίηση των αλλαγών σε άλλους servers
Ευρέως χρησιμοποιούμενα εργαλεία:
Ansible
Puppet
Chef
16. Εργαλεία Software Configuration
Management (2/3)
Ansible
Playbooks σε YAML γλώσσα
Επικοινωνία μέσω SSH και χρήση χωρίς πράκτορα (agentless)
Γραμμένο σε Python
Puppet
Manifests σε Domain Specific Language (DSL)
Eπικοινωνία με HTTPS και απαιτείται πράκτορας
Γραμμένο σε Ruby
Chef
Cookbooks σε Domain Specific Language (DSL) ή Ruby
Απαιτείται πράκτορας
Γραμμένο σε Ruby και Erlang
17. Εργαλεία Software Configuration
Management (3/3)
Επιλογή Ansible
Αρχιτεκτονική χωρίς χρήση πράκτορα
Εξοικονόμηση πόρων
Ασφάλεια
Άμεση χρήση
Προϋποθέσεις: SSH, Python
Η γλώσσα YAML είναι απλή και εύκολη στην εκμάθηση
Πολλά modules/plugins , αυτοματοποίηση κάθε λειτουργίας
20. Στάδια CI + CD/CDE Pipeline (1/3)
Preparation
Εκτελείται αυτόματα από το Gitlab
Έναρξη Docker executor
Εγκατάσταση docker images(node.js ή django, services mysql,postgres)
Προετοιμασία περιβάλλοντος για την εφαρμογή
21. Στάδια CI + CD/CDE Pipeline (2/3)
Test / Code Quality
Εγκατάσταση απαραίτητων πακέτων για τους ελέγχους της εφαρμογής
Εκτέλεση Unit tests
Εκτέλεση API tests
Αποθήκευση test coverage
Στατική ανάλυση κώδικα
Δημιουργία αρχείου σφαλμάτων (bugs)
22. Στάδια CI + CD/CDE Pipeline (3/3)
Staging deploy
deploy_cloud_staging: Χρήση Heroku για deployment στο staging περιβάλλον
deploy_server_staging: Χρήση Gitlab/Ansible για deployment στον staging server
Production deploy approval
Χειροκίνητη εκκίνηση των jobs στο στάδιο Production deploy από τον χρήστη
Production deploy
deploy_cloud_prod: Χρήση Heroku για deployment στο production περιβάλλον
deploy_server_prod: Χρήση Gitlab/Ansible για deployment στον production server
25. Webapp δημιουργίας αρχείου μεταβλητών
App_name: Όνομα εφαρμογής
Αpp_type: Node.js ή Django
Repo_url: App repo στο Gitlab για
αντιγραφή στον remote server
DB_type: MySQL ή PostgreSQL
DB_password/DB_username/DB_na
me: Κωδικός / Όνομα χρήστη /’Ονομα
βάσης δεδομένων
1) Κατέβασμα ως αρχείο deploy-app-
vars.yml
2) Μετακίνηση αρχείου στο directory
gitlab-reusable-pipelines/Ansible
26. Δημιουργία μεταβλητών στο Gitlab
Settings→CI/CD→ Variables
SSH keys των servers για σύνδεση του
Giltab
Heroku API keys για deployment στο
Heroku
Oνόματα εφαρμογών στο Heroku
Στοιχεία εφαρμογής,χρήστη,βάσης
δεδομένων
Επιλογή τύπου βάσης δεδομένων
Επιλογή για deployment στο Heroku ή
server
27. Δημιουργία αρχείου .gitlab-ci.yml
CI/CD→ Editor→ Create new CI/CD pipeline
Include nodejs-pipeline.yml για εφαρμογή Node.js
Include django-pipeline.yml για εφαρμογή Django
Copy/Paste το περιεχόμενο του αρχείου για τυχόν προσθήκες στο
pipeline από τον χρήστη αντί include
28. Aποτελέσματα (1/4)
Επιτυχής ολοκλήρωση όλων
των σταδίων του pipeline για
την εφαρμογή “Todo App
Create App”
Αρχείο gl-code-quality-
report.json με τα bugs
που περιλαμβάνει ο
κώδικας
33. Συμπεράσματα
Απλοποιημένη και εύκολα κατανοητή διαδικασία
Διευκόλυνση εκμάθησης και χρήσης συστημάτων CI + CD/CDE
Συμβατότητα αρχιτεκτονικής με υποδομές cloud, δοκιμή σε Azure
Δεν είναι εφικτή η πλήρης αυτοματοποίηση των βημάτων της
διαδικασίας
35. Μελλοντική Εργασία
Υποστήριξη περισσότερων τύπων εφαρμογών πέρα από Node.js και
Django
Υποστήριξη και άλλων τύπων βάσεων δεδομένων πέρα από MySQL
και PostgreSQL
Προσθήκη λειτουργιών
Αυτοματοποίηση των βημάτων της διαδικασίας ακόμα περισσότερο