GitHub REST APIを利用してGitHub Actionsのログをダウンロード

本記事は、GitHub Actionsで実行したワークフローのログをGitHubのREST APIを利用してダウンロードしたときの内容を記載します。

### はじめに

GitHub Actionsの実行ログを取得したい場合、Webインターフェースからダウンロードすることもできますが、REST APIを利用すると自動化やスクリプトからの操作が可能になります。以下の手順に従って、Personal Access Tokenの発行からログのダウンロードまでを行います。

### Personal Access Token を発行

1. [Developer Settings](https://github.com/settings/tokens) ページにアクセスします
1. "Generate new token (classic)" ボタンをクリックします
1. トークンに必要な権限として、repo と workflow にチェックを入れます
1. REST APIを利用できるように、まずはGitHubでPersonal Access Tokenを発行しておきます

![github_token.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59203/9eebcba5-2f18-b5a2-1cf8-2216b39d765d.png)

発行されたトークンは一度しか表示されないので、安全な場所に保存しておきます。

![github_token2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59203/34e8851d-4e81-6a61-017d-25d5329a4862.png)


### GitHub Actions の workflow のメタ情報を取得

ログをダウンロードするのにworkflowのidが必要なので、まずは以下のAPIでメタ情報を取得します。

参考サイト: https://docs.github.com/en/rest/actions/workflow-runs?apiVersion=2022-11-28#list-workflow-runs-for-a-repository

```bash
$ curl -L \
  -H "Accept: application/vnd.github+json" \
  -H "Authorization: Bearer <YOUR-TOKEN>" \
  -H "X-GitHub-Api-Version: 2022-11-28" \
  https://api.github.com/repos/OWNER/REPO/actions/runs
```

- `YOUR_TOKEN`: 発行したPersonal Access Token
- `OWNER`: リポジトリの所有者
- `REPO`: リポジトリ名

具体的には以下のようになります。

```bash
$ curl -L \
  -H "Accept: application/vnd.github+json" \
  -H "Authorization: Bearer ghp_***********************************" \
  -H "X-GitHub-Api-Version: 2022-11-28" \
  https://api.github.com/repos/h-nimrod/github-action-sandbox/actions/runs


{
  "total_count": 115,
  "workflow_runs": [
    {
      "id": 10899092149,
      "name": "Experiment GitHub Actions",
      "node_id": "WFR_kwLOKP6MjM8AAAACiaLytQ",
      "head_branch": "main",
      "path": ".github/workflows/experimental_env_vars.yml",
      "display_title": "Experiment GitHub Actions",
      "run_number": 4,
      "event": "workflow_dispatch",
      "status": "completed",
      "conclusion": "success",

...      
```

workflow_runsにあるidを利用してログをダウンロードします。

### ログをダウンロード

次に、先ほど取得したメタ情報からダウンロードしたいworkflowのidを指定してログをダウンロードします。
バイナリで出力されるので、curl に -o をつけてファイルに保存しています。

参考サイト: https://docs.github.com/en/rest/actions/workflow-runs?apiVersion=2022-11-28#download-workflow-run-logs


```bash
$ curl -L \
  -o workflow_logs.zip \
  -H "Accept: application/vnd.github+json" \
  -H "Authorization: Bearer <YOUR-TOKEN>" \
  -H "X-GitHub-Api-Version: 2022-11-28" \
  https://api.github.com/repos/OWNER/REPO/actions/runs/RUN_ID/logs
```

- `RUN_ID`: 対象のworkflowのid

YOUR_TOKEN, OWNER, REPO はメタ情報を取得したときと同じです。

ダウンロードしたファイルは複数のログのテキストがzipになっています。解凍すると、各ジョブやステップごとのログがテキストファイルとして保存されています。

```bash
$ unzip workflow_logs.zip 
Archive:  workflow_logs.zip
  inflating: job2/2_Checkout code.txt  
  inflating: -2147483648_job1.txt    
  inflating: job4/1_Set up job.txt   
  inflating: job1/1_Set up job.txt   
  inflating: job4/2_Checkout code.txt  
  inflating: job4/4_Post Checkout code.txt  
   creating: job3/
  inflating: 0_job3.txt              
  inflating: job2/3_show value.txt   
  inflating: job2/1_Set up job.txt   
  inflating: 0_job4.txt              
  inflating: 0_job2.txt              
  inflating: job2/7_Complete job.txt  
  inflating: -2130706432_job3.txt    
  inflating: job3/1_Set up job.txt   
  inflating: job4/5_Complete job.txt  
  inflating: job1/7_Complete job.txt  
  inflating: -2122317824_job4.txt    
  inflating: job2/6_Post Checkout code.txt  
  inflating: -2139095040_job2.txt    
  inflating: job1/3_show and update value.txt  
  inflating: job3/7_Complete job.txt  
  inflating: 0_job1.txt              
  inflating: job1/6_Post Checkout code.txt  
  inflating: job3/2_Checkout code.txt  
  inflating: job1/2_Checkout code.txt  
  inflating: job3/3_show value.txt   
  inflating: job3/6_Post Checkout code.txt  
```