BASHプログラミング
 Computer >> コンピューター >  >> プログラミング >> BASHプログラミング

GitHubアクションとページを使用してGitHubイベントデータを公開する方法

GitHubで作業するチームは、コラボレーションのためにイベントデータに依存しています。問題、プルリクエスト、コメントとして記録されたデータは、プロジェクトを理解するために不可欠になります。

GitHub Actionsが一般提供されているため、プログラムでGitHubイベントデータにアクセスしてリポジトリに保存することができます。データをリポジトリ自体の一部にすることは、GitHubの外部でデータを保存する方法です。また、GitHubPagesなどの前面のWebサイトでデータを紹介する機能も提供します。

そして、あなたが私のようであれば、GitHubの問題のコメントを素晴らしい90年代のゲストブックページに変えることができます。

使用法に関係なく、基本的な概念は同じです。アクションを使用して、1つのワークフローファイルでGitHubイベントデータにアクセス、保存、表示できます。プロセスを説明するために、ゲストブックを際立たせるワークフローコードを紹介します。

ワークフローのトリガー方法など、GitHubアクションの概要については、「GitHubアクションを使用したツールに依存しない軽量のCI/CDフロー」を参照してください。

GitHubイベントデータへのアクセス

アクションワークフローは、いくつかのデフォルトの環境変数がある環境で実行されます。イベントデータなど、便利な情報がたくさんここにあります。イベントデータにアクセスする最も完全な方法は、 $ GITHUB_EVENT_PATHを使用することです。 変数、完全なJSONイベントペイロードを含むファイルのパス。

展開されたパスは、 /home/runner/work/_temp/_github_workflow/event.jsonのようになります。 そのデータはそのwebhookイベントに対応しています。 Webhookイベントデータのドキュメントは、GitHubRESTAPIのイベントタイプとペイロードにあります。 JSONデータをワークフロー環境で利用できるようにするには、 jqなどのツールを使用できます。 イベントデータを解析して環境変数に入れます。

以下では、問題コメントイベントからコメントIDを取得します:

ID="$(jq '.comment.id' $GITHUB_EVENT_PATH)"

ほとんどのイベントデータは、 github.eventからも入手できます。 JSONを解析する必要のないコンテキスト変数。同じコメントIDを取得する以下の例のように、フィールドにはドット表記を使用してアクセスします。

ID=${{ github.event.comment.id }}

ゲストブックでは、ユーザーのハンドルと日付と時刻を含むエントリを表示したいと思います。このイベントデータは次のようにキャプチャできます:

AUTHOR=${{ github.event.comment.user.login }}
DATE=${{ github.event.comment.created_at }}

シェル変数はデータにアクセスするのに便利ですが、一時的なものです。ワークフロー環境は実行ごとに新しく作成され、1つのステップで設定されたシェル変数でさえ他のステップに保持されません。キャプチャされたデータを永続化するには、アーティファクトを使用するか、リポジトリにコミットするかの2つのオプションがあります。

イベントデータの保存:アーティファクトの使用

アーティファクトを使用すると、リポジトリにコミットせずにワークフロージョブ間でデータを永続化できます。これは、たとえば、データをより永続的な場所に配置する前に、データを変換または組み込む場合に便利です。次の理由により、ワークフロージョブ間でデータを保持する必要があります。

ワークフローの各ジョブは、仮想環境の新しいインスタンスで実行されます。ジョブが完了すると、ランナーは終了し、仮想環境のインスタンスを削除します。 (アーティファクトを使用したワークフローデータの永続化)

アーティファクトの使用を支援する2つのアクション: upload-artifact およびdownload-artifact 。これらのアクションを使用して、同じワークフロー内の他のジョブでファイルを使用できるようにすることができます。完全な例については、ワークフロー内のジョブ間でのデータの受け渡しを参照してください。

upload-artifact アクションのaction.yml キーワードの説明が含まれています。アップロードされたファイルは.zipに保存されます フォーマット。同じワークフロー実行の別のジョブで、 download-artifactを使用できます 別のステップでデータを利用するためのアクション。

ワークフロー実行ページのリポジトリの[アクション]タブでアーカイブを手動でダウンロードすることもできます。

生成されたアーティファクトはワークフロー環境でのみライブであるため、ジョブ間でワークフローデータを永続化しても、リポジトリファイルは変更されません。

