GitHub-acties als CI/CD voor Static Generator-site en GitHub-pagina's

GitHub-acties als CI/CD voor Static Generator-site en GitHub-pagina's

Nadat ik Habr een beetje had doorzocht, was ik verrast dat er maar heel weinig artikelen zijn gepubliceerd over het onderwerp van de (bèta)functie van GitHub: Acties.

Het lijkt erop dat een dergelijk understatement kan worden verklaard door het feit dat de functionaliteit nog steeds in de testfase verkeert, zij het in de bètafase. Maar het is een nuttige functie van de bèta die het mogelijk maakt deze tool in privérepository's te gebruiken. Het gaat over het werken met deze technologie waar ik het in dit artikel over zal hebben.

prehistorie

Als we op volgorde beginnen, is het waarschijnlijk de moeite waard om te vermelden dat ik tijdens het zoeken naar een snelle, handige, gemakkelijke en gratis optie voor het opslaan van een persoonlijke 'Over mij'-website een aantal nachten moest doorbrengen en veel artikelen moest doorzoeken.

Sommige mensen kiezen voor hosting, anderen voor een cloudserver, en degenen die het werk, de interactie en de betaling voor dit alles niet willen begrijpen, zoals het uploaden van statische sites naar een repository, aangezien dit nu zowel op GitHub als GitLab kan worden gedaan.

Uiteraard is dit ieders persoonlijke keuze.

Mijn uiteindelijke keuze was GitHub Pages.

Over pagina's

Wie is niet op de hoogte? gh-pages - dit is een optie voor het opslaan van documentatie in de vorm van een website en deze wordt gratis verstrekt, en naast documentatie wordt ook voorgesteld om persoonlijke websites op te slaan. Deze functionaliteit wordt door GitHub aan alle gebruikers aangeboden en is beschikbaar in de repository-instellingen.

De projectrepository gebruikt een vertakking gh-pages, voor een gebruikerssite - een aparte repository met de naam username.github.io met sitebronnen in master tak.

U kunt meer details bekijken bij documentatie, maar laat me opmerken dat GitHub verrassend genereus is door iedereen toe te staan ​​zijn eigen domein aan zo'n site te koppelen door simpelweg een bestand toe te voegen CNAME met de domeinnaam en het instellen van de DNS van uw domeinprovider op de GitHub-servers.

Ik ben er zeker van dat er hier veel artikelen zijn over hoe je zo’n site kunt ontwikkelen, dus daar ga ik het verder niet over hebben.

Het optreden van een probleem

Het probleem was dat bij het gebruik van een statische generator er behoefte was aan het schrijven van extra scripts en het gebruik van bibliotheken om het proces van het genereren van pagina's en het laden ervan in de repository te vereenvoudigen. Als u de bronnen eenvoudigweg in een aparte privérepository opslaat, was het elke keer dat er enige verandering op de site plaatsvond, nodig om de lokale omgeving in te zetten voor de daaropvolgende generatie van statische pagina's en publicatie in de hoofdrepository van de site.

Er is een overvloed statische generatoren en ze hebben allemaal hetzelfde probleem. Deze acties kosten te veel tijd en moeite en vertragen uiteindelijk het werk op de site, vooral na verschillende migraties van besturingssysteem naar besturingssysteem of incidenten met gegevensverlies op harde schijven (dit was in mijn geval het geval).

Onlangs werd in een pop-upmelding op de website of in een nieuwsbrief van GitHub een nieuw gebouwde CI/CD opgemerkt, waardoor deze acties met minimale inspanning konden worden uitgevoerd.

Over statische paginageneratoren

Ik zal geen speciale aandacht besteden aan dit subitem, maar ik zal een paar stellingen delen die ik tegenkwam tijdens de selectie en het gebruik van het volgende:

