Tindakan GitHub minangka CI / CD kanggo situs ing generator statis lan Kaca GitHub

Tindakan GitHub minangka CI / CD kanggo situs ing generator statis lan Kaca GitHub

Sawise nggoleki Habr sethithik, aku kaget amarga sawetara artikel sing diterbitake babagan topik fitur GitHub (beta) - Tindakan.

Kayane understatement kasebut bisa diterangake kanthi kasunyatan manawa fungsi kasebut isih diuji, sanajan "beta". Nanging minangka fitur beta sing migunani sing ngidini alat iki digunakake ing repositori pribadi. Babagan nggarap teknologi iki sing bakal dakkandhakake ing artikel iki.

prasejarah

Yen kita miwiti kanthi urutan, mesthine kudu dicritakake yen ing proses nggoleki pilihan sing cepet, trep, gampang lan gratis kanggo nyimpen situs web "About Me", aku kudu ngentekake pirang-pirang bengi lan nyisir akeh artikel.

Sawetara wong milih hosting, liyane server maya, lan sing ora pengin ngerti karya, interaksi lan pembayaran kanggo kabeh iki kaya ngunggah situs statis menyang repositori, amarga saiki iki bisa ditindakake ing GitHub lan GitLab.

Mesthi, iki pilihan pribadi saben wong.

Pilihan pungkasanku yaiku GitHub Pages.

Babagan Pages

Sapa sing ora ngerti gh-pages - iki minangka pilihan kanggo nyimpen dokumentasi ing wangun situs web lan diwenehake kanthi gratis, lan saliyane dokumentasi, uga diusulake kanggo nyimpen situs web pribadi. Fungsi iki diwenehake dening GitHub kanggo kabeh pangguna lan kasedhiya ing setelan repositori.

Repositori proyek nggunakake cabang gh-pages, kanggo situs pangguna - gudang kapisah kanthi jeneng username.github.io karo sumber situs ing master cabang.

Sampeyan bisa ndeleng rincian liyane ing dokumentasi, nanging aku mung nyathet yen GitHub pancen loman banget kanggo ngidini sapa wae nyambungake domain dhewe menyang situs kasebut kanthi mung nambah file. CNAME kanthi jeneng domain lan nyetel DNS panyedhiya domain sampeyan ing server GitHub.

Aku yakin manawa ana akeh artikel ing kene babagan cara ngembangake situs kasebut, mula dudu sing bakal dakkandhakake.

Masalah muncul

Masalahe yaiku nalika nggunakake generator statis, perlu kanggo nulis skrip tambahan lan nggunakake perpustakaan kanggo nyederhanakake proses ngasilake kaca lan ngemot menyang repositori. Cukup, yen sampeyan nyimpen sumber ing gudang pribadi sing kapisah, mula saben ana owah-owahan ing situs kasebut, perlu kanggo nyebarake lingkungan lokal kanggo generasi sabanjure kaca statis lan publikasi ing gudang situs utama.

Ana turah mbrawah generator statis lan kabeh padha duwe masalah sing padha. Tumindak kasebut mbutuhake wektu lan gaweyan akeh banget, lan pungkasane alon-alon kerja ing situs kasebut, utamane sawise sawetara migrasi saka OS menyang OS utawa kedadeyan mundhut data ing hard drive. (iki kasus ing kasusku).

Mung bubar, ing notifikasi pop-up ing situs web utawa ing buletin saka GitHub, CI / CD sing mentas dibangun ditemokake, sing ngidini tumindak kasebut ditindakake kanthi minimal.

Babagan generator kaca statis

Aku ora bakal fokus manungsa waé khusus ing sub-item iki, nanging aku bakal nuduhake saperangan saka tesis sing aku teka kanggo sak pilihan lan nggunakake ing ngisor iki:

1) pilih generator sing cocog karo basa pamrograman, utawa sing paling jelas. Aku teka ing idea iki ing wektu nalika aku kudu nambah sawetara fungsi kanggo situs bisa, nambah crutches kanggo stabilitas lan automation luwih. Kajaba iku, iki minangka alesan sing apik kanggo nulis fungsi tambahan dhewe ing wangun plugin;

2) generator apa sing kudu dipilih minangka pilihan pribadi, nanging kudu dipikirake manawa kanggo kecemplung wiwitan ing karya fungsi GitHub Pages, sampeyan kudu nginstal dhisik. Jekyll. Untunge, ngidini sampeyan nggawe situs web saka sumber langsung ing repositori (Aku bakal mbaleni iki kanthi pilihanku).

pilihan sandi generator adhedhasar titik pisanan. Pelikan kang ditulis ing Python gampang diganti Jekyll, kang manca kanggo kula (digunakake meh setahun). Akibaté, malah nggawe lan nyunting artikel lan nggarap situs web menehi pengalaman tambahan ing basa sing menarik kanggo kula.

__

Formulasi masalah

Tugas utama yaiku nulis skrip (sajatine file konfigurasi) sing bakal ngasilake kaca statis kanthi otomatis saka gudang pribadi. Solusi kasebut bakal kalebu fungsi lingkungan virtual. Skrip kasebut dhewe bakal nambah kaca sing wis siap kanggo repositori umum.

Piranti kanggo solusi

Alat sing bakal digunakake kanggo ngatasi masalah:

  • Tindakan GitHub;
  • Python3.7;
  • pelikan;
  • Git;
  • Kaca GitHub.

Ngatasi masalah

Dadi, sawise njaluk kenalan karo dokumentasi sethitik lan ngerti carane nulis skrip kanggo Tindakan, dadi cetha yen mekanisme iki bakal rampung ngatasi masalah sing wis arisen. Nalika nulis, sampeyan kudu langganan kanggo nggunakake fungsi iki. kanggo beta testing!

