स्थिर जनरेटर र GitHub पृष्ठहरूमा साइटको लागि CI/CD को रूपमा GitHub कार्यहरू

स्थिर जनरेटर र GitHub पृष्ठहरूमा साइटको लागि CI/CD को रूपमा GitHub कार्यहरू

Habr लाई अलिकति स्काउर गरेपछि, म छक्क परें कि GitHub को (beta) सुविधा - कार्यको विषयमा धेरै थोरै लेखहरू प्रकाशित भएका छन्।

यस्तो देखिन्छ कि यस्तो अधोरेखण तथ्य द्वारा व्याख्या गर्न सकिन्छ कि कार्यक्षमता अझै पनि परीक्षण मा छ, यद्यपि "बीटा"। तर यो बिटाको उपयोगी सुविधा हो जसले यो उपकरणलाई निजी भण्डारहरूमा प्रयोग गर्न अनुमति दिन्छ। यो यस टेक्नोलोजीसँग काम गर्ने बारे हो जुन म यस लेखमा कुरा गर्नेछु।

प्रागैतिहासिक

यदि हामीले क्रमबद्ध रूपमा सुरु गर्यौं भने, यो सम्भवतः उल्लेख गर्न लायक छ कि व्यक्तिगत "मेरो बारेमा" वेबसाइट भण्डारण गर्नको लागि छिटो, सुविधाजनक, सजिलो र नि: शुल्क विकल्प खोज्ने प्रक्रियामा, मैले धेरै रातहरू बिताउनुपर्‍यो र धेरै लेखहरू मार्फत कंघी गर्नुपर्‍यो।

केही व्यक्तिहरूले होस्टिङ रोज्छन्, अरूले क्लाउड सर्भर, र ती सबैको लागि काम, अन्तरक्रिया र भुक्तानी बुझ्न चाहँदैनन् जस्तै भण्डारमा स्थिर साइटहरू अपलोड गर्ने, किनकि अब यो GitHub र GitLab दुवैमा गर्न सकिन्छ।

निस्सन्देह, यो सबैको व्यक्तिगत छनौट हो।

मेरो अन्तिम छनौट GitHub पृष्ठहरू थियो।

पृष्ठहरूको बारेमा

कसलाई थाहा छैन gh-pages - यो एक वेबसाइट को रूप मा कागजात भण्डारण को लागी एक विकल्प हो र यो नि: शुल्क प्रदान गरिएको छ, र कागजात को अतिरिक्त, यो पनि व्यक्तिगत वेबसाइटहरु भण्डारण गर्न को लागी प्रस्ताव गरिएको छ। यो कार्यक्षमता GitHub द्वारा सबै प्रयोगकर्ताहरूलाई प्रदान गरिएको छ र भण्डार सेटिङहरूमा उपलब्ध छ।

परियोजना भण्डारले शाखा प्रयोग गर्दछ gh-pages, एक प्रयोगकर्ता साइट को लागी - नाम संग एक अलग भण्डार username.github.io मा साइट स्रोतहरु संग master साखा।

तपाईं थप विवरणहरू हेर्न सक्नुहुन्छ कागजातमा, तर मलाई केवल नोट गर्नुहोस् कि GitHub अचम्मको रूपमा उदार छ कसैलाई पनि आफ्नो डोमेनलाई त्यस्ता साइटमा फाइल थपेर लिङ्क गर्न अनुमति दिनमा। CNAME डोमेन नामको साथ र GitHub सर्भरहरूमा तपाईंको डोमेन प्रदायकको DNS सेटअप गर्नुहोस्।

म पक्का छु कि यस्तो साइट कसरी विकास गर्ने भन्ने बारे यहाँ धेरै लेखहरू छन्, त्यसैले म अगाडि कुरा गर्न जाँदैछु।

समस्या उत्पन्न हुन्छ

समस्या यो थियो कि स्थिर जेनेरेटर प्रयोग गर्दा, पृष्ठहरू उत्पन्न गर्ने र भण्डारमा लोड गर्ने प्रक्रियालाई सरल बनाउन थप लिपिहरू लेख्न र पुस्तकालयहरू प्रयोग गर्न आवश्यक छ। सरल रूपमा, यदि तपाइँ स्रोतहरूलाई छुट्टै निजी भण्डारमा भण्डार गर्नुहुन्छ भने, प्रत्येक पटक साइटमा कुनै पनि परिवर्तन हुँदा, स्थिर पृष्ठहरू र मुख्य साइट भण्डारमा प्रकाशनको पछिल्लो पुस्ताको लागि स्थानीय वातावरण प्रयोग गर्न आवश्यक थियो।

प्रचुरता छ स्थिर जनरेटरहरू र तिनीहरू सबैको एउटै समस्या छ। यी कार्यहरूले धेरै समय र प्रयास लिन्छ, र अन्ततः साइटमा कामलाई सुस्त बनाउँछ, विशेष गरी OS बाट OS मा धेरै माइग्रेसनहरू वा हार्ड ड्राइभहरूमा डेटा हराउने घटनाहरू पछि। (यो मेरो मामला मा मामला थियो).

भर्खरै, या त वेबसाइटमा पप-अप अधिसूचनामा वा GitHub बाट न्यूजलेटरमा, नयाँ निर्मित CI/CD देखियो, जसले यी कार्यहरूलाई न्यूनतम प्रयासमा गर्न सम्भव बनायो।

स्थिर पृष्ठ जनरेटरहरूको बारेमा