1) kies een generator die bij jouw programmeertaal past, of eentje die zo duidelijk mogelijk is. Ik kwam op dit idee op een moment dat ik zelf wat functionaliteit moest toevoegen om de site te laten werken, krukken moest toevoegen voor meer stabiliteit en automatisering. Daarnaast is dit een goede reden om zelf extra functionaliteit te schrijven in de vorm van plugins;

2) welke generator je moet kiezen is een persoonlijke keuze, maar het is de moeite waard om te overwegen dat je voor de eerste onderdompeling in het werk van de GitHub Pages-functionaliteit eerst moet installeren Jekyll. Gelukkig kunt u hiermee een website genereren vanuit bronnen rechtstreeks in de repository (Ik zal dit herhalen bij mijn keuze).

Mijn keuze voor een generator is gebaseerd op het eerste punt. Pelikaan dat in Python is geschreven, vervangt gemakkelijk Jekyll, wat mij vreemd is (ik heb hem bijna een jaar gebruikt). Daardoor geeft zelfs het maken en redigeren van artikelen en het werken aan een website extra ervaring in een taal die voor mij interessant is.

__

Formulering van het probleem

De belangrijkste taak zal zijn het schrijven van een script (eigenlijk een configuratiebestand) dat automatisch statische pagina's genereert vanuit een privérepository. De oplossing omvat de functionaliteit van een virtuele omgeving. Het script zelf voegt kant-en-klare pagina's toe aan de openbare repository.

Hulpmiddelen voor oplossing

Hulpmiddelen die we zullen gebruiken om het probleem op te lossen:

  • GitHub-acties;
  • Python 3.7;
  • Pelikaan;
  • Git;
  • GitHub-pagina's.

Probleemoplossend

Dus nadat we een beetje kennis hadden gemaakt met de documentatie en hadden begrepen hoe scripts voor acties worden geschreven, werd het duidelijk dat dit mechanisme het gerezen probleem volledig zal oplossen. Op het moment dat dit artikel wordt geschreven, moet u zich abonneren om deze functionaliteit te gebruiken. voor bètatesten!

GitHub-acties als CI/CD voor Static Generator-site en GitHub-pagina's
Beschrijving van de nieuwe functionaliteit door Github zelf

Het schrijven van een Actions-script begint met het maken van een benoemd bestand in een map .github en zijn submap workflows. Dit kan handmatig worden gedaan of vanuit de editor op het tabblad Acties op de repositorypagina.

GitHub-acties als CI/CD voor Static Generator-site en GitHub-pagina's
Voorbeeld van een leeg scriptformulier

Ik zal kort commentaar geven op het formulier

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.

Laten we onze eigen schrijven op basis van de sjabloon:

0) U kunt ook de naam “CI” laten staan. Het is een kwestie van smaak.

1) Vervolgens moet je de actie/trigger selecteren die het script zal starten, in ons geval is dit de gebruikelijke push van een nieuwe commit naar de repository.

on:
  push

2) We laten ook de afbeelding op basis waarvan het script wordt gelanceerd als voorbeeld achter, aangezien Ubuntu best tevreden is met de nodige functionaliteit. Kijken naar доступные het wordt duidelijk dat dit elke noodzakelijke of eenvoudigweg handige afbeelding kan zijn (of een Docker-container die daarop is gebaseerd).

  build:
    runs-on: ubuntu-latest

3) In de stappen gaan we eerst de omgeving inrichten ter voorbereiding op de hoofdwerkzaamheden.

3.1) ga naar het filiaal dat we nodig hebben (standaardstap checkout):

- uses: actions/checkout@v1

3.2) Python installeren:

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

3.3) installeer de afhankelijkheden van onze generator:

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

3.4) maak een map aan waarin de sitepagina's worden gegenereerd:

   - name: Make output folder
      run: mkdir output

4) Om ervoor te zorgen dat het werk op de site consistent is, namelijk om eerdere wijzigingen niet te verwijderen en om zonder conflicten wijzigingen aan de siterepository toe te kunnen voegen, is de volgende stap het elke keer klonen van de siterepository:

   - 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

