GitHub үйлдлүүд нь статик генератор болон GitHub хуудас дээрх сайтын CI/CD хэлбэрээр.

GitHub үйлдлүүд нь статик генератор болон GitHub хуудас дээрх сайтын CI/CD хэлбэрээр.

Хабрыг бага зэрэг судалж үзээд GitHub-ийн (бета) функц болох Үйлдлийн сэдвээр маш цөөхөн нийтлэл нийтлэгдсэнд би гайхсан.

Ийм дутуу мэдэгдлийг функц нь "бета" ч гэсэн туршилтын шатандаа байгаатай холбон тайлбарлаж болох юм шиг санагдаж байна. Гэхдээ энэ нь бета хувилбарын ашигтай шинж чанар бөгөөд энэ хэрэгслийг хувийн хадгалах газарт ашиглах боломжийг олгодог. Энэ технологитой ажиллах талаар би энэ нийтлэлд ярих болно.

Түүхийн өмнөх үе

Хэрэв бид дарааллаар нь эхэлбэл "Миний тухай" хувийн вэбсайтыг хадгалах хурдан, хялбар, хялбар, үнэ төлбөргүй сонголтыг хайж олох явцад би хэдэн шөнө өнгөрөөж, олон нийтлэлийг самнах шаардлагатай болсон гэдгийг дурдах нь зүйтэй болов уу.

Зарим хүмүүс хостинг, зарим нь үүлэн серверийг сонгож, энэ бүхний ажил, харилцан үйлчлэл, төлбөрийг ойлгохыг хүсдэггүй хүмүүс статик сайтуудыг хадгалах газарт байршуулах дуртай байдаг тул одоо үүнийг GitHub болон GitLab дээр хийх боломжтой.

Мэдээжийн хэрэг, энэ нь хүн бүрийн хувийн сонголт юм.

Миний эцсийн сонголт GitHub Pages байсан.

Хуудасны тухай

Хэн мэдэхгүй байна gh-pages - энэ нь баримт бичгийг вэбсайт хэлбэрээр хадгалах сонголт бөгөөд үүнийг үнэ төлбөргүй олгодог бөгөөд баримт бичгээс гадна хувийн вэбсайтуудыг хадгалахыг санал болгож байна. Энэ функцийг GitHub-аас бүх хэрэглэгчдэд олгодог бөгөөд хадгалах сангийн тохиргоонд ашиглах боломжтой.

Төслийн агуулах нь салбарыг ашигладаг gh-pages, хэрэглэгчийн сайтын хувьд - нэртэй тусдаа хадгалах газар username.github.io сайтын эх сурвалжтай master салбар.

Та дэлгэрэнгүй мэдээллийг харах боломжтой баримт бичигт, гэхдээ GitHub нь зүгээр л файл нэмж ийм сайт руу өөрийн домайныг холбох боломжийг олгодог гайхалтай өгөөмөр гэдгийг би зүгээр л тэмдэглэе. CNAME домэйн нэрээр болон GitHub серверүүд дээр домэйн үйлчилгээ үзүүлэгчийнхээ DNS-г тохируулна уу.

Ийм сайтыг хэрхэн хөгжүүлэх талаар олон нийтлэл байгаа гэдэгт би итгэлтэй байна, тиймээс би энэ талаар цаашид ярихгүй.

Асуудал гарах үед

Асуудал нь статик генераторыг ашиглах үед хуудас үүсгэх, тэдгээрийг репозитор руу ачаалах үйл явцыг хялбаршуулахын тулд нэмэлт скрипт бичих, номын санг ашиглах шаардлагатай болсон явдал байв. Энгийнээр хэлэхэд, хэрэв та эх сурвалжийг тусдаа хувийн хадгалах газарт хадгалдаг бол сайтад ямар нэгэн өөрчлөлт гарах бүрт дараа нь статик хуудсуудыг бий болгох, сайтын үндсэн репозиторыг нийтлэхийн тулд локал орчныг байрлуулах шаардлагатай болдог.

Элбэг дэлбэг байна статик генераторууд мөн тэд бүгд ижил асуудалтай байдаг. Эдгээр үйлдлүүд нь хэтэрхий их цаг хугацаа, хүчин чармайлт шаарддаг бөгөөд ялангуяа үйлдлийн системээс үйлдлийн систем рүү хэд хэдэн удаа шилжсэн эсвэл хатуу диск дээрх өгөгдөл алдагдсаны дараа сайт дээрх ажлыг удаашруулдаг. (энэ нь миний тохиолдолд байсан).

Саяхан, вэбсайт дээрх попап мэдэгдэл эсвэл GitHub-ийн мэдээллийн товхимол дээр шинээр баригдсан CI/CD-г анзаарсан нь эдгээр үйлдлийг хамгийн бага хүчин чармайлтаар гүйцэтгэх боломжийг олгосон.

Статик хуудас үүсгэгчийн тухай

Би энэ дэд зүйлд онцгой анхаарал хандуулахгүй, гэхдээ дараахь зүйлийг сонгох, ашиглах явцад олж авсан хэд хэдэн диссертацийг хуваалцах болно.