म यस उप-वस्तुमा विशेष ध्यान केन्द्रित गर्ने छैन, तर म निम्नको चयन र प्रयोगको क्रममा आएको केही थेसिसहरू साझा गर्नेछु:

1) तपाईंको प्रोग्रामिङ भाषामा उपयुक्त हुने जनरेटर वा सम्भव भएसम्म स्पष्ट छनोट गर्नुहोस्। म यो विचारमा एक समयमा आएको थिएँ जब म आफैंले साइटलाई काम गर्नका लागि केही कार्यक्षमता थप्नुपर्‍यो, यसको ठूलो स्थिरता र स्वचालनको लागि बैसाखी थप्नुपर्‍यो। थप रूपमा, यो प्लगइनहरूको रूपमा अतिरिक्त कार्यक्षमता आफैं लेख्ने राम्रो कारण हो;

२) कुन जेनेरेटर छनौट गर्ने व्यक्तिगत छनौट हो, तर यो विचार गर्न लायक छ कि GitHub पृष्ठहरूको कार्यक्षमताको काममा प्रारम्भिक विसर्जनको लागि, तपाईंले पहिले स्थापना गर्नुपर्छ। Jekyll। सौभाग्य देखि, यसले तपाईंलाई स्रोतहरूबाट सीधा भण्डारमा वेबसाइट उत्पन्न गर्न अनुमति दिन्छ (म यो मेरो छनोट संग दोहोर्याउनेछु).

जेनेरेटरको मेरो छनौट पहिलो बिन्दुमा आधारित छ। पेलिकन जुन पाइथनमा लेखिएको छ सजिलै जेकिललाई प्रतिस्थापन गरियो, जुन मेरो लागि विदेशी हो (लगभग एक वर्षको लागि प्रयोग गरियो)। नतिजाको रूपमा, लेखहरू सिर्जना र सम्पादन गर्न र वेबसाइटमा काम गर्दा पनि मलाई रोचक भाषामा थप अनुभव दिन्छ।

__

समस्याको गठन

मुख्य कार्य भनेको स्क्रिप्ट लेख्नु (वास्तवमा कन्फिगरेसन फाइल) हो जसले स्वचालित रूपमा निजी भण्डारबाट स्थिर पृष्ठहरू उत्पन्न गर्दछ। समाधानले भर्चुअल वातावरणको कार्यक्षमता समावेश गर्नेछ। स्क्रिप्टले नै सार्वजनिक भण्डारमा तयार पृष्ठहरू थप्नेछ।

समाधानका लागि उपकरणहरू

हामीले समस्या समाधान गर्न प्रयोग गर्ने उपकरणहरू:

  • GitHub कार्यहरू;
  • पाइथन २.७;
  • पेलिकन;
  • गिट;
  • GitHub पृष्ठहरू।

समस्या निवारण

त्यसोभए, कागजातसँग थोरै परिचित भएपछि र कार्यहरूको लागि लिपिहरू कसरी लेखिन्छ भनेर बुझेपछि, यो स्पष्ट भयो कि यो संयन्त्रले उत्पन्न भएको समस्यालाई पूर्ण रूपमा समाधान गर्नेछ। लेख्ने समयमा, तपाईंले यो कार्यक्षमता प्रयोग गर्न सदस्यता लिनुपर्छ। बीटा परीक्षणको लागि!

स्थिर जनरेटर र 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 आवश्यक कार्यक्षमतासँग धेरै सन्तुष्ट छ। हेर्दै उपलब्ध उपकरणहरू यो स्पष्ट हुन्छ कि यो कुनै पनि आवश्यक वा केवल सुविधाजनक छवि (वा यसमा आधारित डकर कन्टेनर) हुन सक्छ।

  build:
    runs-on: ubuntu-latest

3) चरणहरूमा, हामी मुख्य कामको लागि तयारी गर्न वातावरण तयार गर्नेछौं।

३.१) हामीलाई चाहिएको शाखामा जानुहोस् (मानक चरण checkout):

- uses: actions/checkout@v1

3.2) पाइथन स्थापना गर्नुहोस्:

    - 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 वेब इन्टरफेस मार्फत फाइल सिर्जना गरेर, कार्यहरूले आफैंले सबै काम गर्नेछ। यदि स्क्रिप्ट अप्रत्याशित रूपमा क्र्यास भयो भने, तपाईंको इमेलमा सूचना पठाइनेछ।

पूर्ण कोड

म मेरो काम गर्ने संस्करण छोड्नेछु, जसमा अन्तिम चरणले एक सूचना पठाउने थप गर्दछ कि प्रतिबद्धता मुख्य भण्डारमा धकेलिएको छ।

माथि वर्णन गरिएका गोप्य कुराहरू प्रयोग गरिन्छ, जहाँ बोट टोकन र प्रयोगकर्ता 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 पृष्ठहरूमा साइटको लागि CI/CD को रूपमा GitHub कार्यहरू
स्रोत भण्डारको कार्य ट्याबमा प्रदर्शित रन मध्ये एकको नतिजा

स्थिर जनरेटर र GitHub पृष्ठहरूमा साइटको लागि CI/CD को रूपमा GitHub कार्यहरू
स्क्रिप्ट पूरा भएको बारे बोटबाट सन्देश

उपयोगी लिङ्कहरू

कार्यहरू बुझ्दै
कार्य वाक्य रचना
ट्रिगरहरूको सूची
भर्चुअल वातावरणका लागि विकल्पहरू
Github पृष्ठहरू
स्थिर जेनरेटर सूची

स्रोत: www.habr.com

एक टिप्पणी थप्न