Met deze stap worden systeemvariabelen aangeroepen:

  • variabel GITHUB_ACTOR GitHub installeert zichzelf, en dit is de gebruikersnaam door wiens schuld dit script werd gelanceerd;
  • variabele secrets.ACCESS_TOKEN dit wordt gegenereerd token voor het beheren van Github, kunnen we het doorgeven als een omgevingsvariabele door deze op het tabblad in te stellen Secrets onze repository-instellingen. Houd er rekening mee dat tijdens het genereren het token één keer aan ons wordt verstrekt. Er is geen verdere toegang meer toe. Evenals de waarden van de Secrets-items.

5) Laten we verder gaan met het genereren van onze pagina's:

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

De parameters die aan de generator worden doorgegeven, zijn verantwoordelijk voor de map waarnaar de gegenereerde bestanden worden verzonden (-o output) en het configuratiebestand dat we gebruiken om te genereren (-s publishconf.py; U kunt lezen over de aanpak voor het scheiden van de lokale configuratie en de configuratie voor publicatie in de Pelican-documentatie).

Ik wil u eraan herinneren wat er in onze map staat output De siterepository is al gekloond.

6) Laten we git opzetten en onze gewijzigde bestanden indexeren:

    - 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

Op dit punt wordt een reeds bekende variabele gebruikt en wordt de werkmap aangegeven waarin de opdrachten uit deze stap zullen worden gestart. Het commando om naar de werkmap te gaan zou er anders als volgt uitzien: cd output.

7) Laten we een commit-bericht genereren, de wijzigingen vastleggen en ze in de repository pushen. Zodat de commit niet tevergeefs is en daarom geen fout in bash oplevert (het uitvoerresultaat is dat niet 0) – laten we eerst eens kijken of het überhaupt nodig is om iets vast te leggen en te pushen. Om dit te doen gebruiken we het commando git diff-index --quiet --cached HEAD -- die naar de terminal wordt uitgevoerd 0 als er geen wijzigingen zijn ten opzichte van de vorige versie van de site, en 1 zulke veranderingen zijn er. Vervolgens verwerken we het resultaat van deze opdracht. In de informatie over de uitvoering van het script zullen we dus in dit stadium nuttige informatie over de status van de site vastleggen, in plaats van automatisch te crashen en ons een rapport te sturen over de scriptcrash.

Deze acties voeren wij ook uit in onze directory met kant-en-klare pagina's.

   - 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

Resultaat

Als gevolg hiervan kunt u met een dergelijk script niet nadenken over het maken van statische pagina's. Door wijzigingen rechtstreeks aan een privérepository toe te voegen, of je nu met git werkt vanuit welk systeem dan ook of een bestand maakt via de GitHub-webinterface, doet Actions alles zelf. Als het script onverwachts crasht, wordt er een melding naar uw e-mail verzonden.

Volledige code

Ik verlaat mijn werkende versie, waarin de laatste stap het verzenden van een melding toevoegt dat een commit naar de hoofdrepository is gepusht.

Er wordt gebruik gemaakt van de hierboven beschreven geheimen, waarbij het bottoken en de gebruikers-ID naar wie het bericht moet worden verzonden, worden toegevoegd.

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

Schermafbeeldingen

GitHub-acties als CI/CD voor Static Generator-site en GitHub-pagina's
Het resultaat van een van de runs die wordt weergegeven op het tabblad Acties van de bronrepository

GitHub-acties als CI/CD voor Static Generator-site en GitHub-pagina's
Bericht van de bot over de voltooiing van het script

Nuttige links

Acties begrijpen
Syntaxis van acties
Lijst met triggers
Opties voor virtuele omgevingen
Github-pagina's
Lijst met statische generatoren

Bron: www.habr.com

Voeg een reactie