Aksi GitHub salaku CI / CD pikeun situs dina generator statik sareng Halaman GitHub

Aksi GitHub salaku CI / CD pikeun situs dina generator statik sareng Halaman GitHub

Saatos ngajalajah Habr sakedik, kuring kaget yén sakedik pisan tulisan anu diterbitkeun dina topik fitur GitHub (beta) - Aksi.

Sigana yén understatement sapertos kitu tiasa dijelaskeun ku kanyataan yén fungsionalitasna masih diuji, sanaos "béta". Tapi éta mangrupikeun fitur anu mangpaat tina béta anu ngamungkinkeun alat ieu dianggo dina repositori swasta. Éta ngeunaan gawé bareng téknologi ieu anu bakal kuring bahas dina tulisan ieu.

Prasajarah

Upami urang ngamimitian dina urutan, maka sigana kedah disebatkeun yén dina prosés milarian pilihan anu gancang, merenah, gampang sareng gratis pikeun nyimpen situs wéb "About Me", kuring kedah nyéépkeun sababaraha wengi sareng nyisiran seueur tulisan.

Sababaraha urang milih hosting, batur server awan, sarta jalma anu teu hayang ngarti karya, interaksi jeung pamayaran pikeun sakabéh ieu kawas unggah situs statik ka Repository a, saprak ayeuna ieu bisa dipigawé dina duanana GitHub na GitLab.

Tangtosna, ieu mangrupikeun pilihan pribadi masing-masing.

Pilihan terakhir kuring nyaéta GitHub Pages.

Ngeunaan Kaca

Saha nu teu nyaho gh-pages - ieu mangrupikeun pilihan pikeun nyimpen dokuméntasi dina bentuk halaman wéb sareng disayogikeun gratis, sareng salian dokuméntasi, ogé disarankeun pikeun nyimpen situs wéb pribadi. Pungsi ieu disayogikeun ku GitHub ka sadaya pangguna sareng sayogi dina setélan gudang.

Repository proyék ngagunakeun cabang gh-pages, pikeun situs pamaké - gudang misah jeung ngaran username.github.io kalawan sumber situs di master dahan.

Anjeun tiasa ningali langkung rinci dina dokuméntasi, tapi hayu atuh ngan dicatet yén GitHub téh heran berehan dina ngamungkinkeun saha pikeun numbu domain sorangan ka situs misalna ku saukur nambahkeun file CNAME nganggo nami domain sareng nyetél DNS panyadia domain anjeun dina server GitHub.

Kuring yakin yén aya seueur tulisan di dieu ngeunaan kumaha carana ngamekarkeun situs sapertos kitu, janten éta sanés anu bakal kuring bahas salajengna.

Lumangsungna masalah

Masalahna nyaéta nalika nganggo generator statik, peryogi nyerat skrip tambahan sareng nganggo perpustakaan pikeun nyederhanakeun prosés ngahasilkeun halaman sareng ngamuat kana gudang. Kantun, upami anjeun nyimpen sumber dina gudang pribadi anu misah, teras unggal waktos aya parobahan dina situs, éta kedah nyebarkeun lingkungan lokal pikeun generasi halaman statik salajengna sareng publikasi dina gudang situs utama.

Aya kaayaanana generator statik sareng aranjeunna sadayana gaduh masalah anu sami. Tindakan ieu butuh teuing waktos sareng usaha, sareng pamustunganana ngalambatkeun padamelan dina situs, khususna saatos sababaraha migrasi tina OS ka OS atanapi kajadian leungitna data dina hard drive. (ieu kasus dina kasus kuring).

Nembé nembé, boh dina béwara pop-up dina halaman wéb atanapi dina buletin ti GitHub, CI / CD anu nembé diwangun diperhatoskeun, anu ngamungkinkeun tindakan ieu dilaksanakeun kalayan usaha minimal.

Ngeunaan generator kaca statik

Kuring moal museurkeun perhatian husus dina sub-item ieu, tapi kuring baris babagi sababaraha theses yén kuring datang ka mangsa Pilihan sarta pamakéan di handap:

1) Pilih generator anu cocog sareng basa pamrograman anjeun, atanapi anu paling jelas. Kuring datang ka gagasan ieu dina hiji waktu nalika kuring sorangan kedah nambahkeun sababaraha pungsi pikeun situs jalan, nambahkeun crutches pikeun stabilitas gede tur automation na. Salaku tambahan, ieu mangrupikeun alesan anu hadé pikeun nyerat fungsionalitas tambahan sorangan dina bentuk plugins;

2) generator mana anu kedah dipilih mangrupikeun pilihan pribadi, tapi kedah dipertimbangkeun yén pikeun immersion awal dina karya fungsionalitas GitHub Pages, anjeun kedah pasang heula. Jekyll. Untungna, éta ngamungkinkeun anjeun ngahasilkeun halaman wéb tina sumber langsung dina gudang (Kuring bakal ngulang ieu sareng pilihan kuring).

pilihan abdi generator dumasar kana titik munggaran. Pelikan nu ditulis dina Python gampang diganti Jekyll, nu asing ka kuring (dipake ampir sataun). Hasilna, malah nyieun jeung ngédit artikel jeung gawe dina ramatloka méré pangalaman tambahan dina basa nu metot pikeun kuring.

__

Ngarumuskeun masalah

Tugas utama bakal nyerat naskah (saleresna file konfigurasi) anu otomatis bakal ngahasilkeun halaman statik tina gudang pribadi. Solusina bakal ngalibetkeun fungsionalitas lingkungan virtual. Skrip sorangan bakal nambihan halaman anu siap-siap kana gudang umum.

Alat pikeun solusi

Alat anu bakal kami anggo pikeun ngarengsekeun masalah:

  • Aksi GitHub;
  • Python3.7;
  • Pelikan;
  • Git;
  • Kaca GitHub.

alamat

Ku kituna, sanggeus saeutik acquainted jeung dokuméntasi jeung ngarti kumaha carana nulis Aksara pikeun Aksi, éta jelas yén mékanisme ieu sagemblengna bakal ngajawab masalah anu timbul. Dina waktos nyerat, anjeun kedah ngalanggan pikeun nganggo pungsi ieu. pikeun nguji béta!

Aksi GitHub salaku CI / CD pikeun situs dina generator statik sareng Halaman GitHub
Katerangan ngeunaan fungsionalitas anyar ku Github sorangan

Nulis skrip Actions dimimitian ku nyieun file ngaranna dina polder .github sareng subfolder na workflows. Ieu tiasa dilakukeun sacara manual atanapi tina éditor dina tab Aksi dina halaman gudang.

Aksi GitHub salaku CI / CD pikeun situs dina generator statik sareng Halaman GitHub
Conto wangun naskah kosong

Kuring sakeudeung bakal mairan dina formulir

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.

Hayu urang nulis sorangan dumasar kana template:

0) Anjeun oge bisa ninggalkeun ngaran "CI". Ieu masalah rasa.

1) Salajengna, anjeun kedah milih tindakan / pemicu anu bakal ngaluncurkeun naskah, dina hal urang ieu mangrupikeun dorongan biasa tina komitmen anyar pikeun gudang.

on:
  push

2) Urang ogé bakal ninggalkeun gambar dina dasar nu naskah bakal diluncurkeun salaku conto, saprak Ubuntu cukup wareg jeung pungsionalitas diperlukeun. Ningali parabot sadia janten jelas yén ieu tiasa waé gambar anu diperyogikeun atanapi ngan saukur merenah (atanapi wadah Docker dumasar kana éta).

  build:
    runs-on: ubuntu-latest

3) Dina léngkah-léngkahna, urang badé nyetél heula lingkungan pikeun nyiapkeun karya utama.

3.1) angkat ka cabang anu urang peryogikeun (step standar checkout):

- uses: actions/checkout@v1

3.2) pasang Python:

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

3.3) pasang katergantungan generator kami:

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

3.4) ngadamel diréktori dimana halaman situs bakal dibangkitkeun:

   - name: Make output folder
      run: mkdir output

4) Supados karya dina situs janten konsisten, nyaéta, teu mupus parobahan saméméhna tur bisa nambahkeun parobahan dina Repository situs tanpa bentrok, lengkah saterusna bakal clone Repository situs unggal waktu:

   - 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

Léngkah ieu nyauran variabel sistem:

  • variabel GITHUB_ACTOR GitHub masang sorangan, sareng ieu mangrupikeun nami pangguna anu lepatna naskah ieu diluncurkeun;
  • variabel secrets.ACCESS_TOKEN ieu dihasilkeun token pikeun ngatur Github, urang tiasa lulus salaku variabel lingkungan ku netepkeunana dina tab Secrets setélan gudang urang. Punten dicatet yén salami generasi token bakal disayogikeun ka urang sakali, moal aya aksés deui kana éta. Kitu ogé nilai barang Rahasia.

5) Hayu urang ngaléngkah ka ngahasilkeun halaman kami:

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

Parameter anu dikirimkeun ka generator tanggung jawab kana diréktori dimana file anu dihasilkeun bakal dikirim (-o output) sareng file konfigurasi anu kami anggo pikeun ngahasilkeun (-s publishconf.py; Anjeun tiasa maca ngeunaan pendekatan pikeun misahkeun config lokal sareng config pikeun publikasi dina dokuméntasi Pelican).

Hayu atuh ngingetkeun maneh naon dina folder urang output Repositori situs parantos diklon.

6) Hayu urang nyetél git sareng indéks file anu dirobih:

    - 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

Dina titik ieu, variabel anu parantos dipikanyaho dianggo, sareng diréktori kerja dituduhkeun dimana paréntah tina léngkah ieu bakal diluncurkeun. Paréntah pikeun muka diréktori kerja bakal katingali sapertos - cd output.

7) Hayu urang ngahasilkeun pesen komitmen, bunuh parobihan sareng nyorong kana gudang. Janten komitna henteu sia-sia sahingga henteu ngahasilkeun kasalahan dina bash (hasil kaluaran henteu 0) — kahiji, hayu urang pariksa naha éta téh perlu bunuh jeung nyorong hiji hal pisan. Jang ngalampahkeun ieu kami nganggo paréntah git diff-index --quiet --cached HEAD -- nu bakal kaluaran ka terminal 0 lamun euweuh parobahan relatif ka versi saméméhna loka éta, jeung 1 aya parobahan kitu. Teras we ngolah hasil paréntah ieu. Ku kituna, dina informasi ngeunaan palaksanaan naskah, urang bakal ngarekam informasi mangpaat ngeunaan kaayaan situs dina tahap ieu, tinimbang otomatis nabrak jeung ngirim kami laporan ngeunaan kacilakaan Aksara.

Kami ogé ngalaksanakeun tindakan ieu dina diréktori kami kalayan halaman anu siap-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

hasil

Hasilna, skrip sapertos kitu ngamungkinkeun anjeun henteu mikir ngeunaan nyiptakeun halaman statik. Ku nambahkeun parobahan langsung ka gudang swasta, naha ku gawé bareng git ti handapeun sistem naon atawa nyieun file ngaliwatan panganteur web GitHub, Aksi bakal ngalakukeun sagalana sorangan. Upami naskahna ngadat teu disangka-sangka, bewara bakal dikirim ka email anjeun.

Kode lengkep

Kuring bakal ngantunkeun versi kerja kuring, dimana léngkah terakhir nambihan ngirim béwara yén komitmen parantos kadorong ka gudang utama.

Rahasia anu dijelaskeun di luhur dianggo, dimana token bot sareng ID pangguna anu kedah dikirimkeun pesenna.

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

Potret layar

Aksi GitHub salaku CI / CD pikeun situs dina generator statik sareng Halaman GitHub
Hasil tina salah sahiji jalan ditampilkeun dina tab Aksi tina gudang sumber

Aksi GitHub salaku CI / CD pikeun situs dina generator statik sareng Halaman GitHub
Pesen ti bot ngeunaan parantosan naskah

link mangpaat

Pamahaman Tindakan
Sintaksis tindakan
Daptar micu
Pilihan Lingkungan Virtual
Kaca Github
Daptar generator statik

sumber: www.habr.com

Tambahkeun komentar