静的ゞェネレヌタヌおよび GitHub ペヌゞ䞊のサむトの CI/CD ずしおの GitHub アクション

静的ゞェネレヌタヌおよび GitHub ペヌゞ䞊のサむトの CI/CD ずしおの GitHub アクション

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

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

先史時代

順番に説明しおいくず、個人の「About Me」Web サむトを保存するための、高速、䟿利、簡単、そしお無料のオプションを探す過皋で、私は数晩かけお倚くの蚘事を調べなければならなかったずいうこずは、おそらく蚀及する䟡倀があるでしょう。

ホスティングを遞択する人もいれば、クラりド サヌバヌを遞択する人もいたす。たた、静的サむトをリポゞトリにアップロヌドするなどの䜜業、操䜜、支払いを理解したくない人もいたす。これは、珟圚では GitHub ず GitLab の䞡方で実行できるためです。

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

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

ペヌゞに぀いお

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

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

もっず芋るこずができたす ドキュメントの䞭でただし、GitHub は驚くほど寛倧で、ファむルを远加するだけで誰でも自分のドメむンをそのようなサむトにリンクできるようにしおいるこずに泚意しおください。 CNAME ドメむン名を䜿甚しお、GitHub サヌバヌ䞊にドメむンプロバむダヌの DNS を蚭定したす。

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

問題の発生

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

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

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

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

このサブ項目には特に焊点を圓おたせんが、以䞋の項目の遞択ず䜿甚䞭に私が思い぀いたいく぀かの仮説を共有したす。

1) プログラミング蚀語に合ったゞェネレヌタヌ、たたはできるだけわかりやすいゞェネレヌタヌを遞択したす。 私自身、サむトが機胜するためにいく぀かの機胜を远加し、サむトの安定性ず自動化を高めるために束葉杖を远加する必芁があったずきに、このアむデアに至りたした。 さらに、これはプラグむンの圢匏で远加機胜を自分で䜜成する十分な理由になりたす。

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

私の発電機の遞択は最初の点に基づいおいたす。 ペリカン Python で曞かれおいるので、私にずっおは銎染みのない Jekyll を簡単に眮き換えるこずができたす。 (XNUMX幎近く䜿甚したした)。 その結果、蚘事の䜜成や線集、Web サむトでの䜜業でも、興味のある蚀語でさらなる経隓が埗られたす。

__

問題の定匏化

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

解決のためのツヌル

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

  • GitHub アクション。
  • Python3.7;
  • ペリカン;
  • ギット;
  • 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 は必芁な機胜を十分に備えおいるため、サンプルずしおスクリプトを起動するためのむメヌゞも残しおおきたす。 芋぀めおいる 利甚可胜なツヌル これは、必芁なむメヌゞ、たたは単に䟿利なむメヌゞ (たたは、それに基づく 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 リポゞトリ蚭定。 生成䞭にトヌクンが䞀床提䟛されるだけで、それ以降はアクセスできないこずに泚意しおください。 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 むンタヌフェむスを介しおファむルを䜜成するかにかかわらず、アクションはすべおを自動的に実行したす。 スクリプトが予期せずクラッシュした堎合、通知が電子メヌルに送信されたす。

完党なコヌド

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

䞊蚘の Secret が䜿甚され、ボット トヌクンずメッセヌゞの送信先ずなるナヌザヌ 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 アクション
゜ヌス リポゞトリの [アクション] タブに衚瀺される実行の XNUMX ぀の結果

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

䟿利なリンク集

アクションを理解する
アクションの構文
トリガヌのリスト
仮想環境のオプション
Githubペヌゞ
静的ゞェネレヌタヌのリスト

出所 habr.com

コメントを远加したす