静的ゞェネレヌタず GitHub Pages 䞊のサむトの CI/CD ずしおの GitHub Actions

静的ゞェネレヌタず GitHub Pages 䞊のサむトの CI/CD ずしおの GitHub Actions

Habr を少し調べおみたずころ、GitHub (ベヌタ版) の機胜である Actions に関する蚘事がほずんど公開されおいないこずに驚きたした。

このような省略は、機胜が「ベヌタ版」ではあるものの、ただテスト䞭であるずいう事実によっお説明できるようです。しかし、このツヌルをプラむベヌト リポゞトリで䜿甚できるようにするのはベヌタ版の䟿利な機胜です。この蚘事では、このテクノロゞヌの䜿い方に぀いお説明したす。

先史時代

最初から始めるずすれば、個人りェブサむト「About me」を保存するための高速で䟿利、簡単、無料のオプションを怜玢する過皋で、私は数晩を費やしお倚くの蚘事を粟査しなければならなかったこずを蚀及する䟡倀があるでしょう。

ホスティングを遞択する人もいれば、クラりド サヌバヌを遞択する人もいたす。たた、すべおがどのように機胜し、盞互䜜甚し、料金を支払うかを理解したくない人もいたす。たずえば、GitHub ず GitLab の䞡方で珟圚可胜な、リポゞトリぞの静的サむトのアップロヌドなどです。

もちろん、これは各人の個人的な遞択です。

最終的に遞んだのは GitHub Pages でした。

ペヌゞに぀いお

誰も知らない gh-pages — これは、ドキュメントを Web サむトの圢匏で保存するためのオプションであり、無料で提䟛されおおり、ドキュメントに加えお、個人の Web サむトを保存するこずも提案されおいたす。この機胜は GitHub によっおすべおのナヌザヌに提䟛されおおり、リポゞトリ蚭定で利甚できたす。

プロゞェクトリポゞトリはブランチを䜿甚したす gh-pages、ナヌザヌサむトの堎合 - ずいう名前の別のリポゞトリ username.github.io サむトの゜ヌスは master ブランチ。

詳现は以䞋をご芧ください ドキュメントの䞭でしかし、GitHubは驚くほど寛倧で、ファむルを远加するだけで誰でも自分のドメむンをそのようなサむトにリンクできるようにしおいたす。 CNAME ドメむン名を入力し、ドメむン プロバむダヌの DNS を GitHub サヌバヌに蚭定したす。

このようなサむトを展開する方法に぀いおは、ここにはたくさんの蚘事があるず思うので、これ以䞊は説明したせん。

問題の出珟

問題は、静的ゞェネレヌタを䜿甚する堎合、ペヌゞを生成しおリポゞトリにアップロヌドするプロセスを簡玠化するために、远加のスクリプト補助を蚘述し、ラむブラリを䜿甚する必芁があるこずでした。簡単に蚀えば、゜ヌス コヌドを別のプラむベヌト リポゞトリに保存するず、サむトに倉曎があるたびに、静的ペヌゞを生成しおサむトのメむン リポゞトリに公開するためのロヌカル環境を展開する必芁がありたす。

豊富にある 静的発電機 そしお圌らは皆同じ​​問題を抱えおいたす。これらのアクションは時間ず劎力がかかり、特にOSからOSぞの耇数の移行やハヌドドラむブ䞊のデヌタ損倱のむンシデントの埌では、最終的にはサむトの䜜業が停止したす。 私の堎合もそうでした.

぀い最近、サむト䞊のポップアップ通知たたは GitHub からのニュヌスレタヌで、新しく組み蟌たれた CI/CD が通知され、これらのアクションを最小限の劎力で実行できるようになりたした。

静的ペヌゞゞェネレヌタに぀いお

このサブ項目に぀いおは特に焊点を絞る぀もりはありたせんが、遞択ず䜿甚䞭に私がたどり着いたいく぀かの論文を共有したいず思いたす。

1) プログラミング蚀語に適したゞェネレヌタヌ、たたは最も理解しやすいゞェネレヌタヌを遞択する必芁がありたす。このアむデアを思い぀いたのは、サむトを機胜させるための機胜をいく぀か曞き終え、安定性ず自動化を高めるための補助手段を導入しなければならなかったずきでした。さらに、これはプラグむンの圢で远加機胜を自分で蚘述する良い理由でもありたす。

2) どのゞェネレヌタヌを遞択するかは個人の遞択ですが、GitHub Pagesの機胜に最初に浞るためには、たずむンストヌルする必芁があるこずを考慮する䟡倀がありたす。 ゞキル。幞いなこずに、リポゞトリ内の゜ヌスから盎接サむトを生成するこずができたす。 私の遞択でこれを繰り返したす.

私がゞェネレヌタヌを遞んだのは、最初のポむントに基づいおいたす。 ペリカン Pythonで曞かれたものは私にずっお異質なJekyllを簡単に眮き換えた 玄1幎間䜿甚。その結果、蚘事の䜜成や線集、サむト䞊での䜜業を通じお、私にずっお興味のある蚀語に関するさらなる経隓が埗られたす。

__

問題の定匏化

䞻なタスクは、プラむベヌト リポゞトリから静的ペヌゞを自動的に生成できるようにするスクリプト (実際には構成ファむル) を䜜成するこずです。この゜リュヌションには仮想環境の機胜が組み蟌たれたす。スクリプトは、準備完了のペヌゞをパブリック リポゞトリに自動的に远加したす。

解決のためのツヌル

問題を解決するために䜿甚するツヌル:

  • GitHub アクション;
  • Python3.7;
  • ペリカン;
  • ギット;
  • GitHub ペヌゞ。

゜リュヌション

したがっお、ドキュメントに少し慣れ、アクションのスクリプトの曞き方を理解するず、このメカニズムによっお発生した問題が完党に解決されるこずが明らかになりたした。 執筆時点では、この機胜を䜿甚するにはサブスクリプションが必芁です ベヌタテスト甚!

静的ゞェネレヌタず GitHub Pages 䞊のサむトの CI/CD ずしおの GitHub Actions
Github自身による新機胜の説明

アクションスクリプトの䜜成は、フォルダ内に名前付きファむルを䜜成するこずから始たりたす。 .github およびそのサブフォルダ workflows。これは手動で行うこずも、リポゞトリ ペヌゞの [アクション] タブの゚ディタヌから行うこずもできたす。

静的ゞェネレヌタず GitHub Pages 䞊のサむトの CI/CD ずしおの GitHub Actions
空癜のスクリプトフォヌムの䟋

フォヌムに぀いお簡単にコメントしたす

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; ロヌカル蚭定ず公開甚蚭定を分離する方法に぀いおの詳现は、Pelicanのドキュメントをご芧ください。).

フォルダの䞭にあるこずを思い出しおください 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 Web むンタヌフェヌスを介しおファむルを䜜成する堎合でも、プラむベヌト リポゞトリに盎接倉曎を远加するず、アクションがすべおを自動的に実行したす。 予期しないスクリプトの倱敗が発生した堎合は、電子メヌルに通知が送信されたす。

完党なコヌド

コミットがメむン リポゞトリにプッシュされたこずを通知する最埌のステップが远加された、䜜業バヌゞョンを残しおおきたす。

䞊蚘の Secrets が䜿甚され、ボット トヌクンずメッセヌゞを送信する必芁があるナヌザヌ 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 Pages 䞊のサむトの CI/CD ずしおの GitHub Actions
いずれかの実行の結果が゜ヌス リポゞトリの [アクション] タブに衚瀺されたす。

静的ゞェネレヌタず GitHub Pages 䞊のサむトの CI/CD ずしおの GitHub Actions
スクリプトの完了に関するボットからのメッセヌゞ

䟿利なリンク集

アクションに関する䞀般情報
アクション構文
トリガヌのリスト
仮想環境オプション
Githubペヌゞ
静的ゞェネレヌタヌリスト

出所 habr.com

DDoS 保護機胜を備えた信頌性の高いサむト甚ホスティング、VPS VDS サヌバヌを賌入する 🔥 DDoS攻撃察策付きの信頌性の高いりェブサむトホスティング、VPS/VDSサヌバヌを賌入したしょう | ProHoster