ワークフローのキャッシュ、共有、デバッグ
このユニットでは、パフォーマンスを最適化し、ジョブ間でデータを渡し、ログとトークンを使用してワークフローのトラブルシューティングを行う方法について説明します。
このプロセスを実装するには、次の方法を学習します。
- より高速なワークフローのために依存関係をキャッシュします。
- ジョブ間で成果物データを渡す。
- ワークフローのデバッグ ログを有効にします。
- GitHub UI と REST API からワークフロー ログにアクセスします。
- GitHub アプリ認証にはインストール トークンを使用します。
キャッシュ アクションを使用して依存関係をキャッシュする
ワークフローを構築するときは、多くの場合、同じ出力を再利用するか、ある実行から別の実行に依存関係をダウンロードする必要があります。 これらの依存関係を繰り返しダウンロードするのではなく、それらをキャッシュして、ワークフローの実行速度と効率を向上させることができます。 GitHub でホストされるランナー上のジョブは毎回クリーンな仮想環境で開始されるため、依存関係をキャッシュすると、ワークフローで特定の手順を実行するのにかかる時間が短縮されます。
ジョブの依存関係をキャッシュするには、GitHub の cache アクションを使用します。 このアクションでは、指定した一意のキーによって識別されるキャッシュを取得します。 アクションによってキャッシュが検出されると、構成したパスにキャッシュされたファイルが取得されます。 cache アクションを使用するには、いくつかの特定のパラメーターを設定する必要があります。
| パラメーター | 説明 | 必須 |
|---|---|---|
Key |
キャッシュを保存および検索するときに作成されるキー識別子を参照します。 | イエス |
Path |
キャッシュまたは検索するランナー上のファイル パスを参照します。 | イエス |
Restore-keys |
目的のキャッシュ キーが見つからない場合にキャッシュする代替の既存のキーで構成されます。 | いいえ |
steps:
- uses: actions/checkout@v2
- name: Cache NPM dependencies
uses: actions/cache@v2
with:
path: ~/.npm
key: ${{ runner.os }}-npm-cache-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-npm-cache-
上の例では、path は ~/.npm に設定され、key にはランナーのオペレーティング システムと package-lock.json ファイルの SHA-256 ハッシュが含まれています。 npm-cache フォールバックを使用し、複数のキャッシュがある場合、キーのプレフィックスを ID (この例では restore-keys) にすると便利です。
ジョブ間で成果物データを渡す
ワークフロー内で依存関係をキャッシュするという考え方と同様に、同じワークフロー内のジョブ間でデータを渡すことができます。 upload-artifactアクションとdownload-artifactアクションを使用して、データを渡すことができます。 前のジョブの成果物に依存しているジョブの実行は、前のジョブが正常に完了するまで待機する必要があります。 この方法は、以前のジョブからアップロードされた成果物に基づいて順番に実行する必要がある一連のジョブがある場合に便利です。 たとえば、job_2 では job_1 構文を使用することにより needs: job_1 が必要となっています。
name: Share data between jobs
on: push
jobs:
job_1:
name: Upload File
runs-on: ubuntu-latest
steps:
- run: echo "Hello World" > file.txt
- uses: actions/upload-artifact@v2
with:
name: file
path: file.txt
job_2:
name: Download File
runs-on: ubuntu-latest
needs: job_1
steps:
- uses: actions/download-artifact@v2
with:
name: file
- run: cat file.txt
この例には 2 つのジョブがあります。 job_1 は、 file.txt ファイルにテキストを書き込みます。 その後、actions/upload-artifact@v2 アクションを使用してこの成果物をアップロードし、後でワークフロー内で使用できるようにデータを保存します。 job_2 は、job_1 に needs: job_1 構文を使用して完了することを要求します。 その後、actions/download-artifact@v2 アクションを使用してその成果物をダウンロードし、file.txt の内容を出力します。
ワークフローでステップ デバッグ ログを有効にする
場合によっては、既定のワークフロー ログでは、特定のワークフローの実行、ジョブ、またはステップが失敗した理由を診断するのに十分な詳細が提供されない場合があります。 これらのシナリオでは、 実行 と ステップの 2 つのオプションに対して、より多くのデバッグ ログを有効にすることができます。 リポジトリへの admin アクセスを必要とする 2 つのリポジトリ シークレットを trueに設定して、この診断ログを有効にします。
- 診断ログの実行を有効にするには、ワークフローを含むリポジトリの
ACTIONS_RUNNER_DEBUGシークレットをtrueに設定します。 - ステップ診断ログを有効にするには、ワークフローを含むリポジトリの
ACTIONS_STEP_DEBUGシークレットをtrueに設定します。
GitHub でワークフロー ログにアクセスする
自動化の成功を考える場合は、関連性に集中できるように、自動化された内容を見るために最小限の時間を費やすことを目指します。 しかし、状況が計画どおりに進まない場合があり、何が起こったかを確認する必要があります。 そのようなデバッグ プロセスは面倒な場合があります。
GitHub には、現在のデバッグ 手順のコンテキストを保持しながらジョブ間をすばやく移動するのに役立つ、明確で構造化されたレイアウトがあります。
GitHub でワークフロー実行のログを表示するには:
- リポジトリで、[ アクション] タブに移動します。
- 左側のウィンドウで、ワークフローを選択します。
- ワークフロー実行の一覧で、実行を選択します。
- ジョブ の下で、ジョブを選択します。
- ログ出力を読みます。
ワークフロー内に複数の実行がある場合は、ワークフローを選択し、[失敗] に設定した後で [状態] フィルターを選択すると、そのワークフローで失敗した実行のみが表示されます。
REST API からワークフロー ログにアクセスする
GitHub を使用してログを表示するだけでなく、GitHub REST API を使用してワークフロー実行のログを表示したり、ワークフローを再実行したり、ワークフローの実行をキャンセルしたりできます。 API を使用してワークフロー実行のログを表示するには、ログ エンドポイントに GET 要求を送信します。 リポジトリに対する読み取りアクセス権を持つすべてのユーザーがこのエンドポイントを使用できることに注意してください。 リポジトリがプライベートである場合は、repo スコープでアクセス トークンを使用する必要があります。
たとえば、特定のワークフロー実行ログを表示する GET 要求は、次のパスに従います。
GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs
GitHub アプリからインストール トークンを使用するタイミングを特定する
GitHub アプリがアカウントにインストールされている場合は、REST および GraphQL API 要求の installation access token を使用して、アプリのインストールとして認証できます。 この手順では、アプリに必要なリポジトリのアクセスとアクセス許可が付与されていると仮定して、アプリがインストールによって所有されているリソースにアクセスできるようにします。 アプリのインストールによって行われた REST または GraphQL API 要求は、アプリに起因します。
次の例では、 INSTALLATION_ACCESS_TOKEN をインストール アクセス トークンに置き換えます。
curl --request GET \
--url "https://api.github.com/meta" \
--header "Accept: application/vnd.github+json" \
--header "Authorization: Bearer INSTALLATION_ACCESS_TOKEN" \
--header "X-GitHub-Api-Version: 2022-11-28"
インストール アクセス トークンを使って、HTTP ベースの Git アクセスの認証を行うこともできます。 アプリには、 Contents リポジトリのアクセス許可が必要です。 その後は、インストール アクセス トークンを HTTP パスワードとして使用できます。
この例の TOKEN は、インストール アクセス トークンに置き換えます。
git clone https://x-access-token:TOKEN@github.com/owner/repo.git