1) өөрийн програмчлалын хэлэнд тохирсон генератор эсвэл аль болох ойлгомжтой генераторыг сонго. Би өөрөө сайтыг ажиллуулахын тулд зарим функцийг нэмж, илүү тогтвортой байдал, автоматжуулалтыг хангахын тулд таяг нэмэх шаардлагатай үед би энэ санааг олж авсан. Нэмж дурдахад энэ нь нэмэлт функцийг залгаас хэлбэрээр өөрөө бичих сайн шалтгаан юм;

2) аль генераторыг сонгох нь хувь хүний ​​сонголт боловч GitHub Pages-ийн функцийг анх удаа оруулахын тулд та эхлээд суулгах хэрэгтэй гэдгийг анхаарч үзэх хэрэгтэй. Jekyll. Аз болоход энэ нь танд репозитор дахь эх сурвалжаас вэбсайт үүсгэх боломжийг олгодог (Би үүнийг өөрийн сонголтоор давтах болно).

Миний генераторын сонголт эхний цэг дээр суурилдаг. Пеликан Python хэл дээр бичигдсэн нь надад харийн зүйл болох Жекиллийг амархан сольсон (бараг нэг жил ашигласан). Үүний үр дүнд нийтлэл үүсгэх, засварлах, вэбсайт дээр ажиллах нь надад сонирхолтой хэлээр нэмэлт туршлага өгдөг.

__

Асуудлын тодорхойлолт

Гол ажил бол хувийн репозитороос статик хуудсыг автоматаар үүсгэх скрипт (үнэндээ тохиргооны файл) бичих явдал юм. Шийдэл нь виртуал орчны функцийг хамарна. Скрипт нь өөрөө бэлэн хуудсуудыг нийтийн санд нэмж оруулах болно.

Шийдвэрлэх хэрэгсэл

Асуудлыг шийдэхийн тулд бидний ашиглах хэрэгслүүд:

  • GitHub үйлдлүүд;
  • Python3.7;
  • хотон;
  • Git;
  • GitHub хуудаснууд.

Алдааг олж засварлах

Тиймээс баримт бичигтэй бага зэрэг танилцаж, Actions-ийн скриптүүд хэрхэн бичигддэгийг ойлгосны дараа энэ механизм үүссэн асуудлыг бүрэн шийдвэрлэх нь тодорхой болсон. Бичиж байх үед та энэ функцийг ашиглахын тулд бүртгүүлэх ёстой. бета туршилтын хувьд!

GitHub үйлдлүүд нь статик генератор болон GitHub хуудас дээрх сайтын CI/CD хэлбэрээр.
Github өөрөө шинэ функцийн тайлбар

Үйлдлийн скрипт бичих нь хавтас дотор нэртэй файл үүсгэхээс эхэлдэг .github болон түүний дэд хавтас workflows. Үүнийг гараар эсвэл хадгалах хуудасны Үйлдлүүд таб дахь засварлагчаас хийж болно.

GitHub үйлдлүүд нь статик генератор болон GitHub хуудас дээрх сайтын CI/CD хэлбэрээр.
Хоосон скрипт маягтын жишээ

Би маягтын талаар товч тайлбар өгөх болно

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 манай репозиторын тохиргоо. Токеныг үүсгэх явцад бидэнд нэг удаа олгогддог тул цаашид хандах боломжгүй гэдгийг анхаарна уу. Нууцын зүйлсийн үнэ цэнэ.

5) Бид хуудсаа үүсгэх рүү шилжье:

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

Генератор руу дамжуулсан параметрүүд нь үүсгэсэн файлуудыг илгээх директорийг хариуцдаг (-o output) болон бидний үүсгэхэд ашигладаг тохиргооны файл (-s publishconf.py; Та Пеликаны баримт бичигт хэвлэн нийтлэх орон нутгийн тохиргоо болон тохиргоог салгах аргын талаар уншиж болно.).

Манай хавтсанд юу байгааг сануулъя 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 өөрөө бүгдийг хийх болно. Хэрэв скрипт гэнэт гацвал таны имэйлд мэдэгдэл илгээгдэх болно.

Бүрэн код

Би ажлын хувилбараа үлдээх болно, үүнд сүүлчийн алхам нь үндсэн репозитор руу үүрэг шилжүүлсэн тухай мэдэгдэл илгээх болно.

Дээр дурдсан Нууцуудыг ашигладаг бөгөөд үүнд бот токен болон мессеж илгээх хэрэглэгчийн ID-г нэмж оруулсан болно.

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 үйлдлүүд нь статик генератор болон GitHub хуудас дээрх сайтын CI/CD хэлбэрээр.
Эх сурвалжийн репозиторын Үйлдлүүд таб дээр гүйлтийн аль нэгийн үр дүнг харуулав

GitHub үйлдлүүд нь статик генератор болон GitHub хуудас дээрх сайтын CI/CD хэлбэрээр.
Скрипт дууссан тухай ботоос ирсэн мессеж

Ашигтай холбоосууд

Үйлдлүүдийг ойлгох
Үйлдлийн синтакс
Өдөөгч хүчин зүйлсийн жагсаалт
Виртуал орчинд зориулсан сонголтууд
Github хуудаснууд
Статик генераторын жагсаалт

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх