Ενέργειες GitHub ως CI/CD για Ιστότοπο Στατικής Γεννήτριας και Σελίδες GitHub

Ενέργειες GitHub ως CI/CD για Ιστότοπο Στατικής Γεννήτριας και Σελίδες GitHub

Έχοντας ψάξει λίγο το Habr, εξεπλάγην που έχουν δημοσιευτεί πολύ λίγα άρθρα σχετικά με το θέμα της λειτουργίας (beta) του GitHub - Ενέργειες.

Φαίνεται ότι μια τέτοια υποτίμηση μπορεί να εξηγηθεί από το γεγονός ότι η λειτουργικότητα είναι ακόμα υπό δοκιμή, αν και "beta". Αλλά είναι ένα χρήσιμο χαρακτηριστικό της beta που επιτρέπει τη χρήση αυτού του εργαλείου σε ιδιωτικά αποθετήρια. Πρόκειται για την εργασία με αυτήν την τεχνολογία για την οποία θα μιλήσω σε αυτό το άρθρο.

Προϊστορία

Αν ξεκινήσουμε με τη σειρά, τότε μάλλον αξίζει να αναφέρουμε ότι στη διαδικασία αναζήτησης μιας γρήγορης, βολικής, εύκολης και δωρεάν επιλογής για την αποθήκευση ενός προσωπικού ιστότοπου "About Me", έπρεπε να περάσω αρκετές νύχτες και να χτενίσω πολλά άρθρα.

Μερικοί άνθρωποι επιλέγουν τη φιλοξενία, άλλοι έναν διακομιστή cloud και όσοι δεν θέλουν να κατανοήσουν τη δουλειά, την αλληλεπίδραση και την πληρωμή για όλα αυτά, όπως το ανέβασμα στατικών ιστότοπων σε ένα αποθετήριο, αφού τώρα αυτό μπορεί να γίνει τόσο στο GitHub όσο και στο GitLab .

Φυσικά, αυτό είναι προσωπική επιλογή του καθενός.

Η τελική μου επιλογή ήταν το GitHub Pages.

Σχετικά με τις σελίδες

Ποιος δεν γνωρίζει gh-pages - αυτή είναι μια επιλογή αποθήκευσης τεκμηρίωσης σε μορφή ιστότοπου και παρέχεται δωρεάν, ενώ εκτός από τεκμηρίωση προτείνεται και η αποθήκευση προσωπικών ιστοσελίδων. Αυτή η λειτουργία παρέχεται από το GitHub σε όλους τους χρήστες και είναι διαθέσιμη στις ρυθμίσεις του αποθετηρίου.

Το αποθετήριο έργου χρησιμοποιεί έναν κλάδο gh-pages, για έναν ιστότοπο χρήστη - ένα ξεχωριστό αποθετήριο με το όνομα username.github.io με πηγές ιστότοπου σε master κλαδί.

Μπορείτε να δείτε περισσότερες λεπτομέρειες στην τεκμηρίωση, αλλά επιτρέψτε μου απλώς να σημειώσω ότι το GitHub είναι εκπληκτικά γενναιόδωρο στο να επιτρέπει σε οποιονδήποτε να συνδέσει τον δικό του τομέα σε έναν τέτοιο ιστότοπο προσθέτοντας απλώς ένα αρχείο CNAME με το όνομα τομέα και τη ρύθμιση του DNS του παρόχου τομέα σας στους διακομιστές GitHub.

Είμαι βέβαιος ότι υπάρχουν πολλά άρθρα εδώ για το πώς να αναπτύξετε έναν τέτοιο ιστότοπο, οπότε δεν πρόκειται να μιλήσω για αυτό περαιτέρω.

Εμφάνιση προβλήματος

Το πρόβλημα ήταν ότι κατά τη χρήση μιας στατικής γεννήτριας, υπάρχει ανάγκη να γραφτούν πρόσθετα σενάρια και να χρησιμοποιηθούν βιβλιοθήκες για να απλοποιηθεί η διαδικασία δημιουργίας σελίδων και φόρτωσής τους στο αποθετήριο. Απλώς, εάν αποθηκεύετε τις πηγές σε ξεχωριστό ιδιωτικό αποθετήριο, τότε κάθε φορά που υπάρχει οποιαδήποτε αλλαγή στον ιστότοπο, ήταν απαραίτητο να αναπτυχθεί το τοπικό περιβάλλον για την επακόλουθη δημιουργία στατικών σελίδων και δημοσίευση στο κύριο αποθετήριο ιστότοπου.

Υπάρχει αφθονία στατικές γεννήτριες και όλοι έχουν το ίδιο πρόβλημα. Αυτές οι ενέργειες απαιτούν πολύ χρόνο και προσπάθεια και τελικά επιβραδύνουν την εργασία στον ιστότοπο, ειδικά μετά από αρκετές μετεγκαταστάσεις από λειτουργικό σύστημα σε λειτουργικό σύστημα ή περιστατικά με απώλεια δεδομένων σε σκληρούς δίσκους (αυτό ήταν στην περίπτωση μου).

Μόλις πρόσφατα, είτε σε μια αναδυόμενη ειδοποίηση στον ιστότοπο είτε σε ένα ενημερωτικό δελτίο από το GitHub, παρατηρήθηκε ένα νέο CI/CD, το οποίο κατέστησε δυνατή την εκτέλεση αυτών των ενεργειών με ελάχιστη προσπάθεια.

Σχετικά με τις γεννήτριες στατικών σελίδων

Δεν θα εστιάσω ιδιαίτερη προσοχή σε αυτό το υποσημείο, αλλά θα μοιραστώ μερικές από τις διατριβές στις οποίες κατέληξα κατά την επιλογή και τη χρήση των παρακάτω:

1) επιλέξτε μια γεννήτρια που ταιριάζει στη γλώσσα προγραμματισμού σας ή μια όσο το δυνατόν πιο σαφή. Κατέληξα σε αυτήν την ιδέα σε μια εποχή που ο ίδιος έπρεπε να προσθέσω κάποια λειτουργικότητα για να λειτουργήσει ο ιστότοπος, να προσθέσω πατερίτσες για μεγαλύτερη σταθερότητα και αυτοματοποίηση. Επιπλέον, αυτός είναι ένας καλός λόγος για να γράψετε μόνοι σας πρόσθετη λειτουργικότητα με τη μορφή πρόσθετων.

2) ποια γεννήτρια να επιλέξετε είναι προσωπική επιλογή, αλλά αξίζει να λάβετε υπόψη ότι για την αρχική εμβάπτιση στην εργασία της λειτουργικότητας των σελίδων GitHub, πρέπει πρώτα να εγκαταστήσετε Jekyll. Ευτυχώς, σας επιτρέπει να δημιουργήσετε έναν ιστότοπο από πηγές απευθείας στο αποθετήριο (Θα το επαναλάβω με την επιλογή μου).

Η επιλογή της γεννήτριας βασίζεται στο πρώτο σημείο. Πελεκάνος που είναι γραμμένο σε Python αντικατέστησε εύκολα το Jekyll, που μου είναι ξένο (το χρησιμοποίησα σχεδόν ένα χρόνο). Ως αποτέλεσμα, ακόμη και η δημιουργία και η επεξεργασία άρθρων και η εργασία σε έναν ιστότοπο δίνει επιπλέον εμπειρία σε μια γλώσσα που με ενδιαφέρει.

__

Δήλωση προβλήματος

Το κύριο καθήκον θα είναι να γράψετε ένα σενάριο (στην πραγματικότητα ένα αρχείο διαμόρφωσης) που θα δημιουργεί αυτόματα στατικές σελίδες από ένα ιδιωτικό αποθετήριο. Η λύση θα περιλαμβάνει τη λειτουργικότητα ενός εικονικού περιβάλλοντος. Το ίδιο το σενάριο θα προσθέσει έτοιμες σελίδες στο δημόσιο αποθετήριο.

Εργαλεία για λύση

Εργαλεία που θα χρησιμοποιήσουμε για να λύσουμε το πρόβλημα:

  • Ενέργειες GitHub;
  • Python3.7;
  • Πελεκάνος;
  • Git;
  • Σελίδες GitHub.

Το διάλυμα

Έτσι, αφού εξοικειωθείτε λίγο με την τεκμηρίωση και κατανοήσαμε πώς γράφονται τα σενάρια για τις Ενέργειες, έγινε σαφές ότι αυτός ο μηχανισμός θα λύσει πλήρως το πρόβλημα που έχει προκύψει. Τη στιγμή της σύνταξης, πρέπει να εγγραφείτε για να χρησιμοποιήσετε αυτήν τη λειτουργία. για beta testing!

Ενέργειες GitHub ως CI/CD για Ιστότοπο Στατικής Γεννήτριας και Σελίδες GitHub
Περιγραφή της νέας λειτουργικότητας από το ίδιο το Github

Η σύνταξη ενός σεναρίου ενεργειών ξεκινά με τη δημιουργία ενός αρχείου με όνομα σε έναν φάκελο .github και τον υποφάκελό του workflows. Αυτό μπορεί να γίνει είτε με μη αυτόματο τρόπο είτε από το πρόγραμμα επεξεργασίας στην καρτέλα Ενέργειες στη σελίδα αποθετηρίου.

Ενέργειες GitHub ως CI/CD για Ιστότοπο Στατικής Γεννήτριας και Σελίδες GitHub
Παράδειγμα κενής φόρμας σεναρίου

Θα σχολιάσω εν συντομία το έντυπο

name: CI    # название скрипта: будет отображаться во вкладке Actions

on: [push]  # действие, по которому запускается данный скрипт

jobs:       # роботы, которые будут выполняться
  build:    # сборка, которая..

    runs-on: ubuntu-latest      # ..будет запущена на основе этого образа

    steps:              # шаги которые будут проделаны после запуска образа
    - uses: actions/checkout@v1     # переход в самую актуальную ветку
    - name: Run a one-line script   # имя работы номер 1
      run: echo Hello, world!       # суть работы номер 1 (bash-команда записана в одну строку)
    - name: Run a multi-line script   # имя работы номер 2
      run: |                    # суть работы номер 2 (многострочная)
        echo Add other actions to build,
        echo test, and deploy your project.

Ας γράψουμε το δικό μας με βάση το πρότυπο:

0) Μπορείτε επίσης να αφήσετε το όνομα "CI". Είναι θέμα γούστου.

1) Στη συνέχεια, πρέπει να επιλέξετε τη δράση/έναν ενεργοποίηση που θα εκκινήσει το σενάριο, στην περίπτωσή μας αυτή είναι η συνηθισμένη ώθηση μιας νέας δέσμευσης στο αποθετήριο.

on:
  push

2) Θα αφήσουμε επίσης την εικόνα βάσει της οποίας θα ξεκινήσει το σενάριο ως παράδειγμα, αφού το Ubuntu είναι αρκετά ικανοποιημένο με την απαραίτητη λειτουργικότητα. Κοιταζώ διαθέσιμα εργαλεία γίνεται σαφές ότι αυτή μπορεί να είναι οποιαδήποτε απαραίτητη ή απλά βολική εικόνα (ή ένα δοχείο Docker που βασίζεται σε αυτό).

  build:
    runs-on: ubuntu-latest

3) Στα βήματα, θα δημιουργήσουμε πρώτα το περιβάλλον για να προετοιμαστούμε για την κύρια εργασία.

3.1) μεταβείτε στο υποκατάστημα που χρειαζόμαστε (τυπικό βήμα checkout):

- uses: actions/checkout@v1

3.2) εγκαταστήστε την Python:

    - name: Set up Python
      uses: actions/setup-python@v1
      with:
        python-version: 3.7

3.3) εγκαταστήστε τις εξαρτήσεις της γεννήτριας μας:

    - name: Install dependencies
      run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

3.4) δημιουργήστε έναν κατάλογο στον οποίο θα δημιουργηθούν οι σελίδες του ιστότοπου:

   - name: Make output folder
      run: mkdir output

4) Για να είναι συνεπής η εργασία στον ιστότοπο, δηλαδή να μην διαγράφονται προηγούμενες αλλαγές και να είναι δυνατή η προσθήκη αλλαγών στο χώρο αποθήκευσης του ιστότοπου χωρίς διενέξεις, το επόμενο βήμα θα είναι να κλωνοποιείτε το αποθετήριο του ιστότοπου κάθε φορά:

   - name: Clone master branch
      run: git clone "https://${{ secrets.ACCESS_TOKEN }}@github.com/${GITHUB_ACTOR}/${GITHUB_ACTOR}.github.io.git" --branch master --single-branch ./output

Αυτό το βήμα καλεί μεταβλητές συστήματος:

  • μεταβλητός GITHUB_ACTOR Το GitHub εγκαθίσταται μόνο του και αυτό είναι το όνομα χρήστη με υπαιτιότητα του οποίου ξεκίνησε αυτό το σενάριο.
  • μεταβλητός secrets.ACCESS_TOKEN αυτό δημιουργείται διακριτικό για τη διαχείριση του Github, μπορούμε να τη μεταβιβάσουμε ως μεταβλητή περιβάλλοντος ορίζοντας την στην καρτέλα Secrets τις ρυθμίσεις του αποθετηρίου μας. Λάβετε υπόψη ότι κατά τη διάρκεια της δημιουργίας το διακριτικό θα μας παρέχεται μία φορά, δεν θα υπάρχει περαιτέρω πρόσβαση σε αυτό. Καθώς και τις αξίες των στοιχείων Secrets.

5) Ας προχωρήσουμε στη δημιουργία των σελίδων μας:

   - name: Generate static pages
      run: pelican content -o output -s publishconf.py

Οι παράμετροι που μεταβιβάζονται στη γεννήτρια είναι υπεύθυνες για τον κατάλογο όπου θα σταλούν τα δημιουργημένα αρχεία (-o output) και το αρχείο ρυθμίσεων που χρησιμοποιούμε για τη δημιουργία (-s publishconf.py; Μπορείτε να διαβάσετε σχετικά με την προσέγγιση για τον διαχωρισμό της τοπικής διαμόρφωσης και της διαμόρφωσης για δημοσίευση στην τεκμηρίωση του Pelican).

Επιτρέψτε μου να σας υπενθυμίσω τι υπάρχει στον φάκελό μας output Το αποθετήριο του ιστότοπου έχει ήδη κλωνοποιηθεί.

6) Ας ρυθμίσουμε το git και ας κάνουμε ευρετήριο των αλλαγμένων αρχείων μας:

    - name: Set git config and add changes
      run: |
          git config --global user.email "${GITHUB_ACTOR}@https://users.noreply.github.com/"
          git config --global user.name "${GITHUB_ACTOR}"
          git add --all
      working-directory: ./output

Σε αυτό το σημείο, χρησιμοποιείται μια ήδη γνωστή μεταβλητή και υποδεικνύεται ο κατάλογος εργασίας στον οποίο θα εκκινηθούν οι εντολές από αυτό το βήμα. Η εντολή για μετάβαση στον κατάλογο εργασίας θα έμοιαζε διαφορετικά - cd output.

7) Ας δημιουργήσουμε ένα μήνυμα δέσμευσης, δεσμεύσουμε τις αλλαγές και ωθήσουμε στο αποθετήριο. Έτσι ώστε η δέσμευση να μην είναι μάταιη και επομένως να μην παράγει σφάλμα στο bash (το αποτέλεσμα εξόδου δεν είναι 0) — πρώτα, ας ελέγξουμε αν είναι απαραίτητο να δεσμευτείς και να πιέσεις κάτι καθόλου. Για να το κάνουμε αυτό χρησιμοποιούμε την εντολή git diff-index --quiet --cached HEAD -- που θα βγει στο τερματικό 0 εάν δεν υπάρχουν αλλαγές σε σχέση με την προηγούμενη έκδοση του ιστότοπου και 1 υπάρχουν τέτοιες αλλαγές. Στη συνέχεια επεξεργαζόμαστε το αποτέλεσμα αυτής της εντολής. Έτσι, στις πληροφορίες σχετικά με την εκτέλεση του σεναρίου, θα καταγράψουμε χρήσιμες πληροφορίες για την κατάσταση του ιστότοπου σε αυτό το στάδιο, αντί να διακοπεί αυτόματα και να μας στείλουμε μια αναφορά σχετικά με το σφάλμα του σεναρίου.