個人的には、シェル環境での作業に慣れているため、アーティファクトの使用例は限られていますが、アーティファクトは言うまでもありません。ジョブ間でデータを渡すだけでなく、 .zipの作成にも役立つ可能性があります。 たとえば、テスト出力データのアーカイブをフォーマットします。ゲストブックの例の場合、1つのジョブで必要なすべての手順を実行するだけで、ジョブ間でデータを渡す必要がなくなりました。

イベントデータの保存:ワークフローファイルをリポジトリにプッシュ

ワークフローでキャプチャされたデータをリポジトリ自体に保存するには、このデータをGitリポジトリに追加してプッシュする必要があります。ワークフローでこれを行うには、データを使用して新しいファイルを作成するか、シェルコマンドを使用して既存のファイルにデータを追加します。

ワークフローでのファイルの作成

ワークフローでリポジトリファイルを操作するには、 checkoutを使用します 使用するコピーを最初に取得するアクション:

- uses: actions/checkout@master
  with:
    fetch-depth: 1

ゲストブックにコメントを追加するために、シェル変数にキャプチャされたイベントデータを適切なファイルに変換し、シェルパラメータ展開の置換を使用してユーザー入力をサニタイズし、改行を段落に変換します。以前、ユーザー入力を慎重に扱う必要がある理由について書きました。

- name: Turn comment into file
  run: |
    ID=${{ github.event.comment.id }}
    AUTHOR=${{ github.event.comment.user.login }}
    DATE=${{ github.event.comment.created_at }}
    COMMENT=$(echo "${{ github.event.comment.body }}")
    NO_TAGS=${COMMENT//[<>]/\`}
    FOLDER=comments

    printf '%b\n' "<div class=\"comment\"><p>${AUTHOR} says:</p><p>${NO_TAGS//$'\n'/\<\/p\>\<p\>}</p><p>${DATE}</p></div>\r\n" > ${FOLDER}/${ID}.html

printfを使用する >で出力を指示します 新しいファイルに、イベントデータは、キャプチャされたイベントデータを含むコメントID番号で名前が付けられたHTMLファイルに変換されます。フォーマットすると、次のようになります:

<div class="comment">
  <p>victoriadrake says:</p>
  <p>This is a comment!</p>
  <p>2019-11-04T00:28:36Z</p>
</div>

コメントを操作する場合、コメントIDを使用してファイルに名前を付けると、同じIDを持つ新しいファイルが以前のファイルを上書きするという効果があります。これは、コメントを編集して元のコメントファイルを置き換えることができるため、ゲストブックに便利です。

Hugoのような静的サイトジェネレーターを使用している場合は、Markdown形式のファイルを作成し、それを content /に貼り付けることができます。 フォルダ、および通常のサイトビルドが残りの処理を行います。

私の単純なゲストブックの場合、個々のコメントファイルをページに統合するための追加の手順があります。実行するたびに、既存の index.htmlが上書きされます header.htmlを使用 部分(> )、次に(>> を検索して追加します )すべてのコメントファイルの内容を降順で、最後に footer.htmlを追加します ページを終了する部分。

- name: Assemble page
  run: |
    cat header.html > index.html
    find comments/ -name "*.html" | sort -r | xargs -I % cat % >> index.html
    cat footer.html >> index.html
リポジトリへの変更のコミット

checkout以降 アクションはリポジトリのクローン作成とまったく同じではありません。執筆時点では、まだ回避すべき問題がいくつかあります。 pull するには、いくつかの追加手順が必要です。 、 checkout 、正常に push masterに戻ります ブランチですが、これはシェルで非常に簡単に行われます。

以下は、ワークフローによって行われた変更を追加、コミット、およびリポジトリの masterにプッシュする手順です。 ブランチ。

- name: Push changes to repo
  run: |
    REMOTE=https://${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}
    git config user.email "${{ github.actor }}@users.noreply.github.com"
    git config user.name "${{ github.actor }}"

    git pull ${REMOTE}
    git checkout master
    git add .
    git status
    git commit -am "Add new comment"
    git push ${REMOTE} master

リモート、実際にはリポジトリは、 github.repositoryを使用して指定されます コンテキスト変数。ワークフローをマスターにプッシュできるようにするには、 secrets.GITHUB_TOKENを使用します 変数。

ワークフロー環境は光沢があり新生児であるため、Gitを構成する必要があります。上記の例では、 github.actorを使用しました ワークフローを開始するアカウントのユーザー名を入力するコンテキスト変数。メールは、デフォルトの noreplyを使用して同様に構成されます GitHubのメールアドレス。

イベントデータの表示

2019年11月6日修正:GitHub Actionsでは、Pagesサイトのビルドをトリガーするためにパーソナルアクセストークンが必要です。

デフォルトのsecrets.GITHUB_TOKENでGitHubPagesを使用している場合 変数であり、サイトジェネレーターがない場合、ワークフローでリポジトリに変更をプッシュすると、リポジトリファイルのみが更新されます。 GitHub Pagesビルドは、「サイトのビルドに問題があります:ページビルドに失敗しました」というエラーで失敗します。

アクションがPagesサイトのビルドをトリガーできるようにするには、パーソナルアクセストークンを作成する必要があります。このトークンは、リポジトリ設定にシークレットとして保存し、デフォルトの secrets.GITHUB_TOKENの代わりにワークフローに渡すことができます。 変数。この投稿では、アクション環境と変数について詳しく説明しました。

パーソナルアクセストークンを使用すると、アクションワークフローによって開始されたプッシュによってページサイトも更新されます。私のゲストブックにコメントを残すことで、あなた自身でそれを見ることができます!コメント作成イベントがワークフローをトリガーし、ゲストブックページの実行と更新に約30秒から1分かかります。

Hugoを使用する場合など、変更を公開するためにサイトビルドが必要な場合は、アクションでもこれを実行できます。ただし、意図しないループの作成を回避するために、1つのアクションワークフローが別のワークフローをトリガーすることはありません。代わりに、Makefileを使用してサイトを構築するプロセスを処理すると非常に便利です。これにより、任意のワークフローを実行できます。ワークフロージョブの最後のステップとして、必要に応じてリポジトリトークンを使用して、Makefileの実行を追加するだけです。

- name: Run Makefile
  env:
    TOKEN: ${{ secrets.GITHUB_TOKEN }}
  run: make all

これにより、ワークフローの最終ステップで更新されたサイトが確実に構築および展開されます。

これ以上のイベントデータホライズンはありません

GitHub Actionsは、イベントデータをキャプチャして利用するための優れた方法を提供するため、GitHub内でのみ利用できるわけではありません。可能性はあなたの想像力と同じくらい限られています!これにより作成できるもののアイデアをいくつか紹介します。

  1. 公開されている問題ボード。GitHubアカウントを持たない顧客は、プロジェクトの問題を表示してフィードバックを提供できます。
  2. 任意のリポジトリの新しい問題、コメント、またはPRのRSSフィードを自動的に更新します。
  3. GitHubの発行コメントを入力メソッドとして利用する静的サイトのコメントシステム。
  4. 素晴らしい90年代のゲストブックページ。

私は90年代のゲストブックページを作ったと言いましたか?私の内なるジオシティーズオタクは少し興奮しています。


  1. Google ドライブと暗号化を使用して WhatsApp データを安全に保つ方法

    WhatsApp は、友人や家族と通信するための最も一般的な方法になりました。動画、画像、ジョーク、連絡先などを WhatsApp で共有しています。デバイスの内部ストレージに保存されている貴重な写真やビデオをすべて失ったらどうなるか考えたことはありますか?大変そうですよね?そうではありません! WhatsApp が Google と提携して、Google ドライブの Google アカウントのデータを暗号化してバックアップしてからではありません。 プロセスは非常に簡単で、WhatsApp データを Google ドライブと同期して保護するだけです。そのため、貴重なチャットやメディアを紛失し

  2. Windows 10 でファイル履歴を使用してデータを保存および復元する方法

    ハードドライブの故障、停電、その他の問題などの予期しない状況から重要なファイルやドキュメントを保存することがいかに重要であるかを理解しています.できれば、データを定期的にバックアップする必要があります。ただし、Windows OS について言えば、すべての重要なファイルを USB ドライブ (少量のデータの場合) やハード ドライブ (大量のデータの場合) などの外部ストレージ デバイスに定期的にコピーできます。気楽な人は、毎日 (または好みに応じて) クラウド ストレージにデータを自動的にバックアップできるソフトウェアを購入できます。一方、「ファイル履歴」と呼ばれる Windows 10 の