Tindakan GitHub minangka CI / CD kanggo situs ing generator statis lan Kaca GitHub
Katrangan babagan fungsi anyar dening Github dhewe

Nulis skrip Tindakan diwiwiti kanthi nggawe file jenenge ing folder .github lan subfolder sawijining workflows. Iki bisa ditindakake kanthi manual utawa saka editor ing tab Tindakan ing kaca repositori.

Tindakan GitHub minangka CI / CD kanggo situs ing generator statis lan Kaca GitHub
Tuladha formulir skrip kosong

Aku bakal menehi komentar sedhela babagan formulir kasebut

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.

Ayo nulis dhewe adhedhasar cithakan:

0) Sampeyan uga bisa ninggalake jeneng "CI". Iku bab rasa.

1) Sabanjure, sampeyan kudu milih tumindak / pemicu sing bakal miwiti skrip, ing kasus iki, iki minangka push biasa saka komitmen anyar menyang repositori.

on:
  push

2) Kita uga bakal ninggalake gambar ing basis kang script bakal dibukak minangka conto, wiwit Ubuntu cukup wareg karo fungsi perlu. nyawang piranti kasedhiya dadi cetha yen iki bisa dadi gambar sing perlu utawa mung trep (utawa wadhah Docker adhedhasar).

  build:
    runs-on: ubuntu-latest

3) Ing langkah-langkah kasebut, kita bakal nyetel lingkungan kanggo nyiapake karya utama.

3.1) pindhah menyang cabang sing kita butuhake (langkah standar checkout):

- uses: actions/checkout@v1

3.2) nginstal Python:

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

3.3) nginstal dependensi generator kita:

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

3.4) nggawe direktori ing ngendi kaca situs bakal diasilake:

   - name: Make output folder
      run: mkdir output

4) Supaya karya ing situs kasebut konsisten, yaiku, ora mbusak owah-owahan sadurunge lan bisa nambah owah-owahan ing repositori situs tanpa konflik, langkah sabanjure yaiku klone repositori situs saben wektu:

   - 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

Langkah iki nelpon variabel sistem:

  • variabel GITHUB_ACTOR GitHub nginstal dhewe, lan iki jeneng panganggo sing kesalahane script iki dibukak;
  • variabel secrets.ACCESS_TOKEN iki kui token kanggo ngatur Github, kita bisa ngliwati minangka variabel lingkungan kanthi nyetel ing tab Secrets setelan repositori kita. Wigati dimangerteni yen sajrone generasi token bakal diwenehake marang kita sapisan, ora bakal ana akses maneh. Uga nilai barang Rahasia.

5) Ayo pindhah menyang ngasilake kaca kita:

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

Parameter sing dikirim menyang generator tanggung jawab kanggo direktori ing ngendi file sing digawe bakal dikirim (-o output) lan file konfigurasi sing digunakake kanggo ngasilake (-s publishconf.py; Sampeyan bisa maca babagan pendekatan kanggo misahake konfigurasi lokal lan konfigurasi kanggo publikasi ing dokumentasi Pelican).

Ayo kula ngelingake sampeyan apa sing ana ing folder kita output Repositori situs wis dikloning.

6) Ayo nyiyapake git lan indeks file sing diganti:

    - 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

Ing titik iki, variabel sing wis dikenal digunakake lan direktori kerja dituduhake ing ngendi perintah saka langkah iki bakal diluncurake. Printah kanggo pindhah menyang direktori kerja bakal katon kaya - cd output.

7) Ayo nggawe pesen komit, gawe owah-owahan lan push menyang repositori. Supaya komit ora muspra lan mulane ora ngasilake kesalahan ing bash (asil output ora 0) — pisanan, ayo mriksa apa perlu kanggo tundhuk lan push soko. Kanggo nindakake iki, kita nggunakake printah git diff-index --quiet --cached HEAD -- kang bakal output kanggo terminal 0 yen ora ana owah-owahan relatif kanggo versi sadurungé saka situs, lan 1 ana owah-owahan kuwi. Banjur kita proses asil saka printah iki. Mangkono, ing informasi babagan eksekusi skrip, kita bakal ngrekam informasi sing migunani babagan kahanan situs ing tahap iki, tinimbang kanthi otomatis nabrak lan ngirim laporan babagan kacilakan naskah.

Kita uga nindakake tumindak kasebut ing direktori kita kanthi kaca sing wis siap.

   - 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

asil

Akibaté, skrip kasebut ngidini sampeyan ora mikir babagan nggawe kaca statis. Kanthi nambahake owah-owahan langsung menyang repositori pribadi, apa kanthi nggarap git saka sistem apa wae utawa nggawe file liwat antarmuka web GitHub, Tindakan bakal nindakake kabeh dhewe. Yen script crash ndadak, kabar bakal dikirim menyang email.

Kode lengkap

Aku bakal ninggalake versi kerjaku, ing ngendi langkah pungkasan nambahake ngirim kabar yen komit wis di-push menyang repositori utama.

Rahasia sing diterangake ing ndhuwur digunakake, ing ngendi token bot lan ID pangguna sing kudu dikirim pesen ditambahake.

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

Screenshot

Tindakan GitHub minangka CI / CD kanggo situs ing generator statis lan Kaca GitHub
Asil saka salah siji mlaku ditampilake ing tab Tindakan saka gudang sumber

Tindakan GitHub minangka CI / CD kanggo situs ing generator statis lan Kaca GitHub
Pesen saka bot babagan ngrampungake naskah

link migunani

Understanding Actions
Sintaks tumindak
Dhaptar pemicu
Pilihan kanggo lingkungan virtual
Github Pages
Daftar generator statis

Source: www.habr.com

Add a comment