Πραγματοποιούμε επίσης αυτές τις ενέργειες στον κατάλογό μας με έτοιμες σελίδες.

   - name: Push and send notification
      run: |
          COMMIT_MESSAGE="Update pages on $(date +'%Y-%m-%d %H:%M:%S')"
          git diff-index --quiet --cached HEAD -- && echo "No changes!" && exit 0 || echo $COMMIT_MESSAGE
          # Only if repo have changes
          git commit -m "${COMMIT_MESSAGE}"
          git push https://${{ secrets.ACCESS_TOKEN }}@github.com/${GITHUB_ACTOR}/${GITHUB_ACTOR}.github.io.git master
      working-directory: ./output

Αποτέλεσμα

Ως αποτέλεσμα, ένα τέτοιο σενάριο σάς επιτρέπει να μην σκέφτεστε τη δημιουργία στατικών σελίδων. Προσθέτοντας αλλαγές απευθείας σε ένα ιδιωτικό αποθετήριο, είτε δουλεύοντας με το git από οποιοδήποτε σύστημα είτε δημιουργώντας ένα αρχείο μέσω της διεπαφής ιστού GitHub, οι Actions θα κάνουν τα πάντα μόνα τους. Εάν το σενάριο διακοπεί απροσδόκητα, θα σταλεί ειδοποίηση στο email σας.

Πλήρης κωδικός

Θα αφήσω την έκδοση εργασίας μου, στην οποία το τελευταίο βήμα προσθέτει την αποστολή ειδοποίησης ότι μια δέσμευση έχει προωθηθεί στο κύριο αποθετήριο.

Χρησιμοποιούνται τα μυστικά που περιγράφονται παραπάνω, όπου προστίθεται το διακριτικό bot και το αναγνωριστικό χρήστη στον οποίο πρέπει να σταλεί το μήνυμα.

name: Push content to the user's GitHub pages repository

on:
  push

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - name: Set up Python
      uses: actions/setup-python@v1
      with:
        python-version: 3.7
    - name: Install dependencies
      run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt
    - name: Make output folder
      run: mkdir output
    - name: Clone master branch
      run: git clone "https://${{ secrets.ACCESS_TOKEN }}@github.com/${GITHUB_ACTOR}/${GITHUB_ACTOR}.github.io.git" --branch master --single-branch ./output
    - name: Generate static pages
      run: pelican content -o output -s publishconf.py
    - name: Set git config and add changes
      run: |
          git config --global user.email "${GITHUB_ACTOR}@https://users.noreply.github.com/"
          git config --global user.name "${GITHUB_ACTOR}"
          git add --all
      working-directory: ./output
    - name: Push and send notification
      run: |
          COMMIT_MESSAGE="Update pages on $(date +'%Y-%m-%d %H:%M:%S')"
          git diff-index --quiet --cached HEAD -- && echo "No changes!" && exit 0 || echo $COMMIT_MESSAGE
          git commit -m "${COMMIT_MESSAGE}"
          git push https://${{ secrets.ACCESS_TOKEN }}@github.com/${GITHUB_ACTOR}/${GITHUB_ACTOR}.github.io.git master
          curl "https://api.telegram.org/bot${{ secrets.BOT_TOKEN }}/sendMessage?text=$COMMIT_MESSAGE %0ALook at ${GITHUB_ACTOR}.github.io %0ARepository%3A github.com/${GITHUB_ACTOR}/${GITHUB_ACTOR}.github.io&chat_id=${{ secrets.ADMIN_ID }}"
      working-directory: ./output

Στιγμιότυπα

Ενέργειες GitHub ως CI/CD για Ιστότοπο Στατικής Γεννήτριας και Σελίδες GitHub
Το αποτέλεσμα μιας από τις εκτελέσεις που εμφανίζεται στην καρτέλα Ενέργειες του αποθετηρίου προέλευσης

Ενέργειες GitHub ως CI/CD για Ιστότοπο Στατικής Γεννήτριας και Σελίδες GitHub
Μήνυμα από το bot για την ολοκλήρωση του σεναρίου

χρήσιμοι σύνδεσμοι

Κατανόηση Δράσεων
Σύνταξη ενεργειών
Λίστα ερεθισμάτων
Επιλογές για εικονικά περιβάλλοντα
Σελίδες Github
Λίστα στατικής γεννήτριας

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο